视觉、音频、全模态:十几个独立命名的多模态 template
本文所有事实以
hiyouga/LlamaFactory官方仓库 2026-08-09 的内容为准。我们没有安装、训练或部署过任何模型,文中数字均为仓库文档与源码里写着的值。
很多人以为 LlamaFactory 的多模态是”某个地方打个勾”,实际上它落在一个很朴素的地方:README 模型表最右边那一列 Template。那一列里,视觉、视频、音频、全模态各自有一批独立命名的字符串,彼此不通用,也不会自动推断。你要做的不是”开启多模态”,而是把属于你那个模型系列的那一串字符抄对。
这篇不讲多模态微调怎么调参,只回答一件事:这些 template 名分别是什么、怎么读、抄错了会牵动什么。
先把名单摊开
README 的模型表我们实读是 53 行(README 标题里写的 “100+ large language models” 指的是这些系列展开后的模型总数,不是表格行数——这一点我们另有一篇专门讲)。整张表这篇不重复,只摘与多模态直接相关的那些行,因为这篇要解释的正是这一列里的命名规律:
| Model | Model size | Template |
|---|---|---|
| GLM-4.5/GLM-4.5(6)V | 9B/106B/355B | glm4_moe/glm4_5v |
| InternVL 2.5-3.5 | 1B/2B/4B/8B/14B/30B/38B/78B/241B | intern_vl |
| Kimi-VL | 16B | kimi_vl |
| LFM 2.5 (VL) | 1.2B/1.6B | lfm2/lfm2_vl |
| Llama 3.2 Vision | 11B/90B | mllama |
| LLaVA-1.5 | 7B/13B | llava |
| LLaVA-NeXT | 7B/8B/13B/34B/72B/110B | llava_next |
| LLaVA-NeXT-Video | 7B/34B | llava_next_video |
| MiniCPM-o/MiniCPM-V 4.5 | 8B/9B | minicpm_o/minicpm_v |
| MiniCPM-V 4.6 | 3B/8B | minicpm_v_4_6 |
| PaliGemma/PaliGemma2 | 3B/10B/28B | paligemma |
| Pixtral | 12B | pixtral |
| Qwen2-VL/Qwen2.5-VL/QVQ | 2B/3B/7B/32B/72B | qwen2_vl |
| Qwen3-VL | 2B/4B/8B/30B/32B/235B | qwen3_vl |
视觉这一侧独立命名的 template 有 mllama、llava、llava_next、llava_next_video、qwen2_vl、qwen3_vl、intern_vl、kimi_vl、minicpm_v、glm4_5v、pixtral、paligemma、lfm2_vl 这十三个。
音频与全模态另有一组,同样是各自独立的名字:
| Model | Model size | Template |
|---|---|---|
| Qwen2-Audio | 7B | qwen2_audio |
| Qwen2.5-Omni | 3B/7B | qwen2_omni |
| Qwen3-Omni | 30B | qwen3_omni |
加上前面 MiniCPM 那行里的 minicpm_o,音频/全模态一侧是 qwen2_audio、qwen2_omni、qwen3_omni、minicpm_o 四个。
把两侧加起来,就是标题里”十几个”的来源。这里只是把表里已有的字符串按类归了一次,没有做任何加工。
命名里有三个能直接读出来的规律
第一,_vl 是视觉侧最常见的后缀,但不是通用规则。 intern_vl、kimi_vl、qwen2_vl、qwen3_vl、lfm2_vl 都带 _vl,可 mllama、llava、pixtral、paligemma 就完全不带。也就是说,你不能靠”在模型名后面加个 _vl”来猜 template——猜出来的字符串在表里可能根本不存在。这一列的正确用法只有一个:回表查,然后逐字符抄。
第二,同一行里出现两个 template 名,意味着这个系列被拆成了两档。 表里 glm4_moe/glm4_5v、minicpm_o/minicpm_v、lfm2/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 可以从 default、alpaca、vicuna 之类里选;但对 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_vl 和 qwen3_vl 只差一个数字,minicpm_v 和 minicpm_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_pixels | 768 * 768 |
image_min_pixels | 32 * 32 |
image_do_pan_and_scan | False |
crop_to_patches | False |
video_max_pixels | 256 * 256 |
video_min_pixels | 16 * 16 |
video_fps | 2.0 |
video_maxlen | 128 |
use_audio_in_video | False |
audio_sampling_rate | 16000 |
从这组默认值可以直接读出三件事,都不需要推断:
- 图像的最大像素预算是
768 * 768,视频单帧是256 * 256,前者是后者的 9 倍; - 视频默认按
2.0fps 抽帧,最多取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_code 在 model_args.py 里的源码默认值是 False,而 examples/ 下的示例 YAML(train_lora/qwen3_lora_sft.yaml、inference/qwen3_lora_sft.yaml、merge_lora/qwen3_lora_sft.yaml)里都显式写了 trust_remote_code: true。两处口径不一致,以仓库当前状态为准。我们不推断原因,也不给”你该不该开”的结论。
最后,这张名单该怎么用
按顺序走,比按印象走可靠:
- 先在模型表里找到你手上权重对应的那一行,不是那个系列的大致位置——版本号不同可能就是另一行;
- 看这行的 Template 列是不是斜杠分档,如果是,先确认你的权重属于哪一档;
- 把那串字符原样抄进训练配置的
template字段,再把同一串字符同步到推理和合并配置; - 回头看这行有没有
*/**标记,有的话先把transformers的版本条件处理掉; - 如果要动图像/视频/音频的输入预算,去
model_args.py那组字段里改,那和 template 是两回事。
多模态这块,本篇能核实到的那部分复杂度都不在算法层,而在”名字对不对得上”这一层。把 Template 这一列当成一个必须跨文件一致的字符串常量来管,是这几张表里最容易一次性做对的一件事。
本文依据 LlamaFactory 官方仓库(github.com/hiyouga/LlamaFactory)的 README、data/README.md、examples/ 下的配置与 src/llamafactory/hparams/ 的参数定义整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有安装、训练或部署过任何模型,文中显存数字均为官方标注的估算值(README 原文标 * estimated)而非实测占用。参数与默认值随版本变动,请以 llamafactory-cli train -h 的实际输出为准。安全相关做法请结合自身环境评估,本文不构成安全方案建议。