作者:昇腾实战派
知识地图链接:强化学习知识地图

背景概述

在大语言模型训练过程中,强化学习优化是提升模型性能的关键环节。本文记录了基于昇腾Atlas 800T A2设备,使用GRPO算法对Qwen2.5-VL-7B模型进行强化学习训练的全过程。通过详细的配置说明和问题解决方案,为开发者提供一套完整的训练实践指南,帮助快速搭建训练环境并完成模型优化。

一、版本信息

硬件平台:Atlas 800T A2
软件版本

工具 版本 备注
python 3.11
cann 8.3.rc1
hdk 25.2.0
torch 2.7.1
torch_npu 2.7.1
vllm 0.11.0 https://github.com/vllm-project/vllm/tree/v0.11.0
vllm-ascend 0.11.0.rc1 https://github.com/vllm-project/vllm-ascend/tree/v0.11.0rc1
verl 0.7.0.dev0

二、核心参数

2.1 数据配置

data.train_batch_size=512 \
data.max_prompt_length=1024 \
data.max_response_length=2048 \

2.2 并行配置

actor_rollout_ref.rollout.tensor_model_parallel_size=4 \

2.3 节点显卡配置

trainer.n_gpus_per_node=8 \

三、数据集及预处理

使用开源GSM8K数学推理数据集,该数据集包含高质量的数学问题及其推理过程,适合用于强化学习训练。

数据集链接:https://huggingface.co/datasets/openai/gsm8k

数据集预处理:

python3 examples/data_preprocess/gsm8k.py --local_save_dir ~/data/gsm8k

将数据集预处理为parquet格式,以便包含计算RL奖励所需的必要字段。

四、部署指导

4.1 镜像拉取

参考verl官方仓中,昇腾镜像构建文档
昇腾会发布每日基于dockerfile构建的最新docker,发布链接:https://quay.io/repository/ascend/verl?tab=tags&tag=latest
拉最新的镜像:

docker pull quay.io/ascend/verl:verl-8.3.rc1-910b-ubuntu22.04-py3.11-latest

4.2 容器启动

新建start_docker.sh,执行sh start_docker.sh启动容器

#!/bin/b
# 容器名称
CONTAINER_NAME="verl-qwen25VL"
# 镜像名称(需替换为实际使用的镜像名+标签,如 mindspeed-llm:v1.0)
IMAGE_NAME="quay.io/ascend/verl:verl-8.3.rc1-910b-ubuntu22.04-py3.11-latest"
WORK_VOLUME="/data02/weights:/models/"
WORK_VOLUME2="/home/l00919516:/workspace/"
echo -e "\033[32m[操作] 开始启动容器 $CONTAINER_NAME,使用镜像 $IMAGE_NAME...\033[0m"
docker run -dit \
--ipc=host \
--network host \
--name "$CONTAINER_NAME" \
--privileged \
 -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
 -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
 -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
 -v /usr/local/sbin:/usr/local/sbin \
 -v /etc/hccn.conf:/etc/hccn.conf \
 -v /etc/localtime:/etc/localtime \
-v "$WORK_VOLUME" \
-v "$WORK_VOLUME2" \
"$IMAGE_NAME" \
/bin/bash

# ========================== 启动结果校验 ==========================
if [ $? -eq 0 ]; then
echo -e "\033[32m[成功] 容器 $CONTAINER_NAME 启动完成!\033[0m"
echo -e "\033[32m[后续操作] 执行以下命令进入容器:\033[0m"
echo -e " docker exec -it $CONTAINER_NAME bash"
else
echo -e "\033[31m[失败] 容器 $CONTAINER_NAME 启动失败,请检查镜像名称/挂载路径是否正确!\033[0m"
exit 1
fi
  • CONTAINTER_NAME:自定义容器名
  • IMAGE_NAME: 使用的镜像名称,<仓库地址:tag>
  • WORK_VOLUME: 物理机与容器对应的文件路径,<物理机路径: 容器内路径>

启动后执行docker exec -it <container_name> bash进入容器

4.3 启动训练

新建tune_qwen25vl7b_grpo.sh

set -x
ENGINE=${1:-vllm}

# Some models are optimized by vllm ascend. While in some case, e.g. rlhf training, 
# the optimized model may not be suitable. In this case, set this value to 0 to disable the optimized model.
export USE_OPTIMIZED_MODEL=0
export VLLM_ASCEND_ENABLE_NZ=0

python3 -m verl.trainer.main_ppo \
    algorithm.adv_estimator=grpo \
    data.train_files=/workspace/verl/gsm8k/train.parquet \
    data.val_files=/workspace/verl/gsm8k/test.parquet \
    data.train_batch_size=512 \
    data.max_prompt_length=1024 \
    data.max_response_length=2048 \
    data.filter_overlong_prompts=True \
    data.truncation='error' \
    data.image_key=images \
    actor_rollout_ref.model.path=/models/Qwen2.5-VL-7B-Instruct \
    actor_rollout_ref.actor.optim.lr=1e-6 \
    actor_rollout_ref.model.use_remove_padding=True \
    actor_rollout_ref.actor.ppo_mini_batch_size=32 \
    actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=2 \
    actor_rollout_ref.actor.use_kl_loss=True \
    actor_rollout_ref.actor.kl_loss_coef=0.01 \
    actor_rollout_ref.actor.kl_loss_type=low_var_kl \
    actor_rollout_ref.actor.entropy_coeff=0 \
    actor_rollout_ref.actor.use_torch_compile=False \
    actor_rollout_ref.model.enable_gradient_checkpointing=True \
    actor_rollout_ref.actor.fsdp_config.param_offload=False \
    actor_rollout_ref.actor.fsdp_config.optimizer_offload=False \
    actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=4 \
    actor_rollout_ref.rollout.tensor_model_parallel_size=4 \
    actor_rollout_ref.rollout.name=$ENGINE \
    +actor_rollout_ref.rollout.engine_kwargs.vllm.disable_mm_preprocessor_cache=True \
    actor_rollout_ref.rollout.gpu_memory_utilization=0.5 \
    actor_rollout_ref.rollout.enable_chunked_prefill=False \
    actor_rollout_ref.rollout.enforce_eager=True \
    actor_rollout_ref.rollout.free_cache_engine=True \
    actor_rollout_ref.rollout.n=5 \
    actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=4 \
    actor_rollout_ref.ref.fsdp_config.param_offload=True \
    algorithm.use_kl_in_reward=False \
    trainer.critic_warmup=0 \
    trainer.logger=console \
    trainer.project_name='verl_grpo_example_geo3k' \
    trainer.experiment_name='qwen2_5_vl_7b_function_rm' \
    trainer.n_gpus_per_node=8 \
    trainer.nnodes=1 \
    trainer.save_freq=-1 \
    trainer.test_freq=-1 \
    trainer.total_epochs=15 \
    trainer.device=npu $@

执行 sh tune_qwen25vl7b_grpo.sh启动训练

4.4 报错解决

4.4.1 OSError: Not enough disk space

在这里插入图片描述

解决:找一块空间充足的盘,在启动脚本前,将ray的存储路径更换至空间充足的盘中

# 1. 创建 Ray/数据集/系统临时目录
mkdir -p /models/ray_tmp /models/ray_spill /models/dataset_cache /models/system_tmp

# 2. 设置 Ray 相关环境变量:指向 /models 下的目录
export RAY_TMPDIR=/models/ray_tmp                  # Ray 临时文件目录
export RAY_DISK_SPILLING_DIR=/models/ray_spill     # Ray 磁盘溢出目录
export RAY_OBJECT_STORE_ALLOW_SLOW_STORAGE=1       # 允许 /models(非高速磁盘)存储 Ray 对象
export RAY_LOGDIR=/models/ray_logs                 # Ray 日志目录(可选,避免日志占满根目录)

# 3. 设置数据集缓存目录:指向 /models
export HF_DATASETS_CACHE=/models/dataset_cache     # HuggingFace 数据集缓存
export DATASETS_CACHE=/models/dataset_cache        # 兼容 datasets 库的不同环境变量

# 4. 设置系统临时目录:替换默认 /tmp(根目录)为 /models
export TMPDIR=/models/system_tmp
export TEMP=/models/system_tmp
export TMP=/models/system_tmp
4.4.2 ValueError: FRACTAL_NZ mode is enabled.
  • ValueError: FRACTAL_NZ mode is enabled. This may cause model parameter precision issues in the RL scenarios. Please set VLLM_ASCEND_ENABLE_NZ=0.

解决:sh中添加

export VLLM_ASCEND_ENABLE_NZ=0

五、复现结果

在这里插入图片描述

a2单机8卡,13step

5.1 精度数据

在这里插入图片描述

5.2 性能数据

在这里插入图片描述

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐