最近在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中文微调版,为啥在我本地上推理总报错?
全部回复
共 7 条这个问题我上周刚踩过一模一样的坑,大概率是device_map="auto"在没显卡的机器上反而会出幺蛾子,它试图把不同层分配到不同设备,结果CPU上没成功。你试试加载时直接写model.to("cpu"),同时tokenizer也手动指定一下device="cpu",别用auto那个参数。另外16G内存跑8B模型理论上够,但推理速度会慢得离谱,而且如果不做量化,内存占用可能飙到12-14G,建议先试试4bit量化,用bitsandbytes库加载,能把显存需求压到6G左右。至于tokenizer配置,有些中文微调版会改bos_token或padding side,你检查下tokenizer的config是不是和原版llama一样,特别是pad_token_id有没有设成eos_token_id。我上次折腾了两天,最后发现是某个社区版把tokenizer的model_max_length改成了512,但模型本身支持2048,导致溢出报错。说实话,8B模型在无独显的笔记本上体验真的很劝退,生成一个字可能要等好几秒,建议先用llama.cpp跑GGUF格式的试试,那个对CPU优化好得多。
这报错大概率是device_map的问题,我之前也遇到过,手动指定device='cpu'或者把模型放到cpu上再加载就能解决。16G内存跑8B确实够呛,量化到4-bit或者8-bit可能勉强能跑,但推理速度会慢到怀疑人生。建议先试试bitsandbytes加载,或者换个更小的模型。
这问题我遇到过类似的,八成是device_map="auto”在没显卡时会搞出奇怪分配,试试手动设成device="cpu"加载模型,或者直接删掉device_map参数。内存16G跑8B其实挺悬的,即使能加载推理速度也慢得怀疑人生,建议先量化到4bit试试,bitsandbytes库能帮上忙。tokenizer一般不用单独配,但如果微调版改了特殊标记,检查下config.json里的pad_token_id是不是设成了eos_token_id,这个坑也挺常见的。
八成是device_map设成auto时偷偷把部分层塞到GPU了,16G内存跑8B确实吃力,建议直接上4bit量化。
16G内存跑8B确实勉强,试试加载时加个low_cpu_mem_usage=True,设备用cpu手动指定。
这问题我上周刚遇到过,device_map="auto"有时会自作聪明把层分配到不同设备上,你手动指定model.to(‘cpu’)反而更稳。另外16G内存跑8B模型确实很勉强,加载时记得加load_in_8bit=True或使用bitsandbytes的4bit量化,否则光是模型参数就得占掉15G以上。Tokenizer的话建议直接用原版Llama-3的tokenizer_config.json,很多中文微调版其实没动这个。
这个问题我上周刚遇到过,极大概率是device_map参数搞的鬼——设成auto后某些层会被分配到不同设备上,你手动指定device='cpu'或者直接删掉device_map试试。另外16G内存跑8B模型确实比较勉强,推理时峰值内存很容易爆掉,建议先用4-bit量化或者bitsandbytes加载看看能不能撑住。Tokenizer的话一般用原版Llama的就行,除非微调作者特别说了要换,你可以去模型卡确认下有没有特殊说明。