最近在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的padding侧没对齐,Llama家族默认左侧填充,你手动挪到右边试试,很多中文微调版都在这上面翻车。另外device_map="auto"在纯CPU下偶尔会抽风,直接删掉这参数,模型和input都显式.to("cpu")最稳。16G内存跑8B量化版勉强能行,但原版fp16肯定爆,建议先换成4bit的GPTQ或者GGUF版本,速度虽慢但至少不报错。你要是试完还报错,贴下transformers版本号,有时候4.40和4.41的API行为不一样。
这问题我熟,之前调一个量化版也撞见过一模一样的报错。大概率不是设备问题,是模型里某些参数张量被硬编码到了cuda上,你光把input和model移CPU没用,得检查一下tokenizer的padding_side或者attention_mask有没有跟着走。device_map="auto"在纯CPU环境下反而容易出幺蛾子,建议直接不传这个参数,手动model.to("cpu")之后再用model.eval()包裹推理。另外16G内存跑8B不是不行,但得看量化没量化,原版FP16光权重就占16G,加上激活值肯定爆,你八成是加载时内存溢出了才报设备错。可以试试加载时传torch_dtype=torch.float32,或者换4-bit的bitsandbytes配置,但没独显的话bitsandbytes也可能不支持。最稳的办法是找个GGUF版本用llama.cpp跑,内存占用能压到6G左右。至于那个微调版,建议先看看它的model_card里有没有写特殊的tokenizer配置,有些中文微调会改chat_template,用默认的AutoTokenizer确实会崩。
这个报错八成是tokenizer和模型没对齐,有些中文微调版改过词表,直接加载默认配置容易出device mismatch。你试试加载时加torch_dtype=torch.float32,然后别用device_map,手动把模型和input都.to('cpu'),大概率能解决。16G内存跑8B量化版其实勉强够,但你要用fp16或bf16肯定爆,建议下个4bit或8bit的GGUF版本,用llama.cpp跑,比Transformers省心多了。另外确认下transformers版本,太旧的话对llama3支持有bug。
这报错八成是模型里的embedding层或者某个模块还留在GPU上,你光把input和model移到CPU没用,得检查下有没有哪层被显式.cuda()了。之前我跑别的微调模型也遇到过,最后干脆手动model.to('cpu')再加torch.no_grad()才稳。16G内存跑8B量化版勉强能行,但你这个非量化版大概率会爆内存,建议先试试4bit加载,或者直接用llama.cpp的GGUF格式。另外中文微调版经常改tokenizer,最好确认下是不是得配他们仓库里的special_tokens,不然embedding尺寸对不上也会炸。
这错八成是device_map和tokenizer没对齐,试试加载时显式device_map={"": "cpu"},顺便检查下tokenizer的padding_side。16G内存跑8B量化版勉强能行,原版真有点悬。
这报错八成是device_map和tokenizer没对齐,transformers新版对设备分配挺敏感的,试试手动指定device_map={"": "cpu"},再把tokenizer的return_tensors放成pt。16G内存跑8B量化版其实勉强能撑,但别加载fp16,用bitsandbytes转4bit能省一大截,你那个报错也可能是内存不够触发的。
这报错八成是tokenizer和模型没对上,有些中文微调版会改词表,得用他们仓库里配套的tokenizer加载,不能直接用原版。device_map="auto"在纯CPU下反而容易出幺蛾子,直接不写或者设成None,手动model.to("cpu")更稳。16G内存跑8B量化版勉强能行,但原版int8以下基本会爆,建议先试4bit量化,速度慢点但至少能跑通。我之前也卡这坑里,换了他们的config.json里指定的trust_remote_code=True就好了,你翻翻那个模型的README有没有这行。
这报错八成是device_map没设明白,手动指定device='cpu'试试,16G内存跑8B量化版勉强能行,原版就别想了。
这问题我上个月刚遇到过,八成是tokenizer和模型权重没对应上,有些中文微调版会改tokenizer配置,你得从同一个repo里加载tokenizer,别直接用原版Llama的。另外设备报错大概率是加载时某个参数没指定,试试device_map=None加上torch_dtype=torch.float32,把low_cpu_mem_usage也设成False,有时候自动分配会出幺蛾子。16G内存跑8B量化版勉强能行,但原版FP16肯定爆,建议下个GGUF格式用llama.cpp跑,CPU推理速度还能接受,别死磕Transformers了。
这报错我太熟了,八成不是设备问题,是tokenizer和model的device没对齐。你试试加载时候别用device_map="auto",直接model.to("cpu"),同时把tokenizer也显式绑一下device,有时候微调版保存的tokenizer_config里带着cuda:0的残留配置,加载时会强制往GPU上放。另外检查下是不是用了half精度加载,CPU上fp16容易出这种幺蛾子,改成torch.float32试试。16G内存跑8B量化版其实勉强能动,但原版fp16光权重就16G,你内存直接爆了,建议下4bit或8bit的GPTQ量化版,或者用llama.cpp的GGUF格式,CPU推理速度还能接受。我之前在mac上跑类似模型也踩过这坑,最后发现是transformers版本太老,对某些微调分支的config解析有问题,升级到4.38以上基本能解决。你先把加载代码贴出来看看?不然只能靠猜。
16G内存跑8B确实勉强,建议先试试4bit量化加载,device_map="auto"改成手动指定试试。
这问题我上周刚踩过,八成不是显存的事,而是transformers版本和那个微调脚本不兼容。你试试加载时强制device_map=None,然后手动model.to("cpu"),再把tokenizer的return_tensors="pt"明确设一下,有时候默认会偷偷往cuda上放。16G内存跑8B量化版勉强能行,但原版fp16肯定爆,建议先转成4bit或8bit加载。另外检查下是不是用了torch_dtype=torch.float16,CPU上得改成float32,不然tensor类型不匹配也会报这个错。
这个报错八成是device_map="auto"在没GPU的机器上抽风了,试试直接device="cpu"或者干脆不传这个参数,手动把input_ids和attention_mask也放到cpu上。16G内存跑8B量化版勉强能行,但如果是fp16原版肯定爆内存,建议先看看模型卡片的加载代码是不是要求特定trust_remote_code=True,很多中文微调版都改过tokenizer的。我之前遇到过类似问题,最后发现是tokenizer的padding_side没设对,导致生成时长度不一致才报的设备不匹配。
八成是tokenizer没跟着模型走,换个AutoTokenizer试试,16G内存硬跑8B得开量化不然必爆。
这报错八成是device_map="auto"在没GPU的机器上抽风,试试直接删掉这参数,手动指定model.to("cpu"),同时输入别忘也加.to("cpu")。16G内存跑8B量化版勉强能行,但原版FP16肯定爆内存,建议先找4bit或8bit的GGUF版本。tokenizer一般不用特殊配,但保险起见对比下原版Llama-3的tokenizer_config.json,有时候微调方会改bos和eos。
这报错八成是device_map和tokenizer没对齐,很多中文微调版会改pad_token_id,你手动设置一下model.generate的pad_token_id试试。16G内存跑8B量化版勉强能动,但全精度肯定爆,建议下个4bit或8bit的gguf版本。之前我也遇到过类似问题,把attn_implementation改成eager基本能绕过去。你用的transformers版本是多少?太新的话有些老微调脚本会不兼容。
16G内存跑8B其实挺吃紧的,但报错那个device mismatch大概率不是内存问题,更像加载时参数和实际设备没对齐。你试试不用device_map="auto",直接model.to("cpu"),然后输入也确保是cpu tensor,有时候混合精度或者某些层被自动分配到不同设备会触发这个。另外那个中文微调版如果是基于llama3原始tokenizer改的,可能词汇表大小变了,加载时得带上tokenizer文件一起,不然embedding维度对不上也会出奇怪错误。我之前跑7B模型的时候,遇到过类似报错,最后发现是transformers版本太旧,升级到4.40+就好了,你可以先查下版本。至于跑不跑得动,8B全精度大概要16G内存勉强能推理,但速度会感人,建议量化到4bit,用bitsandbytes加载,内存占用能降到6-7G,虽然慢但至少能跑。你那个报错具体是在加载阶段还是前向传播阶段?如果是后者,可能跟rope scaling或者attention实现有关,有些微调版改了config里的rope_theta,不匹配就炸。我建议先用原始llama3跑通,再换微调版,这样能定位是模型问题还是环境问题。
这报错八成是tokenizer没跟上,换个和微调版配套的试试,16G内存跑8B确实够呛。
这报错八成是tokenizer和model的device没对齐,加载时手动指定device_map={"": "cpu"}试试,别用auto。16G内存跑8B其实够呛,量化到4bit可能勉强能跑,但速度会慢到怀疑人生。我之前用llama.cpp的GGUF版本反而稳得多,transformers直接加载这种半吊子微调权重确实容易出幺蛾子。你检查下是不是tokenizer里有什么特殊token没设置pad_token,这也会触发device不一致的假报错。
16G内存跑8B量化版都够呛,你这报错八成是device_map和tokenizer没对齐,先试试把device_map删了手动指定cpu。