最近在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和模型没对齐,中文微调版经常自己改了特殊token,你试试加载时加个trust_remote_code=True,或者直接换官方Llama-3的tokenizer再跑。16G内存跑8B确实够呛,量化到4bit勉强能动,但速度会慢到怀疑人生,建议先拿7B以下或者GGUF格式试试水。
这个报错我太熟了,八成不是设备问题,是模型加载时内部某个子模块的device没跟上。你试试加载的时候别用device_map="auto",直接model.to("cpu"),然后tokenizer那边也手动指定一下device,或者干脆在调用model.generate前把所有input都显式.to("cpu"),有时候是transformers版本和模型代码不匹配导致部分权重留在默认设备上。
至于16G内存跑8B,纯CPU推理确实很勉强,但也不是完全不行——前提是得用4bit量化,不然光加载权重就得占7-8G,再加上激活值和中间变量,内存直接爆掉。你那个报错可能也是内存不够触发的OOM,然后被包装成了device错误。
我建议你换个思路,去搜一下这个模型有没有GGUF格式的量化版本,用llama.cpp跑,CPU上反而比transformers快很多。另外检查下transformers版本,有些微调模型是基于老版本训练的,新版库改了默认行为,也会导致这种诡异报错。
如果实在不行,把模型名发出来,我帮你看看它的config里有没有什么特殊设置,比如需要trust_remote_code=True才能正确加载自定义层。
这报错八成是device_map和tokenizer没对齐,有些中文微调版会改pad_token,你手动设一下tokenizer的pad_token_id试试。16G内存跑8B不是不行,但得用4bit量化加torch_dtype=float16,不然光加载就快爆内存了。我之前在类似配置上跑过,把max_length调小到512,推理速度虽然慢但至少不崩。你要是实在折腾不明白,直接换Qwen2-7B或Yi-1.5-6B的中文版,兼容性好很多。
device_map="auto"在纯CPU上容易出这问题,试试直接删掉这参数,手动把input tensors也放cpu。16G内存跑8B量化版勉强能行,但别指望速度。
这报错八成是tokenizer和模型没对上,微调版经常带自定义chat模板,直接用默认的加载容易出这种幺蛾子。你试试加载时显式传tokenizer_config或者干脆用AutoTokenizer.from_pretrained时加use_fast=False。16G内存跑8B其实能跑,但得把load_in_8bit=True加上,再配device_map="cpu",不然光权重就快塞满内存了。另外检查下torch_dtype是不是设成float16了,CPU上跑fp16容易出设备不一致的怪问题。
这报错八成是tokenizer和模型没对上,有些中文微调版会改词表,原版tokenizer直接加载就会出设备不一致的幺蛾子。你试试用AutoTokenizer.from_pretrained(..., use_fast=False)或者干脆用model.config.tokenizer_class指定一下。16G内存跑8B确实有点悬,量化到4bit再关掉attention的flash版本可能勉强能跑,但生成速度会慢到怀疑人生,我上次用6G显存的卡都卡得不行。
这报错八成是tokenizer和模型没对齐,有些中文微调版改过词表,得用他们仓库里那个tokenizer_config.json,别直接用原版的。另外device_map别设auto,手动device="cpu"试试,有些脚本会默认把embedding层丢到cuda上。16G内存跑8B量化版勉强能行,但全精度肯定爆,建议下个4bit的GGUF用llama.cpp跑,省心很多。
大概率是device_map="auto"把部分层扔GPU上了,你强制device_map={"": "cpu"}试试。16G内存跑8B量化版还行,原版悬。
八成是tokenizer没跟着微调版走,换他们仓库里的配置再load。8B没独显就别硬扛了,上4bit量化吧。
这报错八成是device_map="auto"在搞鬼,它可能把模型某些层分到了GPU(哪怕你没独显),但输入又留在CPU上,两边就打架了。你试试直接改成device_map="cpu"或者干脆不设这个参数,应该能绕过去。16G内存跑8B量化版(4bit)其实勉强够,但你要是不开量化直接跑fp16,那肯定爆内存,建议先看看那个模型卡上有没有推荐的内存占用数据。另外tokenizer一般不会导致设备错误,除非你加载时特意指定了cuda,检查下代码里有没有混用.to("cuda")和.to("cpu")的地方。
这报错八成是tokenizer的padding侧和attention mask没对齐,微调版经常改这个,你试试手动把padding_side设成left,然后显式传attention_mask。另外16G内存跑8B量化版都悬,建议先上4bit量化或者GGUF格式,不然光加载就快爆了。device_map="auto"在纯CPU上反而容易出幺蛾子,直接删掉试试。
多半是tokenizer没配对,换回原版Llama-3的试试,device_map直接删掉手动指定cpu。
16G内存跑8B量化版勉强能行,fp16肯定爆,建议上4bit。
八成是tokenizer没跟着模型一起换,中文微调版得用人家配套的,别用原版那个。
这报错八成是tokenizer没跟上,换回原版Llama-3的试试,device_map直接删掉手动指定cpu稳点。16G内存跑8B量化版都悬,建议先上4bit。
这报错我太熟了,八成不是device_map的问题,你试试加载的时候加一句torch_dtype=torch.float32,很多中文微调版在fp16下会把某些层留在GPU上,但你压根没CUDA,就出现这种“假跨设备”报错。另外别用device_map="auto",直接model.to("cpu")加inputs也手动.to("cpu")最稳,auto有时候会自作主张。至于tokenizer,那个模型如果是用Llama原版tokenizer微调的,你直接用原版就行,除非它带了自定义的tokenizer_config.json,但你报错在tensor上,跟tokenizer关系不大。16G内存跑8B纯CPU推理真的勉强,加载完权重就占7-8G,还得留内存给输入和中间激活,建议你试试load_in_8bit=True,配合bitsandbytes能省一半内存,但CPU上速度会慢到怀疑人生,一个短句可能得等半分钟。我之前用6G内存跑7B模型,直接OOM了,后来改成4bit量化才勉强能跑,但回答质量明显下降。你要是真想本地玩,不如找个1.5B或3B的中文微调版,那个速度能接受,效果也不差太多。
这报错八成是device_map和tokenizer没对上,有些中文微调版会改pad_token,你用原版Llama的tokenizer去加载就容易出这种幺蛾子。16G内存跑8B其实能跑,但得把load_in_8bit打开,再加个low_cpu_mem_usage=True,不然光加载权重内存就爆了。我上次也是同样配置,最后手动指定device_map={"": "cpu"},然后把tokenizer的pad_token设成eos_token就过了,你可以试试。
这问题我太熟了,八成不是你机器的问题,是加载方式有坑。device_map="auto"在CPU-only环境下有时候会自作聪明把不同层分到不同设备,反而触发device mismatch,你试试直接写device_map="cpu"或者干脆不传这个参数,只指定torch_dtype=torch.float32,大概率能跑通。另外那个微调版如果用了自定义的tokenizer,一定要从它仓库里单独下载tokenizer_config.json和special_tokens_map.json,别用基座模型的,不然embedding维度对不上也会出幺蛾子。至于16G内存跑8B,说实话很勉强,纯CPU推理速度会慢到怀疑人生,但也不是完全不能跑——把max_new_tokens调小,再开low_cpu_mem_usage=True,加载时能省不少内存。不过最关键的还是先确认模型是不是用transformers>=4.35加载的,老版本对Llama-3的attention实现有兼容问题,报错信息经常误导人。你试试先把这几个参数改对,如果还报错,把完整traceback贴出来看看是哪个op崩的,我上次就是卡在repeat_kv那个函数上,换个新版本库就好了。
这报错八成是device_map和tokenizer没对齐,试试手动指定device和加载对应配置。16G内存跑8B量化版勉强能行,原版确实悬。
八成是tokenizer没跟上,换回原版Llama-3的试试,device_map直接删了手动指定cpu稳点。16G内存跑8B量化版勉强能行,fp16就别想了。
16G内存跑8B确实勉强,加载时加个low_cpu_mem_usage=True试试,设备不匹配八成是tokenizer没跟着模型走。
这报错太经典了,八成不是模型本身的问题,而是device_map和输入张量没对齐。你试试加载的时候别用device_map="auto",直接model.to("cpu"),然后输入也明确.to("cpu"),一般就能解决。另外16G内存跑8B量化版其实勉强够,但如果是FP16原版,光权重就占16G,加载时一swap就炸,建议先看下模型卡片的精度要求,换个4bit量化版试试。至于tokenizer,有些中文微调版会改special tokens,你最好用repo里自带的tokenizer_config.json,别用base版本硬顶。我之前也踩过类似的坑,最后发现是transformers版本太老,对Llama-3的支持有bug,升级到4.40+就稳了。你这配置跑8B推理速度会慢到怀疑人生,但出结果还是可行的,记得把max_new_tokens调小点,别让生成过程爆内存。要是还不行,就换个7B以下的模型,比如Qwen2-7B量化版,体验会好很多。