最近在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和模型没配对,有些微调版会改词表,你直接加载默认的Llama-3 tokenizer就会在embedding层device mismatch,试试用模型卡里给的AutoTokenizer.from_pretrained(路径, use_fast=False),或者干脆把device_map删了手动.to("cpu")。
16G内存跑8B其实能跑,但得用4-bit量化,load_in_4bit=True加torch_dtype=torch.float16,不然光权重就占16G,加载就爆了。
我之前也踩过这坑,最后发现是transformers版本太老,升到4.40以上基本就稳了。你报错完整堆栈发出来看看?
八成是device_map和tokenizer没对齐,试试load时加torch_dtype=torch.float32,另外16G内存跑8B确实悬,量化版会更稳。
device_map=auto在多卡或CPU内存不够时会自动拆分,你纯CPU还是手动device='cpu'稳一点,8B量化下还能凑合跑。
八成是tokenizer的padding侧和模型不一致,换个left padding试试。
这报错大概率是加载时某个子模块没跟着走,试试加载前先torch.set_default_device('cpu'),或者干脆不用device_map直接model.to('cpu')。16G内存跑8B其实够呛,光是权重就占16G左右,加上中间变量很容易爆,建议先量化到4bit再试试。另外检查下是不是tokenizer没设padding_side='left',有些中文微调版对输入格式挺敏感的。我上次也卡在这,最后换了load_in_8bit=True才跑通,但速度嘛……基本等于看PPT。
这报错八成是tokenizer那边的padding或者attention mask没跟上,尤其是微调版经常改pad token,你试试加载时显式设一下pad_token_id,或者干脆把input tensors和attention mask一起传进去。device_map="auto"在纯CPU下反而容易出幺蛾子,建议直接删掉,然后确保model.to("cpu")和inputs.to("cpu")都执行了。16G内存跑8B确实够呛,量化到4bit(比如bitsandbytes)勉强能跑,但速度会慢到怀疑人生,实在不行就换7B以下的模型吧。
八成是tokenizer没对齐,换原版Llama-3的试试,device_map直接删了手动指定cpu稳点。
这报错八成是device_map="auto"在没GPU的机器上把层拆到不同设备了,你手动指定device_map={"": "cpu"}试试,或者干脆别传这个参数。另外这微调版可能改了tokenizer的pad_token,加载时最好检查下tokenizer_config里有没有设置eos_token和pad_token一致。16G内存跑8B量化版勉强可以,但原版fp16肯定爆内存,建议下4bit或8bit量化版,推理速度慢点但能跑。
你这问题我上周刚踩过,跟你一模一样。device_map="auto"在无CUDA环境下反而会触发设备分配bug,改成device_map="cpu"或者直接不写就行。还有那个中文微调版如果用的是Alpaca模板,得确保tokenizer的padding_side="left",不然生成时位置编码错乱也会报类似错。16G内存跑8B真别硬扛,去下个GPTQ或AWQ量化版,显存内存都省,速度还能接受。
我猜你可能是用了torch_dtype=torch.float16加载,但CPU不支持半精度计算,所以tensor设备不匹配。改成torch_dtype=torch.float32或者直接load_in_8bit=True试试。另外那个微调版如果从alpaca数据训练,可能vocab里加了特殊token,你加载后得重新save_p
这报错八成是tokenizer和模型权重没对齐,有些中文微调版会改词表但没更新config里的pad_token_id,导致输入长度不一致。你试试加载时显式传pad_token_id=tokenizer.eos_token_id,或者干脆用tokenizer.pad_token = tokenizer.eos_token。至于16G内存跑8B,纯CPU推理是能跑但特别慢,建议用load_in_8bit=True加device_map="cpu",然后把torch_dtype=torch.float16打开,能省不少内存,不过速度嘛……基本等于看PPT。
这报错八成是tokenizer的padding side跟模型不一致导致的,有些中文微调版改过special token,你试试加载时加个pad_token_id=tokenizer.eos_token_id,或者直接model.config.pad_token_id设一下。16G内存跑8B量化版其实勉强能玩,但float16肯定爆,建议下个GGUF用llama.cpp,或者转成4bit加载,别硬刚transformers全家桶。我之前也遇到过device_map的坑,手动设device_map={"": "cpu"}比auto稳。
这问题多半是tokenizer和模型没对齐,微调版经常改词表,你加载时用AutoTokenizer试试,别用Llama自带那个。device_map="auto"在CPU上反而容易出幺蛾子,直接不设或者设成None更稳。
16G内存跑8B确实勉强,加载时开load_in_8bit或load_in_4bit能省不少,但没独显的话量化版也慢得怀疑人生。我上次用纯CPU跑7B,生成一句话能等半分钟。
建议先换个别的微调版交叉验证下,如果都报同样错,那基本就是你环境问题了。实在不行就上Colab免费T4,比本地折腾省心太多。
这报错八成是device_map和tokenizer没对齐,手动指定device='cpu'试试。16G内存跑8B确实悬,建议量化到4bit再玩。
这报错八成是tokenizer和模型权重没对齐导致的,有些中文微调版会改词表,你直接加载原版tokenizer就炸了。建议先检查下模型卡的tokenizer_config.json,确认是不是得用他们配套的版本。16G内存跑8B确实勉强,但CPU推理能跑,就是慢到怀疑人生,建议把加载参数改成low_cpu_mem_usage=True,然后手动指定device_map={"": "cpu"}试试。之前我也遇到过类似问题,最后发现是分词器没跟着模型走,换成他们的config就正常了。
这报错八成是device_map和tensor并行没对上,你试试加载时直接写死device_map={"": "cpu"},别用auto。另外16G内存跑8B确实够呛,光是fp16权重就要占16G,你还要留空间给中间激活值,建议用bitsandbytes的4bit量化加载,能压到6G左右。之前我拿4060跑7B都卡得不行,纯CPU基本是等半小时出一句话的程度。
八成是tokenizer没配对,换个微调版自带的config试试。16G内存跑8B勉强能行,但得用4bit量化。
16G内存跑8B确实有点悬,不过报错这个事儿大概率不是显存问题,是device_map和tokenizer没对齐。你试试加载时明确写device_map={"": "cpu"},然后把tokenizer也手动pad到左侧,很多中文微调版在生成时padding side不一致就会触发这个鬼报错。
另外这模型八成是拿bf16训练的,你CPU推理得用torch_dtype=torch.float32,不然精度不匹配也会出幺蛾子。我上次跑个7B模型也是卡在这,折腾半天发现是tokenizer的pad_token没设,加一句tokenizer.pad_token = tokenizer.eos_token就好了。
至于16G内存,8B量化版勉强能跑,但速度会慢到怀疑人生,建议直接上4bit的GGUF格式,用llama.cpp跑,体验完全不一样。
这报错我熟,八成不是设备问题,是tokenizer和模型不匹配闹的。很多中文微调版都改了词表,但没在config里更新pad_token_id,你试试加载时显式传pad_token_id=tokenizer.eos_token_id,或者干脆用model.generate(..., pad_token_id=tokenizer.eos_token_id)绕过去。device_map那个别用auto,你16G内存跑8B本来就紧,auto会把层分散到CPU和硬盘上反而更慢,直接device_map="cpu"或者干脆不设,让模型默认在CPU上。不过说真的,没独显跑8B的fp16,就算能跑也是龟速,一个token能给你等出火星子来。我上次用i7+32G内存跑7B的Q4量化版,生成10个字都得半分钟,你这16G可能直接内存溢出。建议先试4bit量化版,比如TheBloke出的GGUF,用llama.cpp跑,内存占用能压到6G左右,速度还能接受。至于那个报错,先检查一下是不是用了auto的device_map导致部分权重被甩到GPU上去了,虽然你没独显但有些库会默认检测CUDA,很坑。最后问一下,你加载的时候有没有设置torch_dtype=torch.float32?没设的话默认fp16在纯CPU上也会出这种设备不一致的幺蛾子。
八成是tokenizer没配对,换回原版Llama-3的试试,device_map直接删掉手动指定cpu就行。16G跑8B真够呛,建议上4bit量化。
16G内存跑8B确实够呛,先把device_map去掉手动指定device试试,八成是tokenizer没配对齐的问题。
这问题我上周刚踩过,八成不是显存的事,是tokenizer和模型没对齐。你加载的时候用了AutoTokenizer.from_pretrained没错吧?但有些中文微调版会改特殊token,比如pad_token或者eos_token,得用他们repo里给的tokenizer_config.json,不然输入长度不一致,device就错乱了。
另外device_map="auto"在无GPU时有时候会自作聪明,建议直接删掉,换成model.to("cpu"),输入也手动.to("cpu"),再检查一下attention_mask是不是也跟着移了。
16G内存跑8B纯CPU推理其实能跑,就是慢,大概每分钟吐几个token,别指望交互。但你这报错跟内存没关系,就是设备分配问题。
还有个坑,有些微调版本是用trust_remote_code=True加载的,你如果没加这个,可能加载了原版权重,导致维度对不上。去他们模型卡页面翻一下加载示例,照着抄一遍最稳。
我上次就是漏了trust_remote_code,搞了俩小时,最后发现是加载方式不对。你试试把device_map去掉,加上那个参数,多半就好了。
这报错八成是device_map和tokenizer没对齐,有些中文微调版改了词表,直接加载原版tokenizer会把padding位置搞乱。你可以试试加载时显式写device_map={"": "cpu"},然后检查下tokenizer的pad_token_id是不是被设成了-1,手动改成eos_token_id再跑。16G内存跑8B确实勉强,但量化到4bit还是能跑的,transformers里load_in_4bit=True配合bitsandbytes,推理时把torch线程数调低点,我8G内存的老笔记本都试过能出结果,就是速度慢得感人。