最近在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 条这报错八成是device_map="auto"在没GPU的机器上抽风,把部分层甩到CPU外了。你直接手动设device="cpu"加载,顺便把torch_dtype改成float32试试,有些微调版默认float16会踩内存坑。16G跑8B量化版还行,原版是真够呛,建议先上4bit量化或换7B以下模型。tokenizer的话,记得检查下是不是要传个trust_remote_code=True,有些魔改版会挂载自定义代码。
16G内存跑8B得量化到4bit,device_map直接设cpu别用auto,不然embedding层容易飘。
把load_in_8bit打开试试,16G勉强能跑,但速度会慢到怀疑人生,建议换Q4版本。
八成是tokenizer没配对,换回原版Llama-3的试试,另外16G跑8B量化版都悬,建议上4bit。
16G内存跑8B属实勉强,把load_in_8bit打开再试试,device_map直接设成cpu就行。
这报错我熟,八成不是设备的问题,是tokenizer和模型没对上。有些中文微调版会改词表,你直接用原版Llama-3的tokenizer去加载微调后的权重,embedding矩阵尺寸对不上,就可能触发这种隐性的device检查。建议先确认你加载的是不是AutoTokenizer.from_pretrained且没传use_fast=False,有些微调版是慢速tokenizer的。
关于device_map="auto",在无GPU的机器上其实会自动全放CPU,但如果你之前装过accelerate且配置了多设备策略,它可能尝试把不同层分到meta设备上,反而出现tensor不在同一device的假象。手动指定device_map={"": "cpu"}或者干脆不传这个参数,直接model.to("cpu")试试。
至于16G内存跑8B,推理勉强能跑,但速度会很感人,而且加载时峰值内存可能到12G左右,容易把系统搞到swap。建议先量化成4-bit(比如bitsandbytes的load_in_4bit=True),但注意CPU上量化支持不太好,你可能得装torch_direct或改用GGUF格式用llama.cpp跑,反而更稳。
另外检查下transformers版本,太老的话对Llama-3的支持有bug,建议升到4.40以上。我之前也是被这种微调版坑过,最后发现是模型本身保存时出了问题,重新下载一遍就好了。
你那个报错是在加载后第一次前向传播时出现的,还是中途?如果是中途,很可能某个层里有额外的buffer没跟着转移到CPU,这时候可以试着model.config.torch_dtype = torch.float32,排除混合精度导致的设备错配。
八成是device_map和tokenizer没对齐,试试加载时明确device_map={"": "cpu"},再手动把inputs.to("cpu")。16G内存跑8B勉强能行,就是慢到怀疑人生。
八成是device_map没设对,手动指定cpu试试,tokenizer也得跟着模型配置走。16G内存跑8B有点悬,建议先量化到4bit。
这报错八成是device_map和tokenizer没对齐,微调版经常把pad_token改掉,你加载时试下显式传device_map={"": "cpu"},再把tokenizer的pad_token设成eos_token,能消掉大半问题。16G内存跑8B其实勉强够,但推理速度会慢到怀疑人生,建议先用4-bit量化或者直接上llama.cpp的GGUF版本,体验会好很多。之前我也在无独显机器上试过,最后发现是模型里的position_ids没处理对,你查下是不是这个原因。
这报错我熟,八成不是模型的问题,是transformers版本和device_map那套逻辑在搞鬼。你试试直接不用device_map,改成model.to("cpu")然后input也显式.to("cpu"),有时候auto会偷偷把某层放到cuda:0上去。另外那个中文微调版很可能是在多卡环境下保存的,有些权重名字带"module."前缀,加载的时候不匹配也会出这种幺蛾子,你检查下加载时的警告信息。
16G内存跑8B其实勉强够,但推理速度会慢到怀疑人生,而且如果系统本身吃4G内存,剩下的12G很容易爆。建议你把加载时的torch_dtype设成float16,再把max_memory设成{"cpu": "10GiB"},能省一点算一点。实在不行就换个4B或者用GGUF量化版,q4_k_m那种,内存占用直接砍一半以上。
还有个坑是tokenizer的padding_side,很多中文微调版默认左侧填充,但你用默认的右侧就会触发设备不一致的报错。我上次就是被这个卡了半天,改成left之后立马好了。你先把这几个点挨个试一遍,还不行就把完整报错贴出来,大家帮你一起看。
这报错八成是device_map="auto"在没GPU的机器上反而搞出问题,直接删掉这个参数,手动指定model.to("cpu")和input_ids.to("cpu")试试。16G内存跑8B量化版勉强够,但fp16原版肯定爆,建议下个4bit或8bit的GGUF版本用llama.cpp跑,速度还快些。另外检查下transformers版本,太旧的话对llama3支持有bug,升到4.40+能省不少事。
这报错我太熟了,八成不是模型问题,是transformers版本和accelerate库的锅。你试试把device_map参数直接删掉,手动指定model.to('cpu'),然后输入张量也确认下device,别用默认的cuda:0。另外那个微调版如果用了PEFT或者bitsandbytes加载,得检查下是否装了对应依赖,不然tensor会卡在meta device上。至于16G内存跑8B,说实话很悬,光加载fp16权重就要16G,加上中间激活值肯定爆,建议用4bit量化,或者直接上GGUF格式用llama.cpp跑,CPU速度虽然慢但至少能出结果。我上次在Mac上试过类似模型,内存不够直接OOM,后来切了量化才勉强跑起来。还有个坑是tokenizer_config里如果写了pad_token_id,但模型没设置,也会触发device不匹配的报错,你检查下generation_config文件。最后建议看下模型卡片的config.json里torch_dtype是不是float16,如果是,加载时强制torch_dtype=torch.float32能避免一部分兼容问题。
这报错八成是device_map和输入张量没对齐,模型虽然放CPU了但某个子模块还留在GPU上。你试试加载时直接device_map="cpu"或者干脆不写,然后手动model.to("cpu")。另外有些中文微调版会改tokenizer的pad_token,你检查下是不是没设置,导致padding后维度对不上。16G内存跑8B确实勉强,但量化版能凑合,建议换个4bit或GGUF版本试试。
这报错八成不是模型本身的问题,大概率是加载时参数没对齐。device_map="auto"在纯CPU环境下有时候会抽风,它可能默认把某些层分到了cuda,但你机器上又没显卡,自然就报device不一致。建议直接删掉device_map,老老实实写model.to("cpu"),然后tokenizer那边也确认一下有没有把padding_side或者truncation设对,有些中文微调版会改这些。
另外16G内存跑8B确实悬,量化一下还有戏,试试加载时传load_in_8bit=True,或者干脆用bitsandbytes的4bit,不然光参数就得占16G,加上激活值直接爆。我之前用32G内存跑7B cpu推理都慢得想砸电脑,你这配置建议还是上llama.cpp的gguf量化版,或者找个更小的中文模型比如Qwen1.5-4B,体验会好很多。
不过如果你非要跑这个,检查一下是不是tokenizer里加了特殊token导致embedding维度变了,有些微调版本会resize词表,不匹配也会出这种鬼问题。实在不行就把transformers升级到最新版,老版本对llama3支持有bug,报错信息很误导人。
八成是device_map没写对,试试model.to('cpu')然后input也手动挪,别用auto。16G跑8B能行但很勉强,加载时加个low_cpu_mem_usage=True试试。
这报错八成是device_map="auto"在没GPU的机器上自动分配出了岔子,试试直接不写这个参数,或者手动指定device="cpu"加载。另外16G内存跑8B量化版勉强能行,但原版FP16肯定爆,建议先看看那个模型卡有没有提供4bit或8bit的版本,不然推理速度也会慢到怀疑人生。tokenizer的话一般跟着模型走不会错,重点还是看加载时的torch_dtype设置,试试torch_dtype=torch.float32说不定就通了。
这报错我熟,八成不是设备问题,是device_map="auto"在没GPU的机器上反而会搞出幺蛾子。你试试直接删掉这个参数,或者手动设成device_map={"": "cpu"},我上次就是这么解决的。另外那个中文微调版大概率改过tokenizer,你加载时候用AutoTokenizer.from_pretrained看看有没有什么特殊字符或者padding side的警告,有些微调脚本会在tokenizer_config里塞自定义的chat template,这也会影响输入张量的构建。至于16G内存跑8B,说实话挺悬的,我24G内存跑7B都得开4bit量化才勉强不爆,你试试load_in_4bit=True再加torch_dtype=torch.float16,内存占用能压到6G左右。不过纯CPU推理速度会慢到怀疑人生,一个短句可能都要等十几秒,如果你只是想验证效果,建议先拿个小点的中文模型比如Qwen-1.5B跑通流程,再回头排查这个。还有个坑是transformers版本太老的话,对llama3的架构支持不完整,你检查下是不是最新版。最后问下,你加载时候有没有看到警告说torch_dtype被忽略?有时候模型权重本身是fp32,你强行指定fp16反而会触发device mismatch的假报错。
大概率是device_map和tokenizer没对齐,试试加载时加device_map={"": "cpu"},顺手把pad_token设成eos_token。
这报错八成是device_map和模型内部tie weights打架了,有些中文微调版改过embedding层,没锁死参数共享,加载时部分权重默认浮在meta设备上。你试试加载时把low_cpu_mem_usage=True去掉,或者干脆device_map=None然后手动model.to('cpu'),input_ids也要确保在同一设备上,最好加一句print看下模型参数实际在哪个device。16G内存跑8B量化版其实勉强能行,但你这个是FP16原版的话光权重就占16G,加上激活值必然爆内存,建议先转成4-bit的bitsandbytes配置,或者用llama.cpp的GGUF量化版本,速度会慢但至少不报错。另外有些微调版本会改tokenizer的pad_token,你检查下加载后tokenizer.pad_token_id是不是None,有时候生成时自动补pad会跑到GPU上导致设备不一致。我上次跑别的中文微调版也遇到类似问题,最后发现是transformers版本太新,跟模型卡里写的旧config不兼容,你试试降到4.38左右。
这报错八成是device_map和tokenizer的锅,特别是有些中文微调版会改pad_token或者模型内部有额外的embedding层,手动指定device_map={"": "cpu"}再配合torch_dtype=torch.float32试试。16G内存跑8B理论上能挤进去但速度感人,建议用llama.cpp量化版或者直接上4-bit加载,不然光加载就要吃10G+内存,推理时容易爆。我之前也遇到过类似问题,最后是把low_cpu_mem_usage=True加上才稳。
这报错八成是device_map="auto"在没GPU的机器上抽风,把部分层丢到CPU部分留在默认设备上。你试试改成device_map={"": "cpu"}或者干脆不传这个参数,手动把model.to("cpu")再跑。16G内存跑8B量化版勉强可以,但原版fp16肯定爆,建议先看看模型卡上有没有提供4bit或8bit的版本,用bitsandbytes加载能省一大半内存。tokenizer一般不用特殊配置,主要问题还是出在设备分配上。