视觉智能体(Visual Agent):Qwen3-VL 能操作电脑和手机界面:识别 GUI 元素、理解按钮功能、调用工具、执行任务,在 OS World 等 benchmark 上达到世界顶尖水平。
视觉 Coding 能力大幅提升:实现图像生成代码以及视频生成代码,例如看到设计图,能自动代码生成 http://Draw.io 图表,甚至输出完整的 HTML/CSS/JS 代码,真正实现“所见即所得”的视觉编程。
空间感知能力大幅提升:支持判断物体方位、视角变化、遮挡关系,能实现 3D grounding,为复杂场景下的空间推理和具身场景打下基础。
长上下文支持:全系列模型原生支持 256K token 的上下文长度,并可扩展至 100 万 token。这意味着,无论是几百页的技术文档、整本教材,还是长达数小时的会议录像或教学视频,都能完整输入、全程记忆、精准检索。
超长视频理解:不仅能理解长达两小时的视频内容,还能根据时间戳精确定位“什么时候发生了什么”,并支持连续帧中对物体的追踪与行为分析。
多模态思考能力显著增强:Thinking 模型重点优化了 STEM 与数学推理能力,在 MathVista、MathVision、CharXiv 等权威评测中达到 SOTA 水平。
视觉感知与识别能力全面升级:识别更丰富的对象类别,从名人、动漫角色、商品、地标,到动植物等,覆盖日常生活与专业领域的“万物识别”需求。
OCR 能力重大升级:支持语言从 19 种扩展到 32 种;在复杂光线、模糊、倾斜等实拍挑战性场景下表现更稳定;对生僻字、古籍字、专业术语的识别准确率显著提升;超长文档理解和精细结构还原能力进一步提升。
模型huggingface链接:Qwen/Qwen3-VL-4B-Instruct

本案例使用昇腾A2机器上,基于VeRL 框架完成Qwen3-VL-4B-GRPO算法强化学习实践。
| 硬件名称 | 配置信息 | 备注 |
|---|---|---|
| 机器型号 | A2 | 910B3 |
| 测试集群 | 8卡 | 单机 |
安装完成后版本概览
| 软件 | 版本 | 部署方式 |
|---|---|---|
| Driver | AscendHDK 25.2.0 | 宿主机 |
| Firmware | AscendHDK 25.2.0 | 宿主机 |
| CANN | 8.3.RC1 | 容器 |
| Python | 3.11.13 | 容器 |
| torch | 2.7.1 | 容器 |
| torch_npu | 2.7.1 | 容器 |
| transformers | 4.57.3 | 容器 |
| torchvision | 0.22.1 | 容器 |
| ray | 2.46.0 | 容器 |
参考DockerFile: 根据https://github.com/volcengine/verl/blob/main/docker/ascend/Dockerfile.ascend_8.3.rc1_a2修改,详情见当前项目/DockerFile目录。
本环境制作时间:2025年12月15日。
本环境在制作时使用清华源,并将所有源代码放置于/home目录下。
Geometry3k 数据集是由加利福尼亚大学洛杉矶分校联合浙江大学发布的一个几何问题数据集,主要用于视觉问答任务,相关论文成果为:「Inter-GPS: Interpretable Geometry Problem Solving with Formal Language and Symbolic Reasoning.」。该数据集共有 3002 个样本,包含图像和文本两种模态数据,按照 7:1:2 的比例划分为训练集、验证集和测试集,其中训练集有 2100 条左右数据 。
该数据集描述了丰富多样的几何问题,如求解角度、边长、面积、周长等,总共有 6293 个文本项。
图表用于辅助呈现几何问题中的图形信息,如各种几何形状(三角形、圆形、四边形等)及其相互关系,总共有 27213 个文本项。

原始数据集地址:https://hf-mirror.com/datasets/hiyouga/geometry3k
测试过程中我们采用hiyouga/geometry3k,下载数据集并将数据集预处理为parquet格式,以便包含计算RL奖励所需的必要字段。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
cd /home/verl/
python3 examples/data_preprocess/geo3k.py --local_dir "你保存处理后数据的路径"
如果数据集已经下载到本地,则运行
python3 examples/data_preprocess/geo3k.py --local_dataset_path “本地路径” --local_dir "你保存处理后数据的路径"下载HuggingFace权重到指定目录下,比如/data:
魔塔社区权重链接:https://www.modelscope.cn/models/Qwen/Qwen3-VL-4B-Instruct
jemalloc(由 Facebook 优化)和 tcmalloc(Google 的线程缓存分配器)在 内存分配效率、碎片控制、多线程性能 等方面显著优于传统的 malloc(如 glibc 的 ptmalloc2)。
jemalloc也可以通过DockerFile安装
# 要求Ubuntu版本>=20.04
# 安装 jemalloc
sudo apt update
sudo apt install libjemalloc2set -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
# 内存分配优化
if [ -f "/usr/lib/aarch64-linux-gnu/libjemalloc.so.2" ]; then
export LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libjemalloc.so.2${LD_PRELOAD:+:$LD_PRELOAD}"
echo "jemalloc enabled"
else
echo "Running without jemalloc - consider installing it for better performance"
echo "sudo apt-get install libjemalloc2"
fi
python3 -m verl.trainer.main_ppo \
algorithm.adv_estimator=grpo \
data.train_files=/data/geo3k/train.parquet \
data.val_files=/data/geo3k/test.parquet \
data.train_batch_size=512 \
data.max_prompt_length=2048 \
data.max_response_length=2048 \
data.filter_overlong_prompts=True \
data.truncation='error' \
data.image_key=images \
actor_rollout_ref.model.path=/data/Qwen3-VL-4B-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=16 \
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=True \
actor_rollout_ref.actor.fsdp_config.optimizer_offload=True \
actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=4 \
actor_rollout_ref.rollout.tensor_model_parallel_size=2 \
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.6 \
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='qwen3_vl_4b_npu_fsdp' \
trainer.n_gpus_per_node=8 \
trainer.nnodes=1 \
trainer.save_freq=20 \
trainer.test_freq=10 \
trainer.total_epochs=15 \
trainer.device=npu $@
注意:jemalloc的路径可能不同环境有所不同
日志可以参考这个项目进行曲线绘制:
https://github.com/CurryRice233/TrainingLogParser?tab=readme-ov-file
reward曲线:

验证集准确率曲线:

回答长度曲线
