视觉、音频、全模态:十几个独立命名的多模态 template

2026-08-09

本文所有事实以 hiyouga/LlamaFactory 官方仓库 2026-08-09 的内容为准。我们没有安装、训练或部署过任何模型,文中数字均为仓库文档与源码里写着的值。

很多人以为 LlamaFactory 的多模态是”某个地方打个勾”,实际上它落在一个很朴素的地方:README 模型表最右边那一列 Template。那一列里,视觉、视频、音频、全模态各自有一批独立命名的字符串,彼此不通用,也不会自动推断。你要做的不是”开启多模态”,而是把属于你那个模型系列的那一串字符抄对。

这篇不讲多模态微调怎么调参,只回答一件事:这些 template 名分别是什么、怎么读、抄错了会牵动什么。

先把名单摊开

README 的模型表我们实读是 53 行(README 标题里写的 “100+ large language models” 指的是这些系列展开后的模型总数,不是表格行数——这一点我们另有一篇专门讲)。整张表这篇不重复,只摘与多模态直接相关的那些行,因为这篇要解释的正是这一列里的命名规律:

ModelModel sizeTemplate
GLM-4.5/GLM-4.5(6)V9B/106B/355Bglm4_moe/glm4_5v
InternVL 2.5-3.51B/2B/4B/8B/14B/30B/38B/78B/241Bintern_vl
Kimi-VL16Bkimi_vl
LFM 2.5 (VL)1.2B/1.6Blfm2/lfm2_vl
Llama 3.2 Vision11B/90Bmllama
LLaVA-1.57B/13Bllava
LLaVA-NeXT7B/8B/13B/34B/72B/110Bllava_next
LLaVA-NeXT-Video7B/34Bllava_next_video
MiniCPM-o/MiniCPM-V 4.58B/9Bminicpm_o/minicpm_v
MiniCPM-V 4.63B/8Bminicpm_v_4_6
PaliGemma/PaliGemma23B/10B/28Bpaligemma
Pixtral12Bpixtral
Qwen2-VL/Qwen2.5-VL/QVQ2B/3B/7B/32B/72Bqwen2_vl
Qwen3-VL2B/4B/8B/30B/32B/235Bqwen3_vl

视觉这一侧独立命名的 template 有 mllamallavallava_nextllava_next_videoqwen2_vlqwen3_vlintern_vlkimi_vlminicpm_vglm4_5vpixtralpaligemmalfm2_vl 这十三个。

音频与全模态另有一组,同样是各自独立的名字:

ModelModel sizeTemplate
Qwen2-Audio7Bqwen2_audio
Qwen2.5-Omni3B/7Bqwen2_omni
Qwen3-Omni30Bqwen3_omni

加上前面 MiniCPM 那行里的 minicpm_o,音频/全模态一侧是 qwen2_audioqwen2_omniqwen3_omniminicpm_o 四个。

把两侧加起来,就是标题里”十几个”的来源。这里只是把表里已有的字符串按类归了一次,没有做任何加工。

命名里有三个能直接读出来的规律

第一,_vl 是视觉侧最常见的后缀,但不是通用规则。 intern_vlkimi_vlqwen2_vlqwen3_vllfm2_vl 都带 _vl,可 mllamallavapixtralpaligemma 就完全不带。也就是说,你不能靠”在模型名后面加个 _vl”来猜 template——猜出来的字符串在表里可能根本不存在。这一列的正确用法只有一个:回表查,然后逐字符抄。

第二,同一行里出现两个 template 名,意味着这个系列被拆成了两档。 表里 glm4_moe/glm4_5vminicpm_o/minicpm_vlfm2/lfm2_vl 都是这种写法,斜杠两侧分别对应该系列的不同档位。这是这篇里最容易踩的一格:你要用的是不是带 _vl / _5v / _o 的那一个,取决于你手上具体是哪一档权重,而不是取决于”这个系列支持多模态”。

第三,同一个系列换了小版本,template 名也可能跟着换。 表里 MiniCPM-o/MiniCPM-V 4.5 走的是 minicpm_o/minicpm_v,而 MiniCPM-V 4.6 单独占一行、template 写的是 minicpm_v_4_6。所以”上次跑 MiniCPM 用的什么,这次照抄”是不成立的,版本号变了要重新回表看一眼。

再往下的问题——这些 template 内部到底怎么拼提示词、视觉 token 怎么插——我们没有读过实现,不做描述。

那条全大写的规则,在多模态这批上格外好踩

模型表下面 README 给了六条注解,其中两条是硬规则,跟这篇直接相关:

一条是:对 base 模型,template 可以从 defaultalpacavicuna 之类里选;但对 instruct/chat 模型,务必使用对应的 template。这里要留意的是,这条规则按”base”与”instruct/chat”分档,而模型表本身并没有逐行标注哪一行属于哪一档——你手上那份权重算哪一档,得看权重发布方自己怎么标,仓库文档没有替你判定。落到实操上就是:只要不能确定手上是 base 权重,就按”必须用对应 template”这一侧办,别去通用兜底档里随便挑一个。

另一条更关键,README 原文用了全大写强调:训练和推理必须用同一个 template(Remember to use the SAME template in training and inference)。这条规则对所有模型都成立,我们另有一篇专门讲它。放在这篇里要补一句的是:多模态这批 template 名彼此形近——llava / llava_next / llava_next_video 三个只差后缀,qwen2_vlqwen3_vl 只差一个数字,minicpm_vminicpm_v_4_6 只差个版本尾巴。你在训练 YAML 里写一个、在推理 YAML 里写另一个,两个名字各自都是表里存在的取值,差异只体现在”两处对不上”这件事本身。

所以实操上唯一稳的做法是:把 template 这个字段当成一个必须跨文件保持一致的常量来管——训练配置、推理配置、合并配置里的这一行要能一眼比对上。至于比对不上会具体表现成什么样,我们没有跑过训练,不臆测现象。

顺带记住两个查证入口:完整模型清单在 src/llamafactory/extras/constants.py;要加自定义 chat template 的话,README 指的位置是 src/llamafactory/data/template.py。表里还有 *** 两种标记,注解写的是:带 * 的需要从 main 分支安装 transformers 并用 DISABLE_VERSION_CHECK=1 跳过版本检查,带 ** 的需要安装特定版本的 transformers。查你那一行的时候顺手看一眼有没有带标记,比装完之后再回头查省事。

template 之外,多模态还有第二组旋钮

选对 template 只解决了”对话格式”这一层。多模态输入本身怎么处理,在 src/llamafactory/hparams/model_args.py 里另有一组字段,下面全部是源码里 field(default=...) 读出来的默认值:

参数默认值
image_max_pixels768 * 768
image_min_pixels32 * 32
image_do_pan_and_scanFalse
crop_to_patchesFalse
video_max_pixels256 * 256
video_min_pixels16 * 16
video_fps2.0
video_maxlen128
use_audio_in_videoFalse
audio_sampling_rate16000

从这组默认值可以直接读出三件事,都不需要推断:

  • 图像的最大像素预算是 768 * 768,视频单帧是 256 * 256,前者是后者的 9 倍;
  • 视频默认按 2.0 fps 抽帧,最多取 128 帧;
  • 音频默认采样率是 16000,而 use_audio_in_video 默认是 False——也就是说,“视频里的音轨”这件事在字段层面有独立开关,且默认没打开。这个开关背后的处理逻辑我们没有读过,只陈述默认值。

这些该不该改、改成多少,取决于你的数据形态和硬件,官方没有给通用推荐值,我们也不编一个。

model_args.py 之外还有一组和多模态相关的冻结开关(视觉塔、投影层、语言模型三个),默认值有点反直觉,我们另有一篇专门拆,这篇不展开。

Windows 侧要单独说的一行

拿权重这一步常常是第一道坎。README 把这个场景写成”Hugging Face 下载有问题时”,给出的处置是切下载源;环境变量的写法两个平台不一样,别混用。

Linux / macOS:

export USE_MODELSCOPE_HUB=1

Windows:

set USE_MODELSCOPE_HUB=1

切过去之后,model_name_or_path 要填 ModelScope 侧的 model ID(README 给的示例是 LLM-Research/Meta-Llama-3-8B-Instruct)。切 Modelers Hub 是同一套写法,变量换成 USE_OPENMIND_HUB=1,model ID 示例是 TeleAI/TeleChat-7B-pt

这里有一处仓库内部可核实的口径差异,顺手说明:trust_remote_codemodel_args.py 里的源码默认值是 False,而 examples/ 下的示例 YAML(train_lora/qwen3_lora_sft.yamlinference/qwen3_lora_sft.yamlmerge_lora/qwen3_lora_sft.yaml)里都显式写了 trust_remote_code: true。两处口径不一致,以仓库当前状态为准。我们不推断原因,也不给”你该不该开”的结论。

最后,这张名单该怎么用

按顺序走,比按印象走可靠:

  1. 先在模型表里找到你手上权重对应的那一,不是那个系列的大致位置——版本号不同可能就是另一行;
  2. 看这行的 Template 列是不是斜杠分档,如果是,先确认你的权重属于哪一档;
  3. 把那串字符原样抄进训练配置的 template 字段,再把同一串字符同步到推理和合并配置;
  4. 回头看这行有没有 * / ** 标记,有的话先把 transformers 的版本条件处理掉;
  5. 如果要动图像/视频/音频的输入预算,去 model_args.py 那组字段里改,那和 template 是两回事。

多模态这块,本篇能核实到的那部分复杂度都不在算法层,而在”名字对不对得上”这一层。把 Template 这一列当成一个必须跨文件一致的字符串常量来管,是这几张表里最容易一次性做对的一件事。


本文依据 LlamaFactory 官方仓库(github.com/hiyouga/LlamaFactory)的 README、data/README.mdexamples/ 下的配置与 src/llamafactory/hparams/ 的参数定义整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有安装、训练或部署过任何模型,文中显存数字均为官方标注的估算值(README 原文标 * estimated)而非实测占用。参数与默认值随版本变动,请以 llamafactory-cli train -h 的实际输出为准。安全相关做法请结合自身环境评估,本文不构成安全方案建议。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。