For the complete documentation index, see llms.txt. This page is also available as Markdown.

👁️‍🗨️视觉强化学习(VLM RL)

使用 Unsloth 通过 GRPO 和 RL 训练视觉/多模态模型!

Unsloth 现在支持视觉/多模态 RL,搭配 Qwen3-VL, Gemma 3 以及更多。由于 Unsloth 独特的 权重共享 以及自定义内核,Unsloth 让 VLM RL 快 1.5–2 倍, 使用 显存占用减少 90%,并支持 长 15 倍的上下文 长度比 FA2 配置更长,且没有精度损失。此更新还引入了 Qwen 的 GSPO 算法。

Unsloth 可以在免费的 Colab T4 GPU 上使用 GSPO/GRPO 训练 Qwen3-VL-8B。其他 VLM 也可以使用,但可能需要更大的 GPU。Gemma 需要比 T4 更新的 GPU,因为 vLLM 仅限制为 Bfloat16,因此我们建议在 Colab 上使用 NVIDIA L4。我们的笔记本可解决涉及图像和图表的数值数学问题:

  • Qwen-3 VL-8B (vLLM 推理): Colab

  • Qwen-2.5 VL-7B (vLLM 推理): Colab • Kaggle

  • Gemma-3-4B (Unsloth 推理): Colab

我们还已将 vLLM VLM 集成原生加入 Unsloth,因此要使用 vLLM 推理,你只需启用 fast_inference=True 标志,在初始化模型时启用。特别感谢 Sinoué GAD 提供了 第一个笔记本 ,使得集成 VLM RL 更加容易!

此 VLM 支持还集成了我们最新的更新,使 RL 更节省内存且更快,包括我们的 待机功能,与其他实现相比,它独特地限制了速度下降。

你只能使用 fast_inference 用于 vLLM 支持的 VLM。一些模型,如 Llama 3.2 Vision,因此只能在不使用 vLLM 的情况下运行,但它们仍可在 Unsloth 中正常工作。

os.environ['UNSLOTH_VLLM_STANDBY'] = '1' # 启用使用 vLLM 的内存高效 GRPO
model, tokenizer = FastVisionModel.from_pretrained(
    model_name = "Qwen/Qwen2.5-VL-7B-Instruct",
    max_seq_length = 16384, # 必须这么大才能将图像放入上下文
    load_in_4bit = True, # LoRA 16 位时为 False
    fast_inference = True, # 启用 vLLM 快速推理
    gpu_memory_utilization = 0.8, # 如果显存不足则降低
)

还需要注意的是,vLLM 不支持视觉/编码器层的 LoRA,因此请设置 finetune_vision_layers = False 在加载 LoRA 适配器时。 不过,如果你使用 transformers/Unsloth 进行推理,你也可以训练视觉层。

# 将 LoRA 适配器添加到模型中,以进行参数高效微调
model = FastVisionModel.get_peft_model(
    model,

    finetune_vision_layers     = False,# fast_inference 目前还不支持 finetune_vision_layers :(
    finetune_language_layers   = True, # 如果不微调语言层则设为 False
    finetune_attention_modules = True, # 如果不微调注意力层则设为 False
    finetune_mlp_modules       = True, # 如果不微调 MLP 层则设为 False

    r = lora_rank, # 可选择任何大于 0 的数!建议 8、16、32、64、128
    lora_alpha = lora_rank*2, # *2 可加快训练
    use_gradient_checkpointing = "unsloth", # 降低内存占用
    random_state = 3407,
)

🦋Qwen 2.5 VL 视觉 RL 问题与怪癖

在 Qwen 2.5 VL 的 RL 过程中,你可能会看到如下推理输出:

这曾是 被报告 在 Qwen2.5-VL-7B-Instruct 的输出中也被报告为意外结果“addCriterion”。事实上我们也看到了这个问题!我们尝试了非 Unsloth、bfloat16 和 float16 机器以及其他方法,但它似乎仍然存在。例如第 165 项,即 train_dataset[165] 来自 AI4Math/MathVista 数据集如下:

然后我们就得到了上面的乱码输出。可以添加一个奖励函数来惩罚添加 addCriterion,或者惩罚乱码输出。不过,另一种方法是让它训练更久。比如,大约要到 60 步之后,我们才看到模型真正通过 RL 学到东西:

🏅用于减少乱码的奖励函数

为了惩罚 addCriterion 以及乱码输出,我们修改了奖励函数,以惩罚过多的 addCriterion 和换行符。

🏁GSPO 强化学习

此更新还加入了 GSPO(组序列策略优化),这是阿里巴巴 Qwen 团队提出的 GRPO 变体。他们注意到,GRPO 会隐式地为每个 token 产生重要性权重,尽管显式的优势并不会随每个 token 缩放或变化。

这促成了 GSPO 的诞生,它现在将重要性分配给序列似然,而不是各个 token 的单独似然。这两种算法的差异如下所示,均来自 Qwen 和阿里巴巴的 GSPO 论文:

GRPO 算法,来源: Qwen
GSPO 算法,来源: Qwen

在公式 1 中可以看出,优势会在该张量求和之前将每一行缩放到 token 的 logprob 中。本质上,尽管该缩放是针对整个序列而不是每个单独 token 给出的,但每个 token 得到的缩放都是相同的。下方可见一个简单示意图:

GRPO Logprob 比率按行由优势缩放

公式 2 表明,在计算出 Logprob 比率后,每个序列的 logprob 比率会先求和并指数化,而只有得到的序列比率会再按行乘以优势。

GSPO 序列比率按行由优势缩放

启用 GSPO 很简单,你只需要设置 importance_sampling_level = "sequence" 在 GRPO 配置中的该标志。

总体而言,Unsloth 现在结合 VLM vLLM 快速推理,不仅可将内存使用减少 90%,还能在 GRPO 和 GSPO 下实现 1.5–2 倍更快的速度!

如果你想了解更多关于强化学习的内容,请查看我们的 RL 指南:

Reinforcement Learning

作者: 非常感谢 Keith 和 Datta 对本文的贡献!

最后更新于

这有帮助吗?