大家好,我是 Ai 学习的老章
最近在测试 llama.cpp 这个推理引擎的表现,主要是启动 GGUF 格式的量化大模型比较方便
启动确实方便,但是性能测试结果却很不理想
单并发极快,速度飞起,并发数上来之后平均 TPS 断崖式下降
我的启动脚本中是设置了并发相关参数的
搜了一下了 Reddit 的 LocalLLaMA 社区,发现很多吐槽
llama.cpp 项目 issue 还有吐槽
看了一个博主的文章《# Stop Wasting Your Multi-GPU Setup With llama.cpp》[1]
作者地下室里的常驻 AI 服务器——一台配备 14 张 RTX 3090 GPU 和 336GB VRAM 的专用 AI 服务器,在此设备上做过大量测试。
省流: lama.cpp 并未针对张量并行(Tensor Parallelism)与批推理(Batch Inference)进行优化。只有在进行 LLM 的部分或全部 CPU 卸载时,你才应该使用 llama.cpp。但在多 GPU 配置下,需要经过优化的批推理与 Tensor Parallelism,此时 vLLM 或 ExLlamaV2 等才是正确选择。也不要使用 Ollama,它只是 llama.cpp 的一个封装,干的就是设置环境变量、蹩脚地计算显存拆分和卸载。如果你只有一块 GPU,只想跑点基础模型做做聊天,那它还行;但凡超出这个范围,就不值得用了。
llama.cpp[2] 是一个支持多种模型架构和硬件平台的推理引擎。然而,它不支持批处理推理,因此一次处理多个请求时并不理想。它主要与 GGUF 量化格式配合使用,在单次请求场景下性能尚可,但也就仅此而已。唯一真正推荐使用 llama.cpp 的情况是:当你的 GPU 显存(VRAM)不足,需要将部分模型权重卸载到 CPU 内存(RAM)时。
它是目前最流行的推理引擎。围绕它的开源社区非常活跃,通常能很快支持新模型和新架构,尤其因为它支持 CPU 卸载,对更广泛的用户群体而言也极易上手。遗憾的是,llama.cpp 并不支持、也大概率永远不会支持张量并行(Tensor Parallelism)[3] 因为大多数人不会像我一样把几千美元砸在快速贬值的资产上[4] 🤷
作者的 AI 服务器配备了 512 GB 高性能 DDR4 3200 3DS RDIMM 内存,可提供 CPU 架构所支持的最大内存带宽。配合 AMD Epyc Milan 7713 CPU,仅通过 CPU 卸载就能够在 DeepSeek v2.5 236B BF16 模型上实现每秒约 1 个 token。
但是
利用 14x GPU AI 服务器中的 8 块 GPU,仅通过 GPU 卸载,服务器在处理 Llama 3.1 70B BF16 时,通过 vLLM 使用张量并行的批量推理,可达到每秒约 800 个 token,同时处理 50 个异步请求。
这是为什么呢?
从宏观上看,张量并行将模型每一层的计算分布到多块 GPU 上。与其在单块 GPU 上完成整个矩阵乘法,不如把运算切分,让每块 GPU 只处理一部分工作量,这样每块 GPU 就能同时运行不同层中的不同部分,使结果以指数级速度计算出来。
张量并行对多 GPU 配置至关重要——经验法则是 TP 喜欢 2^n,因此下面运行模型时用了 8×GPU——而在对系统进行压力测试时,并行也比串行更合适。当你试图用 llama.cpp 让 LLMs 彼此对话时,引擎会把这些 GPU 拖慢,让它们一个接一个地排队等待。
下图作者运行的一个脚本:50 个异步请求,每个请求约 2k tokens,总共耗时 2 分 29 秒,使用的是 vLLM 运行 Llama 3.1 70B BF16。如果改用 INT8 量化或更低精度,速度会快得多;再加上投机解码和/或嵌入模型,速度还会进一步提升。这一切都离不开 vLLM 利用张量并行实现的批推理。
作者还测试了 vLLM、Aphrodite、Sglang、TensorRT-LLM、ExLlamaV2 和 LMDeploy 等支持张量并行的推理引擎。其中 ExLlamaV2[5] 它是一款仅 GPU 的推理引擎,ExLlamaV2 带来了独一无二的 EXL2 量化格式 ,如今已被多款推理引擎采纳,因为它在显存利用率上的优势巨大。
参考资料
[1]
Stop Wasting Your Multi-GPU Setup With llama.cpp: https://www.ahmadosman.com/blog/do-not-use-llama-cpp-or-ollama-on-multi-gpus-setups-use-vllm-or-exllamav2/
[2]
llama.cpp: https://github.com/ggerganov/llama.cpp
[3]
并不支持、也大概率永远不会支持张量并行(Tensor Parallelism): https://github.com/ggerganov/llama.cpp/issues/9086#issuecomment-2578645269
[4]
把几千美元砸在快速贬值的资产上: https://x.com/TheAhmadOsman/status/1869841392924762168
[5]
ExLlamaV2: https://github.com/turboderp/exllamav2