作者:昇腾实战派
知识地图: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)为例,基本配套如下:
| verl | vllm | vllm-ascend | torch | torch_npu | cann |
|---|---|---|---|---|---|
| v0.8.0 | 0.18.0 | 0.18.0 | 2.9.0 | 2.9.0.post2 | 9.0.0 |
详细配套请参考verl/docs/ascend_tutorial/get_start/install_guidance.rst at main · verl-project/verl · GitHub
模型训练
数据预处理、权重转换、参数配置、启动训练
性能
- throughput:端到端吞吐
- perf/time_per_step:单步总时长
精度
- 参考指标:
- critic/rewards/mean
类似LLM的loss,但是越高越好,一般要求训练过程中rewards是上升趋势
- 测试验收方式:
如果是有标杆的情况,需要使用训练后保存的权重进行评测,参考下面模型推理的精度测试方法
模型推理(评测)
服务端
使用模型训练的环境拉起服务端
# 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故障排查
执行训练脚本后,ray从一开始就连不通
确保各节点python版本、ray的版本一致,且各节点没有开启防火墙,确保ray通信不会被拦截。可以使用以下代码进行测试:
- 关闭防火墙
systemctl stop firewalld- 主节点
ray start --head --port 6366- 备节点
ray start --address='主节点ip:6366若无法联通,需要检查环境的集群配置是否正常。
- 执行训练脚本后,一开始ray能联通,后续ray自行断联
这种情况一般是备节点能够联通主节点,但主节点无法联通备节点。可以互换主备节点,使用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 = 输入+输出。