跳到内容

vLLM 性能分析

警告

性能分析仅供 vLLM 开发者和维护者用于了解代码库不同部分花费的时间比例。vLLM 最终用户切勿开启性能分析,因为它会显著减慢推理速度。

使用 PyTorch Profiler 进行性能分析

我们支持使用 torch.profiler 模块跟踪 vLLM worker。您可以通过启动服务器时设置 --profiler-config 来启用 torch profiler,并将 profiler 条目设置为 'torch',将 torch_profiler_dir 设置为您希望保存跟踪文件的目录。此外,您还可以通过在配置中指定以下附加参数来控制性能分析内容:

  • torch_profiler_record_shapes:启用记录张量形状,默认关闭
  • torch_profiler_with_memory:记录内存,默认关闭
  • torch_profiler_with_stack:启用记录堆栈信息,默认开启
  • torch_profiler_with_flops:启用记录 FLOPs,默认关闭
  • torch_profiler_use_gzip:控制性能分析文件的 gzip 压缩,默认开启
  • torch_profiler_dump_cuda_time_total:控制转储并打印聚合的 CUDA 自时间表,默认开启

在使用 vllm bench serve 时,您可以通过传递 --profile 标志来启用性能分析。

可以使用 https://ui.perfetto.dev/ 可视化跟踪信息。

提示

您可以使用 python -m vllm.entrypoints.cli.main bench 直接调用 bench 模块,而无需安装 vLLM。

提示

在进行性能分析时,只向 vLLM 发送少量请求,因为跟踪信息可能会非常大。另外,无需解压跟踪文件,它们可以直接查看。

提示

停止 profiler - 它会将所有性能分析跟踪文件刷新到目录中。这需要时间,例如,对于一个 llama 70b 的大约 100 个请求的数据,在 H100 上刷新大约需要 10 分钟。在启动服务器之前,将环境变量 VLLM_RPC_TIMEOUT 设置为一个较大的值。例如,设置为 30 分钟。export VLLM_RPC_TIMEOUT=1800000

示例命令和用法

离线推理

有关示例,请参阅 examples/offline_inference/simple_profiling.py

OpenAI 服务器

vllm serve meta-llama/Llama-3.1-8B-Instruct --profiler-config '{"profiler": "torch", "torch_profiler_dir": "./vllm_profile"}'

vllm bench 命令

vllm bench serve \
    --backend vllm \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --dataset-name sharegpt \
    --dataset-path sharegpt.json \
    --profile \
    --num-prompts 2

使用 NVIDIA Nsight Systems 进行性能分析

Nsight Systems 是一个高级工具,可以暴露更多性能分析细节,例如寄存器和共享内存使用情况、注解代码区域以及低级 CUDA API 和事件。

使用您的包管理器 安装 nsight-systems。以下块是 Ubuntu 的一个示例。

apt update
apt install -y --no-install-recommends gnupg
echo "deb http://developer.download.nvidia.com/devtools/repos/ubuntu$(source /etc/lsb-release; echo "$DISTRIB_RELEASE" | tr -d .)/$(dpkg --print-architecture) /" | tee /etc/apt/sources.list.d/nvidia-devtools.list
apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
apt update
apt install nsight-systems-cli

提示

使用 nsys 进行性能分析时,建议设置环境变量 VLLM_WORKER_MULTIPROC_METHOD=spawn。默认情况下,它使用 fork 方法而不是 spawn。有关此主题的更多信息,请参阅 Nsight Systems 发行说明

可以使用 nsys profile ... 启动 Nsight Systems profiler,并为 vLLM 推荐一些标志:--trace-fork-before-exec=true --cuda-graph-trace=node

示例命令和用法

离线推理

对于基本用法,您只需在运行离线推理的任何现有脚本前附加性能分析命令即可。

以下是使用 vllm bench latency 脚本的一个示例

nsys profile  \
    --trace-fork-before-exec=true \
    --cuda-graph-trace=node \
vllm bench latency \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --num-iters-warmup 5 \
    --num-iters 1 \
    --batch-size 16 \
    --input-len 512 \
    --output-len 8

OpenAI 服务器

要对服务器进行性能分析,您需要像离线推理一样,将 vllm serve 命令置于 nsys profile 之前,但您需要指定一些其他参数来启用动态捕获,这与 Torch Profiler 类似

# server
nsys profile \
    --trace-fork-before-exec=true \
    --cuda-graph-trace=node \
    --capture-range=cudaProfilerApi \
    --capture-range-end repeat \
    vllm serve meta-llama/Llama-3.1-8B-Instruct --profiler-config.profiler cuda

# client
vllm bench serve \
    --backend vllm \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --dataset-name sharegpt \
    --dataset-path sharegpt.json \
    --profile \
    --num-prompts 2

使用 --profile 时,vLLM 将为 vllm bench serve 的每次运行捕获一个性能分析。服务器关闭后,所有性能分析文件都将被保存。

分析

您可以通过 CLI 中的摘要,使用 nsys stats [profile-file],或通过 在此处按照说明 本地安装 Nsight 来查看这些性能分析。

CLI 示例
nsys stats report1.nsys-rep
...
** CUDA GPU Kernel Summary (cuda_gpu_kern_sum):

Time (%)  Total Time (ns)  Instances   Avg (ns)     Med (ns)    Min (ns)  Max (ns)   StdDev (ns)                                                  Name
--------  ---------------  ---------  -----------  -----------  --------  ---------  -----------  ----------------------------------------------------------------------------------------------------
    46.3   10,327,352,338     17,505    589,965.9    144,383.0    27,040  3,126,460    944,263.8  sm90_xmma_gemm_bf16bf16_bf16f32_f32_tn_n_tilesize128x128x64_warpgroupsize1x1x1_execute_segment_k_of…
    14.8    3,305,114,764      5,152    641,520.7    293,408.0   287,296  2,822,716    867,124.9  sm90_xmma_gemm_bf16bf16_bf16f32_f32_tn_n_tilesize256x128x64_warpgroupsize2x1x1_execute_segment_k_of…
    12.1    2,692,284,876     14,280    188,535.4     83,904.0    19,328  2,862,237    497,999.9  sm90_xmma_gemm_bf16bf16_bf16f32_f32_tn_n_tilesize64x128x64_warpgroupsize1x1x1_execute_segment_k_off…
    9.5    2,116,600,578     33,920     62,399.8     21,504.0    15,326  2,532,285    290,954.1  sm90_xmma_gemm_bf16bf16_bf16f32_f32_tn_n_tilesize64x64x64_warpgroupsize1x1x1_execute_segment_k_off_…
    5.0    1,119,749,165     18,912     59,208.4      9,056.0     6,784  2,578,366    271,581.7  void vllm::act_and_mul_kernel<c10::BFloat16, &vllm::silu_kernel<c10::BFloat16>, (bool)1>(T1 *, cons…
    4.1      916,662,515     21,312     43,011.6     19,776.0     8,928  2,586,205    199,790.1  void cutlass::device_kernel<flash::enable_sm90_or_later<flash::FlashAttnFwdSm90<flash::CollectiveMa…
    2.6      587,283,113     37,824     15,526.7      3,008.0     2,719  2,517,756    139,091.1  std::enable_if<T2>(int)0&&vllm::_typeConvert<T1>::exists, void>::type vllm::fused_add_rms_norm_kern…
    1.9      418,362,605     18,912     22,121.5      3,871.0     3,328  2,523,870    175,248.2  void vllm::rotary_embedding_kernel<c10::BFloat16, (bool)1>(const long *, T1 *, T1 *, const T1 *, in    0.7      167,083,069     18,880      8,849.7      2,240.0     1,471  2,499,996    101,436.1  void vllm::reshape_and_cache_flash_kernel<__nv_bfloat16, __nv_bfloat16, (vllm::Fp8KVCacheDataType)0...

GUI 示例

Screenshot 2025-03-05 at 11 48 42 AM

连续性能分析

在 PyTorch 基础设施存储库中有一个 GitHub CI 工作流,它为 vLLM 上的不同模型提供连续性能分析。这种自动性能分析有助于跟踪不同模型配置下的性能特征。但是,您也可以使用 Github Action 工具手动触发它。

工作原理

该工作流目前每周为选定的模型运行性能分析会话,生成详细的性能跟踪,可以使用不同的工具进行分析,以识别性能回归或优化机会。但是,您也可以使用 Github Action 工具手动触发它。

添加新模型

要将连续性能分析扩展到其他模型,您可以修改 PyTorch 集成测试存储库中的 profiling-tests.json 配置文件。只需将您的模型规格添加到此文件中,即可将其包含在自动性能分析运行中。

查看性能分析结果

由连续性能分析工作流生成的性能分析跟踪可在 vLLM 性能仪表板 上公开获取。查找 性能分析跟踪 表以访问和下载不同模型和运行的跟踪。

vLLM Python 代码性能分析

Python 标准库包含用于性能分析 Python 代码的 cProfile。vLLM 包含一些辅助函数,可以轻松地将其应用于 vLLM 的一部分。vllm.utils.profiling.cprofilevllm.utils.profiling.cprofile_context 函数都可以用来分析代码段。

注意

旧的导入路径 vllm.utils.cprofilevllm.utils.cprofile_context 已弃用。请改用 vllm.utils.profiling.cprofilevllm.utils.profiling.cprofile_context

示例用法 - 装饰器

第一个辅助函数是一个 Python 装饰器,可用于分析函数。如果指定了文件名,性能分析将保存到该文件。如果未指定文件名,性能分析数据将打印到标准输出。

from vllm.utils.profiling import cprofile

@cprofile("expensive_function.prof")
def expensive_function():
    # some expensive code
    pass

示例用法 - 上下文管理器

第二个辅助函数是一个上下文管理器,可用于分析代码块。与装饰器类似,文件名是可选的。

from vllm.utils.profiling import cprofile_context

def another_function():
    # more expensive code
    pass

with cprofile_context("another_function.prof"):
    another_function()

分析性能分析结果

有多种工具可帮助分析性能分析结果。一个例子是 snakeviz

pip install snakeviz
snakeviz expensive_function.prof

分析垃圾回收成本

利用 VLLM_GC_DEBUG 环境变量来调试 GC 成本。

  • VLLM_GC_DEBUG=1:启用 GC 调试器,并显示 gc.collect 的耗时
  • VLLM_GC_DEBUG='{"top_objects":5}':启用 GC 调试器,记录每个 gc.collect 的前 5 个被回收对象