昇腾平台VeRL测试方法概述

昇腾平台VeRL测试方法概述

作者​:昇腾实战派
知识地图​:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003

背景简介

VeRL原生支持GPU,昇腾作为VeRL开源社区贡献方,对VeRL进行适配,使其能在NPU上运行。因此,需要对社区原生特性在NPU上的支持情况以及一些NPU上的新增特性进行测试。

简单说,强化学习包含训练和推理两部分,是一种边推边训的框架。区别于预训练和微调,强化学习是后训练,基于推理的结果对训练进行指导。

下面介绍VeRL的测试方法:

环境部署

安装HDK、CANN、PTA
准备VeRL、vllm、vllm-ascend、Megatron(可选)、MindSpeed(可选)等源码,安装相关依赖verl/blob/main/docs/ascend_tutorial/get_start/quick_start.rst

以release的版本(v0.8.0)为例,基本配套如下:

verlvllmvllm-ascendtorchtorch_npucann
v0.8.00.18.00.18.02.9.02.9.0.post29.0.0

详细配套请参考verl/docs/ascend_tutorial/get_start/install_guidance.rst at main · verl-project/verl · GitHub

模型训练

数据预处理、权重转换、参数配置、启动训练

性能

  • throughput:端到端吞吐
  • perf/time_per_step:单步总时长

精度

  1. 参考指标:
  • critic/rewards/mean

    类似LLM的loss,但是越高越好,一般要求训练过程中rewards是上升趋势

  1. 测试验收方式:
    如果是有标杆的情况,需要使用训练后保存的权重进行评测,参考下面模型推理的精度测试方法

模型推理(评测)

服务端

使用模型训练的环境拉起服务端

# NPU服务端python-mvllm.entrypoints.openai.api_server\--model="/home/zbz/Qwen3-32B/"\--served-model-name auto\--gpu-memory-utilization0.9\--max-num-seqs24\--max-model-len22528\--max-num-batched-tokens22528\--enforce-eager\--trust-remote-code\--distributed_executor_backend=mp\--tensor-parallel-size4\--data-parallel-size1\--generation-config vllm\--port6380
  • model:训练后的权重路径,需要是hf格式,保存后的若是mg格式,需要转回hf
  • tensor-parallel-size:TP建议和训练时infer的配置保持一致
  • data-parallel-size:DP建议和训练时infe的配置保持一致
  • port:可任意设置空闲端口
  • max-model-len:输入序列长度+输出序列长度
  • max-num-batched-tokens: 和max-model-len一致即可
客户端

另起一个会话,并且需要新建一个conda或者venv环境安装ais-benchmark(避免环境依赖冲突)

gitclone https://gitee.com/aisbench/benchmark.gitcdbenchmark/ pip3install-e./ --use-pep517

按需下载aime、MATH等数据集,放到benchmark/ais_bench/datasets目录下

然后修改评测脚本
vim benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_stream_chat.py

fromais_bench.benchmark.utils.model_postprocessorsimportextract_non_reasoning_contentfromais_bench.benchmark.modelsimportVLLMCustomAPIChatStream models=[dict(attr="service",# local or servicetype=VLLMCustomAPI,abbr='vllm-api-general',path="",model="",max_seq_len=2048,# 输入长度request_rate=0,rpm_verbose=False,retry=2,host_ip="localhost",# 推理服务的IPhost_port=6380,# 推理服务的端口enable_ssl=False,max_out_len=20480,# 最大输出tokens长度batch_size=48,# 推理的最大并发数generation_kwargs=dict(temperature=0,seed=1234,))]

评测命令如下:

ais_bench --models vllm_api_chat --datasets aime2024_gen

其中datasets的值需要和benchmark/ais_bench/benchmark/configs/datasets/下各数据集的py文件名称对应一致

下面提供循环评测的代码以便验证:

# 启动命令#!/bin/bashfor((i=1;i<=4;i++))doecho"==================aime2024_gen times:$i"ais_bench--modelsvllm_api_stream_chat--datasetsaime2024_gendonefor((i=1;i<=4;i++))doecho"==================math_prm800k_500_0shot_cot_gen times:$i"ais_bench--modelsvllm_api_stream_chat--datasetsmath_prm800k_500_0shot_cot_gendone

故障排查

  1. 执行训练脚本后,ray从一开始就连不通
    确保各节点python版本、ray的版本一致,且各节点没有开启防火墙,确保ray通信不会被拦截。可以使用以下代码进行测试:

    • 关闭防火墙systemctl stop firewalld
    • 主节点ray start --head --port 6366
    • 备节点ray start --address='主节点ip:6366

    若无法联通,需要检查环境的集群配置是否正常。

  1. 执行训练脚本后,一开始ray能联通,后续ray自行断联
    这种情况一般是备节点能够联通主节点,但主节点无法联通备节点。可以互换主备节点,使用1的方式进行测试。
  1. 评测报错ValueError: This model’s maximum context length is 0 tokens. However, your request has 195 input tokens. Please reduce the length of the input messages.
    benchmark/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general.py脚本中的输入输出长度和服务端脚本max_model_len不对应,max_model_len = 输入+输出。