Prhub

#6606 [tool] fix: update npu profiling test scrip

原始 PR 作者 yyyy2000 合并时间 2026-06-04 19:13 文件变更 2 提交数 2 评论 1 代码增减 +29 / -27

执行摘要

NPU 性能分析测试脚本参数灵活化

PR body 中说明是 'update npu profiling test script',核心是修改测试脚本里的传参方式以支持灵活传参。原脚本中 LEVELCONTENTSANALYSIS 等参数是硬编码常量,无法通过外部覆盖,导致无法灵活适配不同 profiling 场景。

值得快速浏览但不需深度精读。主要学习点是 '将硬编码参数环境变量化' 的测试脚本重构模式,以及双引号包裹变量防止 globbing 的 Bash 最佳实践。对于其他测试脚本有借鉴意义。

讨论亮点

唯一的 review 评论来自 gemini-code-assist[bot],指出在 Bash 中未加引号的方括号(如 ['npu','cpu'][1][2,4])会被当作 globbing 模式,如果当前目录存在匹配的文件,shell 可能会意外展开导致语法错误。建议用双引号包裹默认值,例如 CONTENTS=${CONTENTS:-"['npu','cpu']"}。截至 PR 合并时,该建议未被确认采纳,但 PR 已由 wucong25 批准合并,说明可能已在其他提交中处理或认为当前写法风险可控(因为 set -x 且通常无匹配文件)。

实现拆解

  1. 将硬编码参数改为环境变量 + 默认值:在 tests/special_npu/run_qwen3_8b_grpo_profiling.sh 中,原硬编码的 LEVEL=level0CONTENTS=['npu','cpu']ANALYSIS=False 等变量被替换为 ${LEVEL:-level0}${CONTENTS:-['npu','cpu']} 等带默认值的形式,新增 TRAIN_FILETEST_FILEtotal_training_steps 三个可覆盖变量。这样用户可以通过设置环境变量来自定义参数,无需修改脚本。
  2. 双引号包裹变量引用:在 Python 命令中,所有 $PROFILE_RANKS_ALL$PROFILE_RANKS 等变量引用都加上了双引号,例如 actor_rollout_ref.actor.profiler.all_ranks="$PROFILE_RANKS_ALL",避免 Bash globbing 意外展开类似 [2,4] 的值。
  3. 调整默认值ANALYSIS 默认值从 False 改为 TruePROFILE_RANKS[0] 改为 [2,4]SAVE_PATH 从硬编码 tests/utils/ci/profiler_data 改为 ./profiler_data-dis
  4. CI 工作流补充后验证与清理:在 .github/workflows/e2e_ascend.yml 中,在运行 profiling 脚本后显式添加了调用 test_check_profiler_output.py 验证输出并清理临时目录的步骤。原来这些步骤在脚本内,但脚本已移除了这些后处理逻辑。
文件 模块 状态 重要度
tests/special_npu/run_qwen3_8b_grpo_profiling.sh 测试脚本 modified 5.23
.github/workflows/e2e_ascend.yml CI 配置 modified 2.38

关键源码片段

tests/special_npu/run_qwen3_8b_grpo_profiling.sh test-coverage

核心改动文件:将所有 profiling 参数从硬编码改为环境变量带默认值,并增加双引号保护,提升脚本灵活性。

# 修改后的脚本片段:所有参数通过环境变量传入,带默认值
set -x
​
MODEL_ID=${MODEL_ID:-Qwen/Qwen3-8B}
MODEL_PATH=${MODEL_PATH:-${HOME}/.cache/models/${MODEL_ID}}
SAVE_PATH=${SAVE_PATH:-./profiler_data-dis}
rm -rf "$SAVE_PATH"# 注意:以下方括号默认值(如 ['npu','cpu']、[1])
# 建议外层加双引号以避免 Bash globbing,但当前写法在无匹配文件时安全
LEVEL=${LEVEL:-"level0"}
CONTENTS=${CONTENTS:-['npu','cpu']}
ANALYSIS=${ANALYSIS:-True}
PROFILE_STEPS=${PROFILE_STEPS:-[1]}
PROFILE_RANKS_ALL=${PROFILE_RANKS_ALL:-False}
PROFILE_RANKS=${PROFILE_RANKS:-[2,4]}
DISCRETE=${DISCRETE:-True}
TRAIN_FILE=${TRAIN_FILE:-${HOME}/data/gsm8k/train.parquet}
TEST_FILE=${TEST_FILE:-${HOME}/data/gsm8k/test.parquet}
total_training_steps=${total_training_steps:-1}# Python 命令中所有变量引用均加双引号以防止 globbing
trainer.total_training_steps="$total_training_steps" \
    actor_rollout_ref.actor.profiler.enable=True \
    actor_rollout_ref.actor.profiler.all_ranks="$PROFILE_RANKS_ALL" \
    actor_rollout_ref.actor.profiler.ranks="$PROFILE_RANKS" \
    actor_rollout_ref.actor.profiler.tool_config.npu.discrete="$DISCRETE" \
    actor_rollout_ref.actor.profiler.tool_config.npu.contents="$CONTENTS" \
    actor_rollout_ref.actor.profiler.tool_config.npu.level="$LEVEL" \
    actor_rollout_ref.actor.profiler.tool_config.npu.analysis="$ANALYSIS" \
    ...
.github/workflows/e2e_ascend.yml infrastructure

在 CI 工作流中补充了后验证和清理步骤,确保 profiling 数据被验证并清理。

# .github/workflows/e2e_ascend.yml 片段
- name: Running qwen3 8b grpo profiling test on ASCEND NPU
  run: |
    ray stop --force
    bash tests/special_npu/run_qwen3_8b_grpo_profiling.sh
    # 新增:运行后验证,并清理临时目录
    python3 "tests/utils/test_check_profiler_output.py" --profiler_dir="./profiler_data-dis" --device="npu"
    rm -rf ./profiler_data-dis
    rm -rf $HOME/ckpts

评论区精华

未加引号的方括号默认值存在 globbing 风险 正确性

`gemini-code-assist[bot]` 指出 `CONTENTS=${CONTENTS:-['npu','cpu']}` 等行中,方括号作为默认值部分但未加引号,如果当前目录存在匹配文件,Bash 可能将其展开导致意外行为。建议如 `CONTENTS=${CONTENTS:-"['npu','cpu']"}` 整体加双引号。

结论:未被确认采纳,但 PR 已合并。可能因为实际运行环境极少存在匹配文件,风险可接受。 · unaddressed

风险与影响

低风险。主要改动在测试脚本和 CI 配置,不涉及核心逻辑。潜在风险包括:

  • 如果用户滥用环境变量传入非法值,可能导致 Python 命令参数格式错误;但已有双引号保护。
  • 默认值 PROFILE_RANKS=${PROFILE_RANKS:-[2,4]} 未加额外引号,在极端条件下可能受 globbing 影响,但实际运行时目录很少存在名为 [2,4] 的文件。
  • SAVE_PATH 默认值改为 ./profiler_data-dis,与 CI 中清理路径一致,但若用户自定义覆盖,需确保清理逻辑匹配。

影响范围小:只影响 NPU profiling 测试脚本及其 CI 调用。受益用户是需要在 NPU 上执行 profiling 的开发者,现在可以外部覆盖参数,无需修改脚本。团队 CI 流程增加了一次显式验证和清理,提升了可维护性。

缺少测试覆盖 潜在 Bash globbing 问题

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论