跳至内容

性能剖析 vLLM

警告

性能分析仅供vLLM开发者和维护者了解代码库中各部分耗时占比。vLLM终端用户切勿开启性能分析,这将显著降低推理速度。

使用PyTorch Profiler进行性能分析

我们支持使用torch.profiler模块追踪vLLM工作进程。您可以通过设置VLLM_TORCH_PROFILER_DIR环境变量为想要保存追踪文件的目录来启用追踪功能:VLLM_TORCH_PROFILER_DIR=/mnt/traces/。此外,您还可以通过指定以下环境变量来控制分析内容:

  • VLLM_TORCH_PROFILER_RECORD_SHAPES=1 用于启用记录张量形状功能,默认关闭
  • VLLM_TORCH_PROFILER_WITH_PROFILE_MEMORY=1 用于记录内存使用情况,默认关闭
  • VLLM_TORCH_PROFILER_WITH_STACK=1 启用记录堆栈信息功能,默认开启
  • VLLM_TORCH_PROFILER_WITH_FLOPS=1 用于启用FLOPs记录功能,默认关闭

OpenAI服务器启动时还需要设置VLLM_TORCH_PROFILER_DIR环境变量。

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

可以使用https://ui.perfetto.dev/可视化追踪记录。

提示

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

提示

在性能分析时只需通过vLLM发送少量请求,因为跟踪记录可能会变得非常大。此外,无需解压跟踪文件,可以直接查看。

提示

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

示例命令与用法

离线推理

参考 examples/offline_inference/simple_profiling.py中的示例。

OpenAI 服务器

VLLM_TORCH_PROFILER_DIR=./vllm_profile \
    python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-70B

vllm 基准测试命令:

vllm bench serve \
    --backend vllm \
    --model meta-llama/Meta-Llama-3-70B \
    --dataset-name sharegpt \
    --dataset-path sharegpt.json \
    --profile \
    --num-prompts 2

使用NVIDIA Nsight Systems进行性能分析

Nsight systems 是一款高级工具,可展示更多性能分析细节,例如寄存器和共享内存使用情况、带注释的代码区域以及底层CUDA API和事件。

Install 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 profile -o report.nsys-rep --trace-fork-before-exec=true --cuda-graph-trace=node即可。

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

nsys profile -o report.nsys-rep \
    --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,就像离线推理时一样,但必须根据基准测试的需求指定--delay XX --duration YY参数。当持续时间耗尽后,服务器将被终止。

# server
nsys profile -o report.nsys-rep \
    --trace-fork-before-exec=true \
    --cuda-graph-trace=node \
    --delay 30 \
    --duration 60 \
    vllm serve meta-llama/Llama-3.1-8B-Instruct

# client
vllm bench serve \
    --backend vllm \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --num-prompts 1 \
    --dataset-name random \
    --random-input 1024 \
    --random-output 512

在实际应用中,应将--duration参数设置为较大的值。当需要服务器停止性能分析时,请运行:

nsys sessions list

获取格式为profile-XXXXX的会话ID,然后运行:

nsys stop --session=profile-XXXXX

手动终止性能分析器并生成您的nsys-rep报告。

分析

您可以通过CLI以摘要形式查看这些性能分析文件,使用nsys stats [profile-file]命令,或者按照此处指引在本地安装Nsight后通过GUI界面查看。

CLI example
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...

图形用户界面示例:

Screenshot 2025-03-05 at 11 48 42 AM

分析 vLLM Python 代码

Python标准库包含用于分析Python代码性能的cProfile。vLLM提供了一些辅助工具,可以轻松将其应用于vLLM的某个部分。无论是vllm.utils.cprofile还是vllm.utils.cprofile_context函数,都可用于分析代码段的性能。

示例用法 - 装饰器

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

import vllm.utils

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

示例用法 - 上下文管理器

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

import vllm.utils

def another_function():
    # more expensive code
    pass

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

分析性能剖析结果

有多种工具可用于帮助分析性能分析结果,其中一个例子是snakeviz

pip install snakeviz
snakeviz expensive_function.prof
优云智算