Skip to content

核心架构与微调

基于 Meta AI / llama.com / developer.meta.com 官方文档 + HuggingFace PEFT/Transformers + vLLM 官方文档编写,对照 2025-04-05 发布的 Llama 4 系列

速查

  • MoE:alternating dense + MoE 层,所有参数常驻显存,每 token 仅激活 shared + 1/N routed expert;显存按总参算、算力按激活参数算
  • Early fusion:文本+图像+视频联合预训练(不是外挂视觉模块),视觉编码器基于 MetaCLIP;预训练最多 48 图、后训练测试最多 8 图
  • iRoPE:interleaved RoPE,无位置编码的 global attention 与带 RoPE 的 chunked local attention 按 1:3 交错,配合推理期 attention temperature scaling 实现 length generalization
  • 训练规模:>30T token(Llama 3 的 2x+)、200+ 语言、FP8 精度;Behemoth 在 32K GPU 上达 390 TFLOPs/GPU
  • 后训练管线:lightweight SFT → online RL(连续 + 自适应过滤)→ lightweight DPO;删除 >50% 标记为 easy 的 SFT 数据(Behemoth 删 95%)
  • LoRA:ΔW ≈ B×A,A 用 Kaiming-uniform、B 全零(初始恒等映射);典型 256x 参数削减
  • LoraConfig 必会r(秩)、lora_alpha(有效 scale=alpha/r)、target_modules(覆盖 q/k/v/o)、use_rslora(alpha/√r,高秩稳训练)、init_lora_weights(default/gaussian/loftq)
  • QLoRA:基础模型 NF4(4-bit NormalFloat)量化 + LoRA;官方推荐 LoftQ 初始化让 A/B 补偿量化误差,16GB GPU 可微调 7B 级
  • 推理期合并merge_and_unload() 熔独立模型零延迟;merge_adapter()/unmerge_adapter() 热切换;add_weighted_adapter() 多 LoRA 加权融合
  • vLLM 长上下文:Scout 10M 必须开 attn_temperature_tuning + --kv-cache-dtype fp8;H100 1M、H200 3.6M
  • Meta Model API:drop-in 兼容 OpenAI/Anthropic SDK,$20 免费额度,3000 RPM/团队
  • 许可:Llama 4 Community License,700M MAU 阈值;HF gated repo
  • 反模式:把 MoE 17B 激活等同 17B dense 显存;Behemoth 当生产模型;QLoRA 不用 LoftQ;微调不 merge 就上 vLLM;裸写 <|image|> 等特殊 token

MoE 架构深度

alternating dense + MoE 层

Llama 4 不是「全部 MoE」,而是密集层与 MoE 层交错(alternating)。每个 MoE 层内有:

  • 1 个 shared expert:每个 token 必经
  • N 个 routed experts:每 token 进 1/N(Maverick 是 1/128)

关键机制

  • 所有 experts 的权重全部常驻显存——不管激不激活
  • 每个 token 的 forward pass 只读取 shared + 被路由到的那 1 个 expert 的权重做计算
  • 训练 / 推理的算力消耗按 17B 激活参数算,显存占用按 109B / 400B 总参数算
模型sharedrouted每 token 激活 expert
Scout115shared + 部分 routed
Maverick1128shared + 1/128 routed

MoE 的核心 trade-off:用更多显存换更少算力——同样能力下,MoE 推理算力远低于等能力 dense。

总参 vs 激活参数(最易踩坑)

估算对象用哪个
显存占用(能不能装下)总参数 109B / 400B
单 token 算力(FLOPs)激活参数 17B
训练算力总参数 × 数据量

把「17B 激活」当 17B dense 模型算显存 = 直接 OOM。109B 总参 FP16 ≈ 218GB 显存,必须 INT4(~50GB)才能单卡 H100。

原生多模态 early fusion

与 late fusion 的区别

维度Late fusion(外挂)Early fusion(Llama 4)
视觉模块独立 vision encoder 后接 LLM联合预训练,视觉 token 进主干
训练多阶段(先文本后对齐)单阶段联合
优势模块解耦跨模态理解更深

Llama 4 实现

  • 视觉编码器基于 MetaCLIP,与冻结的 Llama 联合训练
  • 预训练阶段:每 prompt 最多 48 张图
  • 后训练测试:每 prompt 最多 8 张图

Early fusion 让 Llama 4 在多模态推理上比传统「视觉编码器 + projector + LLM」三段式架构的模型表现更稳。

iRoPE 与超长上下文

iRoPE(interleaved RoPE)机制

Llama 4 用 interleaved RoPE 支持超长上下文:

  • Global attention:无位置编码(noPE),负责跨距离依赖
  • Chunked local attention:带 RoPE 的局部 attention,负责近距离细节
  • 两者按 1:3 交错(每 1 层 global 配 3 层 local)
  • 配合推理期 attention temperature scaling:随距离调整 attention logits 的温度,做 length generalization

Scout 10M 上下文部署要点

取值
理论上限10M token
H100 单机可用上下文~1M
H200 单机可用上下文~3.6M(开 KV cache fp8)
必须开启--override-generation-config attn_temperature_tuning=true
推荐开启--kv-cache-dtype fp8(翻倍上下文)

10M 是理论上限。不开 attn_temperature_tuning 会掉精度;不量化 KV cache 会爆显存

训练规模与后训练管线

预训练

  • 数据量:>30T token(Llama 3 的 2 倍+)
  • 语言:200+ 语言,100+ 语言各 >1B token(多语言 token 是 Llama 3 的 10 倍)
  • 精度:FP8
  • 算力:Behemoth 在 32K GPU 上达 390 TFLOPs/GPU

后训练管线(重构)

传统 SFT → DPO 单管线被 Llama 4 推翻

lightweight SFT  →  online RL(连续 + 自适应数据过滤)  →  lightweight DPO

关键改动

  • 删除 >50% 标记为 easy 的 SFT 数据(Behemoth 删 95%)——与传统「数据越多越好」相反
  • online RL 阶段做连续训练 + 自适应过滤
  • DPO 只做 lightweight 微调

不要把 Llama 4 后训练说成「传统 SFT → DPO」——会失实。

LoRA / QLoRA 深度

LoRA 原理

冻结原权重 W,新增低秩矩阵 A、B 使权重更新 ΔW ≈ B × A:

原始前向:  y = W·x
LoRA 前向: y = W·x + B·A·x
  • A 用 Kaiming-uniform 初始化
  • B 全零初始化
  • 保证初始时 B·A = 0,即恒等映射(不改变原模型行为)
  • 训练时只更新 A、B,原权重 W 冻结

参数削减示例:4096 × 4096 矩阵(16.7M 参数),r=8 时 A 是 4096×8、B 是 8×4096,共 65K 可训练参数,削减 256x。

LoraConfig 关键超参

字段作用经验值
r秩,越低参数越少8 / 16
lora_alpha缩放系数,有效 scale = alpha / r2 × r
target_modules挂载的线性层["q_proj","k_proj","v_proj","o_proj"]
use_rslora用 alpha/√r 而非 alpha/r(高秩稳训练)true(高 r 时)
init_lora_weightsA/B 初始化方式default / gaussian / loftq
bias是否训练 bias"none"
layers_to_transform只挂特定层全部
modules_to_save训练并保存原始模块["embed_tokens"]

官方起步经验:r=8/16、lora_alpha=2×r、target_modules 覆盖 q/k/v/o、bias='none'。高 r 时用 use_rslora=True(alpha/√r)数值更稳。

QLoRA 与 LoftQ

QLoRA = NF4 量化 + LoRA

  • 基础模型 NF4(4-bit NormalFloat)量化
  • 在量化后的模型上挂 LoRA 训练
  • 16GB 消费级 GPU 可微调 7B 级模型

LoftQ 初始化(官方推荐)

  • 标准流程:先 bitsandbytes 量化,再挂 LoRA(默认初始化)→ 丢精度
  • LoftQ 流程:init_lora_weights='loftq' + LoftQConfig(loftq_bits=4),A/B 初始化即补偿量化误差
  • PEFT 官方明确推荐 LoftQ

不要先自行量化再挂默认初始化的 LoRA——会丢精度。

推理期合并(部署前必做)

ts
// 把 LoRA 权重熔进基础权重,得独立模型
const merged = peftModel.merge_and_unload();
await merged.savePretrained("./merged-model");

// 其他工具方法(不熔):
peftModel.merge_adapter();       // 临时熔,可 unmerge 切回
peftModel.unmerge_adapter();     // 解熔,切回原 + LoRA 分离
peftModel.add_weighted_adapter({ // 多 LoRA 加权融合
  adapters: ["lora-a", "lora-b"],
  weights: [0.7, 0.3],
  adapter_name: "merged-lora",
});
方法用途
merge_and_unload()部署前熔成独立模型,零额外延迟
merge_adapter() / unmerge_adapter()在 PeftModel 内热切换多适配器
add_weighted_adapter()多 LoRA 加权融合成新适配器

保留未合并版本以便后续迭代;部署的版本必须 merge。

部署 / API 深度

vLLM(生产服务)

场景命令模板
Scout 单机 8 卡vllm serve meta-llama/Llama-4-Scout-17B-16E-Instruct --tensor-parallel-size 8 --max-model-len 1000000
Maverick FP8vllm serve meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8 --tensor-parallel-size 8
多模态--limit-mm-per-prompt image=10
长上下文--kv-cache-dtype fp8 + --override-generation-config attn_temperature_tuning=true

为什么生产用 vLLM 不用 Ollama

  • vLLM 的 continuous batching:动态拼批,吞吐数倍于静态批
  • vLLM 的 PagedAttention:KV cache 分页管理,显存利用率高
  • Ollama / LM Studio 优化单机易用性,无连续批处理能力

Ollama(桌面 / 原型)

bash
ollama run llama4           # 一行起

REST API 默认 http://localhost:11434/api

端点用途
POST /api/generate单轮 prompt
POST /api/chatmessages 对话(含工具调用)
POST /api/embeddings向量
POST /api/pull拉模型
POST /api/show查模型信息
GET /api/list列已装模型

多模态图像用 images: ["base64-string"] 数组传入 messages。

Meta Model API(dev.meta.ai 托管)

ts
// OpenAI SDK drop-in
const client = new OpenAI({
  apiKey: process.env.META_API_KEY,
  baseURL: "https://api.llama.com/compat/v1/",
});

// 或 Anthropic SDK drop-in
import Anthropic from "anthropic";
const claude = new Anthropic({
  apiKey: process.env.META_API_KEY,
  baseURL: "https://api.llama.com/compat/v1/",
});
  • 新账户送 $20 免费额度
  • 1M token 计费
  • 限流 3000 RPM / 团队
  • 前代 Llama 3.3 70B 仍可在 API 中使用

反模式(避坑)

  • 把「MoE 17B 激活」等同「17B dense 显存」:总参 109B/400B 全部常驻显存,按总参备显存;按 17B 备会直接 OOM
  • Scout 默认拉到 10M 上下文却不开 attn_temperature_tuning / fp8 KV cache:掉精度或爆显存,10M 是理论上限
  • 把 Behemoth 当生产模型写进架构:仍在训练、仅作教师、非完全开源权重
  • 把后训练说成「传统 SFT → DPO 单管线」:Llama 4 是 SFT → online RL → lightweight DPO,且主动删 >50% easy SFT 数据
  • QLoRA 先 bitsandbytes 量化再挂默认 LoRA:丢精度,应用 LoftQ 初始化
  • LoRA 微调完不 merge 就上 vLLM/Ollama serve:保留适配器热路径在生产推理引擎常不支持或掉性能,先 merge_and_unload()
  • LoRA target_modules 过窄(只挂 q_proj):欠拟合,应覆盖 q/k/v/o 等多个线性层
  • 混淆「开源权重」与「开源许可」:Llama 4 是 open-weight 但走 Llama 4 Community License,700M MAU 阈值,HF 是 gated repo
  • 拿 Llama 4 回答 2024-10 之后事件却不联网 / RAG:知识截止 2024-10,闭口不提 cutoff 会产出过时 / 幻觉
  • 在 mustache / Jinja 模板里裸写 <|image|> / <|begin_of_text|> 特殊 token:被 Vue / VitePress 当插值或 HTML 标签致 build 崩,用 v-pre 或围栏代码块包裹
  • 以为 Maverick FP8 是无损:FP8 在数值敏感场景仍有微小精度差异,关键业务需做回归对比

下一步

  • 参考:完整参数表、CLI/API 命令清单、许可条款、官方资源