背景与目标
正式任务:01 多模态 Dense
认领入口:redai-infra/Relax#86 中 A-Words 的报名评论
本任务选择仓库已有的 Qwen3-VL-4B 双卡 colocate GRPO recipe,在不改变模型、数据、有效 global
batch、prompt/response 长度、采样数和训练步数的前提下,定位训练侧 optimizer CPU offload 的开销,
并通过同环境 before/after 实验验证最小配置改动对端到端 response tokens/s 和 GPU 利用率的影响。
固定信息
| 项目 |
内容 |
| 上游仓库 |
redai-infra/Relax |
| 开发 fork |
A-Words/Relax |
| 基线分支 |
main |
| 基线 commit |
d52cd0aca9b347a57fb435bda3ae2db8fc6706a4 |
| 开发分支 |
perf/task01-multimodal-dense |
| 选定入口 |
scripts/training/multimodal/run-qwen3-vl-4B-2xgpu.sh |
| 运行模式 |
2-GPU、single-node、--colocate、TP=2、PP/CP/EP=1 |
| GPU |
2 × NVIDIA A100-SXM4-80GB;81920 MiB/卡;CUDA P2P 双向可用 |
| GPU 拓扑 |
NV4 |
| 容器镜像 |
ghcr.io/redai-infra/relaxrl:latest;2026-08-05 查询 GHCR 得到 sha256:8dc39af377a570e6cd7ec88c8b7fcd44c1eb820111e9d2069f1c7c3024b2ea23 |
| Python / PyTorch / CUDA |
3.12.3 / 2.11.0+cu129 / 12.9 |
| SGLang / Ray / Transformers |
0.5.12.post1 / 2.56.1 / 5.6.0 |
| Driver |
580.95.05(nvidia-smi 报告最高 CUDA 13.0) |
| CPU / 内存 / 磁盘 |
2 × AMD EPYC 7513(共 128 逻辑 CPU);约 503 GiB RAM;实验开始时约 254 GB 可用磁盘 |
| 交付方式 |
本 Issue + PR |
latest 是可变标签;上述 digest 是实验期间查询注册表得到的当前值,容器内部没有可独立验证实例启动时 digest 的元数据,因此不会把两者表述为完全等价。若租赁平台无法提供同机连续完成
before/after 的条件,则重新租用后两组实验都从头重跑,不跨机器比较。
固定训练负载
基线与优化版共同保持以下参数,不通过减少有效工作量换取速度:
| 维度 |
固定值 |
| 模型 |
Qwen3-VL-4B-Instruct,相同本地 checkpoint 与文件 hash |
| 数据 |
multimodal-open-r1-8k-verified 的同一 parquet 文件与 SHA-256 |
| 算法 |
GRPO |
--num-rollout |
200 |
--rollout-batch-size |
2 |
--n-samples-per-prompt |
8 |
--global-batch-size |
16 |
--rollout-max-response-len |
1024 |
--rollout-max-prompt-len |
2048 |
--rollout-temperature |
0.8 |
| 并行拓扑 |
TP=2、PP=1、CP=1、EP=1、ETP=1 |
| 动态 batch |
开启,基线 --max-tokens-per-gpu 9216 |
| 随机性 |
固定框架最终解析 seed;记录 effective argv 和数据顺序 |
正式对比不修改 reward、KL、clip、学习率、dropout、数据过滤、采样温度或有效 token 口径。
基线入口与命令
在固定容器的 Relax checkout 中运行现有脚本;模型与数据路径按实际挂载位置设置:
export NUM_GPUS=2
export MODEL_DIR=/workspace/models
export DATA_DIR=/workspace/data
export NUM_ROLLOUT=200
bash scripts/training/multimodal/run-qwen3-vl-4B-2xgpu.sh
运行前额外记录:
git rev-parse HEAD
git status --short
nvidia-smi -q
python -V
python -m pip freeze
find "${MODEL_DIR}/Qwen3-VL-4B-Instruct" -type f -print0 \
| sort -z \
| xargs -0 sha256sum > model-sha256.txt
sha256sum \
"${DATA_DIR}/multimodal-open-r1-8k-verified/data/train-00000-of-00001_converted_noextract.parquet"
模型目录的最终 manifest 将逐文件记录相对路径、大小和 SHA-256;不会只依赖可变模型名。
诊断与候选优化
候选实验按单变量顺序执行:
A1:移除 CPU optimizer offload 组合:
--optimizer-cpu-offload
--overlap-cpu-optimizer-d2h-h2d
--use-precision-aware-optimizer
A2:若 A1 无 OOM 且训练阶段仍受 recompute 限制,移除 full activation recompute:
--recompute-granularity full
--recompute-method uniform
--recompute-num-layers 1
A3:仅在 profiler 证明 batch packing 仍有明显空余且显存安全时,逐级调整
--max-tokens-per-gpu;不修改 global batch、样本数或长度上限。
候选结果如下:
- A1 通过正式 200-step:只移除 optimizer CPU offload 三项;
- A2 的 20-step 短跑成功,但正式运行 step 9 在反向传播额外分配 2.46 GiB 时发生 CUDA OOM,故恢复
full recompute;
- A3 将 token budget 降为 8192 后峰值显存仅下降 0.55%,端到端 response tokens/s 下降 5.75%,故撤回。
最终 PR 只保留 A1 的三项删除;A2/A3 均作为失败诊断证据保留,不进入源码改动。
改动范围
计划涉及:
scripts/training/multimodal/run-qwen3-vl-4B-2xgpu.sh
- 如维护者要求,补充与该 recipe 直接相关的性能结果说明
明确不做:
- 不修改模型、数据集、reward、GRPO 数学或 rollout 语义;
- 不降低 global batch、prompt/response 上限、采样数或正式训练步数;
- 不修改通用 Controller、Service、Launcher 或公共参数解析;
- 不新增依赖;
- 不把 profiler 开销混入正式 before/after 吞吐统计;
- 不提交模型权重、原始 rollout 样本、凭据或机器专属路径。
验收口径
正式运行
- 基线和优化版在同一租赁实例、同一容器 digest、同一 commit 派生代码、同一模型/数据 hash 下分别
完成 GRPO 200 step;
- 正式吞吐运行关闭 PyTorch/SGLang profiler 和 memory history,避免采集开销污染结果;
- 另做同配置的短 profiler 运行,采集 rollout、actor train 和显存证据;
- 每组保留完整命令、effective argv、stdout/stderr、metrics、GPU 1 Hz 采样、曲线和 trace manifest。
统计窗口
排除启动和早期 warmup step 0–19,将 step 20–199 预先划分为三个等长窗口:
- W1:step 20–79;
- W2:step 80–139;
- W3:step 140–199。
主指标为 perf/step_resp_token_per_s;同时报告 perf/step_token_per_s、perf/step_time、
perf/actor_train_time、平均 GPU utilization 和每卡峰值 memory.used。每个窗口报告 mean、std、median、
p95,并报告三个窗口 mean 的总体均值。before/after 改善比例使用未舍入值计算。
正确性与质量护栏
- 200/200 step 完成,无 OOM、NaN/Inf、未解释异常或静默降级;
- rollout/train 样本计数、response token 计数和 global batch 口径一致,无丢样本;
- loss、reward、response length、KL、clip fraction 和 grad norm 均为有限值并提供曲线;
- 优化版不降低有效 global batch、prompt/response 上限或采样数;
- 主吞吐指标高于基线,三个窗口方向一致;若收益不稳定或质量护栏失败,则报告失败并不提交优化。
实测结果
| 指标 |
基线 |
优化版 |
变化 |
| response tokens/s |
250.177 |
301.918 |
+20.682% |
| total tokens/s |
430.526 |
524.496 |
+21.827% |
| step time mean / p95 |
31.989 / 36.958s |
25.939 / 31.136s |
mean -18.914% |
| actor train time |
10.681s |
4.060s |
-61.991% |
| GPU utilization mean |
50.688% |
66.042% |
+30.292% |
| peak VRAM / GPU |
73152 MiB |
72766 MiB |
-0.528% |
| completed steps |
200 |
200 |
0 |
| effective batch / length limits |
16 / 2048 / 1024 |
16 / 2048 / 1024 |
不变 |
W1/W2/W3 的 response tokens/s 分别提升 22.314%、27.664% 和 12.302%。两边均有 200 条连续
train/rollout 记录、每步 16 samples,loss/reward 均为有限值,正式日志未发现 OOM/Traceback。
风险与回退
| 风险 |
门禁与回退 |
| 移除 optimizer offload 后 OOM |
已完成 200/200 step;若其他硬件显存不足,恢复完整 offload 组合 |
| 移除 recompute 后 activation 峰值过高 |
A2 已在 step 9 OOM,因此最终改动保留 full recompute |
| token budget 调整影响吞吐 |
A3 已实测回退,最终保持 9216 不变 |
| profiler 改变性能 |
profiler 单独短跑;正式 200-step 对比全部关闭 profiler |
| 租赁实例漂移 |
before/after 必须同实例连续完成;实例中断后两组都重跑 |
| 随机 rollout 造成曲线波动 |
固定 seed、数据和 sampling 参数;使用三个预定义窗口,不挑选有利区间 |
回退方式是恢复该脚本在基线 commit 中的参数组合;本任务不引入数据、checkpoint 或公共 API 迁移。
预期交付
提交一个仅包含实测有效配置和必要结果说明的 PR。PR 将包含前后对照表格、三个窗口统计、
完整复现命令、风险与回退方法,并关联本 Issue。Issue 和 PR 均由用户检查后手动决定是否提交。
背景与目标
正式任务:01 多模态 Dense
认领入口:redai-infra/Relax#86 中 A-Words 的报名评论
本任务选择仓库已有的 Qwen3-VL-4B 双卡 colocate GRPO recipe,在不改变模型、数据、有效 global
batch、prompt/response 长度、采样数和训练步数的前提下,定位训练侧 optimizer CPU offload 的开销,
并通过同环境 before/after 实验验证最小配置改动对端到端 response tokens/s 和 GPU 利用率的影响。
固定信息
redai-infra/RelaxA-Words/Relaxmaind52cd0aca9b347a57fb435bda3ae2db8fc6706a4perf/task01-multimodal-densescripts/training/multimodal/run-qwen3-vl-4B-2xgpu.sh--colocate、TP=2、PP/CP/EP=1NV4ghcr.io/redai-infra/relaxrl:latest;2026-08-05 查询 GHCR 得到sha256:8dc39af377a570e6cd7ec88c8b7fcd44c1eb820111e9d2069f1c7c3024b2ea23580.95.05(nvidia-smi报告最高 CUDA 13.0)固定训练负载
基线与优化版共同保持以下参数,不通过减少有效工作量换取速度:
Qwen3-VL-4B-Instruct,相同本地 checkpoint 与文件 hashmultimodal-open-r1-8k-verified的同一 parquet 文件与 SHA-256--num-rollout200--rollout-batch-size2--n-samples-per-prompt8--global-batch-size16--rollout-max-response-len1024--rollout-max-prompt-len2048--rollout-temperature0.8--max-tokens-per-gpu 9216正式对比不修改 reward、KL、clip、学习率、dropout、数据过滤、采样温度或有效 token 口径。
基线入口与命令
在固定容器的 Relax checkout 中运行现有脚本;模型与数据路径按实际挂载位置设置:
运行前额外记录:
模型目录的最终 manifest 将逐文件记录相对路径、大小和 SHA-256;不会只依赖可变模型名。
诊断与候选优化
候选实验按单变量顺序执行:
A1:移除 CPU optimizer offload 组合:--optimizer-cpu-offload--overlap-cpu-optimizer-d2h-h2d--use-precision-aware-optimizerA2:若 A1 无 OOM 且训练阶段仍受 recompute 限制,移除 full activation recompute:--recompute-granularity full--recompute-method uniform--recompute-num-layers 1A3:仅在 profiler 证明 batch packing 仍有明显空余且显存安全时,逐级调整--max-tokens-per-gpu;不修改 global batch、样本数或长度上限。候选结果如下:
full recompute;
最终 PR 只保留 A1 的三项删除;A2/A3 均作为失败诊断证据保留,不进入源码改动。
改动范围
计划涉及:
scripts/training/multimodal/run-qwen3-vl-4B-2xgpu.sh明确不做:
验收口径
正式运行
完成 GRPO 200 step;
统计窗口
排除启动和早期 warmup step 0–19,将 step 20–199 预先划分为三个等长窗口:
主指标为
perf/step_resp_token_per_s;同时报告perf/step_token_per_s、perf/step_time、perf/actor_train_time、平均 GPU utilization 和每卡峰值 memory.used。每个窗口报告 mean、std、median、p95,并报告三个窗口 mean 的总体均值。before/after 改善比例使用未舍入值计算。
正确性与质量护栏
实测结果
250.177301.918+20.682%430.526524.496+21.827%31.989 / 36.958s25.939 / 31.136s-18.914%10.681s4.060s-61.991%50.688%66.042%+30.292%73152 MiB72766 MiB-0.528%200200016 / 2048 / 102416 / 2048 / 1024W1/W2/W3 的 response tokens/s 分别提升 22.314%、27.664% 和 12.302%。两边均有 200 条连续
train/rollout 记录、每步 16 samples,loss/reward 均为有限值,正式日志未发现 OOM/Traceback。
风险与回退
回退方式是恢复该脚本在基线 commit 中的参数组合;本任务不引入数据、checkpoint 或公共 API 迁移。
预期交付
提交一个仅包含实测有效配置和必要结果说明的 PR。PR 将包含前后对照表格、三个窗口统计、
完整复现命令、风险与回退方法,并关联本 Issue。Issue 和 PR 均由用户检查后手动决定是否提交。