Prhub

#6956 [ci] feat: add GSPO Qwen3-8B FSDP2 vLLM nightly test for Ascend

原始 PR 作者 chengminhua 合并时间 2026-07-07 20:02 文件变更 2 提交数 4 评论 1 代码增减 +204 / -2

执行摘要

新增 Ascend GSPO Qwen3-8B FSDP2 nightly 测试

PR旨在增加CI覆盖,确保持续集成覆盖GSPO Qwen3-8B FSDP2训练在Ascend NPU上的稳定性。PR body明确指出'Add a new nightly CI workflow for GSPO Qwen3-8B FSDP2 training on Ascend using the vLLM rollout backend.'

该PR是标准的CI增强,值得关注其路径兼容性问题,可作为后续改进点。建议在需要非root环境运行时修复。

讨论亮点

评论中指出测试脚本硬编码了/root/.cache作为日志目录,建议使用${HOME}/.cache以确保非root环境兼容。该建议未被采纳,但PR最终被批准,表明在CI root环境下该问题可接受。

实现拆解

实现分为两步:

  1. 新增测试脚本 tests/special_npu/nightly_ci_ascend/run_gspo_qwen3_8b_fsdp2_npu.sh,设置环境变量、模型路径、训练超参数,并定义数据、模型、actor、ref、rollout等配置数组,最终调用verl trainer启动训练。
  2. 修改CI配置文件 .github/workflows/nightly_ascend.yml,新增一个名为nightlyCI_gspo-qwen3-8b-fsdp2-vllm_ascend的job,指定容器镜像、环境变量、步骤,并调整cron时间至UTC 19:00以避免与现有job冲突。
文件 模块 状态 重要度
tests/special_npu/nightly_ci_ascend/run_gspo_qwen3_8b_fsdp2_npu.sh NPU 测试 added 6.25
.github/workflows/nightly_ascend.yml CI 配置 modified 4.86

关键源码片段

tests/special_npu/nightly_ci_ascend/run_gspo_qwen3_8b_fsdp2_npu.sh test-coverage

新增的 GSPO Qwen3-8B FSDP2 vLLM nightly 测试脚本,包含所有训练参数和环境配置。

#!/usr/bin/env bash
# GSPO | Qwen3-8B | GSM8K | vLLM rollout | FSDP2 training | Ascend NPUset -xeuo pipefail
​
# 环境变量:RAY、HYDRA、HCCL、VLLM
export RAY_DEDUP_LOGS=0
export HYDRA_FULL_ERROR=1
export TASK_QUEUE_ENABLE=1
export HCCL_EXEC_TIMEOUT=3600
export VLLM_USE_V1=1# 模型路径,可通过环境变量覆盖
MODEL_ID=${MODEL_ID:-Qwen/Qwen3-8B}
MODEL_PATH=${MODEL_PATH:-${HOME}/.cache/models/${MODEL_ID}}# 数据文件:GSM8K 训练 / 验证集
TRAIN_FILE=${TRAIN_FILE:-$HOME/data/gsm8k/train.parquet}
TEST_FILE=${TEST_FILE:-$HOME/data/gsm8k/test.parquet}# 训练超参数(CI 默认值保持短运行时间)
NGPUS_PER_NODE=${NGPUS_PER_NODE:-16}
TRAIN_BATCH_SIZE=${TRAIN_BATCH_SIZE:-32}
PPO_MINI_BATCH_SIZE=${PPO_MINI_BATCH_SIZE:-16}
MAX_PROMPT_LENGTH=${MAX_PROMPT_LENGTH:-2048}
MAX_RESPONSE_LENGTH=${MAX_RESPONSE_LENGTH:-2048}
ROLLOUT_N=${ROLLOUT_N:-4}
SP_SIZE=${SP_SIZE:-2}
TOTAL_TRAINING_STEPS=${TOTAL_TRAINING_STEPS:-15}# GSPO 算法专用参数
CLIP_RATIO_LOW=${CLIP_RATIO_LOW:-3e-4}
CLIP_RATIO_HIGH=${CLIP_RATIO_HIGH:-4e-4}
ACTOR_LR=${ACTOR_LR:-1e-6}
SEED=${SEED:-42}# 数据配置数组
DATA=(
    algorithm.adv_estimator=grpo
    algorithm.use_kl_in_reward=False
    data.train_files="${TRAIN_FILE}"
    data.val_files="${TEST_FILE}"
    data.train_batch_size=${TRAIN_BATCH_SIZE}
    data.max_prompt_length=${MAX_PROMPT_LENGTH}
    data.max_response_length=${MAX_RESPONSE_LENGTH}
    data.truncation='left'
)# 模型配置数组
MODEL=(
    actor_rollout_ref.model.path="${MODEL_PATH}"
    actor_rollout_ref.model.use_remove_padding=True
    actor_rollout_ref.model.enable_gradient_checkpointing=True
)# Actor 配置数组(关键:使用 GSPO 损失、FSDP2 策略)
ACTOR=(
    actor_rollout_ref.actor.strategy=fsdp2
    actor_rollout_ref.actor.policy_loss.loss_mode=gspo
    actor_rollout_ref.actor.loss_agg_mode=seq-mean-token-mean
    actor_rollout_ref.actor.clip_ratio_low=${CLIP_RATIO_LOW}
    actor_rollout_ref.actor.clip_ratio_high=${CLIP_RATIO_HIGH}
    # ... 余下包含梯度裁剪、动态 batch、优化器、FSDP 配置等
)

评论区精华

硬编码日志目录路径兼容性 正确性

评论指出脚本中硬编码了 /root/.cache 作为日志目录,在非 root 环境中会因权限失败,建议使用 ${HOME}/.cache。

结论:评论被提出,但作者未回应;PR 最终被批准,表明在当前的 CI root 环境下该问题不阻塞合并。 · 已解决

风险与影响

主要风险:脚本硬编码/root/.cache路径,在非root环境中会因权限失败。但当前CI使用root容器,因此风险有限。此外,新增CI job可能增加队列等待时间。

影响范围:仅限夜间CI流程,新增一个job。用户无直接影响。团队需关注该测试的稳定性。

硬编码日志路径 权限问题 仅限 root 环境

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论