最近在 Ubuntu 上用一张 4090 试着部署 Qwen2.5-7B-Instruct,用的是 transformers + accelerate,模型加载正常,显存占用大概 15G 左右,但生成速度只有 5-8 tokens/s,感觉不太对劲。我试过设置 torch_dtype=torch.float16,也装了 flash-attn,但速度没明显变化。看别人说 4090 跑 7B 应该能到 30+ tokens/s,有点迷茫。是我没用 vLLM 或 llama.cpp 这类推理框架的原因吗?还是 batch size、max_new_tokens 这些参数没设对?求有经验的老哥指点一下,感谢!
本地部署Qwen2.5-7B,显存够但推理速度特别慢,是我哪里配错了吗?
全部回复
共 11 条transformers 原生推理就这速度,换 vLLM 立马起飞,4090 跑 7B 轻松 60+。
transformers 原生推理就是这个速度,别怀疑自己配错了。我之前 4090 跑 7B 也是 6-7 tokens/s,换 vLLM 之后直接飙到 40 多,差距就是这么大。flash-attn 只优化注意力那块,解码阶段还是逐 token 串行跑,瓶颈不在那。建议直接上 vLLM 或者 SGLang,开个 OpenAI 兼容接口,几行命令的事,体验完全不一样。
transformers 裸跑就是这个速度,别怀疑自己配置。我之前用 4090 跑 Qwen2.5-7B 也是差不多 6-9 tokens/s,换成 vLLM 之后直接飙到 50 以上,差距就是这么夸张。问题出在 transformers 默认是逐 token 生成,没有 continuous batching 和 paged attention,GPU 利用率其实很低,你看到显存占满不代表算力吃满了。flash-attn 对单条短序列的加速有限,尤其你 batch size 是 1 的时候基本感觉不出来。建议直接上 vLLM,pip 装完几行代码就能起 OpenAI 兼容的接口,7B 在 4090 上跑 fp16 大概能到 40-60 tokens/s。如果只是自己玩不想折腾,llama.cpp 的 Q4 量化版本也很香,显存占用小还快。max_new_tokens 影响的是总时长不是速度,batch size 在 transformers 里调大反而容易 OOM,别在这上面浪费时间了。
大概率就是没用推理框架的锅,transformers 原生 generate 没做 KV cache 优化和 continuous batching,7B 在 4090 上跑出个位数 t/s 太正常了。我之前也踩过这个坑,换成 vLLM 之后同样模型直接飙到 40+ t/s,差距非常夸张。你显存和 flash-attn 都没问题,别在参数上纠结了,直接上 vLLM 或者 sglang 试试,基本是降维打击。
transformers 原生推理就是这个速度,5-8 tokens/s 对 7B 模型来说很正常,问题不在你的配置。4090 跑 7B 能到 30+ 基本都是用了 vLLM 或者 TensorRT-LLM 这类专门优化的推理框架,光靠 flash-attn 提升有限。你显存才占 15G,其实可以试试 vLLM,部署起来也不复杂,速度能翻好几倍。max_new_tokens 不影响生成速度,batch size 单条推理也没啥可调的,换框架才是关键。
transformers 裸跑就是这个速度,别怀疑自己配置有问题。我当初用 4090 跑 7B 也是 6-7 tokens/s,换成 vLLM 之后直接飙到 40+,差距就是这么夸张。原因在于 transformers 默认是逐 token 串行解码,没有做 continuous batching 和 paged attention,GPU 利用率其实很低,你看到显存占满不代表算力吃满了。flash-attn 只优化 attention 那块,对解码阶段的瓶颈帮助有限,所以你没感觉到变化很正常。建议直接上 vLLM 或者 SGLang,部署成本很低,基本 pip 装完改几行代码就能跑,速度提升非常明显。如果只是自己玩、不想折腾环境,llama.cpp 的 CUDA 版本也可以,量化到 Q4 或 Q5 之后 4090 上跑 7B 轻松上百 tokens/s。max_new_tokens 和 batch size 影响的主要是吞吐量,单条请求下不是速度慢的主因,别在这上面浪费时间了。
transformers 原生推理就这速度,换 vLLM 立马起飞,别折腾 flash-attn 了。
写得挺好,建议补充一些性能数据。
写得挺好,建议补充一些性能数据。
transformers原生推理就这速度,换vLLM立马起飞,7B在4090上跑30+很轻松。
你这个速度确实不太正常,4090跑7B用transformers也不该只有5-8 tokens/s。我怀疑关键问题在flash-attn是不是真的生效了,很多人装了但没在from_pretrained里加attn_implementation=“flash_attention_2”,结果还是走的eager attention,白装。另外确认下你有没有用device_map=“auto”之外的东西,有时候accelerate的默认调度会让部分层跑到CPU上,虽然显存看着占15G但实际有offload,速度就崩了。还有generate的时候记得加use_cache=True,这个默认是开的但如果你手动改过config可能会关掉,关了之后每步都重算KV,慢得离谱。batch size对单条生成速度基本没影响,max_new_tokens只影响总时长不影响tokens/s,所以这两个不用纠结。说实话transformers本身就不是为高吞吐推理设计的,就算配置全对,7B在4090上大概也就20出头,想上30+还是得换vLLM,那个才是正经推理框架。你可以先跑个nvidia-smi看看推理时GPU利用率是不是一直贴着100%,如果忽高忽低那基本就是有层在CPU上跑或者attention没优化。