ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从ONNX到NPU:Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K的OGA混合推理流水线深度解析

从ONNX到NPU:Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K的OGA混合推理流水线深度解析

【免费下载链接】Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K

项目地址:https://ai.gitcode.com/hf_mirrors/amd/Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K
点击查看免费下载

本文深入解析Llama-3.2-3B-Instruct在 AMD Ryzen AI 平台上的OGA 混合推理流水线。该模型经过 Quark 量化、ONNX 图优化和 NPU Token Fusion 编译三重处理,实现了 16K 上下文长度下 CPU 与 NPU 的高效协同推理,是 AMD 为 APU 端侧部署打造的完整工程实践案例。

📦 这个模型仓库到底是什么?

Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K并非原始模型,而是 AMD 基于 Meta 的 Llama-3.2-3B-Instruct 进行的一整套端侧优化产物。

简单来说,它回答了一个核心问题:

如何让一个 3B 参数的大语言模型,在 AMD Ryzen AI 处理器(CPU + NPU 异构架构)上流畅运行 16K 上下文推理?

答案就是仓库名中暗示的三个阶段:量化(rai_1.8.0)→ OGA 混合推理(npu)→ 16K Token Fusion(16K)。

📌 详细说明见 README.md

🔧 三大流水线阶段:从原始权重到 NPU 可执行

整个优化流水线可以看作一条"加工厂",原始模型是原材料,最终产出是 NPU 可直接执行的推理图。

阶段一:Quark 量化 — 用 1/4 的体积保留精度

量化是体积缩减的第一步。该模型采用了 Meta 的Quark量化工具,具体策略如下:

量化维度具体参数说明
算法AWQ(Activation-aware Weight Quantization)根据激活分布自适应缩放,保护重要通道
权重精度UINT4权重从 16-bit 压缩到 4-bit,体积缩小约 4 倍
分组大小Group 128每 128 个权重共享一组缩放因子,平衡精度与压缩率
激活精度BFP16(Bfloat16)激活值保持 16-bit,避免推理精度损失
对称性非对称(Asymmetric)独立处理正负偏移,提升小模型精度

这些配置完整记录在 config.json 的quantization_config字段中。其中scaling_layers定义了 AWQ 对q_proj、k_proj、v_proj、o_proj、gate_proj、up_proj、down_proj七类线性层的缩放关系,确保每一层量化都在正确的输入分布上计算缩放因子。

💡为什么选 AWQ?对于 3B 这样的小型模型,AWQ 相比简单的均匀量化能更好地保留注意力头的精度,同时保持 NPU 友好的 UINT4 格式。

阶段二:OGA Model Builder — 构建混合推理 ONNX 图

OGA(ONNX Graph Assembly)是 AMD Ryzen AI 工具链的核心组件,负责将量化后的 PyTorch 模型转换为面向异构执行的 ONNX 推理图。

这一步产出两类关键产物:

  1. ONNX 计算图(model.onnx)

    • 包含算子融合后的推理图结构
    • 权重存储在外置数据文件 model.onnx.data 中
    • 图内算子已被融合优化(如MLADFRMSNORM融合算子),减少 CPU 调度开销
  2. NPU 编译二进制(model.pb.bin)

    • Ryzen AI NPU 提供商的专用执行格式
    • 通过external_data_file参数挂载到 ONNX Runtime 的 NPU Session
    • 由 Token Fusion 编译器生成(见下阶段)

📌 推理图的输入输出接口定义在 genai_config.json 中:输入为input_ids+attention_mask+ 历史past_key_values,输出为logits+ 更新的present.*KV 缓存。

阶段三:NPU Token Fusion — 16K 上下文编译

这是整个流水线中最"硬核"的一步。NPU 的算力虽然强大,但执行模型与 CPU 截然不同——它需要静态编译、预分配内存、固定输入形状。

Token Fusion 编译器针对不同的attention_mask长度,分别编译了专用推理图,对应仓库中一系列dd_metastate_*文件:

dd_metastate_Llm_Token_Token_..._attention_mask_padded_256_.meta dd_metastate_Llm_Token_Token_..._attention_mask_padded_512_.meta dd_metastate_Llm_Token_Token_..._attention_mask_padded_1024_.meta dd_metastate_Llm_Token_Token_..._attention_mask_padded_2048_.meta dd_metastate_Llm_Token_Token_..._attention_mask_padded_3072_.meta dd_metastate_Llm_Token_Token_..._attention_mask_padded_4096_.meta dd_metastate_Llm_Token_Token_..._attention_mask_padded_16384_.meta

每个长度档位(256 → 16384)对应一组三元文件:

文件后缀作用
.metaNPU 状态表的元数据描述(算子列表、张量形状、执行顺序)
.ctrlpkt控制包(Control Packet),NPU 调度器用于控制数据流和同步
.super超级指令块,预编译的 NPU 微码指令

以 cache/Token_modellayers.0input_layernormMLADFRMSNORM_meta.json 为例,可以清晰看到融合算子MLADFRMSNORM的输入张量、权重常量、输出张量及pdi_id(Platform Design ID)等 NPU 硬件级属性。

本质:Token Fusion 将动态的 ONNX 图"烘焙"为 NPU 可直接执行的静态二进制,每个序列长度档位一个独立编译产物,运行时按实际长度选择最近的档位执行。

⚡ 混合推理(Hybrid OGA)是怎么工作的?

"混合"是这个方案最核心的设计思想:CPU 和 NPU 各干各擅长的事。

Prefill 阶段 → CPU

当用户输入一段提示词(Prompt),模型需要一次性处理所有 token 并计算完整的 KV 缓存。这个阶段的特征是计算密集、序列并行,非常适合 CPU 的宽向量单元。

genai_config.json中的关键参数:

  • chunk_size: 4096— 每次预填充处理 4096 个 token
  • hybrid_opt_chunk_context: 1+hybrid_opt_chunk_context_threshold: 1— 开启分块上下文处理

这意味着一个 8K 的 Prompt 会被拆成两个 4K 的 chunk,逐块送入 CPU 计算,避免一次性占用过多内存。

Token 生成阶段 → NPU

Prefill 完成后,进入逐 token 自回归生成。此时每步只需计算单个新 token,计算量小但迭代次数多(可能达数千步),对延迟极其敏感。

NPU 在此阶段的优势:

  • hybrid_opt_token_backend: npu— 明确指定 token 生成由 NPU 执行
  • hybrid_opt_max_seq_length: 4096— NPU 单次处理的最大序列长度
  • fusion_opt_io_bind_kv_cache: 1— KV 缓存绑定在 NPU 高速内存中,避免每步跨总线拷贝

📌 推理搜索策略(temperature 0.6、top_p 0.9、top_k 50)同样定义在 genai_config.json 的search段中。

整体数据流

用户 Prompt │ ▼ ┌─────────────────────────┐ │ CPU (Ryzen x86 核心) │ ← Prefill:分块处理,构建 KV Cache │ chunk_size = 4096 │ └────────────┬────────────┘ │ KV Cache 写入 NPU 绑定内存 ▼ ┌─────────────────────────┐ │ NPU (XDNA 加速器) │ ← Token 生成:逐 token 自回归 │ max_seq = 4096/步 │ └────────────┬────────────┘ │ ▼ 生成结果 (≤ 16384 tokens)

📐 16K 上下文:参数背后的设计

名字中的16K并非随意标注,它对应 genai_config.json 中max_length: 16384——即最大生成 16384 个 token。

而模型本身的上下文能力远不止于此:

参数值含义
context_length131072(128K)模型架构支持的最大上下文窗口
max_position_embeddings131072位置编码的最大范围
max_length(生成)16384(16K)实际部署中限定的最大生成长度
rope_scaling.factor32.0RoPE 外推缩放因子(llama3 类型)
rope_scaling.original_max_position_embeddings8192原始训练时的位置编码范围

💡RoPE 缩放:Llama-3.2-3B-Instruct 原始训练时最大位置为 8192,通过llama3类型的 RoPE 缩放(factor=32),将位置编码范围扩展到 131072,从而支持长上下文推理。

rai_config.json还记录了不同 Ryzen AI SDK 版本(1.3.1 ~ 1.7.1)对应的max_prompt_length上限(2048 ~ 4096),确保 Prompt 长度与 SDK 能力匹配。

📂 仓库文件结构速览

文件 / 目录作用
model.onnx + model.onnx.dataOGA ONNX 推理图 + 外置量化权重
model.pb.binNPU 编译二进制(Token Fusion 产物)
model.bin模型辅助二进制
dd_metastate_*(21 个文件)NPU 状态表:各长度档位的元数据、控制包、超级指令
cache/Token 图编译缓存(txn_bins.zip包含 NPU 可执行二进制包)
genai_config.jsonONNX Runtime GenAI 推理配置(混合推理参数核心)
config.jsonHuggingFace 模型配置 + Quark 量化策略
orig_params.json / params.json原始/当前模型结构参数(28 层、3072 隐层、GQA 8 KV 头)
rai_config.json各 SDK 版本的 Prompt 长度上限
generation_config.json采样参数(temperature 0.6、top_p 0.9)
tokenizer.json / tokenizer.model分词器(FastTokenizer + SentencePiece)
chat_template.jinja对话模板(Jinja2)
special_tokens_map.json特殊 token 映射(<|begin_of_text|>、<|eot_id|>)
USE_POLICY.mdMeta Llama 3.2 可接受使用政策
LICENSE.txtMIT 许可证(AMD 修改部分)

🚀 快速上手

在 AMD Ryzen AI 设备上部署该模型,需要Ryzen AI SDK 1.8.0及以上版本。基本流程:

  1. 获取模型:从模型仓库下载全部文件(含 LFS 大文件)
  2. 加载推理引擎:通过 ONNX Runtime GenAI 加载 model.onnx,配置 RyzenAI Provider 指向 model.pb.bin
  3. 执行推理:调用generate()方法,引擎自动完成 Prefill(CPU)→ Token 生成(NPU)的混合调度

📖 完整的 Quick Start 和 API 示例请参考 AMD Ryzen AI 官方文档中的Hybrid OGA章节。

⚠️ 注意:rai_config.json表明 Prompt 长度受 SDK 版本限制(最高 4096),超长 Prompt 需使用 1.6.0+ 版本。

✅ 关键技术参数一览

维度参数
源模型Llama-3.2-3B-Instruct(Meta)
架构28 层 Transformer,hidden_size 3072,24 注意力头 / 8 KV 头(GQA),head_dim 128
词表大小128,256
量化AWQ / UINT4 / Group 128 / BFP16 激活
最大上下文131,072(128K,RoPE 缩放 ×32)
最大生成长度16,384(16K)
Prefill 分块4,096 tokens/chunk
推理后端CPU(Prefill)+ NPU(Token 生成)
目标硬件AMD Ryzen AI(XDNA NPU)
SDK 版本Ryzen AI SDK 1.8.0

总结

Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K是一个端到端的工程化产物,完整展示了大模型从云端权重到端侧 NPU 推理的全链路优化路径:

  1. Quark 量化把 3B 模型压到 UINT4,体积缩小 4 倍
  2. OGA Model Builder将量化模型转为融合算子 ONNX 图,定义 CPU/NPU 分工
  3. Token Fusion按序列长度档位编译 NPU 专用二进制,绑定 KV 缓存到 NPU 内存
  4. 16K 上下文通过分块 Prefill + RoPE 外推实现,兼顾吞吐与长度

这套流水线并非玩具实验,而是 AMD 在 Ryzen AI APU 上实现实用级端侧 LLM 推理的参考实现。对于希望理解 NPU 部署细节、或需要将自研模型适配到 Ryzen AI 平台的开发者,这个仓库中的每个配置文件和编译产物都是极佳的"解剖样本"。

【免费下载链接】Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K

项目地址:https://ai.gitcode.com/hf_mirrors/amd/Llama-3.2-3B-Instruct_rai_1.8.0_npu_16K
点击查看免费下载

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进