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 示例
連續效能分析¶
在 PyTorch 基礎設施儲存庫中有一個 GitHub CI 工作流,它為 vLLM 上的不同模型提供連續效能分析。這種自動效能分析有助於跟蹤不同模型配置下的效能特徵。但是,您也可以使用 Github Action 工具手動觸發它。
工作原理¶
該工作流目前每週為選定的模型執行效能分析會話,生成詳細的效能跟蹤,可以使用不同的工具進行分析,以識別效能迴歸或最佳化機會。但是,您也可以使用 Github Action 工具手動觸發它。
新增新模型¶
要將連續效能分析擴充套件到其他模型,您可以修改 PyTorch 整合測試儲存庫中的 profiling-tests.json 配置檔案。只需將您的模型規格新增到此檔案中,即可將其包含在自動效能分析執行中。
檢視效能分析結果¶
由連續效能分析工作流生成的效能分析跟蹤可在 vLLM 效能儀表板 上公開獲取。查詢 效能分析跟蹤 表以訪問和下載不同模型和執行的跟蹤。
vLLM Python 程式碼效能分析¶
Python 標準庫包含用於效能分析 Python 程式碼的 cProfile。vLLM 包含一些輔助函式,可以輕鬆地將其應用於 vLLM 的一部分。vllm.utils.profiling.cprofile 和 vllm.utils.profiling.cprofile_context 函式都可以用來分析程式碼段。
注意
舊的匯入路徑 vllm.utils.cprofile 和 vllm.utils.cprofile_context 已棄用。請改用 vllm.utils.profiling.cprofile 和 vllm.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。
分析垃圾回收成本¶
利用 VLLM_GC_DEBUG 環境變數來除錯 GC 成本。
- VLLM_GC_DEBUG=1:啟用 GC 偵錯程式,並顯示 gc.collect 的耗時
- VLLM_GC_DEBUG='{"top_objects":5}':啟用 GC 偵錯程式,記錄每個 gc.collect 的前 5 個被回收物件