VLM-R1 + GRPO 算法完整复现全过程日志
📌 仓库地址:om-ai-lab/VLM-R1: Solve Visual Understanding with Reinforced VLMs
我真 TMD 服了 🤯!
这是我科研以来最离谱的一次环境配置,整整肝了快 10 个小时,只为了跑通一个训练脚本💥。
CUDA 对不上,Triton 编译挂,FlashAttention 报 libc 错误,连 gcc 都要我手动指定版本 🤬。
每一步都像踩雷,报错一个接一个,搞到心态炸裂。
这篇总结就是为下一个走这条路的倒霉蛋准备的,也是写给未来的我:看完再动手,别再踩坑了!
💡 背景介绍
在尝试将 VLM-R1 项目中的 GRPO(Guided Reinforcement Prompt Optimization)算法应用于自己的任务时,我亲身经历了一场旷日持久的环境配置噩梦。整个过程累计耗时接近 10 个小时,其中踩坑无数,特别是在 FlashAttention、GLIBC 版本不匹配、Deepspeed 执行异常、Qwen2.5-VL 兼容问题等方面极其繁琐。
本篇博客将对整个复现过程中的关键步骤和典型问题做一个系统性总结,方便大家(尤其是使用多卡分布式训练、非 root 权限服务器的研究者)少走弯路。
📦 Step 1. 基础环境配置
✅ 环境创建(根据官方文档)
conda create -n vlm-r1 python=3.10
conda activate vlm-r1
bash setup.sh
注意事项:
-
setup.sh
内部包含依赖安装、FlashAttention 编译等多个步骤,不建议手动跳过任何步骤。 -
该脚本会尝试安装
gcc-13
,需要提前检查是否具备该编译器环境。
📂 Step 2. 数据准备
根据 readme 文档下载数据:
wget https://huggingface.co/datasets/omlab/VLM-R1/resolve/main/train2014.zip --no-check-certificate
wget https://huggingface.co/datasets/omlab/VLM-R1/resolve/main/rec_jsons_processed.zip --no-check-certificate
根据 run_scripts/run_grpo_rec.sh
中的注释信息修改数据路径:
data_paths="/data1/vincia/VLM-R1/data/rec_jsons_processed/refcoco_train.jsonl"
image_folders="/data1/vincia/VLM-R1/data"
推荐提前检查数据文件是否符合 JSONL 格式、是否存在乱码等问题,否则训练前期直接报错会非常浪费调试时间。
❗ Step 3. 重磅踩坑合集(高能预警⚠️)
⚠️ 1. GLIBC_2.32
not found 报错
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found
原因:系统 GLIBC 版本过低,无法兼容编译好的 FlashAttention2 模块。
解决方案:
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32‘ not found-CSDN博客
⚠️ 2. gcc-13
缺失导致编译失败
FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/gcc-13'
原因:默认在系统路径 /usr/bin/gcc-13
查找 GCC 13 编译器,找不到则报错。
解决方案:
FileNotFoundError: ‘/usr/bin/gcc-13‘-CSDN博客
⚠️ 3. GET was unable to find an engine to execute this computation
RuntimeError: GET was unable to find an engine to execute this computation
原因:使用 Deepspeed + FP16 训练时,未能正确识别设备或 CUDA 执行路径异常。
解决方案:
RuntimeError: GET was unable to find an engine to execute this computation-CSDN博客
⚠️ 4. Qwen2.5-VL 模块导入失败
ImportError: cannot import name 'Qwen2_5_VLVisionFlashAttention2'
原因:最新的 transformers
版本中可能已经变动接口或移除部分 Qwen2.5
相关方法。
解决方案:回退到官方推荐版本的 transformers:
pip install transformers==4.49.0
⚠️ 5. AutoModel 加载配置类报错
ValueError: Unrecognized configuration class <class 'Qwen2_5_VLConfig'> for this kind of AutoModel: AutoModelForCausalLM
原因:Qwen2.5-VL 模型不兼容 AutoModelForCausalLM
加载器。
解决方案:
https://github.com/om-ai-lab/VLM-R1/issues/242#issue-3005082200
🎉 喜提 CUDA out of memory!
在尝试多轮修复之后,当我第一次喜提:
RuntimeError: CUDA out of memory
我居然……感动到流泪 😭第一次这么喜欢这个报错 —— 因为这意味着所有环境相关问题都已解决,模型成功加载,训练终于快要开始了!
✅ 成功运行的最终配置
-
使用
3090 * 8
的服务器,但 Qwen2.5/VL-3B 模型 + Deepspeed 即使最小 batch size 也容易爆显存。 -
最终使用了官方提供的 LoRA 启动脚本:
run_grpo_rec_lora.sh
成功启动训练。
bash run_grpo_rec_lora.sh
训练相关超参数:
-
per_device_train_batch_size
: 尽量设小,防止 OOM -
num_generations
: 控制样本生成数目,直接影响推理阶段显存 -
gradient_accumulation_steps
: 适当放大以模拟大 batch 训练 -
「GRPO训练参数详解:理解Batch构成与生成数量的关系」-CSDN博客
📝 总结 & 建议
-
优先复现 Lora 版本,复杂性更低,能快速验证流程是否通畅;
-
明确 FlashAttention 所需的 GLIBC、CUDA 环境,建议使用 Docker 固定版本;
-
对 Transformers 版本敏感组件进行接口封装,防止 import error;
-
每次配置不成功时,尽量使用
最小复现例子
来 isolate 问题,避免在复杂脚本中排查; -
多关注官方 issues 区,比如 #242,可能能救你一命。
如果你也在复现大模型强化学习训练中踩坑,欢迎留言交流,我们一起少走弯路!🛠️🚀