Skip to content

【Task.01】多模态 Dense #241

Description

@A-Words

背景与目标

正式任务: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.05nvidia-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;不会只依赖可变模型名。

诊断与候选优化

候选实验按单变量顺序执行:

  1. A1:移除 CPU optimizer offload 组合:
    • --optimizer-cpu-offload
    • --overlap-cpu-optimizer-d2h-h2d
    • --use-precision-aware-optimizer
  2. A2:若 A1 无 OOM 且训练阶段仍受 recompute 限制,移除 full activation recompute:
    • --recompute-granularity full
    • --recompute-method uniform
    • --recompute-num-layers 1
  3. 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_sperf/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 均由用户检查后手动决定是否提交。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions