Qwen3在不同硬件芯片上的测试

在各种硬件(3090、4090,以及几台 Mac)上进行了各种速度测试和基准测试,速度比较:4090 VLLM、3090 LCPP、M3Max MLX、M3Max LCPP 与 Qwen-30B-a3b MoE

观察

  • 比较快速处理速度更有意思。Token 生成速度基本符合我的预期。
  • 不确定为什么 VLLM 处理短提示很慢,而处理长提示却快得多。可能是因为它更擅长处理批量数据?
  • 令人惊讶的是,对于这个特定的型号,Qwen3 MoE、带有 MLX 的 M3Max 甚至处理速度都不是太糟糕。
  • 尽管输入的提示完全相同,但与 LCPP 还是存在一个 token 差异。不过,一个 token 应该不会对速度造成太大影响。
  • 看来您还不能使用 2xRTX-3090 在 VLLM 或 Exllama 上运行 Qwen3 MoE。
设置
  • vllm 0.8.5
  • MLX-LM 0.24. 和 MLX 0.25.1
  • 骆驼.cpp 5215
每行包含不同的测试(机器、引擎和提示长度的组合)。每个提示长度包含 4 个测试。
  • 设置 1:2xRTX-4090,VLLM,FP8
  • 设置 2:2x3090、Llama.cpp、q8_0、闪存注意事项
  • 设置 3:M3Max,MLX,8 位
  • 设置 4:M3Max、Llama.cpp、q8_0、flash 注意事项

每行代表不同的配置(机器、引擎)。每行对应一个提示长度。

Machine    Engine    Prompt Tokens    Prompt Processing Speed    Generated Tokens    Token Generation Speed
2x4090    VLLM    681    51.77    1166    88.64
2x3090    LCPP    680    794.85    1087    82.68
M3Max    MLX    681    1160.636    939    68.016
M3Max    LCPP    680    320.66    1255    57.26
2x4090    VLLM    774    58.86    1206    91.71
2x3090    LCPP    773    831.87    1071    82.63
M3Max    MLX    774    1193.223    1095    67.620
M3Max    LCPP    773    469.05    1165    56.04
2x4090    VLLM    1165    83.97    1238    89.24
2x3090    LCPP    1164    868.81    1025    81.97
M3Max    MLX    1165    1276.406    1194    66.135
M3Max    LCPP    1164    395.88    939    55.61
2x4090    VLLM    1498    141.34    939    88.60
2x3090    LCPP    1497    957.58    1254    81.97
M3Max    MLX    1498    1309.557    1373    64.622
M3Max    LCPP    1497    467.97    1061    55.22
2x4090    VLLM    2178    162.16    1192    88.75
2x3090    LCPP    2177    938.00    1157    81.17
M3Max    MLX    2178    1336.514    1395    62.485
M3Max    LCPP    2177    420.58    1422    53.66
2x4090    VLLM    3254    191.32    1483    87.19
2x3090    LCPP    3253    967.21    1311    79.69
M3Max    MLX    3254    1301.808    1241    59.783
M3Max    LCPP    3253    399.03    1657    51.86
2x4090    VLLM    4007    271.96    1282    87.01
2x3090    LCPP    4006    1000.83    1169    78.65
M3Max    MLX    4007    1267.555    1522    60.945
M3Max    LCPP    4006    442.46    1252    51.15
2x4090    VLLM    6076    295.24    1724    83.77
2x3090    LCPP    6075    1012.06    1696    75.57
M3Max    MLX    6076    1188.697    1684    57.093
M3Max    LCPP    6075    424.56    1446    48.41
2x4090    VLLM    8050    514.87    1278    81.74
2x3090    LCPP    8049    999.02    1354    73.20
M3Max    MLX    8050    1105.783    1263    54.186
M3Max    LCPP    8049    407.96    1705    46.13
2x4090    VLLM    12006    597.26    1534    76.31
2x3090    LCPP    12005    975.59    1709    67.87
M3Max    MLX    12006    966.065    1961    48.330
M3Max    LCPP    12005    356.43    1503    42.43
2x4090    VLLM    16059    602.31    2000    75.01
2x3090    LCPP    16058    941.14    1667    65.46
M3Max    MLX    16059    853.156    1973    43.580
M3Max    LCPP    16058    332.21    1285    39.38
2x4090    VLLM    24036    1152.83    1434    68.78
2x3090    LCPP    24035    888.41    1556    60.06
M3Max    MLX    24036    691.141    1592    34.724
M3Max    LCPP    24035    296.13    1666    33.78
2x4090    VLLM    32067    1484.80    1412    65.38
2x3090    LCPP    32066    842.65    1060    55.16
M3Max    MLX    32067    570.459    1088    29.289
M3Max    LCPP    32066    257.69    1643    29.76

网友1: 感谢您发布这些数据!这周我也在各种硬件(3090、4090,以及几台 Mac)上进行了各种速度测试和基准测试(主要是 llmperf 和 aider/livebench)。这些信息绝对有用!

表格中未显示的一点是整体批处理吞吐量——这一点可能显而易见(但或许对读者有用),我们预计当多个用户或同时对 LLM 发出多个请求时(例如在批处理并行处理文档/行或潜在的代理用例中),VLLM FP8 4090 的性能将完全碾压 llama.cpp 和 mlx_lm.server。目前,Exllama 在这方面应该比 llama.cpp 或 mlx-server 表现更好(看起来基本支持大约在 4 小时前就已在引擎的 dev 分支中发布)。

但我很想能够使用 3090s 在 vllm 或 sglang 中运行 Qwen-30B-a3b,但还没有找到合适的量化器(也许是那些 w4a16 量化器之一?)到目前为止,我发现的最佳批处理吞吐量选项是在不同的端口上为每个 3090 启动一个单独的 llama.cpp 实例,然后使用 litellm 代理对它们进行并发请求负载平衡 - 但感觉应该有一种更简单/更好的方法

说得好,这或许可以解释为什么 VLLM 处理长提示符时速度很快,而处理短提示符时却不行。也许它把长提示符拆分成了多个批次?

网友2: 2x4090 LCPP 的基准测试在哪里呢?或者反过来说,2x3090 VLM 的基准测试在哪里呢?又或者 M3Max VLM 的基准测试在哪里呢?

你基本上会同时不断地改变至少两个(甚至更多)变量,以及机器(不仅仅是 GPU)和干扰代理。这使得它有点没用,带有 VLM 的 2x4090 比带有 LCPP 的 2x3090 更快,但这是因为机器还是因为干扰引擎?目前尚不清楚(根据你提供的数据)。

单个 4090 比单个 3090 更快,但 2x3090 在特定工作负载和 nvlink 下比不支持 nvlink 的 2x4090 更快(或基本跟上)。

我猜测安装了 2x4090 的特定机器通常会比安装了 2x3090 的机器更新/规格更好(更新更快的 RAM、CPU 和其他因素)

我可以理解 MLX 仅适用于 Mac,但 LCPP 几乎可以在任何设备上运行,我怀疑 VLM 至少可以在两台 Nvidia 机器上运行,如果不是在 M3Max 上运行的话。

而且 LCPP 不断少 1 个令牌看起来很奇怪,它真的少了 1 个令牌,还是只是 LCPP 本身发送的一个令牌。

基本上我喜欢你正在尝试做的事情的想法,但执行并不完美,这意味着结论有待解释。

回答:

  • VLLM 不支持 rtx-3090 上 fp8 中的特定型号。
  • VLLM 不支持 Mac。
  • 不知道为什么 LCPP 多了一个 token。我输入了完全相同的提示。
  • 显然 4090 上的 LCPP 会比 3090 更快,无需测试来证明这一点。哈哈

网友3: 为什么不也使用 vllm 运行 3090s? 好像不支持, VLLM 支持 RTX 3090,但似乎不支持 Qwen3 MoE FP8 搭配 RTX-3090。我试了好几个小时,最后还是放弃了,在 Runpod 上租了个 RTX-4090。

  • 3090 本身不支持 FP8 和原生的 BF16。所以需要 AWQ 量化分析。
  • 3090 支持 BF16。VLLM 上下文量化又是另一回事,因此可能更难适配该模型。

网友4: 问:你启用了张量并行吗?你的 vllm 好像很慢。我有双 4090。 答:由于我使用的是 2xrtx-4090,所以我将张量并行大小指定为 2。否则,它无法适配。 此外,为了获得每次完整测试的速度,我使用了他们的 python API from vllm import LLM:。 我先尝试了 vllm serve,结果它给出的是批次快照速度,而不是每次测试的完整运行速度,这可能会造成误导。我当时就觉得哇,这玩意儿真是快得要命。哈哈