性能分析#

NVIDIA Nsight Systems 在应用程序级别上的报告信息量很大。指标采样功能已经过几代发展,并在计时分析和使用 NVIDIA Nsight Compute 进行内核级深入研究之间提供了一个清晰的中间地带。

考虑到大型语言模型 (LLM) 潜在的长时间运行,以及模型在单次推理传递或二进制执行期间可能遇到的工作负载的多样性,我们在 TensorRT-LLM 中添加了功能,以充分利用 Nsight Systems 的功能。本文档概述了这些功能,并提供了如何最好地利用它们来理解您的应用程序的示例。

功能描述#

这里的主要功能

  • 依赖于打开和关闭 CUDA 分析器运行时 API。

  • 提供了一种了解用户可能想要关注哪些区域的方法。

打开和关闭 CUDA 分析器运行时 API

  • 允许用户明确知道分析区域对应于什么。

  • 产生更小的文件以进行后处理(用于指标提取或类似操作)。

用法#

推理时间命令行选项#

  • --log_iteration_data,用于 gptManagerBenchmark。运行时决定每次解码器迭代启动的具体细节。此选项将有关每次解码器迭代的元数据打印到 stdout

[TensorRT-LLM][INFO] {"Active Request Count":249,"Context Requests":8,"Free KV cache blocks":0,"Generation Requests":231,"Iteration Counter":90,"Max KV cache blocks":2448,"Max Request Count":256,"MicroBatch ID":0,"Runtime CPU Memory Usage":28784,"Runtime GPU Memory Usage":540173600,"Runtime Pinned Memory Usage":0,"Scheduled Requests":239,"Timestamp":"12-13-2023 14:55:14","Tokens per KV cache block":128,"Total Context Tokens":6904,"Used KV cache blocks":2448}

推理时间环境变量#

  • TLLM_GPTM_PROFILE_START_STOP,一个用于触发 gptManagerBenchmark 启动/停止的迭代的 csv(对应于上面输出中的“Iteration Counter”)。每个值都可以是一个使用“-”分隔符的范围,例如 0-10。对于范围的情况,该范围内的所有迭代都将放置在同一个 nsys 文件中。

  • TLLM_GPTS_PROFILE_START_STOP,一个用于触发 gptSessionBenchmark 启动/停止的静态批处理迭代索引的 csv

与 NVIDIA Nsight Systems 启动协调#

请参阅 Nsight Systems 用户指南,以获得选项的完整概述。

假设我们要分析使用 gptSessionBenchmark 的模型的上下文阶段和第一个输出令牌计算。

要仅分析这些迭代,除了设置 TLLM_GPTS_PROFILE_START_STOP="0,1" 之外

  • 我们需要告诉 Nsight Systems 查找显式 API 触发器来分析 (-c cudaProfilerApi)

  • 我们需要告诉 Nsight Systems 在看到配置文件停止 API 调用后继续分析 (--capture-range-end="repeat[]")

示例#

请参阅 Nsight Systems 用户指南,以获得与 MPI 相关的选项的完整概述。

分析在多 GPU 模型的单个 rank 上执行的单个 IFB 迭代#

假设我们已经使用 --log_iteration_data 运行一次,并且想要根据元数据输出分析迭代 0、63 和 127。 我们还希望以更高的分辨率捕获指标。 为此,我们创建一个 bash 文件,如 Nsight Systems 用户指南中所述

#!/bin/bash

# Use $PMI_RANK for MPICH and $SLURM_PROCID with srun.
if [ $OMPI_COMM_WORLD_LOCAL_RANK -eq 0 ]; then
  nsys profile -e "NSYS_MPI_STORE_TEAMS_PER_RANK=1" -t cuda,nvtx --gpu-metrics-device=${OMPI_COMM_WORLD_LOCAL_RANK} -c cudaProfilerApi --capture-range-end="repeat[]" --gpu-metrics-frequency=100000 "$@"
else
  "$@"
fi

我们将此文件命名为 profile_rank_0.bash,然后启动我们的应用程序,指定要捕获的迭代

mpirun -n 2 env TLLM_GPTM_PROFILE_START_STOP="0,63,127" ./profile_rank_0.bash ./benchmarks/gptManagerBenchmark <benchmark/model options>