当前位置: 首页 > news >正文

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博客


📝 总结 & 建议

  1. 优先复现 Lora 版本,复杂性更低,能快速验证流程是否通畅;

  2. 明确 FlashAttention 所需的 GLIBC、CUDA 环境,建议使用 Docker 固定版本;

  3. 对 Transformers 版本敏感组件进行接口封装,防止 import error;

  4. 每次配置不成功时,尽量使用 最小复现例子 来 isolate 问题,避免在复杂脚本中排查;

  5. 多关注官方 issues 区,比如 #242,可能能救你一命。


如果你也在复现大模型强化学习训练中踩坑,欢迎留言交流,我们一起少走弯路!🛠️🚀

http://www.lryc.cn/news/585714.html

相关文章:

  • Linux修炼:权限
  • SpringCloud【OpenFeign】
  • 学习日记-spring-day46-7.11
  • 伺服驱动控制CANopen协议
  • 网络编程(基本概念)
  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • TCP详解——流量控制、滑动窗口
  • mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
  • 【JMeter】调试方法
  • 论容器化 | 分析Go和Rust做医疗的后端服务
  • Express实现定时任务
  • 飞算科技正在撬动各行业数字化转型的深层变革
  • ch06 部分题目思路
  • OpenCV实现感知哈希(Perceptual Hash)算法的类cv::img_hash::PHash
  • 深入探究编程拷贝
  • 基于Java Spring Boot开发的旅游景区智能管理系统 计算机毕业设计源码32487
  • 4万亿英伟达,凭什么?
  • 【Linux应用】Ubuntu20.04 aarch64开发板一键安装ROS2(清华源)
  • PandaCoder重大产品更新-引入Jenkinsfile文件支持
  • mysql的LIMIT 用法
  • 【AI大模型】超越RAG的搜索革命!分层框架让AI像专家团队一样深度思考
  • Java教程:JavaWeb ---MySQL高级
  • 隆重介绍 Xget for Chrome:您的终极下载加速器
  • linux kernel struct regmap_config结构详解
  • 【Quest开发】快速添加可手指触摸按钮
  • 3 OneNET-调试器模拟上报数据
  • Visual Studio Code 的 settings.json 配置指南
  • HarmonyOS NEXT端云一体化开发初体验
  • 世俱杯直播数据源通过反汇编获取到
  • gradle中namespace和applicationId的区别