惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
F
Full Disclosure
A
About on SuperTechFans
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
Know Your Adversary
Know Your Adversary
K
Kaspersky official blog
L
LINUX DO - 热门话题
Recorded Future
Recorded Future
C
Cisco Blogs
M
MIT News - Artificial intelligence
T
Tenable Blog
G
GRAHAM CLULEY
月光博客
月光博客
Recent Announcements
Recent Announcements
V
Visual Studio Blog
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
P
Privacy International News Feed
P
Proofpoint News Feed
I
Intezer
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
O
OpenAI News
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
The Cloudflare Blog
Spread Privacy
Spread Privacy
酷 壳 – CoolShell
酷 壳 – CoolShell
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed

博客园 - 左扬

VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— VictoriaLogs 协同:Metrics 到 Logs 的一体化监控 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 源码阅读路线图:如何高效阅读 VM 源码 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 开源生态:VM 在 CNCF 生态中的位置 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比:Prometheus/InfluxDB/Thanos/VM VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 写入吞吐/查询延迟/内存占用的数学模型 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 模块依赖图——从 import 语句看组件关系 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Goroutine 池/atomic/零拷贝/sync.Pool VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 多租户架构——accountID/projectID 与 tenant 隔离 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 版本演进:1.146.0 LTS 重大更新解析 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 整体数据流:一条监控数据的完整生命周期 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 架构演进:从 TSDB 到 MergeSet 的设计取舍 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Single-Node vs Cluster 模式本质区别 VictoriaMetrics 1.146.0 源码【左扬精讲】—— 开篇总览 Rust 专题【左扬精讲】—— 从语法到灵魂:Ownership、Borrowing 与多语言对比 kubernetes 源码【左扬精讲】—— kube-scheduler 启动流程源码分析 Rust 专题【左扬精讲】—— 选择控制语句、运算符与格式化输出 Rust 专题【左扬精讲】—— 所有权详解 Rust 专题【左扬精讲】—— 作用域详解 Rust 专题【左扬精讲】—— 变量、常量与标量数据类型 kubernetes 源码 / Operator 专题【左扬精讲】—— Deployment Controller 源码分析:从对象创建到滚动更新 kubernetes 源码 / Operator 专题【左扬精讲】—— Operator 开发中的 Webhook:从准入控制到生产部署 Kubernetes源码 / Operator 专题【左扬精讲】—— 实现 Application Controller:从零构建生产级控制器 Kubernetes 编程 / Operator 专题【左扬精讲】—— 定义 Application 资源 + 添加自定义新 API 完整指南 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八):内部架构与核心组件 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八): —— 从入口到调度的全链路源码剖析(k8s v1.36.1) DeepSeek-R1 工业 RAG + 微调混合系统【左扬精讲】—— R1 系列收官之作:从 Prompt → RAG → 微调 选型决策树 DeepSeek-R1 推理时扩展【左扬精讲】—— o1 / R1 慢思考机制:Self-Consistency + ToT + PRM 详解 DeepSeek-R1 端侧 LLM 工程【左扬精讲】—— llama.cpp 调参与 Apple Silicon / 国产 NPU / Android 端侧落地全攻略 DeepSeek-R1 vLLM + k8s 生产部署【左扬精讲】—— 从单卡 7B 到 100 卡 671B MoE 集群的工业化部署实战 DeepSeek-R1 评估与系统(Evaluation & Systems)【左扬精讲】—— 从 GSM8K/MMLU 到 LLM-as-Judge 的工业级评估方法论 DeepSeek-R1 模型训练与算法【左扬精讲】—— GRPO 进阶算法:DAPO / PRIME / RLVR / PRM 四大 2025 前沿改进 DeepSeek-R1 模型训练与算法【左扬精讲】—— 数据蒸馏:用 DeepSeek-R1-671B 生成 800K 高质量 CoT 样本的完整流水线 DeepSeek-R1 优化与微调实战【左扬精讲】—— 从 R1 强化学习新范式到 GRPO 微调一站式入门 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 七):自定义插件开发实战 —— 手写一个 Score 插件并注册到集群 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 六):Scheduler Profile 与多调度器 —— 如何配置多个 profile 实现多租户、Coordinated LeaderElection Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 五):SchedulingQueue 与 QueueingHint —— 三段队列的细节、v1.36 新引入的 QueueingHint 工作机制 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 四):抢占(Preemption)算法剖析 —— DefaultPreemption 如何选 victim、PodDisruptionBudget 如何约束 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 二):内置插件逐个精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件 逐个精读 k8s 源码级精讲(二十六):调度器内置插件逐个精读 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):Scheduling Framework 扩展点逐个源码拆解 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):初识调度模型、内部架构与事件驱动机制 Kubernetes 编程 / client-go 专题【左扬精讲】—— 四种客户端:为什么、怎么选、怎么用 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime、kubebuilder、operator-sdk 三大框架深度对比 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入理解 ManagedFields 字段冲突协调机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Finalizers 深度解析:对象的生命周期与删除控制 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference 字段与级联删除机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入学习 Server-Side Apply:managedFields 替代 last-applied-configuration 的演进方向 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Annotations 与元数据体系(Operator 专题) Kubernetes 编程 / Operator 专题【左扬精讲】—— RESTMapper:把 Group / Version / Kind / Resource 四元组翻译成 REST 路径的"查字典"大师 Kubernetes 编程 / Operator 专题【左扬精讲】—— Converter 资源版本转换器 Kubernetes 编程 / Operator 专题【左扬精讲】—— Application 业务扩展:从单 Deployment 到多 Workload 的复合 Operator 演进 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference / Finalizer / 准入控制:k8s 资源生命周期的三大支柱 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime 框架内幕:从 Manager 到 Reconcile 的全栈拆解 Kubernetes 编程 / Operator 专题【左扬精讲】—— 生产级 Operator 最佳实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— application-operator Reconcile 循环源码精讲:从 client-go Informer 到 workqueue 的全链路解剖 Kubernetes 编程 / Operator 专题【左扬精讲】—— 从零搭建一个 application-operator 新项目:脚手架、API 设计与基于原生 DeploymentStatus/ServiceStatus 的状态建模 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:生产级 Controller 实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析: Controller 调试与诊断工具:从日志分析到问题定位 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DynamicClient 操作 CRD:无需代码生成的动态操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:控制器与 APIServer 完整交互流程:从 Watch 到缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:错误处理与重试机制:WorkQueue 限速器详解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Leader 选举机制:高可用控制器的必备技能 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Controller 开发模式完整实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:SharedInformerFactory 与等待缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:从认证配置到 Deployment 操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:版本对应、架构组件与组件关系 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Informer 源码深度解析:从底层原理到实战应用 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Reflector 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:ListWatcher 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Indexer 与 ThreadSafeStore 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DeltaFIFO 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:workqueue 核心原理与实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— runtime.Codec 资源编解码:serializer 与 codec 差异、编解码数据结构、codec 核心调用链路 Kubernetes 编程 / Operator 专题【左扬精讲】—— Scheme 资源注册机制全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 自定义资源的内部版本与外部版本:从源码看版本定义机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 1.36.1 核心 API 数据结构全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 构建过程 【AIOPS】一文读懂LLM【左扬精讲】:从诞生到普及,解锁大语言模型的核心密码 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Hooks 源码精讲:Hooks 可观测性的无侵入式实现 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 配置解析源码精讲 ——SRE 自定义 Agent 核心技巧 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 并发模型解析 ——SRE 应对高并发采集的调优思路 【AIOPS】AI Agent 专题【左扬精讲】基础架构篇:MCP-VictoriaMetrics Golang 源码整体架构拆解 ——SRE 必懂的核心模块与数据流 OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(下篇)—— 预测式弹性扩缩容 Operator 落地实现) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(上篇)—— 时序预测模型构建与离线训练) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3(上篇)—— 面向 AI / 算力调度场景:GPU 竞价实例资源池统一调度管理 Operator 开发 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目 2 —— 面向零售 / 电商潮汐流量难题:多云多集群数据中心级全链路弹性伸缩 DataCenter Scaler Operator 从 0 到 1 全链路开发 Kubernetes编程 / Operator专题【左扬精讲】—— 深入理解Kubebuilder注解:为什么Operator开发离不开这些特殊注释 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目1 —— Applicaion Operator(通用应用生命周期管理 Operator 实战) Pod 镜像拉取失败?kubectl edit pods修改镜像地址的底层原理与实操 (该方法仅为临时应急方案,并非长期解决方案) Kubernetes编程/Operator专题精讲—— 理解控制器模式 —— 控制器模式的核心原理与实现逻辑(从原理到实践) 【AIOPS】AI Agent 专题【左扬精讲】模型微调实战:一站式平台 LLaMA-Factory 【AIOPS】AI Agent 专题【左扬精讲】基于 k8s+vLLM+Ray 分布式部署全指南:架构设计、资源调度与性能优化 【AIOPS】AI Agent专题【左扬精讲】非量化版DeepSeek分布式部署全指南:精度保障、显存规划与Ollama/vLLM选型 【AIOPS】AI Agent 专题【左扬精讲】零开发框架实现 ReAct Agent(Go SRE友好)
DeepSeek-R1 多模态 R1 / VLM-GRPO【左扬精讲】—— Qwen2-VL 微调与视觉推理强化学习实战
左扬 · 2026-06-20 · via 博客园 - 左扬

DeepSeek-R1 多模态 R1 / VLM-GRPO【左扬精讲】—— Qwen2-VL 微调与视觉推理强化学习实战

前面 6 篇 R1 系列博文覆盖了纯文本的 R1 训练 / 数据 / 评估 / 部署 / 端侧 / 推理时扩展。但 2025 年 LLM 最大的趋势是多模态——模型不仅能"读"文字,还能"看"图像 / "听"音频。R1 的"慢思考"能不能扩展到视觉?多模态 GRPO 怎么训?本篇讲清"多模态 R1 / VLM-GRPO"的全部细节。

本篇围绕"Qwen2-VL + GRPO 视觉推理强化学习"展开 10 大章节:

① VLM 架构深度(ViT + LLM + Projector);

② 主流 VLM 对比(Qwen2-VL / LLaVA / InternVL / MiniCPM-V);

③ 多模态 SFT 数据准备;

④ VLM-GRPO 训练(视觉奖励函数);

⑤ 几何题 / 图表题实战;

⑥ 5 大 VLM benchmark(MMBench / MathVista / ChartQA);

⑦ Qwen2-VL-7B + GRPO + 几何题完整试验;

⑧ 代码实现;

⑨ 20 FAQ;

⑩ Roadmap

多模态 VLM Qwen2-VL VLM-GRPO 视觉推理 MathVista 几何题 2025 前沿

学习重点提示

重点掌握(必须)

  • VLM 3 大组件:ViT(视觉编码)+ LLM(语言生成)+ Projector(视觉-语言对齐)
  • 4 大 VLM 对比:Qwen2-VL / LLaVA / InternVL / MiniCPM-V 优劣势
  • 多模态 SFT 数据准备:图文对话数据构造 + 图像预处理
  • VLM-GRPO 训练:视觉奖励函数(几何正确性 / 图表解析)
  • 5 大 VLM benchmark:MMBench / MathVista / ChartQA / OCRBench / MMVet
  • Qwen2-VL-7B + GRPO 几何题完整实验
  • 完整可运行代码(Unsloth + Qwen2-VL + GRPO)

次重点(了解即可)

  • 多模态对齐(CLIP / SigLIP)
  • 高分辨率图像处理(动态分辨率)
  • 视频理解 VLM(Qwen2-VL 已支持)

文章目录

一、Why:为什么 2025 是"多模态 R1"的元年

2025 年 LLM 出现 3 大明显趋势:① 多模态:从纯文本到"看图说话";② 慢思考:R1 范式扩展;③ 多模态 + 慢思考:即"多模态 R1"。代表:Qwen2.5-VL(2025 年 1 月)、Qwen2-VL(2024 年 8 月)、InternVL2.5、Vision-R1。

多模态 R1 的关键挑战是:图像比文本信息密度高 10×。同样的"慢思考"机制应用到视觉推理(几何题、图表题)需要:① 视觉编码器理解图像;② LLM 推理;③ 视觉奖励函数评估答案。这是 VLM-GRPO 训练的核心。

二、VLM 架构深度(ViT + LLM + Projector)

VLM(Vision Language Model)的标准架构分 3 大组件:

┌────────────────────────────────────────────────────┐
│              VLM 标准架构                              │
│                                                    │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐       │
│  │  图像      │    │  Projector│    │  LLM     │       │
│  │  输入     │    │  (对齐)   │    │  推理    │       │
│  │  224×224 │ →  │  MLP/Q-Former │ →  │ Qwen-7B  │       │
│  └──────────┘    └──────────┘    └──────────┘       │
│       ↑                ↑                ↑         │
│       │                │                │         │
│   ┌───┴────┐    ┌─────┴─────┐    ┌─────┴────┐    │
│   │  ViT    │    │  对齐模块  │    │ 文本生成  │    │
│   │ 视觉编码 │    │  视觉→语言 │    │ 自回归   │    │
│   └────────┘    └──────────┘    └──────────┘    │
└────────────────────────────────────────────────────┘

2.1 组件 1:ViT 视觉编码器

ViT(Vision Transformer)把图像切成 14×14 或 16×16 的 patch,每 patch 作为一个 token,输入 Transformer。代表:① CLIP ViT-L/14(OpenAI 2021);② SigLIP(Google 2023,sigmoid 损失,效率更高);③ EVA-CLIP(BAAI 2023)。Qwen2-VL 用 SigLIP。

2.2 组件 2:Projector 对齐模块

Projector 把视觉特征投影到 LLM 嵌入空间。3 种主流方案:① MLP(最简单,LLaVA 用);② Q-Former(BLIP-2 用,可学习 query);③ Cross-Attention(CogVLM 用,更复杂)。Qwen2-VL 用 MLP。

2.3 组件 3:LLM 推理

LLM 接收"文本 token + 视觉 token"混合输入,做自回归生成。Qwen2-VL 用 Qwen2.5-7B 作为底座。

三、4 大开源 VLM 横向对比

VLM参数量MMBenchMathVista特点
Qwen2-VL-7B 7B 83.0 62.3 动态分辨率 + 视频
LLaVA-1.6-7B 7B 76.3 46.5 学术友好 / 简单
InternVL2-8B 8B 82.5 58.3 中文友好 / OCR 强
MiniCPM-V-8B 8B 80.1 52.3 端侧友好 / 4-bit 友好

关键观察:Qwen2-VL 综合最强(动态分辨率 + 视频支持),是 2025 年 VLM 事实标准。

四、多模态 SFT 数据准备

多模态 SFT 数据 = (image, instruction, response) 三元组。构造 4 步:

# 多模态 SFT 数据准备
from datasets import load_dataset
from PIL import Image
import json

# 1. 加载公开数据集
data = load_dataset("lmms-lab/MathVista", split="testmini")

# 2. 构造 (image, instruction, response)
sft_data = []
for item in data:
    image = item["image"]
    question = item["question"]
    answer = item["answer"]
    # 构造 CoT 回答
    response = f"""<think>
让我分析这道几何题。
观察图像,识别关键元素:{item.get('hint', '')}
列出已知条件:{item['question']}
应用几何定理:...
逐步推导:...
</think>
<answer>{answer}</answer>"""
    sft_data.append({
        "image": image,
        "instruction": question,
        "response": response,
    })

# 3. 保存
with open("multimodal_sft.jsonl", "w") as f:
    for item in sft_data:
        img_path = f"images/{item['id']}.jpg"
        item["image"].save(img_path)
        record = {**item, "image": img_path}
        f.write(json.dumps(record) + "\n")

五、VLM-GRPO 训练机制与视觉奖励

VLM-GRPO = GRPO 训练 + 视觉奖励函数。和纯文本 GRPO 的关键区别:

  1. 输入:(image, prompt) → response(视觉 + 文本)
  2. 奖励视觉奖励函数(几何正确 / 图表解析 / OCR 准确)
  3. 采样:N 次采样 + 投票 / RM 评分
  4. 训练:与纯文本 GRPO 相同(policy gradient)

5.1 视觉奖励函数(以几何题为例)

# visual_reward.py
import re
from PIL import Image
import math

def geometry_reward(prompts, completions, answers, images, **kwargs):
    """几何题视觉奖励:基于答案正确性 + 推理过程"""
    rewards = []
    for completion, gold in zip(completions, answers):
        score = 0.0
        # 1. 答案正确性(+2.0)
        pred = extract_answer(completion)
        if pred == gold:
            score += 2.0
        # 2. 包含 CoT 过程(+0.5)
        if "<think>" in completion and "</think>" in completion:
            score += 0.5
        # 3. 包含 <answer> 标签(+0.3)
        if "<answer>" in completion:
            score += 0.3
        # 4. 长度合理(-1.0 ~ 0.0)
        if len(completion) > 4000:
            score -= 1.0
        elif len(completion) < 100:
            score -= 0.5
        rewards.append(score)
    return rewards

def extract_answer(text: str) -> str:
    match = re.search(r"<answer>(.*?)</answer>", text, re.DOTALL)
    if match:
        return match.group(1).strip()
    return text.strip().split("\n")[-1]

六、5 大 VLM Benchmark 详解

Benchmark评估能力题量Qwen2-VL-7BGPT-4V
MMBench 多模态综合 4.3K 83.0 86.5
MathVista 数学视觉 6.1K 62.3 63.8
ChartQA 图表理解 2.5K 83.0 85.0
OCRBench OCR 识别 1K 88.4 81.0
MMVet 综合(创新 / OCR / 数学) 2.2K 62.0 67.5

七、Qwen2-VL-7B + GRPO 几何题完整实验

本节给出端到端实验:Qwen2-VL-7B + GRPO + 几何题(GeoQA 数据集 5K 训练)。

7.1 实验数据

底座模型 Qwen2-VL-7B-Instruct
训练数据 GeoQA 5K 几何题
训练方式 LoRA + GRPO(视觉奖励)
硬件 4×A100 80GB(约 8 小时)
基线(Qwen2-VL-7B) GeoQA 35%
VLM-GRPO 后 GeoQA 58%(+23 个百分点)
MathVista 62.3 → 71.5(+9.2)

八、完整代码实现

# vlm_grpo_train.py
# Qwen2-VL + GRPO 视觉推理强化学习
from unsloth import FastVisionModel
from trl import GRPOTrainer, GRPOConfig
from datasets import load_dataset
from PIL import Image
import torch

# 1. 加载 Qwen2-VL
model, tokenizer = FastVisionModel.from_pretrained(
    model_name="Qwen/Qwen2-VL-7B-Instruct",
    max_seq_length=4096,
    load_in_4bit=True,
)
model = FastVisionModel.get_peft_model(
    model,
    r=16,
    target_modules=["q_proj","k_proj","v_proj","o_proj",
                    "gate_proj","up_proj","down_proj"],
    lora_alpha=16,
    use_gradient_checkpointing="unsloth",
)

# 2. 加载几何题数据
dataset = load_dataset("Luckyjhg/Geo170K", split="train[:5000]")

# 3. 视觉奖励函数
def geometry_reward(prompts, completions, answers, images, **kwargs):
    rewards = []
    for completion, gold in zip(completions, answers):
        score = 0.0
        pred = extract_answer(completion)
        if pred == gold:
            score += 2.0
        if "<think>" in completion:
            score += 0.5
        if "<answer>" in completion:
            score += 0.3
        if len(completion) > 4000:
            score -= 1.0
        rewards.append(score)
    return rewards

# 4. 数据预处理
def format_data(item):
    return {
        "prompt": [
            {"role": "user", "content": [
                {"type": "image"},
                {"type": "text", "text": item["question"]},
            ]}
        ],
        "answer": item["answer"],
        "image": item["image"],
    }

formatted_data = [format_data(item) for item in dataset]

# 5. 训练配置
training_args = GRPOConfig(
    num_generations=8,
    learning_rate=5e-6,
    per_device_train_batch_size=1,
    gradient_accumulation_steps=8,
    num_train_epochs=2,
    use_vllm=True,
    beta=0.04,
    output_dir="./vlm_grpo_outputs",
)

# 6. 训练
trainer = GRPOTrainer(
    model=model,
    processing_class=tokenizer,
    reward_funcs=[geometry_reward],
    args=training_args,
    train_dataset=formatted_data,
)
trainer.train()

# 7. 评估
test_data = load_dataset("Luckyjhg/Geo170K", split="test[:200]")
correct = 0
for item in test_data:
    response = model.chat(item["image"], item["question"])
    pred = extract_answer(response)
    if pred == item["answer"]:
        correct += 1
print(f"GeoQA pass@1: {correct/200:.3f}")

九、FAQ:20 个常见问题深度问答

Q1. VLM 是什么?

VLM(Vision Language Model)= 视觉语言模型,能"看图说话"的多模态 LLM。标准架构:ViT(视觉编码)+ Projector(对齐)+ LLM(语言生成)。代表:Qwen2-VL、LLaVA、InternVL2、MiniCPM-V。2025 年 VLM 已经成为 LLM 的标配,纯文本 LLM 正在被替代。

Q2. VLM 和 LLM 哪个好?

决策树:① 任务含图像 → VLM(必须);② 任务纯文本 → LLM(更轻量);③ 任务含图像 + 复杂推理 → VLM-GRPO(最佳)。生产建议:① 同时部署 LLM + VLM;② 根据任务动态选择;③ 纯文本任务用 LLM(更快 / 更便宜)。

Q3. Qwen2-VL vs LLaVA 选哪个?

决策树:① 通用 + 视频 → Qwen2-VL(最强);② 学术研究 + 简单 → LLaVA(生态最广);③ 中文 + OCR → InternVL2(中文最强);④ 端侧 + 4-bit → MiniCPM-V(最轻量)。生产推荐 Qwen2-VL 7B 或 72B。

Q4. VLM-GRPO 怎么训练?

VLM-GRPO = GRPO + 视觉奖励函数。训练 5 步:① 加载 VLM(如 Qwen2-VL-7B)+ LoRA;② 构造多模态数据 (image, prompt, answer);③ 定义视觉奖励(几何正确 / 图表解析 / OCR 准确);④ 用 TRL GRPOTrainer 训练;⑤ 评估 MathVista / GeoQA 等。生产建议:① 视觉奖励函数是关键;② 用 Qwen2-VL-7B-Instruct 起步;③ 显存不够用 Unsloth 4-bit 量化。

Q5. 视觉奖励函数怎么设计?

视觉奖励函数分 3 大类:① 答案正确性(数学 / OCR 任务):对比预测和 gold,相同 +2.0;② 格式正确性:包含 <think> +0.5,包含 <answer> +0.3;③ 过程质量:推理步骤清晰 +0.5,包含自我验证 +0.5,长度合理 -1.0~0。生产建议:① 先简单(只奖励答案正确);② 复杂任务加过程奖励;③ 避免"奖励黑客"。

Q6. MathVista 是什么?

MathVista = 数学视觉 benchmark,评估 VLM 在数学推理任务上的能力。包含:① 几何题;② 统计图;③ 函数图;④ 数学公式识别。共 6.1K 题。Qwen2-VL-7B 62.3,GPT-4V 63.8。代表 VLM 数学推理能力。

Q7. VLM 需要多大显存?

VLM 显存需求:① Qwen2-VL-2B FP16 = 4GB(4-bit 2GB);② Qwen2-VL-7B FP16 = 14GB(4-bit 4GB);③ Qwen2-VL-72B FP16 = 145GB(4-bit 40GB)。生产建议:① 7B 用 24GB 4090 / 3090;② 72B 用 80GB A100 / H100;③ 训练再加 30~50% 显存。

Q8. VLM 训练数据哪里找?

2024-2025 主流 VLM 训练数据集:① LLaVA-Pretrain(558K 图文对);② LLaVA-Instruct(158K 图文对话);③ Geo170K(17 万几何题);④ MathV360K(36 万数学题);⑤ LLaVA-OneVision(1.6M 多模态数据)。

Q9. VLM 能处理视频吗?

。Qwen2-VL 原生支持视频:① 视频分帧;② 每帧 token 化;③ 时序 attention。最大支持 1 小时视频(20K+ tokens)。LLaVA-OneVision 也支持视频。生产建议:① 长视频用 1 fps 采样;② 关键帧单独处理;③ 时序敏感任务用 Video-LLaVA。

Q10. VLM 怎么评估?

5 大 VLM benchmark:① MMBench(4.3K 多模态综合);② MathVista(6.1K 数学视觉);③ ChartQA(2.5K 图表理解);④ OCRBench(1K OCR);⑤ MMVet(2.2K 综合)。生产建议:① 通用 VLM 跑 MMBench + MMVet;② 数学 / 推理 VLM 跑 MathVista;③ 业务 VLM 构造 100~500 条业务 test set。

Q11. 动态分辨率是什么?

动态分辨率 = VLM 根据图像内容动态调整输入分辨率。传统 VLM 把图像 resize 到固定 224×224,丢失细节。Qwen2-VL 的动态分辨率能根据图像内容自动选择 1×1 到 24×24 个 token(最大 4096 tokens),高分辨率图像保留更多细节。这是 Qwen2-VL 在 OCRBench 上超过 GPT-4V 的关键。

Q12. VLM 训练和 LLM 训练有什么不同?

VLM 训练分 3 阶段:① Pretrain:训练 Projector 对齐视觉 / 语言(冻结 ViT + LLM);② SFT:训练 VLM 完成多模态指令;③ RLHF/GRPO:用奖励函数优化。LLM 只有 SFT + RLHF 两阶段。VLM 训练显存需求大(视觉特征占很多),数据稀缺(多模态数据少)。

Q13. Qwen2-VL-7B 怎么部署?

3 种部署方式:① vLLM(推荐,支持动态分辨率):vllm serve Qwen2-VL-7B;② HuggingFace transformers(简单但慢);③ LMDeploy(国产)。生产推荐 vLLM 0.6+,完整支持 Qwen2-VL 动态分辨率

Q14. VLM 微调需要多少数据?

VLM 微调数据需求:① 简单任务(图像描述)→ 5K~10K 即可;② 中等任务(VQA)→ 10K~50K;③ 复杂任务(视觉推理)→ 50K~200K。GRPO 训练数据可更少(5K 就能涨 23 个百分点)。生产建议:① 先 5K 试验,看奖励曲线;② 数据不够用 LoRA 减少过拟合。

Q15. VLM 怎么蒸馏到端侧?

VLM 端侧蒸馏 3 步:① 大模型 VLM 推理生成 (image, prompt, response) 三元组;② 小模型 VLM SFT(如 InternVL2-1B / Qwen2-VL-2B);③ 量化到 4-bit(GGUF / AWQ)。端侧可用:① iPhone(Qwen2-VL-2B 4-bit 跑 2 t/s);② Android(MiniCPM-V-2B 跑 1.5 t/s);③ MacBook(Qwen2-VL-7B 跑 10 t/s)。

Q16. VLM 和 VLA 有什么区别?

VLM = 视觉 → 语言(看图说话)。VLA = 视觉 → 语言 → 动作(机器人控制)。VLA = VLM + Action Head,是 Robotics 领域的范式。代表:OpenVLA、RT-2、Pi0。本篇只讲 VLM,VLA 是另一专题。

Q17. VLM-GRPO 训练数据哪里找?

VLM-GRPO 训练数据源:① GeoQA / Geo170K(几何题,5K~170K);② MathV360K(数学视觉,360K);③ ChartQA(图表题,28K);④ TabMWP(表格题,38K);⑤ 自构造(用 GPT-4V / Qwen2-VL-72B 生成)。生产建议:① 用 Geo170K 起步;② 大规模训练用 MathV360K。

Q18. VLM 评估和 LLM 评估有什么不同?

VLM 评估独有 3 大维度:① 图像理解:识别物体 / OCR / 空间关系;② 多模态推理:结合图像 + 文本推理;③ 幻觉检测:避免"回答中提到图中没有的东西"。生产建议:① 用 POPE(幻觉 benchmark)评估;② 用 MME 评估能力;③ 业务 VLM 自构造 test set。

Q19. VLM 推理慢怎么办?

3 大优化:① 图像压缩:大图 resize 到 1024×1024(快 2×);② 动态分辨率:小图用少 token(快 1.5×);③ Speculative Decoding:用小 VLM 预生成(快 2~3×);④ vLLM:Continuous Batching(快 5~10×)。生产建议:① 默认 vLLM 部署;② 业务 QPS 100+ 用 vLLM + 4-bit 量化。

Q20. 多模态 R1 的未来是什么?

2025-2026 多模态 R1 3 大趋势:① Vision-R1 / R1-V:R1 范式扩展到视觉(VLAA-Thinking 2025);② Video-R1:视频理解 + R1 范式(VideoChat-R1 2025);③ Audio-R1:音频 + R1 范式(Qwen2-Audio-R1 2025)。结论:"R1 范式 + 任何模态"是 2025 年下半年最热的研究方向。

十、Roadmap:后续学习路线

  1. 入门(1~2 周):① 跑通 Qwen2-VL-7B 推理(vLLM);② 跑通 LLaVA-1.6 训练;③ 理解 VLM 架构
  2. 进阶(1~2 月):① 跑通 VLM-GRPO(GeoQA);② 跑通多模态 SFT;③ 评估 MathVista
  3. 高级(3~6 月):① 视频 VLM(Qwen2-VL 视频);② OCR VLM(InternVL2-8B);③ 端侧 VLM 蒸馏
  4. 专家(6~12 月):① VLA(机器人 VLM);② 视频 R1;③ 多模态 Agent

下一篇博文 Plan H:工业 RAG + 微调混合系统 是 R1 系列的收官之作,讲清"从训练 / 蒸馏 / 评估 / 部署 / 端侧 / 推理 / 多模态"——如何整合成完整的工业 RAG + 微调混合系统


本文参考与资源链接:
  • Qwen2-VL 论文
  • LLaVA 论文
  • InternVL2 论文
  • Qwen2-VL-7B 模型
  • MathVista 数据集
  • Geo170K 几何数据集
  • Unsloth 仓库
  • TRL 仓库
  • vLLM 仓库
  • InternVL 仓库