如何用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
相关产品推荐
相关产品推荐

