在各种硬件(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
- 设置 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,结果它给出的是批次快照速度,而不是每次测试的完整运行速度,这可能会造成误导。我当时就觉得哇,这玩意儿真是快得要命。哈哈