NVIDIA TensorRT-LLM 基准测试

Jan 现在除了支持 llama.cpp (opens in a new tab) 之外,还支持 NVIDIA TensorRT-LLM (opens in a new tab),这使得 Jan 成为一个多引擎、对 Nvidia GPU 用户而言速度超快的应用。

我们对 TensorRT-LLM 期待已久,并且在实现它的过程中获得了很多乐趣 (opens in a new tab)。作为这个过程的一部分,我们进行了一些基准测试,以了解 TensorRT-LLM 在消费级硬件(例如,我们在 Jan 的硬件社区 (opens in a new tab)中常见的 4090 (opens in a new tab)3090 (opens in a new tab))上的表现如何。

快来试试吧!Jan 的 TensorRT-LLM 扩展已在 Jan v0.4.9 中提供。我们为您预编译了一些 TensorRT-LLM 模型供您试用:Mistral 7bTinyLlama-1.1bTinyJensen-1.1b 😂

有 Bug 或反馈?请通过 GitHub (opens in a new tab)Discord (opens in a new tab) 告诉我们。

一个有趣的旁注:Jan 实际上于 2023 年 6 月开始时是基于 NVIDIA FastTransformer (opens in a new tab) 构建的,它是 TensorRT-LLM 的前身库。TensorRT-LLM 于 2023 年 9 月发布,使其成为一个非常年轻的库。我们很高兴看到其发展路线图!

主要发现

image

TensorRT-LLM 的表现是:

  • 在相同硬件上比 llama.cpp 快 30-70%
  • 在连续运行时消耗更少的内存,并且 GPU VRAM 利用率略高于 llama.cpp
  • 编译后的模型大小比 llama.cpp 小 20% 以上
  • 便利性较低,因为模型必须针对特定的操作系统和 GPU 架构进行编译,而 llama.cpp 则具有“一次编译,到处运行”的可移植性
  • 可及性较低,因为它不支持旧代 NVIDIA GPU

为何选择 TensorRT-LLM?

TensorRT-LLM (opens in a new tab) 是 Nvidia 的开源推理库,它集成了 Nvidia 在开源 cuBLAS (opens in a new tab) 库之外的专有优化。

与如今作为跨平台推理引擎主导桌面 AI 的 llama.cpp (opens in a new tab) 相比,TensorRT-LLM 针对 Nvidia GPU 进行了高度优化。llama.cpp 将模型编译成一个单一、通用的 CUDA “后端” (opens in a new tab),可以在多种 Nvidia GPU 上运行;而 TensorRT-LLM 则将模型编译成一个针对特定 GPU 的执行图 (opens in a new tab),该图针对特定 GPU 的张量核心(Tensor Core)、CUDA 核心、显存(VRAM)和内存带宽进行了高度优化。

TensorRT-LLM 通常用于数据中心级的 GPU,在 NVIDIA H100 张量核心 GPU (opens in a new tab) 上可产生令人瞠目结舌的 10,000 tokens/s (opens in a new tab)。我们很好奇 TensorRT-LLM 在消费级 GPU 上的表现如何,并进行了尝试。

Llama.cppTensorRT-LLM
基准速度极快(快 30-70%)
一次编译,跨平台运行针对特定 GPU 架构进行编译和高度优化
通用且可移植高度优化
模型编译成单一、通用的 CUDA“后端” (opens in a new tab)模型编译成针对特定 GPU 的执行图 (opens in a new tab)

实验设置

我们在沙盒环境中使用标准化的推理请求进行实验。

  • 模型:Mistral 7b 模型,以可比较的 int4 量化进行编译和量化。
  • 测试运行:每个推理引擎在裸机 PC 上进行 5 批次测试,每批次运行 10 次,期间没有其他应用程序运行。
  • 参数:用户默认值,即 batch_size 1input_len 2048output_len 512
  • 测量指标:
💡

我们选择了 批处理大小为 1 (opens in a new tab) 来模拟真实的现实世界用例,因为 Jan 用户很可能一次只发出一个推理请求。我们还使用了 2048 的 input_len 和 512 的 output_len 来模拟典型的聊天机器人用例。

💡

进一步研究:我们发现 GPU 显存利用率难以测量,Windows 上的 nvidia-smi 与 Windows 任务管理器的资源监视器对 NVIDIA GPU 的测量结果不同。经过一番研究 (opens in a new tab)后,我们决定采用 nvidia-smi 的测量值。

硬件选择

我们根据用户的偏好选择了以下 GPU

NVIDIA GPU显存 (GB)CUDA 核心数张量核心数显存位宽 (bit)显存带宽 (GB/s)连接速度 (GB/s)
GeForce RTX 4090 (Ada)2416,384512384~1000PCIe4.0 x16 (约 32)
GeForce RTX 3090 (Ampere)2410,496328384935.8PCIe4.0 x16 (约 32)
GeForce RTX 4070 笔记本电脑 GPU (Ada)87680144192272PCIe4.0 x4 (约 8)
GeForce RTX 4090 eGPU (Ada)2416,384512384~1000通过 USB4 USB-C 端口连接的雷电 3(约 1.25-5? (opens in a new tab)

llama.cpp 设置

💡

注意:nglNumber of GPU Layers(GPU 层数)的缩写,其范围从 0(无 GPU 加速)到 120(某些大型模型完全使用 GPU)。

TensorRT-LLM 设置

  • TensorRT-LLM 版本 0.7.1 (opens in a new tab) 并在 Windows 上构建
  • 对于 TensorRT-LLM,我们使用了 Mistral-7b-int4 AWQ
  • 我们使用 free_gpu_memory_fraction 运行 TensorRT-LLM,以测试其在最低显存消耗下的表现。
  • 注意:我们选择 TensorRT-LLM 的 AWQ 量化,是为了更接近地与 GGUF 的 Q4 量化进行比较。

结果

NVIDIA GeForce RTX 4090 GPU

image Jan 就是在这台双 4090 工作站上构建的,它最近升级了一个漂亮的机箱。

image 我们双 4090 集群的原始机箱(或者说没有机箱),发布在 r/localllama (opens in a new tab)

硬件详情

  • CPU: Intel 13代
  • GPU: NVIDIA GeForce RTX 4090 (Ada - sm 89)
  • 内存: 32GB
  • 操作系统: Windows 11 Pro

模型详情

  • llama.cpp 模型: Mistral 7B v0.2 GGUF Q4_K_M
  • TensorRT-LLM 模型: Mistral 7B v0.2 AWQ, 针对单 GPU (Ada) 量化

在这次测试中,我们使用了 Jan 的双 4090 工作站 (opens in a new tab),我们的工程师们分时使用它来构建 Jan。

NVIDIA GeForce RTX 4090 (opens in a new tab) 是最新的顶级桌面 GPU,建议零售价为 1599 美元,采用 Ada 架构。它的显存内内存带宽约为 1000 GB/s,GPU 与 CPU 之间的 PCIe 4.0 x16 通道带宽约为 32 GB/s。

指标GGUF (使用 CPU)GGUF (使用 GPU)TensorRT-LLMTensorRT-LLM 对比情况
吞吐量 (token/s)14.0100.43170.63✅ 快了 69.89%
最大 GPU 利用率 (%)不适用83.5088.50高出 5.99%
最大显存利用率 (%)不适用6472.1高出 12.66%
平均内存使用量 (GB)0.6117.1054.98✅ 减少 29.88%
磁盘大小 (GB)4.074.063.05✅ 小了 24.88%

TensorRT-LLM 通过为 GeForce RTX 4090 GPU 的 Ada 架构构建模型以实现最佳图执行,充分利用其 512 个张量核心、16,384 个 CUDA 核心和 1,000 GB/s 的内存带宽,速度比 llama.cpp 快了近 70%。

llama.cpp 速度较慢的直观原因在于,它将模型编译成一个单一、通用的 CUDA “后端” (opens in a new tab),可以在多种 NVIDIA GPU 上运行。这样做需要 llama.cpp 放弃 TensorRT-LLM 通过编译为特定 GPU 执行图所做的所有优化。

NVIDIA GeForce RTX 3090 GPU

image 我们的 3090 机器,现在由我们的一位工程师用于构建 Jan

硬件详情

  • CPU: Intel 13代
  • GPU: NVIDIA GeForce RTX 3090 (Ampere - sm 86)
  • 内存: 64GB
  • 操作系统: Windows 11 Pro

模型详情

  • llama.cpp 模型: Mistral 7B v0.2 GGUF Q4_K_M
  • TensorRT-LLM 模型:Mistral 7B v0.2 AWQ,针对单 GPU(Ampere)量化

NVIDIA 的 GeForce RTX 3090 (opens in a new tab) 是一款广受欢迎的桌面 GPU,截至 4 月 24 日,零售价约为 1500 美元。它采用 NVIDIA Ampere 架构。与其后续产品 GeForce RTX 4090 相比,它的 CUDA 核心数(10,496)和张量核心数(328)减少了 33%,内存带宽(约 930 GB/s)减少了 7%。

指标GGUF (使用 CPU)GGUF (使用 GPU)TensorRT-LLMTensorRT-LLM 对比情况
吞吐量 (token/s)11.4288.70144.19✅ 快了 62.57%
最大 GPU 利用率 (%)不适用80.4089.10高出 10.82%
最大显存利用率 (%)不适用66.8076.20高出 14.07%
平均内存使用量 (GB)0.6112.600.98减少 62.41%
磁盘大小 (GB)4.074.063.05✅ 小了 24.88%

有趣的是,GeForce RTX 3090 仅比 GeForce RTX 4090 慢 16.6%。在 TPS 方面,TensorRT-LLM 比 llama.cpp 快了 62.57%。奇怪的是,在初始模型预热后,它在后续的推理请求中使用的内存可以忽略不计。

NVIDIA GeForce RTX 4070 笔记本电脑 GPU

image

硬件详情

  • 笔记本电脑: Razer Blade 14
  • CPU: AMD Ryzen™ 9 8945HS, 8核/16线程
  • GPU: NVIDIA GeForce RTX 4070 笔记本电脑 GPU (Ada - sm 89) on PCIe 4.0 x16 (32 GB/s)
  • 内存: 32GB
  • 操作系统: Windows 11 Pro

模型详情

  • llama.cpp 模型: Mistral 7B v0.2 GGUF Q4_K_M
  • TensorRT-LLM 模型: Mistral 7B v0.2 AWQ, 针对单 GPU (Ada) 量化

我们还对配备 8GB 显存的 NVIDIA GeForce RTX 4070 笔记本电脑 GPU 进行了基准测试,这是 Jan 用户中一种流行的配置。笔记本电脑 GPU 的性能不如其台式机版本,因为它们为了便携性而牺牲了能耗和散热性能。

指标GGUF (使用 CPU)GGUF (使用 GPU)TensorRT-LLM在 GPU 上的差异
吞吐量 (token/s)11.5739.7051.57✅ 快了 29.9%
最大 GPU 利用率 (%)不适用80.0084.67高出 5.83%
最大显存利用率 (%)不适用72.7881.22高出 11.60%
平均内存使用量 (GB)4.494.441.04✅ 减少 76.55%
磁盘大小 (GB)4.074.063.05✅ 小了 24.88%

在笔记本电脑的独立 GPU 上,TensorRT-LLM 的每秒 token 吞吐量比 llama.cpp 快了 29.9%,但明显慢于台式机 GPU。

其原因很简单:与 4090 相比,GeForce RTX 4070 笔记本电脑 GPU 的 CUDA 核心和张量核心数量减少了 53.1%,显存也更少(8GB 对 24GB)。这减少了 TensorRT-LLM 进行 GPU 特定优化的空间。

GeForce RTX 4070 笔记本电脑 GPU 也比 GeForce RTX 4090 台式机 GPU 慢了约 70%,这显示了较低功耗、较少显存和散热限制对推理速度的硬件影响。

配备 NVIDIA GeForce RTX 4090 eGPU 的笔记本电脑

image

硬件详情

  • 笔记本电脑: Razer Blade 14
  • eGPU 盒子: AORUS RTX 4090 GAMING BOX
  • CPU: AMD Ryzen™ 9 8945HS, 8核/16线程
  • GPU: NVIDIA GeForce RTX 4090 (Ada - sm 89) on eGPU with Thunderbolt 3 connection
  • 内存: 32GB
  • 操作系统: Windows 11 Pro

模型详情

  • llama.cpp 模型: Mistral 7B v0.2 GGUF Q4_K_M
  • TensorRT-LLM 模型:Mistral 7B v0.2 AWQ,针对单 GPU(Ampere)量化

我们最后一个基准测试是实验一台 Asus RTX 4090 eGPU (opens in a new tab),它通过一个 雷电 3 端口 (opens in a new tab) 连接到 Razer Blade 14 的 USB4 端口 (opens in a new tab)。理论上,结果应该与 GeForce RTX 4090 桌面 GPU 相当,因为它们具有相同的底层 GPU,但连接速度却大相径庭。

我们认为,观察 TensorRT-LLM 如何处理 CPU 和 GPU 之间通信带宽减少 68.4% 的情况会很有趣。

  • eGPU 的雷电 3 连接(1.25-5 GB/s?)
  • “设备上”台式机的 PCIe 4.0 x4(约 8 GB/s)
💡

需要帮助:我们实际上不 100% 确定雷电 3 到 USB4 之间的实际连接速度 (opens in a new tab)是多少,因为实际速度似乎与宣传的 5 GB/s 不同。这其中似乎涉及到很多因素,包括实际的线缆本身。如果社区中有人能指导我们,我们将不胜感激!

总的来说,我们在测试中使用了中高端的 NVIDIA 桌面 GPU,因为 TensorRT-LLM 的性能提升在显存更大的设备上最为明显。对于配置较低的机器用户来说,llama.cpp 更好。

指标GGUF (使用 CPU)GGUF (使用 GPU)TensorRT-LLM在 GPU 上的差异
吞吐量 (token/s)11.5662.22104.95✅ 快了 68.66%
最大显存利用率 (%)06599高出 52.31%
内存使用量 (GB)0.6115.384.11✅ 减少 23.61%
磁盘大小 (GB)4.074.063.05✅ 小了 24.88%

与 PCIe 4.0 x16 连接的 GPU 相比,雷电 3 eGPU 的 tokens/s 降低了 38.5%。但与 llama.cpp 相比,速度提升百分比相似,约为 69%。

有趣的是,eGPU 使用的显存量变化较大且更高。我们的假设是,较慢的通信带宽导致分配了更多的显存,因为内存释放也相应变慢。

结论

Token 生成速度

image

吞吐量(越高越好)TensorRT-LLMLlama.cpp百分比差异
GeForce RTX 4090 桌面 GPU✅ 170.63t/s100.43t/s快了 69.89%
GeForce RTX 3090 桌面 GPU✅ 144.19t/s88.70t/s快了 62.57%
GeForce RTX 4090 eGPU✅ 104.95t/s62.22t/s快了 68.66%
GeForce RTX 4070 笔记本电脑 GPU✅ 51.57t/s39.70t/s快了 29.90%
笔记本电脑 AMD Ryzen™ 9 8945HS, 8核/16线程(不支持)✅ 11.57t/s
  • 在桌面 GPU(如 3090 GPU、4090 GPU)上,TensorRT-LLM 比 llama.cpp 快了高达 70%,同时使用的 RAM 和 CPU 更少(但更充分地利用了 VRAM)。
  • 在笔记本电脑 GPU(如 4070 GPU)上,TensorRT-LLM 在显存较小的情况下快了高达 30%

最大显存(VRAM)利用率

平均 VRAM 利用率 %TensorRT-LLMLlama.cpp百分比差异
GeForce RTX 4090 桌面 GPU72.1064.00高出 12.66%
GeForce RTX 3090 桌面 GPU76.2066.80高出 14.07%
GeForce RTX 4070 笔记本电脑 GPU81.2272.78高出 11.06%
GeForce RTX 4090 eGPU不适用不适用不适用
  • 与 llama.cpp 相比,TensorRT-LLM 在峰值利用率下使用的平均 VRAM 略高(高达 14%)。不过,这可能对长期耗电量产生有趣的影响。
  • 注意:我们使用了可比较(但非完全相同)的量化方式,TensorRT-LLM 的 AWQ INT4 与 llama.cpp 的 q4_k_m 实现方式不同。

最大内存(RAM)使用量

最大内存利用率TensorRT-LLMLlama.cpp百分比差异
GeForce RTX 4090 桌面 GPU✅ 4.987.11✅ 减少 29.88%
GeForce RTX 3090 桌面 GPU✅ 0.982.60✅ 减少 62.41%
GeForce RTX 4070 笔记本电脑 GPU✅ 1.044.44✅ 减少 76.55%
GeForce RTX 4090 eGPU✅ 4.115.38✅ 减少 23.61%

在较慢的连接(PCIe 3.0 或雷电 3)上,由于更好的内存管理和高效地将任务委托给显存,TensorRT-LLM 使用的最大内存远少于 llama.cpp。在更快的连接上,它至少与 llama.cpp 持平。

编译后模型大小与文件数量

  • 与普遍看法相反,TensorRT-LLM 预编译的模型并没有那么大。
  • Mistral 7b int4 在 TensorRT-LLM 中实际上小了 25%,为 3.05gb,而 llama.cpp 为 4.06gb。
  • 注意:这些是近似比较,因为 TensorRT-LLM 的 AWQ INT4 与 llama.cpp 的 q4_k_m 实现方式不同。
  • 更重要的结论是,编译后的模型大小大致在同一范围内,而 TensorRT-LLM 的文件数量是 GGUF 文件数量的 7 倍。
模型大小(越低越好)TensorRT-LLM AWQ int4Llama.cpp GGUF Q4百分比差异
Mistral 7B✅ 3.05GB4.06GB✅ 小了 24.88%

便利性

  • 在跨平台通用性和“一次编译,到处运行”的便利性方面,Llama.cpp 仍然胜出。
  • TensorRT-LLM 仍需要针对特定操作系统和架构进行编译,不过这个问题可以通过在 Nvidia 的 NGC 模型目录 (opens in a new tab)上预编译并发布模型来解决。

可及性

  • 在可及性方面,Llama.cpp 毫无悬念地击败了 TensorRT-LLM。
  • TensorRT-LLM 不支持较旧的 NVIDIA GPU,并且在显存较小的显卡(例如 2-4GB VRAM)上运行效果不佳。

结语

我们的基准测试并非完美。我们评估了十几种工具(llmperf (opens in a new tab)psutil (opens in a new tab)gpustat (opens in a new tab)、原生工具等),发现每种工具测量 TPS 和通用指标的方式都不同。我们最终决定使用 Jan 中自己的工具,这些工具在任何推理引擎和硬件上都是一致的。至于运行时参数,我们采用了默认设置,这可能代表了典型用户的体验。

我们也没有为这次基准测试进行超频,因为它不是大多数用户的默认设置。但我们在测试中发现,通过一些调整,TensorRT-LLM 可以运行得更快。我们认为这是一个非常令人兴奋的未来方向。

如何超频:通过以下方式,我们发现 TensorRT-LLM 的性能额外提升了 15%

我们还将发布底层的原始实验数据 (opens in a new tab),并鼓励社区进行审查并帮助我们改进。

特别感谢来自 Nvidia 的 Asli Sabanci Demiroz、Annamalai Chockalingam、Jordan Dodge,以及来自 llama.cpp 的 Georgi Gerganov 提供的反馈、审查和建议。

App screenshots

新机器的灵魂

要了解 Jan 的所有最新研究,请订阅《新机器的灵魂》