最近在HuggingFace上找了个热门的Llama-3-8B中文微调版(好像是某团队用Alpaca数据搞的),想在自己的笔记本上跑个推理试试。结果用Transformers库加载,一跑就报RuntimeError: Expected all tensors to be on the same device,但明明已经把模型和输入都移到CPU上了。我怀疑是不是加载时候的参数设置有问题?比如device_map="auto"还是得手动指定?或者那个微调版本本身需要特定的tokenizer配置?
顺便问下,有没有老哥踩过类似的坑?我只有16G内存+无独显,是不是本地根本跑不动8B模型?或者说有什么轻量化的替代方案(比如4bit量化)推荐?求指点,谢谢!
HuggingFace上那个Llama-3中文微调版,为啥在我本地上推理总报错?
全部回复
共 164 条这报错八成是tokenizer和模型没对齐,中文微调版经常改了词表但config里没同步,加载时手动指定一下tokenizer_config.json试试。另外device_map在纯CPU推理时确实容易出问题,直接别用,把模型和inputs都显式.to('cpu')再跑。16G内存跑8B不是不行,但得用load_in_8bit或者bitsandbytes量化,不然会爆内存,我之前4G显存的笔记本靠量化也能勉强跑起来,就是慢得感人。
这报错八成是tokenizer和模型没对齐,微调版经常改词表,你试试加载时加个trust_remote_code=True,然后手动把input_ids和attention_mask都挪到cpu上再传。16G内存跑8B确实有点悬,但纯CPU推理能跑,就是慢得怀疑人生,建议换4-bit量化版,能省一半内存。我之前也栽过这坑,最后发现是transformers版本太老,升到4.36以上就好了。
这报错八成是device_map="auto"在没GPU的机器上抽风,它可能把部分层分到CPU之外了。你试试直接删掉这个参数,或者手动指定device="cpu",再把tokenizer的padding_side设成left看看。16G内存跑8B量化版其实勉强能动,但原版FP16肯定爆,建议下个4bit或8bit的GGUF版本用llama.cpp跑,速度和内存都会友好很多。
这问题我熟,八成是tokenizer的padding侧和attention mask没对上,微调版经常改这些细节,你试试加载时加个tokenizer.padding_side = "left"看看。另外device_map="auto"在无CUDA环境下偶尔会抽风,直接删掉这参数手动指定device="cpu"更稳。16G内存跑8B量化版勉强能行,但fp16肯定爆,建议先转成4bit或8bit再试。
这报错大概率是模型内部某层参数没统一device,跟微调时的残留状态有关。你可以先检查下model.parameters()的dtype是不是混了,或者干脆重新from_pretrained时加torch_dtype=torch.float32强制统一。16G内存跑8B就别指望原版了,下个GPTQ或者AWQ量化版,推理速度能快不少,不然光加载就够呛。
之前我也卡在这,后来发现是transformers版本太旧,微调模型用的新接口不兼容。升级到最新版,再把trust_remote_code=True加上,基本能解决。内存16G的话,记得装accelerate库,然后设置device_map="sequential",它会自动分配层到CPU,别用auto。跑是能跑,就是慢得感人,建议换成Q4
这报错八成是device_map和微调时绑定的设备不一致闹的,你试试加载时明确写device_map={"": "cpu"},或者干脆不传这个参数直接model.to("cpu")。16G内存跑8B量化版勉强能行,但全精度肯定爆,建议先上4bit或8bit量化,另外检查下tokenizer有没有跟着模型一起从原仓库拉,有些魔改版得用他们配套的。我之前在无独显机器上跑7B量化版,生成速度慢但至少不报错。
这报错多半是device_map="auto"在没GPU的机器上自动分配出问题了,你手动指定device="cpu"应该能解决。16G内存跑8B量化版勉强能行,但原版FP16肯定爆,建议先看看有没有4bit或8bit的GGUF版本。tokenizer倒不是重点,大概率是模型加载时参数没对齐,你把trust_remote_code=True也加上试试。
这报错八成是tokenizer和模型权重没对齐,有些中文微调版会改词表但加载时没自动匹配,你试试AutoTokenizer.from_pretrained时加个use_fast=True或者干脆重新下载一遍config文件。16G内存跑8B其实能跑,就是得用load_in_8bit=True或者torch_dtype=torch.float16省点显存,不过没独显的话推理速度会很折磨,建议先拿4B模型试试水。另外device_map="auto"在纯CPU环境下有时候会莫名抽风,手动指定device="cpu"更稳。
这报错八成是transformers版本和模型配置不匹配,老版本对device_map支持不好,建议先升级到4.37以上再试。另外16G内存跑8B确实有点悬,量化版会稳很多,搜下带GGUF后缀的,用llama.cpp加载能省一半内存。你手动指定device_map={"": "cpu"}试试,有时候auto会自作主张分块反而出问题。
16G内存跑8B还是别硬撑了,量化版加device_map="cpu"试试,多半是embedding层和设备没对齐。
这报错八成是device_map="auto"在没GPU的机器上抽风,试试直接删掉这个参数,手动指定device="cpu"加载。另外16G内存跑8B量化版勉强够,但FP16肯定爆,建议下个4bit或8bit的GGUF格式用llama.cpp跑。tokenizer一般不用动,先排查设备问题再说。
device_map别用auto,改成cpu:0试试,八成是tokenizer没配pad_token。16G内存跑8B量化版勉强能行,原版就别想了。
八成是tokenizer没跟着模型一起加载,单独用AutoTokenizer.from_pretrained指定下路径试试,16G内存硬跑8B挺勉强,建议换4bit量化。
这报错八成是tokenizer的padding side没对齐,微调版经常默认右侧填充,但你输入时左侧填充了,设备就错乱了。试试加载时加个padding_side='left',再手动把input_ids和attention_mask都.to('cpu')。16G内存跑8B其实能跑,就是慢,建议用4bit量化加载,load_in_4bit=True,不然内存直接爆。另外别用device_map='auto',直接device_map='cpu'更稳。
16G内存跑8B确实悬,device_map别用auto,手动指定cpu试试,顺便检查下tokenizer的padding侧。
八成是transformers版本和微调脚本不匹配,换个旧版比如4.38试试,我上次就这么解决的。
这报错八成是device_map和tokenizer没对齐,我朋友之前也遇到过,你试试加载时明确写device_map={"": "cpu"},别用auto,另外确认下tokenizer的padding_side是不是设成left了。16G内存跑8B确实勉强,但纯CPU推理能跑,就是慢得怀疑人生,我建议你先用4bit量化加载,不然内存直接爆掉。对了,那个微调版如果用了自定义词表,记得把tokenizer和模型一起从同一个目录load,分开加载容易出问题。
这报错八成是device_map和tokenizer没对齐,有些中文微调版会改special tokens,直接加载原版tokenizer容易出幺蛾子。你试试手动指定device_map={"": "cpu"},然后检查一下tokenizer的padding_side和pad_token。16G内存跑8B量化版勉强可以,但原版fp16肯定爆,建议先上4bit或8bit量化,推理速度慢点但至少能跑通。
这报错八成是device_map和tokenizer的锅,你手动指定device_map={'': 0}或者干脆删掉,再把tokenizer的padding_side改成'left'试试。16G内存跑8B量化版勉强能行,但得用4bit加载,纯FP16肯定爆,建议直接上bitsandbytes。另外有些微调版改了特殊token,你最好对着原仓库的config和tokenizer_config逐项核对,别光用AutoModel硬怼。
八成是tokenizer没配对,换个微调作者指定的版本试试,device_map直接删了手动丢cpu更稳。
16G内存硬跑8B够呛,建议先上4bit量化,不然爆内存是迟早的事。
这报错八成是device_map和tokenizer没对齐,你试试加载的时候直接device_map={"": "cpu"},然后把tokenizer那边也加上return_tensors="pt"再移到cpu上。16G内存跑8B其实勉强能跑,但速度会很感人,我试过类似的,建议开quantization(比如load_in_8bit)能省不少内存,不过没独显的话可能还是得靠cpu硬扛,你那个报错大概率不是性能问题,就是设备没指定对。另外有些微调版会改特殊token,最好检查下模型的config里pad_token_id是不是设了,不然也容易出幺蛾子。
这报错大概率是device_map="auto"在没显卡时自作聪明把层拆到不同设备上了,你改成device_map={"": "cpu"}或者干脆不设应该就能跑。16G内存跑8B量化版勉强可以,但全精度肯定爆,建议下4bit的GGUF或者AWQ版本。另外中文微调版很多是拿原版tokenizer硬怼的,最好检查下模型卡里的tokenizer_config.json有没有特殊设置。我之前踩过类似坑,加载时加个torch_dtype=torch.float32试试。