当前位置: 首页 > 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.dtcms.com/a/273990.html

相关文章:

  • 在HTML中CSS三种使用方式
  • 飞算JavaAI:重塑Java开发的“人机协同“新模式
  • vue3+node.js+mysql写接口(二)
  • 优学教育实战03跟进管理
  • tensor
  • axios 与 fetch 的区别
  • C++前缀和与差分的深度探索
  • “SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用
  • K8s Service 终极解析:源码、性能、故障排查全攻略
  • 【VScode | 快捷键】全局搜索快捷键(ctrl+shift+f)失效原因及解决方法
  • Github创建仓库并通过VS Code推送项目
  • FPGA开发一个精确反馈控制算法 实现动态调控电磁反馈,控制流过线圈的电流,产生不同大小不同方向的磁力 电路结构设计PCB版图的绘制
  • 小白学Python,标准库篇——随机库、正则表达式库
  • Rail开发日志_5
  • 物联网与互联网融合生态
  • 鸿蒙 Secure Boot 全流程解析:从 BootROM 到内核签名验证的实战指南
  • 使用Selenium自动化获取抖音创作者平台视频数据
  • 深入解析:UPF/PGW-U如何通过PPP/L2TP隧道实现终端PAP/CHAP接入
  • [python]在drf中使用drf_spectacular
  • FPGA通信设计十问
  • 液冷智算数据中心崛起,AI算力联动PC Farm与云智算开拓新蓝海(二)
  • MyBatis02-mybatis-config.xml配置文件讲解
  • Django--02模型和管理站点
  • 链表算法之【判断链表中是否有环】
  • 从零实现一个GPT 【React + Express】--- 【3】解析markdown,处理模型记忆
  • RapidFuzz-CPP:高效字符串相似度计算的C++利器
  • ICLR 2025 | InterpGN:时间序列分类的透明革命,Shapelet+DNN双引擎驱动!
  • 【TCP/IP】18. 因特网服务质量
  • 输入流挂起
  • Promise :then 与 catch 同时触发