使用 Axolotl 微调 GLM-4.6V 视觉语言模型:QLoRA 与 DDP 实战指南
2026/9/15 9:58:47 网站建设 项目流程

使用 Axolotl 微调 GLM-4.6V 视觉语言模型:QLoRA 与 DDP 实战指南

【免费下载链接】axolotlGo ahead and axolotl questions项目地址: https://gitcode.com/GitHub_Trending/ax/axolotl

GLM-4.6V 是智谱 AI(ZhipuAI)发布的视觉语言模型(VLM)家族,包含全量版 GLM-4.6V(106B MoE)与更快的 GLM-4.6V-Flash(9B)两个变体。本文基于 Axolotl 仓库中的官方示例,讲解如何用 Axolotl 对 GLM-4.6V 进行视觉语言任务的微调,涵盖环境准备、QLoRA 配置逐项解析、多卡 DDP 变体、多模态数据集格式与底层处理策略原理,读完后你将能直接复制配置跑通 GLM-4.6V-Flash 的微调训练,并能独立改造为全量微调或自定义数据集。

GLM-4.6V 模型族概览

GLM-4.6V 是面向视觉语言任务的模型系列,Axolotl 对其两个变体均提供开箱即用的支持:

模型参数量模型 ID定位
GLM-4.6V106B(MoE)zai-org/GLM-4.6V完整视觉语言模型
GLM-4.6V-Flash9Bzai-org/GLM-4.6V-Flash更快、资源占用更低的变体

在多模态支持文档 docs/multimodal.qmd 中,GLM-4.6V 与 GLM-4.6V-Flash 均被列为受支持模型,只需在配置中切换base_model即可。仓库中提供的两份示例配置均以 9B 的 Flash 变体为主,适合单卡或少量显卡即可开展实验。

环境准备

按官方安装指南从源码安装 Axolotl(即 edge 构建方式),确保拿到包含最新模型支持的版本。

随后安装Cut Cross Entropy扩展以减少训练显存占用。Cut Cross Entropy 是 Axolotl 的可选集成之一,仓库中其集成说明位于 src/axolotl/integrations/cut_cross_entropy/README.md,从该文件的集成矩阵可以看到glm46v已在受支持架构之列。它通过自研的截断交叉熵 kernel 显著降低语言模型头部的显存与计算开销,对 9B 以上的视觉语言模型训练尤其有价值。

提示:多模态模型涉及图像处理,通常还需要安装torchvision等视觉依赖(部分模型家族还会要求timmlibrosa等),具体以所选模型的官方要求为准。

快速开始:运行 QLoRA 微调

环境就绪后,直接使用仓库自带的示例配置启动训练:

axolotl train examples/glm46v/glm-4-6v-flash-qlora.yaml

该命令读取 examples/glm46v/glm-4-6v-flash-qlora.yaml,对 GLM-4.6V-Flash 进行 4-bit 量化的 QLoRA 微调。训练输出保存在./outputs/glm-4-6v-flash-qlora目录。

核心配置逐项解析

以下完整剖析示例配置中每一组关键参数的作用与取值考量。

模型与处理器加载

base_model: zai-org/GLM-4.6V-Flash trust_remote_code: true processor_type: AutoProcessor load_in_4bit: true
  • base_model:Hugging Face 上的模型标识,切换为zai-org/GLM-4.6V即可微调 106B MoE 全量版。
  • trust_remote_code: true:GLM 系列依赖远程代码执行来加载自定义模型结构与处理器,必须开启。
  • processor_type: AutoProcessor:多模态模型统一使用 AutoProcessor 来同时处理文本与图像输入,这是多模态微调的标准配置(见 docs/multimodal.qmd)。
  • load_in_4bit: true:以 4-bit 量化加载基础模型,配合 QLoRA 大幅降低显存需求。

多模态必须保留的三行配置

# these 3 lines are needed for now to handle vision chat templates w images skip_prepare_dataset: true remove_unused_columns: false sample_packing: false

这是当前阶段处理「带图像的视觉对话模板」所必需的三个开关,注释明确说明了其用途:

  • skip_prepare_dataset: true:跳过数据集预准备阶段,让图像等非文本列保持原样进入训练管线。从 Axolotl 的数据集准备逻辑看,该开关会绕过多模态数据集中图像预处理的复杂环节。
  • remove_unused_columns: false保留数据集中未被直接消费的列。正如 docs/multimodal.qmd 所解释:这些列在训练期间处理图像嵌入时仍然需要,不能按文本训练的默认行为删除。
  • sample_packing: false:多模态暂不支持样本打包(sample packing),必须关闭。文档明确指出这是多模态训练的当前限制。

LoRA 适配器配置

adapter: qlora lora_r: 16 lora_alpha: 32 lora_dropout: 0.05 lora_target_modules: - gate_proj - down_proj - up_proj - q_proj - v_proj - k_proj - o_proj
  • adapter: qlora:使用 QLoRA,即对 4-bit 量化基座施加 LoRA 低秩适配。
  • lora_r: 16lora_alpha: 32lora_dropout: 0.05:标准低秩与缩放配置,alpha 为 r 的两倍。
  • lora_target_modules:覆盖了注意力的q_proj/k_proj/v_proj/o_proj与 MLP 的gate_proj/up_proj/down_proj,即对语言模型部分的全部线性投影注入 LoRA,而视觉塔(vision tower)保持冻结。

训练超参数

sequence_len: 2048 gradient_accumulation_steps: 4 micro_batch_size: 1 num_epochs: 1 optimizer: adamw_8bit lr_scheduler: cosine learning_rate: 0.0002 bf16: auto tf32: false gradient_checkpointing: true logging_steps: 1 attn_implementation: sdpa warmup_ratio: 0.1 evals_per_epoch: 0 saves_per_epoch: 1 weight_decay: 0.0
  • micro_batch_size: 1搭配gradient_accumulation_steps: 4:单卡小 batch、多步累积,适配视觉模型的高显存占用。
  • optimizer: adamw_8bit:8-bit AdamW 优化器,进一步节省优化器状态显存。
  • lr_scheduler: cosinelearning_rate: 0.0002:余弦退火调度,0.0002 是 QLoRA 微调的常见初始学习率。
  • bf16: auto:自动启用 BF16 混合精度;tf32: false显式关闭 TF32。
  • gradient_checkpointing: true:以少量计算换显存,是 9B 级模型单卡训练的关键。
  • attn_implementation: sdpa:使用 PyTorch 原生的 SDPA 注意力实现,避免依赖可选的 flash-attn 编译。
  • warmup_ratio: 0.1:10% 的训练步数用于学习率预热。
  • evals_per_epoch: 0:单轮训练不额外安排验证;saves_per_epoch: 1:每个 epoch 保存一次 checkpoint。

数据集配置

datasets: - path: HuggingFaceH4/llava-instruct-mix-vsft type: chat_template split: train[:1%]

示例默认使用HuggingFaceH4/llava-instruct-mix-vsft视觉指令数据集,type: chat_template表示按对话模板格式解析,split: train[:1%]只取 1% 数据用于快速跑通流程。替换为自己的数据集时,需遵循下文的多模态数据集格式。

多卡 DDP 变体

仓库还提供了多卡版本 examples/glm46v/glm-4-6v-flash-ddp.yaml,与单卡 QLoRA 配置相比仅有两点差异:

ddp_find_unused_parameters: true

DDP 训练中部分视觉参数未参与梯度计算,必须开启ddp_find_unused_parameters: true以避免梯度同步报错(这与 docs/multimodal.qmd 中针对 Gemma 4 的 DDP 说明思路一致——冻结视觉模块时需显式处理未使用参数)。

gradient_checkpointing_kwargs: use_reentrant: false

DDP 变体额外显式指定use_reentrant: false的梯度检查点实现,避免与 DDP 包装器产生兼容性问题。其余模型、LoRA 与训练超参完全一致,方便在单卡与多卡之间平滑切换。

多模态数据集格式

视觉语言任务的微调数据集遵循 docs/multimodal.qmd 定义的扩展chat_template格式,其风格类似 OpenAI 的 Message 结构:

  • 一条消息由rolecontent组成,role可为systemuserassistant等;
  • content是一个元素列表,每个元素包含type键与对应内容,type支持textimagepathurlbase64等。

图像内容可通过以下任一键加载:

  • "path": "/path/to/image.jpg"— 本地路径
  • "url": "https://example.com/image.jpg"— 远程 URL
  • "base64": "..."— Base64 编码数据
  • "image": PIL.Image— 已加载的 PIL 图像对象

标准的多模态样本示例如下:

[ { "messages": [ { "role": "system", "content": [ {"type": "text", "text": "You are a helpful assistant."} ] }, { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"}, {"type": "text", "text": "Describe this image in detail."} ] }, { "role": "assistant", "content": [ {"type": "text", "text": "The image is a bee."} ] } ] } ]

需要注意的兼容性约定:

  • 推荐列名是messages;若上游数据使用其他列名(如conversationsdialogue),可在数据集配置中通过field_messages: <your_column>重命名映射,但内部结构必须仍是role/content(或 ShareGPT 的from/value)格式;
  • 若数据集自带imagesimage列(list[Image]),会自动追加到第一条content中成为{"type": "image", "image": ...};若content是纯字符串,会自动转换为type: text元素;
  • 遇到PIL.UnidentifiedImageError时,通常是url拼写错误或图片服务器屏蔽了请求,需检查 URL 可访问性。

切换为全量微调

示例的 Tips 部分明确指出:只需从配置中删除adapter: qloraload_in_4bit: true两行,即可将 QLoRA 升级为全量微调(FFT)。这意味着同一份配置可以快速在不同训练预算间切换:

  • QLoRA:4-bit 量化 + LoRA 适配,显存友好,适合单卡快速验证;
  • 全量微调:更新全部参数,效果上限更高,但显存与算力需求显著增加,建议使用多卡 DDP(即上文 ddp 配置并移除这两行)。

从源码看,adapterload_in_4bit均属 Axolotl 配置模式中的标准字段(src/axolotl/utils/schemas/config.py),删除后加载与训练路径会自动切换为全参模式。

底层原理:GLM-4.6V 的处理策略

Axolotl 在 src/axolotl/processing_strategies.py 中为 GLM-4.6V 提供了专门的标签处理策略Glm4vProcessingStrategy。其类注释说明:该策略被Glm4vProcessor(GLM-4V / GLM-4.1V)与Glm46VProcessor(GLM-4.6V / GLM-4.7V)共用,因为它们的媒体 token 标记完全一致

该策略的核心工作包括:

  1. 媒体 token 识别:定义并解析图像/视频的成对标记<|image|><|begin_of_image|><|end_of_image|>以及<|video|><|begin_of_video|><|end_of_video|>,并转换为对应 token id;
  2. 标签掩码process_labels在常规的非助手角色掩码基础上,进一步将上述全部媒体 token 的位置掩码为-100,确保损失只在真实文本 token 上计算,媒体占位符不参与学习;
  3. 策略路由:在 get_processing_strategy 中,通过懒加载检测Glm46VProcessor实例,命中后自动返回该策略,无需用户手动指定。

这也解释了为什么示例配置要求remove_unused_columns: false:图像嵌入相关的列必须在训练管线中保留,媒体 token 的掩码逻辑才能正确工作。

性能与显存优化建议

对于 GLM-4.6V 这类大参数视觉语言模型,Axolotl 的优化文档(见仓库 docs/optimizations.qmd)提供了可进一步叠加的优化手段,结合上文配置可考虑:

  • Cut Cross Entropy:如环境准备所述,安装后能明显降低 LM Head 的显存开销,官方示例将 src/axolotl/integrations/cut_cross_entropy/README.md 中glm46v列入支持矩阵;
  • 梯度检查点:示例已默认开启gradient_checkpointing: true
  • 8-bit 优化器:示例已默认使用adamw_8bit
  • 注意力实现:示例使用sdpa,避免 flash-attn 的编译负担;若环境支持且追求更高吞吐,可评估切换注意力实现(从源码与测试看,Axolotl 对注意力实现的兼容性有专门测试覆盖,如 tests/monkeypatch/test_flash_attn_4.py)。

总结

Axolotl 为 GLM-4.6V 视觉语言模型家族提供了开箱即用的微调支持:通过 examples/glm46v/glm-4-6v-flash-qlora.yaml 一条命令即可完成 9B Flash 变体的 QLoRA 微调,通过 examples/glm46v/glm-4-6v-flash-ddp.yaml 可平滑扩展到多卡 DDP;删除adapterload_in_4bit两行即可切换全量微调;底层由Glm4vProcessingStrategy统一处理媒体 token 的标签掩码。配合多模态数据集格式规范,你可以轻松替换为自有视觉指令数据,在单卡到多卡的不同预算下开展视觉语言任务的微调实验。

【免费下载链接】axolotlGo ahead and axolotl questions项目地址: https://gitcode.com/GitHub_Trending/ax/axolotl

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询