/nvme/public_models → /public_models
/nvme/chengweihua/code/GUI_Gym → /workspace
1ROLLOUT_MODE=offline # rollout 模式:offline / docker
2N_SAMPLES_PER_PROMPT=8 # 默认值,建议覆盖为 4
3NUM_GPUS=8
4ACTOR_GPUS=4 # 改为 8 以走 TP=8 colocate
5ROLLOUT_GPUS=4 # 改为 8 以走 TP=8 colocate
--net=host
--ipc=private(默认)
--shm-size=128g
1# 假设 tar.gz 已传到目标机的 /tmp/
2docker load < /tmp/gui-gym-grpo-patched-20260514-2032.tar.gz
3docker images | grep gui-gym-grpo
1docker run -d --name cwh \
2 --gpus all \
3 --net=host \
4 --shm-size=128g \
5 -v /your/path/to/GUI_Gym:/workspace \
6 -v /your/path/to/public_models:/public_models \
7 -e ROLLOUT_MODE=offline \
8 -e NUM_GPUS=8 \
9 -e ACTOR_GPUS=4 \
10 -e ROLLOUT_GPUS=4 \
11 gui-gym-grpo:patched-20260514-2032 \
12 sleep infinity
1docker exec -d \
2 -e N_SAMPLES_PER_PROMPT=4 \
3 -e ROLLOUT_BATCH_SIZE=2 \
4 -e GUI_MAX_IMAGE_HISTORY_LENGTH=3 \
5 cwh bash -c 'cd /workspace && bash /workspace/rl/gui_qwen3vl_8b_kp_grpo.sh > /workspace/train_$(date +%Y%m%d_%H%M%S).log 2>&1'
1docker exec -d \
2 -e N_SAMPLES_PER_PROMPT=4 \
3 -e ROLLOUT_BATCH_SIZE=2 \
4 -e GUI_MAX_IMAGE_HISTORY_LENGTH=3 \
5 -e ACTOR_GPUS=8 \
6 -e ROLLOUT_GPUS=8 \
7 -e TENSOR_PARALLEL_SIZE=8 \
8 -e ROLLOUT_NUM_GPUS_PER_ENGINE=4 \
9 cwh bash -c 'cd /workspace && bash /workspace/rl/gui_qwen3vl_8b_kp_grpo.sh > /workspace/train_$(date +%Y%m%d_%H%M%S).log 2>&1'
1# 目标机器上:
2
3# 1. 拉 OSWorld desktop 镜像
4docker pull happysixd/osworld-docker
5
6# 2. 拷贝 QCOW2(24 GB,可以用 rsync 或 scp)
7rsync -avhP /source/nvme/chengweihua/image/base.qcow2 /target/nvme/chengweihua/image/
8
9# 3. 如果目标路径不一样,有两种方式:
10# a) 设环境变量(推荐):export QCOW2_PATH=/your/new/path/base.qcow2
11# b) 改 container.py:39 的 QCOW2 默认值
1GUI_DOWNLOAD_PROXY=http://chengweihua:...@10.1.20.50:23128/ # HuggingFace 走代理
2ANCHOR_TRAJ_BASE_DIR=/workspace/dataset/Anchor/tasks_with_steps_json_and_image
3DOCKER_DESKTOP_PATH=/workspace/docker_desktop
4GUI_TRAJECTORY_CONCURRENCY=16 # 容器并发数
5GUI_POOL_MAX_ENVS=16
6GUI_FILE_CACHE_DIR=/workspace/desktop_env/cache # 本地缓存优先级 > 代理下载
1docker exec cwh python3 -c "
2import torch
3print('CUDA:', torch.cuda.is_available(), torch.cuda.device_count(), 'GPUs')
4
5# 验证 clip_grads patch 生效
6import sys
7sys.path.insert(0, '/workspace/third_party/Megatron-LM')
8from megatron.core.optimizer.clip_grads import multi_tensor_applier
9mod = multi_tensor_applier.__class__.__module__
10assert 'transformer_engine' in mod, f'WRONG: still using {mod}'
11print('clip_grads patch: OK (using TE)')
12
13# 验证 slime patch 生效
14with open('/workspace/third_party/slime/slime/backends/megatron_utils/actor.py') as f:
15 src = f.read()
16assert 'Without offload_train, slime never frees' in src, 'slime patch MISSING'
17print('slime clear_memory patch: OK')
18
19# 验证 sgl_kernel
20import sgl_kernel, sglang
21print('sgl_kernel + sglang: OK')
22
23print('PASS')
24"