You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Hugging Face Transformers将LLaMA转ONNX?遇KeyError求助

问题解决与回答

先解决你遇到的KeyError: 'llama'错误

这个错误的核心原因是你的Transformers版本过旧,未内置LLaMA模型的配置映射。解决方式如下:

  • 升级Transformers到最新稳定版本:
    pip install --upgrade transformers
    
  • 若使用社区发布的Vicuna权重,检查本地模型目录下的config.json,确保model_type字段值为llama,不符则手动修改。
  • 升级后仍有问题,可手动指定模型类加载:
    from transformers import LlamaForCausalLM, AutoTokenizer
    
    model_name = "C:/Projects/vicuna-13b-delta-v0"
    model = LlamaForCausalLM.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    

关于能否通过Hugging Face Transformers将LLaMA转换为ONNX

可以转换,但需满足几个前提条件:

  • 确保Transformers版本足够新,能够正常加载LLaMA系列模型;
  • 模型加载无异常(解决上述错误后);
  • 转换时注意以下细节:
    • 必须将模型设置为eval()模式,避免训练专属算子(如Dropout)干扰;
    • 正确配置动态轴,适配不同的batch大小和序列长度;
    • 选择兼容的opset版本(推荐opset 15,对Transformer类算子支持更完善);
    • 针对13B这类大模型,转换时需保证足够显存,显存不足可尝试用device_map="auto"自动分配模型到GPU/CPU,或开启do_constant_folding=True优化内存占用。

修正后的完整转换代码示例:

import torch
from transformers import LlamaForCausalLM, AutoTokenizer

model_name = "C:/Projects/vicuna-13b-delta-v0"
# 大模型推荐用device_map自动分配到GPU/CPU,降低显存压力
model = LlamaForCausalLM.from_pretrained(model_name, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)

model.eval()

input_str = "Once upon a time"
input_ids = tokenizer.encode(input_str, return_tensors="pt").to(model.device)

with torch.no_grad():
    symbolic_names = {0: "batch_size", 1: "seq_len"}
    torch.onnx.export(
        model,
        input_ids,
        "vicuna.onnx",
        input_names=["input_ids"],
        output_names=["output"],
        dynamic_axes={"input_ids": symbolic_names, "output": symbolic_names},
        opset_version=15,
        do_constant_folding=True,
    )

内容的提问来源于stack exchange,提问作者Guerrilla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:47:25