forked from skypilot-org/skypilot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathverl-grpo.yaml
More file actions
178 lines (151 loc) · 6.05 KB
/
Copy pathverl-grpo.yaml
File metadata and controls
178 lines (151 loc) · 6.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# Usage:
# sky launch -c verl-grpo llm/verl/verl-grpo.yaml --secret WANDB_API_KEY --num-nodes 1 -y
#
# sky launch -c verl-grpo llm/verl/verl-grpo.yaml --secret WANDB_API_KEY --secret HF_TOKEN --num-nodes 1 -y
resources:
accelerators: H100:1
memory: 128+
image_id: docker:verlai/verl:app-verl0.6-transformers4.56.1-sglang0.5.2-mcore0.13.0-te2.2
ports:
- 8265
- 9090
envs:
TOTAL_EPOCHS: 1
WANDB_PROJECT_NAME: skypilot-verl
WANDB_EXPERIMENT_NAME: grpo-code
CHECKPOINT_BUCKET_NAME: sky-verl-grpo-checkpoints
HF_UPLOAD_MODEL_NAME: "maknee/verl-grpo-code"
SAVE_FINAL_MODEL_HF_PATH: /checkpoints/hf_model
file_mounts:
/checkpoints:
store: nebius
name: ${CHECKPOINT_BUCKET_NAME}
mode: MOUNT
/code:
name: code
source: llm/verl/code
mode: COPY
secrets:
HF_TOKEN: null
WANDB_API_KEY: null
setup: |
rm -f ~/.pip/pip.conf
rm -f ~/.config/pip/pip.conf
sudo apt install iproute2 -y
uv venv --python 3.10 --seed
source .venv/bin/activate
rm -rf verl
git clone https://github.com/volcengine/verl.git
cd verl
git checkout 83aebcc133663c12ac33ea3d5ba5c5c5b4687286
uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
uv pip install -v -e .
uv pip install hf_transfer
uv pip install flashinfer-python
uv pip install "vllm==0.10.0" --torch-backend=auto
uv pip install "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.7cxx11abiFALSE-cp310-cp310-linux_x86_64.whl"
uv pip install datasets
uv pip install "ray[train]" "click<8.2.0"
uv pip install tqdm
# Pin uvloop to 0.21.0 to work around asyncio event loop bug
# See: https://github.com/volcengine/verl/issues/3806
uv pip install "uvloop==0.21.0"
echo "Downloading code dataset..."
mkdir -p ~/data/code
python3 /code/preprocess_rstar_coder.py --local_dir ~/data/code
echo "code dataset download completed"
run: |
HEAD_IP=$(echo "$SKYPILOT_NODE_IPS" | head -n1)
NUM_NODES=$SKYPILOT_NUM_NODES
NUM_GPUS_PER_NODE=$SKYPILOT_NUM_GPUS_PER_NODE
#NETWORK_INTERFACE=$(ip route get 8.8.8.8 | grep -oP 'src \K\S+')
#export GLOO_SOCKET_IFNAME=$NETWORK_INTERFACE
NETWORK_INTERFACE=$(ip route get 8.8.8.8 | grep -oP 'dev \K\S+')
export GLOO_SOCKET_IFNAME=$NETWORK_INTERFACE
export NCCL_SOCKET_IFNAME=$NETWORK_INTERFACE
export VLLM_USE_V1=1
source .venv/bin/activate
python3 -c "import wandb; wandb.login(relogin=True, key='$WANDB_API_KEY')"
# This script is only available on skypilot-nightly>=1.0.0.dev20251114
# If you are using an older version, you can copy and paste the script from:
# https://github.com/skypilot-org/skypilot/blob/master/sky_templates/ray/start_cluster
export RAY_DASHBOARD_HOST=0.0.0.0
~/sky_templates/ray/start_cluster
# Head node: wait for workers and run training
if [ "$SKYPILOT_NODE_RANK" == "0" ]; then
# Wait for all worker nodes to join
retry_count=0
max_retries=30
while [ $retry_count -lt $max_retries ]; do
connected_nodes=$(ray status 2>/dev/null | grep -c "node_" || echo "0")
echo "Connected nodes: $connected_nodes/$NUM_NODES (attempt $((retry_count+1))/$max_retries)"
if [ "$connected_nodes" -ge "$NUM_NODES" ]; then
echo "All nodes connected to Ray cluster"
break
fi
retry_count=$((retry_count+1))
sleep 10
done
python3 -m verl.trainer.main_ppo \
algorithm.adv_estimator=grpo \
data.train_files=$HOME/data/code/train.parquet \
data.val_files=$HOME/data/code/test.parquet \
data.train_batch_size=32 \
data.max_prompt_length=256 \
data.max_response_length=256 \
data.filter_overlong_prompts=True \
data.truncation='error' \
actor_rollout_ref.model.path=Qwen/Qwen2.5-7B-Instruct \
actor_rollout_ref.actor.optim.lr=1e-6 \
actor_rollout_ref.model.use_remove_padding=True \
actor_rollout_ref.actor.ppo_mini_batch_size=16 \
actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4 \
actor_rollout_ref.actor.ppo_epochs=1 \
actor_rollout_ref.actor.use_kl_loss=False \
actor_rollout_ref.actor.entropy_coeff=0 \
actor_rollout_ref.model.enable_gradient_checkpointing=True \
actor_rollout_ref.actor.fsdp_config.param_offload=True \
actor_rollout_ref.actor.fsdp_config.optimizer_offload=True \
actor_rollout_ref.actor.fsdp_config.model_dtype=bfloat16 \
actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=16 \
actor_rollout_ref.rollout.tensor_model_parallel_size=1 \
actor_rollout_ref.rollout.name=vllm \
actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \
actor_rollout_ref.rollout.n=1 \
actor_rollout_ref.rollout.enable_chunked_prefill=True \
actor_rollout_ref.rollout.max_num_batched_tokens=2048 \
actor_rollout_ref.rollout.trace.backend=weave \
actor_rollout_ref.rollout.trace.token2text=True \
actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=16 \
actor_rollout_ref.ref.fsdp_config.param_offload=True \
algorithm.use_kl_in_reward=False \
trainer.critic_warmup=0 \
trainer.logger=[console,wandb] \
trainer.n_gpus_per_node=$NUM_GPUS_PER_NODE \
trainer.nnodes=$NUM_NODES \
trainer.save_freq=10 \
trainer.test_freq=1 \
trainer.total_epochs=${TOTAL_EPOCHS} \
trainer.default_local_dir=/checkpoints \
trainer.project_name=$WANDB_PROJECT_NAME \
trainer.experiment_name=$WANDB_EXPERIMENT_NAME
LATEST_STEP=$(cat /checkpoints/latest_checkpointed_iteration.txt)
CHECKPOINT_DIR="/checkpoints/global_step_${LATEST_STEP}/actor"
if [ -z "$HF_TOKEN" ]; then
python -m verl.model_merger merge \
--backend fsdp \
--tie-word-embedding \
--local_dir ${CHECKPOINT_DIR} \
--target_dir ${SAVE_FINAL_MODEL_HF_PATH} \
--hf_upload_path ${HF_UPLOAD_MODEL_NAME}
else
python -m verl.model_merger merge \
--backend fsdp \
--tie-word-embedding \
--local_dir ${CHECKPOINT_DIR} \
--target_dir ${SAVE_FINAL_MODEL_HF_PATH}
fi
vllm serve /checkpoints/hf_model \
--host 0.0.0.0 \
--port 9090
fi