跳到内容

Qwen2.5-VL 使用指南

本指南介绍了如何在目标加速堆栈上运行 Qwen2.5-VL 系列模型。由于 BF16 是 Qwen2.5-VL 训练中常用的精度类型,因此在推理中使用 BF16 可以确保最佳的准确性。

TPU 部署

GPU 部署

安装 vLLM

uv venv
source .venv/bin/activate
uv pip install -U vllm --torch-backend auto

在 4 块 A100 上以 BF16 运行 Qwen2.5-VL

有两种方法可以在多个 GPU 上并行化模型:(1) 张量并行 (TP) 或 (2) 数据并行 (DP)。每种方法都有其优点,其中张量并行通常更适用于低延迟/低负载的场景,而数据并行则更适用于数据量大且负载重的情况。

启动 Qwen2.5-VL-72B 的在线推理服务器

# Start server with BF16 model on 4 GPUs using TP=4
export CUDA_VISIBLE_DEVICES=0,1,2,3
vllm serve Qwen/Qwen2.5-VL-72B-Instruct  \
  --host 0.0.0.0 \
  --port 8000 \
  --tensor-parallel-size 4 \
  --mm-encoder-tp-mode data \
  --limit-mm-per-prompt '{"image":2,"video":0}' \

提示

  • 您可以设置 --max-model-len 来节省内存。默认情况下,模型的上下文长度为 128K,但 --max-model-len=65536 通常适用于大多数场景。
  • 您可以设置 --tensor-parallel-size--data-parallel-size 来调整并行策略。但对于 A100-80GB 设备,TP 应大于 2 以避免 OOM。
  • 您可以设置 --limit-mm-per-prompt 来限制每个提示允许的多模态数据实例数量。如果您想控制多模态请求的传入流量,这将非常有用。
  • --mm-encoder-tp-mode 设置为 "data",以便以 DP 方式部署多模态编码器以获得更好的性能。这是因为多模态编码器与语言解码器相比非常小(Qwen2.5-VL-72B 中 ViT 为 675M,LM 为 72B),因此对 ViT 进行 TP 增益很小但会产生显著的通信开销。
  • vLLM 会保守地使用 90% 的 GPU 内存。您可以设置 --gpu-memory-utilization=0.95 来最大化 KVCache。

对于 Qwen2.5-VL-7B 这样的中等模型,数据并行通常能提供更好的性能,因为它可以在不产生张量并行中看到的重通信成本的情况下提高吞吐量。以下是使用 DP=4 启动服务器的示例:

# Start server with BF16 model on 4 GPUs using DP=4
export CUDA_VISIBLE_DEVICES=0,1,2,3
vllm serve Qwen/Qwen2.5-VL-7B-Instruct  \
  --host 0.0.0.0 \
  --port 8000 \
  --data-parallel-size 4 \
  --limit-mm-per-prompt '{"image":2,"video":0}' \

基准测试

对于基准测试,您首先需要通过向服务器命令添加 --no-enable-prefix-caching 来启动服务器,禁用前缀缓存。

Qwen2.5VL-72B 在 VisionArena-Chat 数据集上的基准测试

一旦 72B 模型服务器运行起来,打开另一个终端并运行基准测试客户端。

vllm bench serve \
  --host 0.0.0.0 \
  --port 8000 \
  --backend openai-chat \
  --endpoint /v1/chat/completions \
  --endpoint-type openai-chat \
  --model Qwen/Qwen2.5-VL-72B-Instruct \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat \
  --num-prompts 128 
  • 通过更改 --num-prompts 来测试不同的批次大小,例如 1, 16, 32, 64, 128, 256, 512
预期输出
============ Serving Benchmark Result ============
Successful requests:                     128
Benchmark duration (s):                  33.40
Total input tokens:                      9653
Total generated tokens:                  14611
Request throughput (req/s):              3.83
Output token throughput (tok/s):         437.46
Total Token throughput (tok/s):          726.48
---------------Time to First Token----------------
Mean TTFT (ms):                          13715.73
Median TTFT (ms):                        13254.17
P99 TTFT (ms):                           26364.39
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          171.89
Median TPOT (ms):                        157.20
P99 TPOT (ms):                           504.86
---------------Inter-token Latency----------------
Mean ITL (ms):                           150.41
Median ITL (ms):                         56.96
P99 ITL (ms):                            614.47
==================================================

Qwen2.5VL-72B 在随机合成数据集上的基准测试

一旦 72B 模型服务器运行起来,打开另一个终端并运行基准测试客户端。

vllm bench serve \
  --host 0.0.0.0 \
  --port 8000 \
  --model Qwen/Qwen2.5-VL-72B-Instruct \
  --dataset-name random \
  --random-input-len 8000 \
  --random-output-len 1000 \
  --num-prompts 128 
  • 通过调整 --random-input-len--random-output-len 参数来测试不同的工作负载。
  • 提示密集型:8000 输入 / 1000 输出
  • 解码密集型:1000 输入 / 8000 输出
  • 平衡型:1000 输入 / 1000 输出

  • 通过更改 --num-prompts 来测试不同的批次大小,例如 1, 16, 32, 64, 128, 256, 512

预期输出
============ Serving Benchmark Result ============
Successful requests:                     128
Benchmark duration (s):                  778.74
Total input tokens:                      1023598
Total generated tokens:                  114351
Request throughput (req/s):              0.16
Output token throughput (tok/s):         146.84
Total Token throughput (tok/s):          1461.27
---------------Time to First Token----------------
Mean TTFT (ms):                          305503.01
Median TTFT (ms):                        371429.33
P99 TTFT (ms):                           730584.33
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          308.99
Median TPOT (ms):                        337.48
P99 TPOT (ms):                           542.26
---------------Inter-token Latency----------------
Mean ITL (ms):                           297.63
Median ITL (ms):                         60.91
P99 ITL (ms):                            558.30
==================================================

Qwen2.5VL-7B 在 VisionArena-Chat 数据集上的基准测试

一旦 7B 模型服务器运行起来,打开另一个终端并运行基准测试客户端。

vllm bench serve \
  --host 0.0.0.0 \
  --port 8000 \
  --backend openai-chat \
  --endpoint /v1/chat/completions \
  --endpoint-type openai-chat \
  --model Qwen/Qwen2.5-VL-7B-Instruct \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat \
  --num-prompts 128 
预期输出
============ Serving Benchmark Result ============
Successful requests:                     128
Benchmark duration (s):                  9.78
Total input tokens:                      9653
Total generated tokens:                  14227
Request throughput (req/s):              13.09
Output token throughput (tok/s):         1455.11
Total Token throughput (tok/s):          2442.40
---------------Time to First Token----------------
Mean TTFT (ms):                          4432.91
Median TTFT (ms):                        4751.45
P99 TTFT (ms):                           7575.37
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          58.19
Median TPOT (ms):                        45.30
P99 TPOT (ms):                           354.21
---------------Inter-token Latency----------------
Mean ITL (ms):                           43.86
Median ITL (ms):                         17.22
P99 ITL (ms):                            653.85
==================================================

Qwen2.5VL-7B 在随机合成数据集上的基准测试

一旦 7B 模型服务器运行起来,打开另一个终端并运行基准测试客户端。

vllm bench serve \
  --host 0.0.0.0 \
  --port 8000 \
  --model Qwen/Qwen2.5-VL-7B-Instruct \
  --dataset-name random \
  --random-input-len 8000 \
  --random-output-len 1000 \
  --num-prompts 128 
预期输出
============ Serving Benchmark Result ============
Successful requests:                     128
Benchmark duration (s):                  45.30
Total input tokens:                      1023598
Total generated tokens:                  116924
Request throughput (req/s):              2.83
Output token throughput (tok/s):         2581.01
Total Token throughput (tok/s):          25176.17
---------------Time to First Token----------------
Mean TTFT (ms):                          10940.59
Median TTFT (ms):                        10560.30
P99 TTFT (ms):                           21984.26
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          41.64
Median TPOT (ms):                        34.41
P99 TPOT (ms):                           177.58
---------------Inter-token Latency----------------
Mean ITL (ms):                           33.60
Median ITL (ms):                         23.14
P99 ITL (ms):                            196.22
==================================================