RL Data Strategy强化学习数据策略
The RL data is not new annotation. It is drawn from public sets (ViRL39K[50], Ref-L4[51], VigoRL-SA and VigoRL-SAT[52], PixmoCount[16], WebCode2M[53], UniSVG[54], InfoVQA[7] and AI2D[1]) and filtered with the instruct model itself. Two filters decide what stays:
RL 数据不是新标注的,而是取自公开数据集(ViRL39K[50]、Ref-L4[51]、VigoRL-SA 与 VigoRL-SAT[52]、PixmoCount[16]、WebCode2M[53]、UniSVG[54]、InfoVQA[7] 和 AI2D[1]),再用指令模型本身筛选。两道筛选决定哪些样本留下:
- Discrepancy-driven selection. A large gap between Pass@N and Pass@1 means correct answers already appear among the model’s samples but not reliably on the first try. RL can turn that latent ability into consistent behaviour, so these tasks are kept; tasks the model already solves (high Pass@1) or cannot solve (low Pass@N) are dropped.差异驱动筛选。Pass@N 与 Pass@1 之间差距大,说明正确答案已经出现在模型的采样中,只是第一次作答做不稳。RL 能把这种潜在能力变成稳定的行为,因此保留这类任务;模型已经会做(Pass@1 高)或做不出来(Pass@N 低)的任务被剔除。
- Reward-based sampling. The base model answers each prompt several times and every answer is scored. Prompts whose average reward is near 1 (trivial) or near 0 (unsolvable) are removed, which leaves medium-difficulty prompts with a useful learning signal.基于奖励的采样。基础模型对每个题目作答多次并逐一打分。平均奖励接近 1(太简单)或接近 0(不可解)的题目被移除,留下能提供有效学习信号的中等难度题目。
67K examples remain, 58% of them STEM (Figure 8a). Each example also records whether it is posed answer-only or with chain-of-thought, and the two training stages draw on that: stage 1 uses 19.9K answer-only examples, three quarters of them grounding; stage 2 uses 49.2K chain-of-thought examples, 79% of them STEM.
最终留下 6.7 万条样本,其中 58% 为 STEM(图 8a)。每条样本还记录了它是仅答案形式还是链式思维形式,两个训练阶段据此取数:阶段一使用 1.99 万条仅答案样本,其中四分之三是定位任务;阶段二使用 4.92 万条链式思维样本,其中 79% 为 STEM。
Reward System Architecture奖励系统架构
Rewards come from rules, not from a learned preference model. Each answer type has its own checker in the reward/ module (Table 4): math answers are parsed and checked for symbolic equivalence, so ½, 0.5 and 2/4 all match; boxes are scored by IoU; code by token and tag overlap, plus rendering similarity for SVG. Each response gets one scalar. A format reward applies to every task: exactly one <think> block, at least one \boxed{}, and boxed content no longer than 20% of the response.
奖励来自规则,而不是学习得到的偏好模型。每种答案类型在 reward/ 模块中都有自己的校验器(表 4):数学答案先解析再做符号等价判断,因此 ½、0.5 和 2/4 都算正确;定位框按 IoU 打分;代码按 token 与标签重叠度打分,SVG 还加上渲染相似度。每条回答得到一个标量奖励。格式奖励作用于所有任务:恰好一个 <think> 块、至少一个 \boxed{},且框内内容不超过回答长度的 20%。
| Category类别 | Source来源 | Reward Design Details奖励设计细节 |
|---|---|---|
| STEM | ViRL39K | Choice accuracy & math expression equivalence选项准确率与数学表达式等价性 |
| Grounding定位 | Ref-L4, VigoRL-SA | IoU between predicted/ref boxes; choice accuracy预测框与参考框的 IoU;选项准确率 |
| Spatial空间 | VigoRL-SAT | Choice accuracy选项准确率 |
| Counting计数 | PixmoCount | Numeric token equivalence数值 token 等价匹配 |
| Coding代码 | WebCode2M, UniSVG | Token/tag overlap; SVG rendering similarity [0,1]token / 标签重叠度;SVG 渲染相似度 [0,1] |
| OCR | InfoVQA | Text similarity文本相似度 |
| Diagram图表 | AI2D | Choice accuracy选项准确率 |
Reward functions for each answer type (code)各答案类型的奖励函数(代码)
def math_reward_fn(completions, answer):
model_answer = extract_answer(completion, format_strict=True)
gold_parsed = parse(gt_answer, extraction_config=[
StringExtractionConfig(), LatexExtractionConfig(), ExprExtractionConfig(),
])
correct = verify(answer_parsed, gold_parsed)
if not correct:
correct = is_equal(gt_answer, model_answer) # SymPy fallback
return 1.0 if correct else 0.0def bbox_reward_fn(completions, answer):
xA = max(predicted[0], gt[0]); yA = max(predicted[1], gt[1])
xB = min(predicted[2], gt[2]); yB = min(predicted[3], gt[3])
inter = max(0, xB-xA) * max(0, yB-yA)
iou = inter / float(areaA + areaB - inter)
return iou # ∈ [0, 1]IoU = Intersection / (Area₁ + Area₂ − Intersection)
def multiplechoice_reward_fn(completions, answer):
predicted = extract_boxed_content(completions)[-1]
predicted = predicted.strip().strip('.()')
predicted = predicted[0].upper() if predicted else ""
return 1 if predicted == answer.upper() else 0def number_reward_fn(completions, answer):
answer_str = extract_boxed_content(completions)[-1]
match = re.findall(r"([0-9\\.]+)", answer_str)
count = match[-1] if match else ""
return float(count.strip() == answer.strip())def html_reward_fn(completions, answer):
token_score = calculate_token_overlap(gen, ref)
structure_score = calculate_tag_structure_similarity(gen, ref)
reward = 0.6 * token_score + 0.4 * structure_score
return max(0.0, min(1.0, reward))def svg_reward_fn(completions, answer):
token_score = calculate_token_overlap(gen, ref)
structure_score = calculate_structure_similarity(gen, ref)
image_score = calculate_image_similarity(gen_png, ref_png) # SSIM
reward = 0.5 * image_score + 0.25 * (token_score + structure_score)
return reward # ∈ [0, 1]HTML: 0.6 × TokenJaccard + 0.4 × TagJaccard | SVG: 0.5 × SSIM + 0.25 × (Token + Tag)
def ocr_reward_fn(completions, answer):
dist = levenshtein_distance(gt, det)
length = max(len(target), len(det))
reward = 1 - min(values)
return reward if reward >= 0.5 else 0 # thresholdSimilarity = 1 − (Levenshtein / max(len₁, len₂)), clipped at 0.5
Two-Stage Training Procedure两阶段训练流程
Both stages run GRPO in the asynchronous AReaL framework (below). Stage 1 trains the instruct model on short answers so that grounding, counting and OCR become reliable without long outputs. Stage 2 starts from the stage-1 checkpoint and asks the model to reason inside <think> before answering, mostly on STEM problems.
两个阶段都在异步 AReaL 框架中运行 GRPO(见下文)。阶段一用简短回答训练指令模型,让定位、计数与 OCR 在不输出长文本的情况下变得稳定。阶段二从阶段一检查点出发,要求模型先在 <think> 中推理再作答,训练数据以 STEM 题为主。
Answer-only RL仅答案 RL
Init: LLaVA-OneVision-1.5-8B-Instruct · data: ./data/stage1-normal (19.9K)初始化:LLaVA-OneVision-1.5-8B-Instruct · 数据:./data/stage1-normal(1.99 万)
Chain-of-thought RL链式思维 RL
Init: stage-1 checkpoint · data: ./data/stage2-long (49.2K)初始化:阶段一检查点 · 数据:./data/stage2-long(4.92 万)
Full GRPO configuration (both stages)完整 GRPO 配置(两阶段共享)
Reward modules: bbox.py, bool.py, critic.py, format.py, generalcode.py, htmlcode.py, math.py, multiple_choice.py, number.py, ocr.py, svgcode.py, string_matching.py. Full stage-1 config: configs/llavaov15-8b_stage1_grpo.yaml.
奖励模块:bbox.py、bool.py、critic.py、format.py、generalcode.py、htmlcode.py、math.py、multiple_choice.py、number.py、ocr.py、svgcode.py、string_matching.py。阶段一完整配置:configs/llavaov15-8b_stage1_grpo.yaml。
Performance Results性能结果
The RL model can answer in two modes: thinking (chain-of-thought) and fast (direct answer). Table 5 averages the 26 benchmarks of Table 6 by group. Thinking mode lifts reasoning the most, from 45.8 to 51.8 (MathVision 25.6 → 34.4, MMMU-Provision 25.2 → 35.7), at a small cost on OCR and charts. Fast mode keeps OCR and charts at 84.6 and raises the remaining group from 69.0 to 71.6, mainly through counting (PixmoCount 62.2 → 71.1). Both modes improve general VQA.
RL 模型可以用两种模式作答:thinking(链式思维)和 fast(直接作答)。表 5 按类别对表 6 中的 26 个基准求平均。Thinking 模式对推理的提升最大,从 45.8 到 51.8(MathVision 25.6 → 34.4,MMMU-Provision 25.2 → 35.7),代价是 OCR 与图表略有下降。Fast 模式把 OCR 与图表保持在 84.6,并把“其他”类别从 69.0 提升到 71.6,主要来自计数(PixmoCount 62.2 → 71.1)。两种模式都提升了通用 VQA。
| Task group任务类别 | LLaVA-OV-1.5 | RL thinkingRL thinking | RL fastRL fast |
|---|---|---|---|
| General VQA (9)通用 VQA(9) | 71.8 | 72.8 | 72.6 |
| Reasoning (6)推理(6) | 45.8 | 51.8 | 46.8 |
| OCR & chart (7)OCR 与图表(7) | 84.6 | 83.3 | 84.6 |
| Others (4)其他(4) | 69.0 | 66.0 | 71.6 |
Figure 9 adds spatial reasoning, grounding and coding benchmarks and compares with Qwen2.5-VL. Fast mode gives the best grounding (Ref-L4 IoU 57.1 → 61.6, RefCOCO IoU 64.0 → 68.8), while thinking mode lowers it. Thinking mode helps web coding (WebCode 55.6 → 58.3, Design2Code 60.1 → 63.9); on UniSVG, fast mode is best (50.4 → 57.5).
图 9 补充了空间推理、定位与代码基准,并与 Qwen2.5-VL 对比。Fast 模式的定位最好(Ref-L4 IoU 57.1 → 61.6,RefCOCO IoU 64.0 → 68.8),而 thinking 模式会使其下降。Thinking 模式提升网页代码生成(WebCode 55.6 → 58.3,Design2Code 60.1 → 63.9);在 UniSVG 上 fast 模式最好(50.4 → 57.5)。
| Task任务 | Benchmark基准 | LLaVA-OV-1.5 | LLaVA-OV-1.5 RL | |
|---|---|---|---|---|
| - | thinkingthinking | fastfast | ||
| General VQA通用 VQA | MMStar[14] | 67.7 | 68.2↑0.5 | 68.3↑0.6 |
| MMBenchen[10] | 84.1 | 85.7↑1.6 | 85.7↑1.6 | |
| MMBenchcn[10] | 81.0 | 84.2↑3.2 | 81.5↑0.5 | |
| MME-RealWorlden[11] | 61.7 | 63.4↑1.7 | 63.3↑1.6 | |
| MME-RealWorldcn[11] | 56.1 | 56.1↑0.0 | 56.3↑0.2 | |
| SeedBenchimage[20] | 77.3 | 76.7 | 77.6↑0.3 | |
| CV-Bench[5] | 80.7 | 82.9↑2.2 | 81.1↑0.4 | |
| SEED-Bench-2-Plus[19] | 69.2 | 69.5↑0.3 | 69.2↑0.0 | |
| RealWorldQA[17] | 68.1 | 68.4↑0.3 | 70.6↑2.5 | |
| Avg. | 71.8 | 72.8↑1.0 | 72.6↑0.8 | |
| Reasoning推理 | MathVistamini[9] | 69.6 | 72.3↑2.7 | 71.8↑2.2 |
| WeMath[23] | 61.5 | 69.4↑7.9 | 60.8 | |
| MathVision[8] | 25.6 | 34.4↑8.8 | 26.2↑0.6 | |
| MMMUval[12] | 55.4 | 58.8↑3.4 | 54.9 | |
| MMMU-Prostandard[13] | 37.4 | 39.9↑2.5 | 38.0↑0.6 | |
| MMMU-Provision[13] | 25.2 | 35.7↑10.5 | 29.0↑3.8 | |
| Avg. | 45.8 | 51.8↑6.0 | 46.8↑1.0 | |
| OCR & ChartOCR 与图表 | ChartQA[2] | 86.5 | 87.4↑0.9 | 87.0↑0.5 |
| CharXivDQ[3] | 70.9 | 68.4 | 71.2↑0.3 | |
| DocVQA[6] | 95.0 | 91.9 | 95.0↑0.0 | |
| OCRBench[15] | 82.9 | 81.7 | 82.3 | |
| AI2Dw M[1] | 84.2 | 83.7 | 84.3↑0.1 | |
| AI2Dw/o M[1] | 94.1 | 93.7 | 93.9 | |
| InfoVQA[7] | 78.4 | 76.6 | 78.7↑0.3 | |
| Avg. | 84.6 | 83.3 | 84.6↑0.0 | |
| Others其他 | PixmoCount[16] | 62.2 | 65.7↑3.5 | 71.1↑8.9 |
| CountBench[4] | 88.2 | 86.8 | 88.6↑0.4 | |
| VL-RewardBench[22] | 47.7 | 44.0 | 49.7↑2.0 | |
| V*[21] | 78.0 | 79.1↑1.1 | 78.0↑0.0 | |
| Avg. | 69.0 | 66.0 | 71.6↑2.6 | |
GRPO Algorithm & AReaL Async FrameworkGRPO 算法与 AReaL 异步框架
GRPO removes the critic. Each prompt gets G = 16 sampled answers, and each answer’s advantage is its reward minus the group mean, divided by the group standard deviation. The run uses no KL penalty and an asymmetric clip on the probability ratio (0.2 below, 0.28 above).
GRPO 去掉了 critic。每个提示采样 G = 16 个回答,每个回答的优势等于它的奖励减去组内均值、再除以组内标准差。训练不使用 KL 惩罚,对概率比采用非对称裁剪(下界 0.2,上界 0.28)。
AReaL runs generation and training at the same time on separate GPUs. Rollout workers keep sampling with a slightly older policy while the actor updates, and new weights are pushed to them after every step. A sample may be at most four steps stale, and an importance weight, capped at 5, corrects for the gap between the policy that generated it and the current one. Removing the wait between generation and training raises throughput 2.77×.
AReaL 在不同的 GPU 上同时进行生成与训练。actor 更新的同时,rollout worker 用稍旧的策略持续采样,每一步结束后再把新权重推送给它们。样本最多落后当前策略四步,并用上限为 5 的重要性权重修正生成样本的策略与当前策略之间的差异。消除生成与训练之间的等待使吞吐提升 2.77 倍。
GRPO objective and loss implementationGRPO 目标函数与损失实现
Source: utils/functional.py, ppo_actor_loss_fn.
代码来源:utils/functional.py 中的 ppo_actor_loss_fn。
# utils/functional.py — ppo_actor_loss_fn
ratio = torch.exp(logprobs - proximal_logprobs)
clipped_ratio = torch.clamp(ratio, 1.0 - eps_clip, 1.0 + eps_clip_higher)
pg_loss = torch.max(-advantages * ratio, -advantages * clipped_ratio)
# Behavior importance weight (off-policy correction)
behav_kl = proximal_logprobs - old_logprobs
behav_imp_weight = torch.clamp(behav_kl.exp(), max=behav_imp_weight_cap)
pg_loss = pg_loss * behav_imp_weightAReaL training loop, step by stepAReaL 训练循环逐步解析
# trains/grpo.py — main training loop
for global_step in range(start_step, max_steps):
batch = rollout.prepare_batch(train_dataloader, workflow=workflow)
batch["prox_logp"] = actor.compute_logp(batch)
actor.compute_advantages(batch)
actor.ppo_update(batch)
rollout.pause()
actor.update_weights(weight_update_meta)
rollout.set_version(global_step + 1)
rollout.resume()rollout.prepare_batch(...)
In this configuration: batch_size = 32 prompts × n_samples = 16 rollouts per prompt = 512 trajectories per gradient step.
- Draw a prompt from the data loader
- Concurrently launch 16 independent
ageneratecalls (gconfig.n_samples) viaasyncio.gather— each samples autoregressively at temperature = 1.0 (raw logit distribution, no sharpening or flattening), producing 16 diverse responses for the same prompt. These 16 form one GRPO group. - Score each response with a task reward — one scalar r ∈ [0, 1] per response, not per token:MULTIPLE_CHOICE
option letter match → 1 / 0NUMBER / MATH
math equivalence check → 1 / 0BBOX
IoU with ground-truth boxOCR_TEXT
character-level similarity - Push all 16 results into the shared ring buffer as a group
当前配置下:batch_size = 32 条 prompt × n_samples = 16 次 rollout = 每个梯度步处理 512 条轨迹。
- 从数据加载器取一条 prompt
- 通过
asyncio.gather并发发起 16 次独立的agenerate调用(gconfig.n_samples = 16),每次在 temperature = 1.0(直接用原始 logit 分布采样,不压缩也不拉平)下独立自回归采样,对同一条 prompt 生成 16 条各不相同的 response,构成一个 GRPO group。 - 对每条 response 用任务奖励函数打分——每条 response 得到一个标量 r ∈ [0, 1],是整条回答的得分,不是 token 级别的分:MULTIPLE_CHOICE
选项字母匹配 → 1 / 0NUMBER / MATH
数学等价校验 → 1 / 0BBOX
与 ground-truth 框的 IoUOCR_TEXT
字符级相似度 - 将这 16 条结果作为一组推入共享环形缓冲区
Why can samples be up to 4 steps stale?为什么样本可以落后当前策略最多 4 步?
step 1: actor=θ1 → sync → rollout worker now uses θbehave(1)
step 2: actor=θ2 → sync → rollout worker now uses θbehave(2)
step 3: actor=θ3 → sync → rollout worker now uses θbehave(3)
# but the ring buffer still holds samples generated at step 1
step 5: prepare_batch() pulls a sample from θbehave(1) → version gap = 5−1=4 ≤ η → accepted
step 1: actor=θ1 → 同步 → rollout worker 开始使用 θbehave(1)
step 2: actor=θ2 → 同步 → rollout worker 开始使用 θbehave(2)
step 3: actor=θ3 → 同步 → rollout worker 开始使用 θbehave(3)
# 但缓冲区里还存着 step 1 时生成的样本
step 5: prepare_batch() 取到 θbehave(1) 生成的样本 → 版本差 = 5−1=4 ≤ η → 接受
actor.compute_logp(batch) → batch["prox_logp"]
The total drift πbehave → πθ passes through an intermediate anchor πprox. Each leg has a distinct character and gets a different corrective tool:
ratio = exp(logπθ − logπprox) # Leg 2 — within-step ratio
L = w · max(−A·ratio, −A·clip(ratio, 0.8, 1.28)) # combined
总偏移 πbehave → πθ 经过中间锤点 πprox。两段性质完全不同,分别用不同的工具处理:
ratio = exp(logπθ − logπprox) # 第二段 — 步内 ratio
L = w · max(−A·ratio, −A·clip(ratio, 0.8, 1.28)) # 合并
actor.compute_advantages(batch)
For each prompt, G = 16 responses were sampled. compute_advantages groups them and whitens rewards within the group. Here's a concrete example:
| Resp | Answer | Raw reward ri |
|---|---|---|
| 1 | 96 | 1.00 |
| 2 | 96 | 1.00 |
| 3 | 96 | 1.00 |
| 4 | 95 | 0.50 |
| 5 | 98 | 0.00 |
| mean = 0.70, std = 0.41, ε = 1e-6 | ||
Better than group average → positive signal
Worse than group average → negative signal
Broadcast to tokens: All tokens in response #1 get A = +0.73. All tokens in response #5 get A = −1.71. This is GRPO's key approximation — the episode-level reward proxies per-token contribution.
PPO needs a baseline V(s) to form the advantage A = Q(s,a) − V(s). The classic solution is a critic network — but this breaks down for LLMs/VLMs on three fronts:
GRPO’s fix — Monte Carlo group baseline:
This is an unbiased estimator of Vπ(s) by definition — no extra parameters, no warmup, self-consistent from step 1.
Standard-deviation normalization then equalizes gradient magnitude across tasks:
对每个 prompt,rollout 会采样 G = 16 条回答。compute_advantages 做的事情不是逐 token 打分,而是先把这 16 条回答重新放回同一组,再在组内对标量奖励做白化。下面按一个具体例子来看:
| 样本 i | 回答内容 | 奖励 ri |
|---|---|---|
| 1 | 96 | 1.00 |
| 2 | 96 | 1.00 |
| 3 | 96 | 1.00 |
| 4 | 95 | 0.50 |
| 5 | 98 | 0.00 |
| 组内均值 mean = 0.70,组内标准差 std = 0.41,ε ≈ 1e-6 | ||
比组内平均更好,所以是正优势
比组内平均更差,所以是负优势
如果样本 1 的回答是 ["The", "answer", "is", "96"],那么这 4 个 token 在 loss 里都会拿到同一个 A = +0.73。
如果样本 5 的回答是 ["It", "might", "be", "98"],那么这 4 个 token 都会拿到同一个 A = -1.71。
所以,GRPO 不是在判断“哪个 token 对,哪个 token 错”,而是在说:“这整条回答相对同组兄弟回答更好还是更差”。然后把这个回合级信号平均分配给该回答中的每个 token。
PPO 需要一个 基线 V(s) 来计算优势 A = Q(s,a) − V(s)。经典解法是引入 critic(评论家网络)——但在 LLM/VLM 上会在三个方面失效:
GRPO 的解法——蒙特卡洛组基线:
根据定义,这是 Vπ(s) 的无偏估计——无需额外参数,无需预热,从第一步起就自洽。
标准差归一化再进一步,使各任务的梯度量级统一:
actor.ppo_update(batch)
LPPO = −min(ratio · A, clip(ratio, 1−ε, 1+ε′) · A)
- A > 0 (good token): policy is rewarded for raising ratio, capped at 1+ε′
- A < 0 (bad token): policy is penalized once ratio exceeds 1−ε
The total drift from sample generation to the current update is πbehave → πθ. AReaL splits this into two segments with different properties and handles each separately:
↑ Segment 1: cross-step drift ↑ ↑ Segment 2 ↑
1–4 global_steps, variable size one gradient step
handled by w (IS weight, cap 5.0) handled by PPO clip [0.8, 1.28]
L = w · LPPO # Segment 2 handled inside L_PPO via clip
LPPO = −min(ratio · A, clip(ratio, 1−ε, 1+ε′) · A)
- A > 0(好 token):策略因提高 ratio 而获益,上限为 1+ε′
- A < 0(坏 token):ratio 超过 1−ε 后受到惩罚
从样本生成到当前更新,策略经历的总漂移是 πbehave → πθ。AReaL 将其拆成两段性质不同的区间,分别处理:
↑ 第一段:跨步偏移 ↑ ↑ 第二段 ↑
1–4 个 global_step,大小不固定 一个梯度步
由 w(IS 权重,上限 5.0)处理 由 PPO clip [0.8, 1.28] 处理
L = w · LPPO # 第二段由 L_PPO 内部 clip 处理
rollout.pause() / actor.update_weights(...) / rollout.set_version(...) / rollout.resume()
global_step, unconditionally. Four ordered sub-steps transfer the freshly-updated actor weights to the rollout GPU partition.
self.paused.set() on a threading.Event. The rollout thread stops accepting new requests. Any in-flight generation that hits the paused check enters await asyncio.sleep(0.5) loop until the flag is cleared. pause_grace_period defaults to 0.0 s in this config.self._version = version under a lock, after the copy completes. All samples generated henceforth are tagged with this new version. The staleness guard in prepare_batch rejects samples where actor_version − sample_version > 4 (max_head_offpolicyness).self.paused.clear(). Workers exit the sleep loop and immediately resume generating with the new weights.global_step 无条件执行一次。四个有序子步将最新更新的 actor 权重传输到 rollout GPU 分区。
self.paused.set(),设置一个 threading.Event。rollout 线程停止接受新请求。正在生成中的序列遇到暂停检查后进入 await asyncio.sleep(0.5) 循环等待。此配置中 pause_grace_period 默认为 0.0 s。self._version = version。此后生成的样本均打上新版本号。prepare_batch 中的时滞检查拒绝满足 actor_version − sample_version > 4 的样本(max_head_offpolicyness)。self.paused.clear(),worker 退出 sleep 循环,立即以新权重继续生成。Acknowledgements致谢
We thank the following projects and frameworks:
我们感谢以下项目与框架:
- AReaL: Lightning-Fast RL for LLM Reasoning and Agents面向大模型推理与智能体的高吞吐强化学习框架
- sglang: Fast serving framework for LLMs and vision language models面向大语言模型与视觉语言模型的高性能服务框架
- lmms-eval: Standardized evaluation framework标准化评测框架
- LLaVA: Large Language-and-Vision Assistant大型语言-视觉助手
- LLaVA-NeXT: Next-generation multi-modal assistant新一代多模态助手
Open-Source Resources开源资源
The RL code, the trained model and the 67K training examples are all public.
RL 代码、训练好的模型和 6.7 万条训练数据全部公开。
Code and paper代码与论文
Citation引用
@inproceedings{LLaVA-OneVision-1.5,
title={LLaVA-OneVision-1.5: Fully Open Framework for Democratized Multimodal Training},
author={An, Xiang and Xie, Yin and Yang, Kaicheng and Zhang, Wenkang and Zhao, Xiuwei and Cheng, Zheng and Wang, Yirui and Xu, Songcen and Chen, Changrui and Wu, Chunsheng and Tan, Huajie and Li, Chunyuan and Yang, Jing and Yu, Jie and Wang, Xiyao and Qin, Bin and Wang, Yumeng and Yan, Zizhen and Feng, Ziyong and Liu, Ziwei and Li, Bo and Deng, Jiankang},
booktitle={arXiv},
year={2025}
}
@inproceedings{xie2025region,
title={Region-based Cluster Discrimination for Visual Representation Learning},
author={Xie, Yin and Yang, Kaicheng and An, Xiang and Wu, Kun and Zhao, Yongle and Deng, Weimo and Ran, Zimin and Wang, Yumeng and Feng, Ziyong and Miles, Roy and Elezi, Ismail and Deng, Jiankang},
booktitle={ICCV},
year={2025}
}
@article{lillava,
title={LLaVA-OneVision: Easy Visual Task Transfer},
author={Li, Bo and Zhang, Yuanhan and Guo, Dong and Zhang, Renrui and Li, Feng and Zhang, Hao and Zhang, Kaichen and Zhang, Peiyuan and Li, Yanwei and Liu, Ziwei and Li, Chunyuan},
journal={Transactions on Machine Learning Research},
year={2024}
}




