最近在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中文微调版,为啥在我本地上推理总报错?
全部回复
共 173 条八成是tokenizer和模型没对齐,换device_map="cpu"再试试,16G内存跑8B量化版勉强行。
16G内存跑8B纯CPU基本没戏,报错估计是有些层没正确offload到CPU。试试加low_cpu_mem_usage=True加载。
16G内存跑8B纯CPU得量化,不然铁定爆。那个报错八成是device_map和手动to冲突了,试试删掉auto。
16G内存没独显跑8B确实够呛,试试加个 load_in_8bit=True 或者换llama.cpp量化版吧。
16G内存没独显跑8B确实够呛,光权重加载就要15G左右,加上KV cache基本爆内存。你那个报错大概率是device_map="auto"没设,或者模型里有层没跟着移到CPU,试试显式加device_map="cpu"。另外检查下tokenizer是不是得手动加pad_token,有些微调版这块没配好也会出幺蛾子。实在不行就上llama.cpp量化版,Q4跑起来内存压力小很多。
这个报错八成不是模型本身的问题,而是device_map="auto"在搞事情。你既然要纯CPU推理,就别让accelerate自己去分配了,直接去掉device_map,加载完手动model.to('cpu'),再把input_ids也挪到cpu上,基本就能解决。那个Expected all tensors on the same device,通常是模型某些层被dispatch到了meta或者别的地方,输入却还在cpu,两边对不上。另外16G内存跑8B确实很悬,fp32权重就要32G,你得用load_in_4bit或者至少float16,但CPU上float16支持又不好,建议试试GGUF格式配llama.cpp,量化到Q4大概5G左右,能跑但会慢。tokenizer那边一般不会有这种device报错,除非你用了什么奇怪的padding设置。我之前在8G内存的机器上硬跑7B,也是各种崩,最后还是老老实实上量化了。
这个报错我遇到过,大概率不是模型本身的问题,而是device_map="auto"在作怪。你如果在加载时用了这个参数,accelerate会自己把不同层分配到它认为合适的设备上,哪怕你只有CPU,有时候它也会把某些层标记成meta或者disk,结果输入张量在CPU、某些权重却在别的地方,就炸了。最稳的办法是加载时直接device_map=None或者干脆不写,然后用.to("cpu")手动推一遍,基本能解决。另外16G内存跑8B确实很紧张,fp32权重就要32G,你至少得用load_in_8bit=True或者gguf量化版本,不然连加载这一步都可能被OOM干掉。tokenizer那边一般不是主因,但如果微调版改了chat template,输入格式不对也会报奇怪的错,建议先拿官方例子跑通再换你的数据。无独显的话其实可以考虑llama.cpp或者ollama,比transformers省心多了。
这个报错大概率是device_map="auto"的锅,它会自动把不同层分到不同设备,如果你机器上检测到某些加速器但实际又没正确初始化,张量就飘了。你直接手动to("cpu")并去掉device_map试试,或者显式设device_map={"": "cpu"}。另外16G内存跑8B的fp32基本没戏,换成load_in_4bit或者用llama.cpp的量化版才现实,不然光加载权重就爆了。
16G内存跑8B纯CPU有点悬,报错可能是device_map和手动to冲突了,试试全删掉device_map再手动.cpu()。
16G内存没独显跑8B确实够呛,就算量化到4bit,加载完也差不多把内存吃满了,报设备不一致大概率是有的层偷偷跑到meta device或者被accelerate拆走了。试试去掉device_map,显式写model.to('cpu'),再确认tokenizer没搞成fast版本乱切词。实在不行换Qwen2.5-1.5B或者Llama-3.2-3B的中文微调,体验会顺畅很多。
16G内存没独显跑8B确实够呛,device_map那参数容易把层拆到不同设备上,试试全部手动.to('cpu')。
这个报错其实挺典型的,Expected all tensors to be on the same device 不一定是你没移到CPU,而是模型里某些层或者buffer还挂在meta device上,常见于 device_map="auto" 在没GPU的机器上乱分配。你试试加载时直接 device_map="cpu" 或者干脆不传device_map、手动 .to("cpu"),有时候low_cpu_mem_usage开着也会触发这种鬼问题。另外那个中文微调版如果改过config或者tokenizer,embedding层可能被特殊处理过,检查下有没有自定义代码需要trust_remote_code=True。说到16G内存跑8B,fp16大概要16G权重加激活,基本是卡着上限,建议上GGUF量化版走llama.cpp,Q4大概5G左右能跑起来,比transformers硬扛舒服多了。
这个报错我也遇到过,八成是device_map="auto"惹的祸。它有时候会把部分层自动分到meta device或者别的设备上,即使你后面手动to('cpu'),那些已经分散的权重也拉不回来,跑前向的时候自然就报tensor不在同一设备了。你可以试试加载时显式指定device_map="cpu",或者干脆别传这个参数,直接model.to('cpu'),这样所有参数都在一个地方,报错应该就没了。另外那个中文微调版确实可能自带tokenizer配置,建议确认下tokenizer是不是跟模型配套的,不然输入id对不上也会出各种怪问题。至于16G内存无独显跑8B,说实话挺悬的,fp32肯定爆,得用load_in_8bit或者4bit量化,还得看你的内存能不能扛住加载过程,实在不行换个小点的模型或者用llama.cpp的gguf格式会舒服很多。