NVIDIA 优化框架

DLProf 用户指南

摘要

深度学习分析器 (DLProf) 用户指南提供了关于使用 DLProf 工具来提升深度学习模型性能的说明。


1.1. 概述

深度学习分析器是一款用于分析深度学习模型的工具,旨在帮助数据科学家通过 DLProf 查看器以可视化的方式,或通过分析文本报告来理解和提升模型的性能。在本指南的剩余部分,我们将深度学习分析器简称为 DLProf

1.2. 1.8.0 版本的新特性

  • 这是 DLProf 的最终版本。

1.3. 特性

此版本包含以下命令和特性:

  • Tensor Core 使用率和资格检测:DLProf 可以确定某个操作是否有可能使用 Tensor Core,以及这些操作是否正在执行 Tensor Core 启用的内核。
  • 多深度学习框架支持:通过选择适当的分析模式,可以分析 DLProf 支持的各个框架。
  • 自定义查看器:DLProf 将自动生成一个 DLProf 数据库。可以使用 NVIDIA 的 DLProf 查看器查看此文件,以在 Web 浏览器中可视化和分析分析结果。
  • 多 GPU 支持:DLProf 可以分析使用多个 GPU 的运行。
  • 迭代检测:可以通过指定关键节点来检测迭代。报告可以基于迭代进行聚合,从而允许用户进一步深入挖掘性能瓶颈。
  • 时间与 NVTX 标记关联:DLProf 使用插入到分析数据中的 NVTX 标记,将 CPU 和 GPU 时间与模型操作相关联。
  • 报告生成:可以生成许多报告,这些报告基于操作、迭代、层或内核聚合数据。大多数报告都支持 JSON 和 CSV 格式。
  • 专家系统:一项分析分析数据的功能,可识别常见的改进领域和性能瓶颈,并提供关于如何解决这些问题以提升整体性能的建议。
  • XLA 支持:DLProf 完全支持分析 XLA 编译的 TensorFlow 模型。
  • 延迟和持续时间分析:DLProf 可以延迟分析的开始时间,并在设定的持续时间后停止分析。


2.1. 使用 Python Wheel 文件安装

DLProf 的独立、框架无关版本在 NVIDIA PY 索引上以 python(pip) wheel 的形式提供。首先,安装 nvidia-pyindex

复制
已复制!
            

$ pip install nvidia-pyindex


然后安装 DLProf。

复制
已复制!
            

$ pip install nvidia-dlprof

这将仅安装 DLProf 及其直接依赖项。此选项假定已安装受支持的框架。有关更多安装选项,请参阅从 PythonPIP Wheel 进行分析

2.2. 使用 NGC Docker 容器

使用预构建的 NGC 容器需要以下步骤:

使用 docker pull 从 NGC 获取 TensorFlow 容器

复制
已复制!
            

$ docker pull [<container name>]

其中 [<container name>] 是 NGC 框架容器的位置。受支持的容器包括:

  • Tensorflow 1.x: nvcr.io/nvidia/tensorflow:21.11-tf1-py3
  • Tensorflow 2: nvcr.io/nvidia/tensorflow:21.11-tf2-py3
  • PyTorch: nvcr.io/nvidia/pytorch:21.11-py3

假设模型的训练数据在 /full/path/to/training/data 中可用,您可以使用以下命令启动容器

复制
已复制!
            

$ docker run --rm --gpus=1 --shm-size=1g --ulimit memlock=-1 \ --ulimit stack=67108864 -it -p8000:8000 -v/path/to/training/data:/data \ [<container name>]

2.3. 运行 DLProf

从 NGC 容器分析模型训练的最简单方法是使用以下命令(PyTorch 需要额外步骤

复制
已复制!
            

$ dlprof python <train script>

其中 <train script> 是您通常用于训练模型的完整命令行。 NVIDIA 建议您为脚本提供选项,仅训练模型 5 分钟或更短时间。 这段时间足以收集到训练的合理快照。 运行时间过长可能会导致生成过多数据。

DLProf 会自动创建分析训练会话所需的正确 Nsight System 命令行,并创建 DLProf 数据库,以便在 DLProf 查看器中查看结果。 创建以下附加内容:

  • nsys_profile.qdrep:QDREP 文件由 Nsight Systems 生成,可以在 Nsight Systems GUI 中打开以查看分析的时间线。
  • nsys_profile.sqlite:一个 SQLite 数据库,其中包含 DLProf 使用的分析数据。
  • dlprof_dldb.sqlite:DLProf 数据库,其中包含运行的聚合统计信息。

2.4. 分析结果

要在 DLProf 查看器中分析结果,请运行以下命令

复制
已复制!
            

$ dlprofviewer ./dlprof_dldb.sqlite

此命令启动服务器。 要查看结果,请在浏览器中输入 http://<IP 地址>:8000

有关更多信息,请参阅NVIDIA DLProf 查看器用户指南

DLProf 旨在在分析和呈现分析结果时与底层深度学习框架无关。 但是,分析非常特定于各个框架。 并非总是可以自动检测训练或推理脚本正在使用哪个框架。 在 DLProf 中,可以通过使用 --mode 命令行选项设置执行模式来选择正确的框架。 下面列出了可用的操作模式。

NVIDIA GPU 云 (NGC)上的每个受支持的框架容器创建了 DLProf 的特殊版本。 此版本会将适当的默认模式设置为容器中的底层框架,因此无需在容器内设置 --mode 标志。 其他选项可能会受到限制,具体取决于每个框架中支持的功能。 有关每个框架可用的完整选项列表,请参阅命令行选项

3.1. 简单模式

DLProf 提供简单模式,该模式完全与框架无关,并且适用于任何框架,包括受支持和不受支持的框架。 使用 DLProf 命令行选项 --mode=simple 激活简单模式。

与特定于框架的模式不同,简单模式不需要在框架级别嵌入 NVTX 注释标记。 这些标记已存在于 NGC TensorFlow1 中,但不存在于 TensorFlow2 或 PyTorch 中。 简单模式将仅提供总挂钟时间总 GPU 时间总 Tensor Core 内核时间。 此外,简单模式可以生成内核报告,其中显示每个执行内核的时间聚合。

在没有 NVTX 标记的帮助下,简单模式下无法使用所有其他功能和报告。 这包括创建 DLProf 查看器和专家系统输出所需的文件。 但是,简单模式可以提供 GPU 利用率和 Tensor Core 内核利用率的概述。

简单模式仍然需要 Nsight Systems,您可以使用 --delay--duration 选项来限制训练脚本的分析窗口。

3.2. TensorFlow 1.X

要分析 TensorFlow 1.x 模型,请使用命令行选项 --mode=tensorflow1。 此模式在 NGC TensorFlow 1.x 容器中发布的 DLProf 中默认设置,无需显式调用。

TensorFlow 1.x 完全支持所有报告和功能。 有关可用选项的完整列表,请参阅命令行选项部分。

3.3. TensorFlow 2.x

要分析 TensorFlow 2.x 模型,请使用命令行选项 --mode=tensorflow2。 此模式在 NGC TensorFlow 2.x 容器中发布的 DLProf 中默认设置,无需显式调用。

TensorFlow 2.x 完全支持所有报告和功能。 有关可用选项的完整列表,请参阅命令行选项部分。 与 TensorFlow 1.x 不同,TensorFlow 2.x 没有像 “global_step” 这样的常用节点,可以用于检测迭代(或步)边界。 但是,TF2 用户可以执行一个两步过程来生成文本报告和可视化,这些报告和可视化显示按迭代边界拆分的分析数据。

  • 第一步:在不使用 key_node 的情况下运行模型,并在命令行中指定 --reports=detail

    • 检查详细报告 CSV 文件,并手动确定可以使用哪个操作节点来确定迭代(即 “步”)边界。 这将用作下面第二步中的 --key_node 参数。
    • 找到包含网络分析信息的 dlprof 数据库 (dlprof_dldb.sqlite)。 这将在下面的第二步中使用。
  • 第二步:使用 --key_node--database 参数再次运行 dlprof:
    • 添加 --key_node=<从第一步确定的 Op ID>
    • 添加--database=<从第一步找到的 dlprof 数据库的名称>
    • 删除 “python” 和其后的所有参数以运行不进行分析的 DLProf
    • 添加 --reports=<您感兴趣的报告列表>
    • 最后,添加 --force=true 以覆盖上次运行的任何旧报告/输出。

第二步将比第一步快得多,因为分析已在第一步中捕获到数据库中。

执行完这两个步骤后,文本报告即可供查看,DLProf 数据库也可用于 DLProf 查看器内部的可视化。

3.4. TensorRT

要分析 TensorRT 模型,请使用 --mode=tensorrt。 此模式在独立 DLProf pip 安装和安装了 DLProf 的所有 NGC 容器中均可用。

DLProf TensorRT 支持包括仅运行 TensorRT 的模型。 这包括使用 trtexec 运行或通过 TensorRT python/C++ API 从头创建的模型。 DLProf 尚不支持 TF-TRT。

TensorRT 模式完全支持所有报告和功能。 有关可用选项的完整列表,请参阅命令行选项部分。

3.5. PyTorch

要分析 PyTorch 模型,请使用命令行选项 --mode=pytorch。 此模式在 NGC PyTorch 容器中发布的 DLProf 中默认设置,无需显式调用。

DLProf 同时使用其自己的 python pip 包和 Nsight Systems 来分析 PyTorch 模型,并且在 NGC PyTorch 容器中可用。

PyTorch 完全支持所有报告和功能。 有关可用选项的完整列表,请参阅命令行选项部分。

为了获得最佳体验,请确保使用发行说明中指定的 GPU 驱动程序、CUDA、TensorFlow 和 Nsight Systems 的兼容版本。

DLProf 是 Nsight Systems 的包装工具,它将分析计时数据和内核信息与机器学习模型相关联。 相关数据以用户可以轻松理解的格式呈现。 结果突出了模型和 DL/ML 操作的 GPU 利用率。 这些工具提供不同的报告来帮助识别瓶颈和 Tensor Core 使用率。

4.1. 从 PythonPIP Wheel 进行分析

DLProf 在 NVIDIA PY 索引上以 Python wheel 文件的形式提供。 这将安装 DLProf 的框架通用版本,该版本将要求用户使用 --mode 标志指定框架。 要从 PIP wheel 安装 DLProf,请首先安装 NVIDIA PY 索引

复制
已复制!
            

$ pip install nvidia-pyindex

然后安装 DLProf。

复制
已复制!
            

$ pip install nvidia-dlprof

这将仅安装 DLProf 以及任何直接依赖项。 此选项假定已安装受支持的框架,或者您只想在 “简单” 模式下运行以分析不受支持的框架。

要安装特定框架的其他依赖项,请传递框架的名称作为选项。

4.1.1. TensorFlow 1.X

复制
已复制!
            

$ pip install nvidia-dlprof[tensorflow]

此选项还将从 NVIDIA PY 索引安装 nvidia-tensorflow pip 包。 此版本的 Tensorflow 包含插入 DLProf 所需的 NVTX 标记的功能。

4.1.2. TensorFlow 2.X

目前不支持 PythonPIP wheel 文件。

4.1.3. PyTorch

复制
已复制!
            

$ pip install nvidia-dlprof[pytorch]

此选项还安装来自 NVIDIA PY 索引的 nvidia-pytorch pip 包和 dlprof 用于 pytorch 模型的 python pip 包 nvidia_dlprof_pytorch_nvtx。 这两个组件都是插入 DLProf 所需的 NVTX 标记所必需的。

4.2. 从 NGC TensorFlow Docker 容器进行分析

DLProf 在 NVIDIA GPU 云 (NGC)上的 TensorFlow 容器中提供。 容器内的 TensorFlow 版本已由 NVIDIA 修改,以在 TensorFlow 执行器周围自动插入 NVTX 范围标记。NVTX 标记是 DLProf 将 GPU 时间与 TensorFlow 模型相关联所必需的。

4.2.1. 拉取 NGC 框架容器

在可以从 NGC 容器注册表拉取容器之前,您必须安装 Docker 和 nvidia-docker。 对于 DGX 用户,这在准备使用 NVIDIA 容器入门指南中进行了解释。 对于 DGX 以外的用户,请按照nvidia-docker 安装文档安装最新版本的 CUDA、Docker 和 nvidia-docker。

执行上述设置后,可以使用以下命令拉取所需的框架容器。

TensorFlow 1.x

复制
已复制!
            

$ docker pull nvcr.io/nvidia/tensorflow:21.11-tf1-py3

TensorFlow 2.x

复制
已复制!
            

$ docker pull nvcr.io/nvidia/tensorflow:21.11-tf2-py3

PyTorch

复制
已复制!
            

$ docker pull nvcr.io/nvidia/pytorch:21.11-py3

将当前容器版本替换为您要拉取的容器和分析器版本的版本。

4.2.2. 启动 NGC 容器

假设模型的训练数据在 /full/path/to/training/data 中可用,您可以使用以下命令启动容器

复制
已复制!
            

$ docker run --rm --gpus=1 --shm-size=1g --ulimit memlock=-1 \ --ulimit stack=67108864 -it -p8000:8000 -v/path/to/training/data:/data \ [<container name>]

[<container name>] 替换为上一个 docker pull 指令中使用的容器名称。

需要 --gpus 选项才能使用 nvidia-docker,并指定要提供给容器的 GPU 数量。

docker -v 选项将主机上的 /path/to/training/data 映射到容器中的 /data。 您还可以使用单独的 -v 选项将其他主机目录映射到容器中。

-p 标志公开 DLProf 查看器服务器的容器端口(端口 8000)。

--shm-size--ulimit 标志建议用于提高服务器的性能。 对于 --shm-size,建议的最小大小为 1g,但可以根据正在服务的模型的数量和大小使用更小或更大的大小。

4.3. 使用 DLProf CLI 进行分析

DLProf 的主要目标之一是自动化和简化分析体验。 在最简单的形式中,用户只需在训练脚本前面加上 dlprof

复制
已复制!
            

$ dlprof [training_script.py]

DLProf 会自动创建分析训练会话所需的正确 Nsight System 命令行,并创建在 DLProf 查看器中查看结果所需的文件。 创建以下附加内容:

  • nsys_profile.qdrep:QDREP 文件由 Nsight Systems 生成,可以在 Nsight Systems GUI 中打开以查看分析的时间线。
  • nsys_profile.sqlite:一个 SQLite 数据库,其中包含 DLProf 使用的分析数据。
  • dlprof_dldb.sqlite:DLProf 数据库,在 DLProf 查看器中使用。

所有DLProf 特定选项都必须在训练脚本之前以以下格式传递

复制
已复制!
            

$ dlprof <args> [training_script.py]

4.4. 将参数传递给 Nsight Systems

Nsight Systems 被动地记录 CUDA API 调用。 结果是能够在近乎实时的状态下分析整个模型网络(包括 GPU 和 CPU)。 然后,DLProf 提取每个执行内核的计时和 NVTX 范围信息。 获取模型训练期间运行的操作的计时信息可能是确定需要优化的位置的重要调试工具。

DLProf 从内核名称确定 Tensor Core 利用率。 此方法可以准确识别使用 Tensor Core 的 cuDNN 内核,但无法识别使用 Tensor Core 的自定义内核或 cuDNN 之外的内核。

DLProf 允许您自定义 Nsight Systems 命令行。 默认情况下,DLProf 使用以下命令行参数调用 Nsight Systems

复制
已复制!
            

$ nsys profile -t cuda,nvtx -s none --show-output=true --export-sqlite -o ./nsys_profile <training_script.py>

您可以使用此 DLProf 选项自定义 NSight System 参数

复制
已复制!
            

--nsys_opts="[option list]"

例如,

复制
已复制!
            

$ dlprof --nsys_opts="-t osrt,cuda,nvtx" <training_script.py>

创建并执行以下 Nsight Systems 命令

复制
已复制!
            

$ nsys profile -t osrt,cuda,nvtx --show-output=true --export-sqlite -o ./nsys_profile <training_script.py>

发送到 Nsight Systems 的输出级别取决于 DLProf 详细级别。 要隐藏来自 NSight Systems 的输出,可以使用 quietminimal 详细级别。 例如,以下 DLProf 命令

复制
已复制!
            

dlprof --verbosity=quiet <training_script.py>

创建以下 Nsight Systems 命令

复制
已复制!
            

nsys profile -t cuda,nvtx -s none --show-output=false --export-sqlite -o ./nsys_profile <training_script.py>

可以使用以下命令将 Nsight Systems 输出文件的基本文件名从 nsys_profile 更改为

--nsys_base_output_filename=<basename>

当分析多个配置并且您需要保留每次运行的分析数据时,这可能很有用。

4.5. 使用 nvidia_dlprof_pytorch_nvtx 分析 PyTorch

在分析 PyTorch 模型时,DLProf 使用名为 nvidia_dlprof_pytorch_nvtx 的 python pip 包来插入正确的 NVTX 标记。 nvidia_dlprof_pytorch_nvtx 必须首先在 PyTorch Python 脚本中启用,然后才能正常工作。 要启用它,您必须将以下行添加到您的 PyTorch 网络

复制
已复制!
            

import nvidia_dlprof_pytorch_nvtx nvidia_dlprof_pytorch_nvtx.init()

您还应该使用 PyTorch 的 NVTX 上下文管理器运行训练/推理循环,如下所示

with torch.autograd.profiler.emit_nvtx()

然后可以使用 DLProf 正常分析 PyTorch 模型。

4.6. 在范围内进行分析

DLProf 可以在模型中设置的范围内进行分析。

复制
已复制!
            

--nsys_profile_range=true

启用此选项会导致 DLProf 遵循模型中设置的 profiler.start() 和 profiler.stop() 边界,这将导致仅收集该边界内的数据。 Profiler.stop() 不会立即结束分析器,只会结束数据收集。

4.7. 延迟和持续时间分析

DLProf 可以使用此命令行选项延迟分析的开始时间

复制
已复制!
            

--delay <seconds>

这会将正确的命令行添加到 Nsight Systems,这将使分析的开始时间延迟指定的秒数。 请注意,第一次迭代从延迟后找到的第一个关键节点开始,并且不包括延迟时间之前的任何迭代。

DLProf 可以在指定的秒数后停止分析和模型执行,使用以下命令行选项

复制
已复制!
            

--duration <seconds>

延迟和持续时间可以一起使用,以将分析限制为模型运行中间指定的秒数。

4.8. 不进行分析运行 DLProf

可以在不调用 Nsight Systems 再次分析模型的情况下运行 DLProf。 这对于创建新报告、指定不同的关键节点或聚合不同迭代范围内的数据很有用。 在每种情况下,最好重用已收集的分析数据。

为了在不进行分析的情况下运行 DLProf,需要初始 Nsight Systems 分析创建的 SQLite 数据库或 DLProf sqlite 数据库。 如果两者都可用,则首选 DLProf sqlite 数据库。DLProf 命令行的格式变为

复制
已复制!
            

$ dlprof --database=[nsys_profile.sqlite] [<args>]

复制
已复制!
            

$ dlprof --database=[dbdlprof.sqlite] [<args>]

其中 [nsys_profile.sqlite] 是 Nsight Systems 生成的 SQLITE 文件,dbdlprof.sqlite 是 DLProf 生成的 SQLITE 文件。 所有其他DLProf 选项都有效且可选。

4.8.1. 向后兼容性

某些旧版本的 DLProf 数据库可以用作最新 DLProf CLI 的输入:

  • DLProf 数据库的初始版本是用于创建它的 DLProf 版本。
  • DLProf 数据库 v1.3+ 可以用作 DLProf CLI v1.3+ 的输入
    • DLProf 数据库版本应仍小于或等于 DLProf CLI 版本。
  • DLProf 数据库 v1.0、v1.1 和 v1.2 不能用作 DLProf CLI v1.3+ 的输入。
  • 当旧版 DLProf 数据库用作输入时,将对其进行一些小的更改,以使其可以与最新的 DLProf CLI 正确使用。
  • 向后兼容性在每个主要版本中都会 “重置”。
    • DLProf CLI v2.x 将不支持 DLProf 数据库 v1.y。

NVIDIA 的 Tensor Core 是一项革命性技术,它通过实现高效的混合精度实施来加速 AI 性能。 它加速了大型矩阵乘法并在单个操作中累积操作。

5.1. 混合精度训练

混合精度方法在一个计算工作负载中结合使用不同的数值格式。 混合精度训练通过以半精度格式执行操作来提供显着的计算加速,同时以单精度存储最少的信息,以在网络的关键部分保留尽可能多的信息。 自 Volta、Turing 和 Ampere 架构中引入Tensor Core以来,通过切换到混合精度,训练速度显着提高 - 在算术密集型最高的模型架构上,总体加速高达 3 倍。

5.2. 确定 Tensor Core 资格

DLProf 的一项功能,可提供有关模型中 Tensor Core 利用率的反馈。 Tensor Core 是 Volta GPU (Titan V) 及更高版本可用的混合精度浮点运算。 cuDNN 和 cuBLAS 库包含大多数卷积和 GEMM 操作的多个 Tensor Core 启用的 GPU 内核。

DLProf 确定每个操作的 Tensor Core 资格。 Tensor Core 使用率从 Nsight Systems 分析结果中找到的已执行 GPU 内核确定。

NVIDIA DLProf 查看器通过显示占用时间最多的前 10 个操作、Tensor Core 操作的资格和 Tensor Core 使用率、交互式迭代报告,可以轻松查找和可视化模型的性能。 有关如何使用查看器的信息,请参阅NVIDIA DLProf 查看器用户指南。

6.1. 启动 DLProf 查看器

DLProf 查看器安装在安装了 DLProf 的所有容器中,这些容器位于 NVIDIA GPU 云 (NGC)中。 容器必须使用 -p8000:8000 选项运行,才能为查看器服务器打开端口 8000。

查看器直接从容器启动

复制
已复制!
            

$ dlprofviewer <dlprof_database>

其中 <dlprof_database> 是 DLProf 数据库的名称,通常为 dlprof_dldb.sqlite。 运行后,可以在浏览器中使用 URL 查看数据

复制
已复制!
            

http://<machine IP Address>:8000

迭代间隔是单批次通过前向和后向传播的单个过程。 DLProf 尝试使用关键节点的 NVTX 停止时间自动确定迭代间隔。 关键节点是每个迭代仅执行一次的操作节点,最好是每个迭代的第一个操作。 通常,这将是 GlobalStep 或类似的东西。

找到迭代间隔后,每个模型操作和内核调用实例都将排序到间隔中。 指标可以按特定报告的间隔进行聚合,并且是查找瓶颈的非常有用的辅助手段。

迭代间隔始终从时间 0 开始,并以分析中的最终停止时间戳结束。 对于 N 个关键节点实例,间隔将为

复制
已复制!
            

[0,Node[1].stop-1], [Node[1].stop,Node[2].stop-1], ..., [Node[N].stop, last]

从而产生 N+1 个间隔。

注意

如果未找到迭代,则整个分析模型将视为单个迭代。 这将反映在迭代报告中,摘要报告将显示找到 0 次迭代。


7.1. 指定关键节点

默认情况下,DLProf 将查找特定于框架的节点作为关键节点。 但是,并非所有模型都将使用此默认名称。 如果 DLProf 输出 0 次迭代,则表示在模型中未找到当前关键节点。

当找不到默认关键节点时,您需要使用以下命令参数标识并选择新的关键节点

复制
已复制!
            

--key_node=<key_node>

其中 <key_node> 是新关键节点的名称或 Op ID,如详细报告中所列。

7.2. 将聚合限制为迭代范围

DLProf 可以指定一个间隔范围,用于聚合所有报告的分析数据。 这对于忽略在预热和拆卸阶段捕获的分析数据很有用。 要限制聚合范围,请使用以下命令行参数

复制
已复制!
            

--iter_start <start_iter> --iter_stop <stop_iter>

聚合范围是包含性的。 来自迭代 <start_iter><stop_iter> 的所有计时数据聚合,包括 <start_iter><stop_iter>

DLProf 的核心目的是将来自 Nsight Systems 分析的 NVTX (NVIDIA 工具扩展) 注释结果与高级模型描述相关联。 从这里,可以创建任意数量的报告,以数据科学家熟悉的格式交付分析结果。

8.1. TensorFlow 中的 NVTX 标记

NGC TensorFlow 容器中的 TensorFlow 已被修改为自动将 NVTX 开始/停止范围标记插入到模型的执行中。 NVTX 标记包装在模型的执行节点周围,并且命名与节点完全相同。 Nsight Systems 会将所有 GPU 内核与内核计划时处于活动状态的 NVTX 范围相关联。

注意

自动插入 NVTX 范围的 TensorFlow 修改尚未向上游到 TensorFlow,并且仅在 NGC Tensorflow 容器中提供的 TensorFlow 版本中可用。

由于 NVTX 名称与 TensorFlow 图中的节点具有 1:1 映射,因此 DLProf 可以将内核与特定节点相关联。 DLProf 还会关联从 Nsight Systems 收集的内核的任何指标,例如 Tensor Core 使用率、开始时间和停止时间。

8.2. Pytorch 中的 NVTX 标记

Pytorch 在操作周围没有内置的 NVTX 范围。 因此,DLProf 必须依赖名为 nvidia_dlprof_pytorch_nvtx 的 python pip 包,以在操作周围添加 NVTX 范围。

NVTX 标记之外的数据

由于各种原因,并非所有 cuda 调用和内核调用最终都位于 NVTX 范围之内。 为了捕获运行中的所有 CPU 和 GPU 信息,DLProf 将创建一个新操作,名称为 unassociated_<cuda_or_kernel_name>,并将操作类型设置为 <cuda_or_kernel_name>。 所有不在 NVTX 范围内的该类型的 cuda 调用或内核调用都将与该“操作”相关联。

8.4. 映射 GPU 时间

NVTX 范围用作 CPU 线程上操作开始和结束的时间戳。 然后,此范围变为该操作实例的 CPU 时间的同义词。 为了确定 GPU 时间,Nsight Systems 将所有 CUDA API 调用与调用它们的特定 NVTX 范围相关联。

CPU 线程上的 CUDA API 调用在 GPU 上计划相应的 CUDA 内核。 CUDA 内核是在 GPU 上执行的小型并行函数,使 GPGPU 计算成为可能。 Nsight Systems 跟踪哪个 CUDA API 调用启动了每个内核,并将内核的实际执行与 CPU API 调用和 NVTX 范围相关联。

Nsight Systems 对每个 NVTX 范围都有映射 GPU 时间的概念。 映射的 GPU 时间从 GPU 上来自 NVTX 范围的第一个内核的开始时间戳开始,到 GPU 上来自同一 NVTX 时间范围的最后一个内核的停止时间戳停止。

8.5. 聚合时间

在计算统计信息时,有两种组合时间的方法:

  • 展平是通过获取多个时间间隔并执行联合来完成的,其中任何共享任何时间的间隔都将连接在一起。 这消除了任何重叠被重复计算的情况。 这在收集全局统计信息(例如 GPU 空闲时间)或从多个子项(例如 group_node 报告)收集父节点统计信息时完成。
  • 累积是通过获取多个时间间隔并将它们的时间相加来完成的,同时保留已添加的时间间隔数的计数。 这在聚合单个对象的多个实例时使用,例如单个内核的所有实例的 GPU 时间或单个操作节点的所有实例的 CPU 时间。 最终结果是计算大多数报告中存在的总/平均/最小/最大统计信息。

DLProf 支持在单个节点上运行多个 GPU。 用户无需执行任何特殊操作即可让 DLProf 分析多 GPU 训练运行。

输出报告中报告的所有“总计”指标都是跨所有可见 GPU 的数值总和。“GPU 利用率”指标是所有可见 GPU(包括未使用的 GPU)的平均 GPU 利用率。

对于多 GPU 迭代检测,DLProf 假设数据并行性,并查找每个 GPU 上关键节点实例数量相等的情况。如果情况属实,则 DLProf 会查看每个 GPU 上关键节点的第 N 个实例,并使用时间顺序中最后一个实例的结束时间作为运行中迭代 N-1 和 N 之间的分割点。如果 DLProf 无法找到每个 GPU 上实例数量相等的情况,则会退回到假设任何 GPU 上关键节点的每个实例都表示一个新的迭代。

DLProf 可以创建多种文本报告,格式包括 JSON 和 CSV。本节详细介绍了可以创建的可用报告。

10.1. 指定报告和格式

本节讨论如何选择要创建的报告以及文件格式。

10.1.1. 选择报告

用户可以通过将报告类型传递给 --report 选项来选择生成报告

复制
已复制!
            

--reports=<type1>[,type2][,...]

允许的类型如下:

一些用法示例包括

复制
已复制!
            

--reports=kernel,iteration,summary --reports iteration tensor node_op -- --reports all

10.1.2. 选择文件格式

默认情况下,DLProf 将为 --report 指定的每个报告创建一个 CSV 文件。DLPROF 还可以 JSON 文件格式输出报告。如果选择了多种格式,则将尽可能以每种格式创建一个报告。要指定报告的输出格式,请使用 --file_formats 选项

复制
已复制!
            

--file_formats=<opt1>[,opt2][,...]

允许的格式选项如下:

  • csv:一种逗号分隔的文件格式,可以轻松导入到电子表格中
  • json:一种 JSON 文件格式,可用于将数据导入到第三方应用程序中

一些用法示例包括

复制
已复制!
            

--file_formats json --file_formats=csv,json --file_formats json csv --

10.1.3. 报告名称

报告的文件名采用以下格式

复制
已复制!
            

[base_name]_[report_type]_.[csv|json]

其中 [profile_name] 是配置文件的名称(由 --profile_name 指定,空格替换为下划线),[report_type] 是传递给 --reports 以选择报告的相同字符串,最后的扩展名是 csv 或 json,具体取决于文件格式。默认情况下,配置文件名为 dlprof,但可以使用以下命令更改:

复制
已复制!
            

--profile_name <base_name>

例如,以下选项

复制
已复制!
            

--reports=summary,iteration --file_formats=csv,json

创建以下文件:

  • dlprof_summary.csv
  • dlprof_summary.json
  • dlprof_iteration.csv
  • dlprof_iteration.json

10.1.4. 输出路径

默认情况下,所有报告都将写入当前工作目录。但是,您可以选择使用以下命令为报告指定不同的输出目录:

复制
已复制!
            

--output_path <path/to/output>

其中 <path/to/output> 是新的结果文件夹。如果文件夹不存在,DLProf 将尝试创建它。

10.2. 摘要报告

摘要报告提供了整个模型中所有操作和内核的性能结果的高级指标。此报告包含多个单独的表格。

系统配置

此表提供了用于分析模型配置的系统。

行名称 描述
配置文件名 用户指定的配置文件名称(如果未指定则隐藏)
GPU 计数 分析时找到的 GPU 数量。
GPU 名称 分析时找到的每个 GPU 的名称。
CPU 型号 用于分析的 CPU 型号。
GPU 驱动程序版本 分析时找到的 GPU 驱动程序的版本。
框架 分析时找到的框架/版本。
CUDA 版本 分析时找到的 CUDA 版本。
cuDNN 版本 分析时找到的 cuDNN 版本。
NSys 版本 分析时找到的 Nsight Systems 版本。
DLProf 版本 用于分析的 DLProf 版本。
DLProf 构建 用于分析的 DLProf 构建 ID。

摘要报告

此表提供了聚合的配置文件数据的几个高级指标。

行名称 描述
挂钟时间 (ns) 找到的迭代范围的总挂钟时间。
Tensor Core 内核利用率 % 100 *(Tensor Core 内核的时间)/(Tensor Core 合格节点中所有内核的总时间)。越高越好。
GPU 利用率 % GPU 处于活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 利用率的平均值。
Tensor Core 内核持续时间 % Tensor Core 内核处于活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。
非 Tensor Core 内核持续时间 % 非 Tensor Core 内核处于活动状态,而 Tensor Core 内核处于非活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。
内存持续时间 % 内存内核处于活动状态,而 TC 和非 TC 内核处于非活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。
数据加载器持续时间 % 数据加载器处于活动状态,而 TC、非 TC 和内存内核处于非活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。
I/O 持续时间 % CPU 正在执行 fread 或 fwrite,而 TC、非 TC、内存和数据加载器处于非活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。
CPU 持续时间 % CPU 处于活动状态,而 TC、非 TC 和内存、数据加载器和 I/O 处于非活动状态的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。
其他持续时间 % 不属于上述任何其他类别的时间百分比。在多 GPU 运行的情况下,它是所有可见 GPU 的平均值。

迭代

此表提供了有关找到和聚合的迭代次数的信息。

行名称 描述
总迭代次数 基于唯一关键节点操作实例的数量找到的总迭代次数。
聚合迭代次数 用于聚合配置文件数据并用于生成报告数据的总迭代次数。
开始迭代 聚合迭代范围中的起始迭代。
停止迭代 聚合迭代范围中的停止迭代。
平均迭代时间 (ns) 所有聚合迭代的平均时间,以纳秒为单位。
迭代时间标准差 (ns) 所有聚合迭代的标准差,以纳秒为单位。

所有操作

此表提供了模型中找到的所有操作的高级细分。

行名称 描述
所有操作 所有聚合操作的总指标。
使用 TC 的操作 使用 Tensor Core 内核的操作的总指标。
符合 TC 条件但不使用的操作 符合使用 Tensor Core 内核的条件但当前未使用任何内核的操作的总指标。
所有其他操作 所有其他操作的总指标。

列名称 描述
GPU 时间 (ns) 操作的所有内核在 GPU 上执行所花费的总时间。
CPU 时间 (ns) 操作在 CPU 上执行所花费的总时间。
# 操作 在此类别中找到的唯一操作的数量。

所有内核

此表提供了模型中找到的所有内核的高级细分。

行名称 描述
所有内核 找到的所有内核的总指标。
使用 TC 的内核 使用 Tensor Core 启用操作的内核的总指标。
内存 基于内存的内核的总指标,包括设备到设备、设备到主机和主机到设备。
所有其他内核 所有其他内核的总指标。

列名称 描述
GPU 时间 (ns) 所有内核在 GPU 上执行所花费的总时间。
CPU 时间 (ns) CPU 花费在为这些内核调用 CUDA API 上的总时间。
# 内核 在此类别中找到的唯一内核的数量。

10.3. 详细报告

详细报告包含配置文件中执行的每个组节点、叶节点和内核的相关信息。该报告包含 GPU 和 CPU 时间指标、内核计数以及节点中是否使用了 Tensor Core。通过对此报告进行排序,用户可以识别前 N 个 GPU/CPU 节点,并快速识别哪些操作可以使用和正在使用 Tensor Core。

表中的每一行代表模型中的唯一操作,由 NVTX 范围确定。该报告包含以下列:

列名称 描述
操作 ID

唯一标识操作的 ID 字符串,可用于将其他报告数据与此操作关联。该字符串基于操作类型和方向的组合。

操作名称 操作的名称。
方向

操作的方向(前向传播与反向传播)。此列仅适用于 PyTorch 运行。

操作类型 操作类型。
调用次数 操作被调用/执行的实例数。
TC 合格性 指示节点是否可以基于操作名称使用 Tensor Core。
正在使用 TC 指示节点是否使用了 Tensor Core 启用的内核。
总 CPU 时间 (ns) 节点所有实例的总 CPU 时间。
平均 CPU 时间 (ns) 节点所有实例的平均 CPU 时间。
最小 CPU 时间 (ns) 在节点的所有实例中找到的最小 CPU 时间。
最大 CPU 时间 (ns) 在节点的所有实例中找到的最大 CPU 时间。
总 GPU 时间 (ns) 节点所有实例的总 GPU 时间。
平均 GPU 时间 (ns) 节点所有实例的平均 GPU 时间。
最小 GPU 时间 (ns) 在节点的所有实例中找到的最小 GPU 时间。
最大 GPU 时间 (ns) 在节点的所有实例中找到的最大 GPU 时间。
总 CPU 开销时间 (ns) 节点所有实例的总 CPU 开销。
平均 CPU 开销时间 (ns) 节点所有实例的平均 CPU 开销。
最小 CPU 开销时间 (ns) 在节点的所有实例中找到的最小 CPU 开销。
最大 CPU 开销时间 (ns) 在节点的所有实例中找到的最大 CPU 开销。
总 GPU 空闲时间 (ns) 节点所有实例的总 GPU 空闲时间。
平均 GPU 空闲时间 (ns) 节点所有实例的平均 GPU 空闲时间。
最小 GPU 空闲时间 (ns) 在节点的所有实例中找到的最小 GPU 空闲时间。
最大 GPU 空闲时间 (ns) 在节点的所有实例中找到的最大 GPU 空闲时间。
数据类型 操作的数据类型。如果用户指定 detailed_mode=false,则此列将不存在。
输入形状 操作所有输入的形状列表。如果用户指定 detailed_mode=false,则此列将不存在。
堆栈跟踪

运行此操作的代码的堆栈跟踪。此列仅适用于 PyTorch 运行。

CPU 开销是在 NVTX 范围内花费的时间,该时间不归因于 CUDA API 调用。GPU 空闲时间是节点 GPU 内核操作之间 GPU 未执行内核时的时间。

10.4. 迭代报告

迭代报告列出了每个节点和每次迭代执行的每个内核。内核启动时间也已包含在内,因此可以按内核的时间顺序对表进行排序。迭代报告中的每一行代表一个内核调用实例。该报告包含以下列:

列名称 描述
迭代

内核启动的迭代间隔编号。

操作 ID

唯一标识操作的 ID 字符串,可用于将其他报告数据与此操作关联。该字符串基于操作类型和方向的组合。

操作名称 调用内核的节点/NVTX 范围的名称。
方向

操作的方向(前向传播与反向传播)。此列仅适用于 PyTorch 运行。

操作类型 操作类型。
内核名称 GPU 内核的名称。
设备 ID

GPU 内核的设备 ID。

GPU 启动时间 (ns)

内核开始在 GPU 上执行的时间戳。

GPU 时间 (ns)

在 GPU 上执行内核所花费的时间。

API 调用启动 (ns) CPU 调用内核的时间戳。
API 调用时间 (ns) CPU 花费在进行 CUDA API 调用上的时间。
使用 TC

如果内核使用 Tensor Core,则为 True。

Grid X

内核网格大小的 x 维度。

Grid Y 内核网格大小的 y 维度。
Grid Z 内核网格大小的 z 维度。
Block X

内核块大小的 x 维度。

Block Y

内核块大小的 y 维度。

Block Z

内核块大小的 z 维度。

数据类型

调用此内核的操作的数据类型。

输入形状

调用此内核的操作的输入形状。

参数

调用此内核的操作的参数值。

输出形状

调用此内核的操作的输出形状。

长内核名称

数据库中的完整内核名称。

有关如何指定迭代间隔的更多信息,请参阅迭代检测

10.5. 内核报告

内核报告列出了网络中启动的所有内核。与迭代报告不同,此报告在报告中为每个唯一内核包含一个条目,并提供该内核实例的时序指标。该报告包含以下列:

描述
内核名称 GPU 内核的名称。
操作 ID

唯一标识操作的 ID 字符串,可用于将其他报告数据与此操作关联。该字符串基于操作类型和方向的组合。

操作名称 调用内核的操作的名称。
方向

操作的方向(前向传播与反向传播)。此列仅适用于 PyTorch 运行。

使用 TC 如果内核使用 Tensor Core,则为 True。
总 GPU 时间 (ns) 节点的所有实例的总 GPU 时间。
平均 GPU 时间 (ns) 节点的所有实例的平均 GPU 时间。
最小 GPU 时间 (ns) 在节点的所有实例中找到的最小 GPU 时间。
最大 GPU 时间 (ns) 在节点的所有实例中找到的最大 GPU 时间。
总 API 时间 (ns) 节点所有实例的 CUDA API 调用的总 CPU 时间。
平均 API 时间 (ns) 节点所有实例的 CUDA API 的平均 CPU 时间。
最小 API 时间 (ns) 在节点的所有实例中找到的 CUDA API 的最小 CPU 时间。
最大 API 时间 (ns) 在节点的所有实例中找到的 CUDA API 的最大 CPU 时间。

10.6. Tensor Core 报告

Tensor Core 报告列出了所有符合 Tensor Core 条件的操作以及有关其 Tensor Core 使用情况的详细信息。该报告包含以下列:

描述
操作 ID

唯一标识操作的 ID 字符串,可用于将其他报告数据与此操作关联。该字符串基于操作类型和方向的组合。

操作名称 调用内核的节点/NVTX 范围的名称。
方向

操作的方向(前向传播与反向传播)。此列仅适用于 PyTorch 运行。

操作类型 操作类型。
使用 TC 如果节点使用 Tensor Core,则为 True。
总 GPU 时间 节点的所有实例的总 GPU 时间。
TC GPU 时间 节点的所有实例执行 Tensor Core 的 GPU 时间。
非 TC GPU 时间 节点的所有实例不执行 Tensor Core 的 GPU 时间。
TC 利用率 (%) 100 *(TC GPU 时间)/(总 GPU 时间)
内核总数 节点执行的唯一内核的总数。
TC 内核计数 此节点的 Tensor Core 使用的唯一内核的总数。
TC 内核名称 此节点使用 Tensor Core 的所有内核名称的列表。
非 TC 内核计数 此节点不使用 Tensor Core 的唯一内核的总数。
非 TC 内核名称 此节点不使用 Tensor Core 的所有内核名称的列表。

10.7. 操作类型摘要报告

此报告列出了网络中的操作类型。对于每种操作类型,CPU 和 GPU 时间都会被展平并汇总。统计值在各个实例之间计算,以找到每个度量的总和、平均值、最小值和最大值。该报告生成一个包含以下列的表格:

列名称 描述
操作名称 操作名称。
节点数 操作包含在内的节点总数。
调用次数 操作被调用/执行的实例数。
TC 合格性 指示节点是否可以基于操作名称使用 Tensor Core。
正在使用 TC 指示节点是否使用了 Tensor Core 启用的内核。
总 CPU 时间 (ns) 节点所有实例的总 CPU 时间。
平均 CPU 时间 (ns) 节点所有实例的平均 CPU 时间。
最小 CPU 时间 (ns) 在节点的所有实例中找到的最小 CPU 时间。
最大 CPU 时间 (ns) 在节点的所有实例中找到的最大 CPU 时间。
总 GPU 时间 (ns) 节点所有实例的总 GPU 时间。
平均 GPU 时间 (ns) 节点所有实例的平均 GPU 时间。
最小 GPU 时间 (ns) 在节点的所有实例中找到的最小 GPU 时间。
最大 GPU 时间 (ns) 在节点的所有实例中找到的最大 GPU 时间。
总 CPU 开销时间 (ns) 节点所有实例的总 CPU 开销。
平均 CPU 开销时间 (ns) 节点所有实例的平均 CPU 开销。
最小 CPU 开销时间 (ns) 在节点的所有实例中找到的最小 CPU 开销。
最大 CPU 开销时间 (ns) 在节点的所有实例中找到的最大 CPU 开销。
总 GPU 空闲时间 (ns) 节点所有实例的总 GPU 空闲时间。
平均 GPU 空闲时间 (ns) 节点所有实例的平均 GPU 空闲时间。
最小 GPU 空闲时间 (ns) 在节点的所有实例中找到的最小 GPU 空闲时间。
最大 GPU 空闲时间 (ns) 在节点的所有实例中找到的最大 GPU 空闲时间。

10.8. 组节点报告

组节点报告列出了网络中的所有非叶节点。对于每个非叶节点,它会展平并汇总其子树中的所有统计信息。所有指标均按每次迭代计算。该报告包含以下列:

列名称 描述
名称 子树的名称(层次结构)。
聚合的调用次数 此子树中叶节点实例的总数。
TC 合格操作数 此子树中符合使用 Tensor Core 条件的叶节点总数。
使用 TC 的节点操作数 此子树中使用 Tensor Core 的叶节点总数。
总 CPU 时间 (ns) 子树所有实例的总 CPU 时间。
平均 CPU 时间 (ns) 子树所有实例的平均 CPU 时间,按每次迭代计算。
最小 CPU 时间 (ns) 子树所有实例的最小 CPU 时间,按每次迭代计算。
最大 CPU 时间 (ns) 子树所有实例的最大 CPU 时间,按每次迭代计算。
总 GPU 时间 (ns) 子树所有实例的总 GPU 时间。
平均 GPU 时间 (ns) 子树所有实例的平均 GPU 时间,按每次迭代计算。
最小 GPU 时间 (ns) 子树所有实例的最小 GPU 时间,按每次迭代计算。
最大 GPU 时间 (ns) 子树所有实例的最大 GPU 时间,按每次迭代计算。
总 CPU 开销时间 (ns) 子树所有实例的总 CPU 开销时间。
平均 CPU 开销时间 (ns) 子树所有实例的平均 CPU 开销时间,按每次迭代计算。
最小 CPU 开销时间 (ns) 子树所有实例的最小 CPU 开销时间,按每次迭代计算。
最大 CPU 开销时间 (ns) 子树所有实例的最大 CPU 开销时间,按每次迭代计算。
总 GPU 空闲时间 (ns) 子树所有实例的总 GPU 空闲时间。
平均 GPU 空闲时间 (ns) 子树所有实例的平均 GPU 空闲时间,按每次迭代计算。
最小 GPU 空闲时间 (ns) 子树所有实例的最小 GPU 空闲时间,按每次迭代计算。
最大 GPU 空闲时间 (ns) 子树所有实例的最大 GPU 空闲时间,按每次迭代计算。

10.9. 专家系统报告

专家系统报告将列出专家系统检测到的所有问题,并提供有关如何解决潜在问题的可操作反馈。该报告包含以下列:

列名称 描述
问题 发现的潜在问题。
建议 为尝试解决问题而建议采取的措施。

10.10. 专家系统

专家系统是一项功能(目前为 Beta 版),可分析模型和配置文件数据以检测潜在问题或低效率。检测到的任何问题都将附带您尝试解决该问题的操作建议。结果可以通过启用专家系统报告找到。

专家系统包含多个问题检测器。每个检测器都将查找特定问题。未来计划增加更多检测器。以下是当前检测器列表及其查找内容:

名称 检测到的问题 框架
不良迭代范围检测器 检测迭代范围包含迭代之间的大量变化的情况,并在检测到理想范围时推荐理想范围。 全部
无迭代检测器 检测到由于关键节点未指定或无效而未找到迭代的情况。 全部
不良 Tensor 形状检测器 检测到由于模型中不良的 Tensor 形状或数据类型而未使用 Tensor Core 的情况。 Tensorflow
无融合检测器 检测到禁用融合的情况。 Tensorflow 1.x
AMP 检测器 检测到未使用 AMP 的情况。 Pytorch, Tensorflow
数据加载器检测器 检测到运行的大部分时间都花费在数据加载器中的情况。 Pytorch

Cudnn Benchmark 检测器

检测 torch.backends.cudnn.benchmarks 是否设置为 false。

Pytorch

慢速 Api 检测器

检测 pytorch 框架中是否将以下任何一项设置为 True

  • detect_anomaly

  • gradcheck

  • gradgradcheck

  • record_function

  • autograd_profile

  • autograd_set_detect_anomaly

Pytorch

不平衡 GPU 检测器 检测到一个或多个 GPU 的使用率明显低于其他 GPU 的情况。 全部
未充分利用的 GPU 检测器

检测到一个或多个 GPU 未使用或总体 GPU 利用率低于 50% 的情况。

全部
批大小检测器 检测到批大小不足以利用 GPU 中可用内存的情况。 PyTorch, TensorFlow
发出 NVTX 缺失检测器 检测是否未使用 Pytorch emit_nvtx。 PyTorch


11.1. 操作名称

各种报告中列出的操作名称是根据导致操作执行的函数调用层次结构创建的。来自同一源函数的相同名称的多个函数调用将在末尾添加一个数字,以区分它们。例如,如果网络有一个函数 “a”,它调用函数 “b” 两次,并且函数 “b” 执行两个不同的 “conv1d” 操作,则将创建以下 4 个操作名称:

  • /a/b/conv1d
  • /a/b/conv1d(2)
  • /a/b(2)/conv1d
  • /a/b(2)/conv1d(2)

11.2. 操作 ID

在 PyTorch 中,多个操作具有完全相同的操作名称的情况很少见但有可能发生。因此,当尝试识别唯一操作时,最好使用操作 ID,该 ID 在大多数输出报告中都可用。

11.3. 操作方向

只要源脚本使用 torch.autograd.profiler.emit_nvtx() 包装训练,操作的前向和后向传播就会被区分开来。操作的前向传播将在报告中列出,方向字段中带有 “fprop”。操作的后向传播将具有相同的操作名称,但方向字段中将带有 “bprop”。

如果源脚本未使用 torch.autograd.profiler.emit_nvtx() 包装训练,则前向传播仍将照常收集,但所有操作的后向传播将合并为一个操作,操作类型为 “backward”。

在分析任何计算机程序时,目标是检查其代码以确定是否可以提高性能。在 DLProf 中,分析确定 GPU 是否得到充分利用以利用硬件优化。通常,分析在训练模型时完成,以便可以根据结果进行调整。DLProf 可用于了解深度学习模型在 Tensor Core 硬件方面的性能。目标可以总结如下:

  1. 确定深度学习模型在 GPU 利用时间和百分比使用率方面的性能摘要。
  2. 了解可能使用混合精度进行优化的突出节点。
  3. 深入研究突出节点,了解各个操作及其与 Tensor Core 兼容性的关联性。
  4. 更深入地了解内核级别的信息,哪些内核正在使用 Tensor Core,使用时长以及占整个运行时间的百分比。

12.1. 如何分析深度学习网络?

首先下载NGC TensorFlow 容器

发出 dlprof 命令以分析训练运行。Nvidia 建议模型运行时间少于 5 分钟。

12.2. 如果我没有使用 Tensor Core,如何改进我的网络?

导航到 DLProf 查看器中的前 10 个操作节点,并按 GPU 排序。在最后一个符合 Tensor Core 条件但未使用 Tensor Core 的操作节点中找到运行时间最长的操作节点。在 python 代码中,找出以浮点 32 模式运行的操作是否可以切换到浮点 16。使用自动混合精度以自动更改操作以在安全的情况下使用混合精度操作。通过优化模型以使用 Tensor Core,您将加快训练性能。

12.3. 如何找到好的关键节点?

为关键操作使用好的节点对于最大限度地提高每次迭代步骤级别的分析至关重要。默认情况下,DLProf 将使用在大多数框架模型中默认找到的关键节点。但这并非总是如此,并且可能存在节点操作不存在的模型。在这种情况下,DLProf 将提醒用户查找新的关键节点。

首先,正常运行 profile,确保保存生成的 SQL 数据库和 详细报告。如果可能,尝试限制执行的步骤数,例如仅运行 20 个批次。

复制
已复制!
            

$ dlprof --reports=detail python my_script.pl

在详细报告中,按“调用次数”对数据进行排序。选择一个节点操作,其“调用次数”值与脚本中执行的步骤数接近。您还需要选择尽可能接近迭代步骤开始时发生的操作。这可能需要分析图表或脚本。

选择节点后,您可以在之前的 profile 上重新运行 DLProf,以指定新的 Key Node,而无需重新分析模型。

复制
已复制!
            

$ dlprof --key_node=[<op_name_or_op_ID>] --database=[dbdlprof.sqlite]

DLProf 现在应显示找到多个迭代,并且迭代报告将提供每次迭代的 GPU 使用率明细。

12.4. 如何选择合适的迭代范围进行分析?

默认情况下,DLProf 会聚合 profile 中找到的所有迭代的数据。但是,这可能无法准确表示稳定的运行时性能。大多数框架通常会有特殊的预热和结束迭代,这可能会极大地影响总体结果。对于标准的非 RNN 网络,迭代的时间变化应该很小。

要找到理想的迭代集,请正常运行 profile,但生成迭代报告并保存生成的 SQL 数据库。

复制
已复制!
            

dlprof --reports=iteration python my_script.pl

在电子表格应用程序中查看迭代报告应该很简单。迭代时间的简单条形图可以显示具有一致时间的迭代范围。记下此范围内的起始和停止迭代编号。然后可以使用此新范围和现有的 SQL 数据库重新运行 DLProf,以快速重新聚合该范围内的结果。

复制
已复制!
            

dlprof --iter_start=[<start iter>] --iter_stop=[<stop_iter>] --database=[dbdlprof.sqlite]

然后,所有报告都将从仅在两个迭代之间(包括这两个迭代)收集的数据生成。

以下教程示例在 NGC TensorFlow 容器中运行。有关如何设置和运行容器的说明,请参阅从 NGC TensorFlow 容器进行 Profile 分析

13.1. Resnet50

这是一个运行 DLProf 以分析 Resnet50 模型 (resnet50_v1.5) 的示例。

13.1.1. 准备示例

  1. 将训练数据本地复制到 /path/to/training/data。训练数据可以从ImageNet 下载。
  2. 运行NGC TensorFlow 容器,映射训练数据和结果数据目录。
    复制
    已复制!
                

    docker run --rm --gpus=1 --shm-size=1g --ulimit memlock=-1 \ --ulimit stack=67108864 -it -p8000:8000 -v<path/to/training/data>:/data \ -v<path/to/results>:/results nvcr.io/nvidia/tensorflow:21.09-tf1-py3

  3. 启用Pytorch 的 profile 分析(使用nvidia_dlprof_pytorch_nvtx

13.1.2. Profile 分析 Resnet50

要使用 DLProf 进行 profile 分析,请使用下面显示的命令。此命令将对训练数据进行 profile 分析,并生成详细报告以及 DLProf 数据库。

复制
已复制!
            

$ git clone https://github.com/NVIDIA/DeepLearningExamples.git $ pip install -r ./DeepLearningExamples/TensorFlow/Classification/ConvNets/requirements.txt $ cd /workspace/DeepLearningExamples/TensorFlow/Classification/ConvNets/ $ mkdir results $ dlprof --reports=summary,detail,iteration \ --iter_start 20 --iter_stop 80 \ python main.py \ --mode=train --iter_unit=batch --num_iter=100 \ --batch_size=128 --warmup_steps=1 --use_cosine_lr \ --label_smoothing 0.1 --lr_init=0.256 --lr_warmup_epochs=8 \ --momentum=0.875 --weight_decay=3.0517578125e-05 --use_tf_amp \ --data_dir=/data/train-val-tfrecord-480 --results_dir=./results

此命令使用自动混合精度 (AMP) 对 NVIDIA Resnet50 示例的 100 个批次进行 profile 分析。/workspace/nvidia-examples/resnet50v1.5 中将有三个输出报告文件。

  • dlprof_summary.csv - 摘要报告
  • dlprof_detailed.csv - 详细节点报告
  • dlprof_iteration.csv - 详细迭代报告

13.1.3. 在 DLProf 中查看结果

DLProf 数据库文件 dlprof_dldb.sqlite 将最终位于 /workspace/nvidia-examples/resnet50v1.5 中。结果可以在 DLProf Viewer 中可视化。

复制
已复制!
            

$ dlprofviewer /workspace/nvidia-examples/resnet50v1.5/dlprof_dldb.sqlite

要查看结果,请在浏览器中输入 http://<IP Address>:8000。

13.2. MobileNet

这是一个运行 DLProf 以分析 TensorFlow 中的 MobileNetV2 的示例。

13.2.1. 准备示例

  1. 将训练数据本地复制到 /path/to/training/data

    训练数据可以从 ImageNet 下载 http://image-net.org/download

  2. 运行 NGC TensorFlow docker 容器,并映射训练数据和结果数据目录。
    复制
    已复制!
                

    docker run --rm --gpus=1 --shm-size=1g --ulimit memlock=-1 \ --ulimit stack=67108864 -it -p8000:8000 -v<path/to/training/data>:/data \ -v<path/to/results>:/results nvcr.io/nvidia/tensorflow:21.10-tf1-py3

  3. 在 docker 容器中,将 TensorFlow 基准测试安装到 /workspace
    复制
    已复制!
                

    mkdir /workspace/tensorflow-examples && \ cd /workspace/tensorflow-examples && \ git clone https://github.com/tensorflow/models.git && \ git clone https://github.com/tensorflow/benchmarks.git && \ cd benchmarks && \ git checkout cnn_tf_v1.15_compatible && \ export PYTHONPATH=/workspace/tensorflow-examples/models && \ cd /workspace/tensorflow-examples/benchmarks/scripts/tf_cnn_benchmarks

13.2.2. Profile 分析 MobileNet

以下命令行是分析模型并生成事件文件所需的最低要求。

复制
已复制!
            

dlprof \ /usr/bin/python tf_cnn_benchmarks.py \ --num_gpus=1 --batch_size=256 --model=mobilenet --device=gpu --gpu_indices=1 \ --data_name=imagenet --data_dir=/data/train-val-tfrecord-480 \ --num_batches=50 --use_fp16 --fp16_enable_auto_loss_scale

13.2.3. 在 DLProf Viewer 中查看结果

以下命令行将启动 DLProf Viewer

复制
已复制!
            

$ dlprofviewer ./dlprof_dldb.sqlite

要查看结果,请在浏览器中输入 http://<IP Address>:8000。

13.3. Pytorch

这演示了如何使用 DLProf 分析深度学习模型(使用 Pytorch),使用 DLProf Viewer 可视化结果,并最终使用提供的建议改进模型。

13.3.1. 准备示例

  • 将训练数据本地复制到 /path/to/training/data。训练数据可以从ImageNet 下载
  • 运行NGC TensorFlow 容器(使用 Pytorch),并映射训练数据和结果数据目录
  • 复制
    已复制!
                

    $ docker run --rm --gpus=1 --shm-size=1g --ulimit memlock=-1 \ --ulimit stack=67108864 -it -p8000:8000 -v<path/to/training/data>:/data \ -v<path/to/results>:/results nvcr.io/nvidia/pytorch:21.10-tf1-py3

  • 启用 PyTorch 的 profile 分析 (使用 nvidia_dlprof_pytorch_nvtx)。

13.3.2. Profile 分析未优化的 Resnet

以下命令将进行 profile 分析并创建 DLProf 数据库

复制
已复制!
            

$ git clone https://github.com/NVIDIA/DeepLearningExamples.git $ cd /workspace/DeepLearningExamples/PyTorch/Classification/ConvNets $ dlprof --mode=pytorch -f true --reports=summary,detail,iteration,kernel,tensor \ --delay 60 --duration 60 python main.py \ --arch resnet50 -b 16 --training-only --raport-file benchmark.json \ --epochs 90 --prof 100 /data/imagenet

13.3.3. 启动 DLProf Viewer 并分析结果

以下命令行将启动 viewer

复制
已复制!
            

$ dlprofviewer /workspace/examples/resnet50v1.5/dlprof_dldb.sqlite


要查看结果,请在浏览器中输入 http://<IP Address>:8000。结果表明,很大一部分操作符合 Tensor Core 条件,但未使用 Tensor Core:

tb_op_summary_analyzing.png
tb_op_details_analyzing.png

列出了两个问题以及建议的解决方案

tb_recommendations_analyzing.png

13.3.4. Profile 分析优化的 Resnet

使用上述建议,我们可以使用以下命令约束迭代范围并启用 AMP

复制
已复制!
            

$ dlprof -f true --reports=summary,detail,iteration,kernel,tensor \ --delay 60 --duration 60 --iter_start=47 --iter_stop=111 python \ /workspace/examples/resnet50v1.5/main.py --arch resnet50 -b 16 \ --training-only --raport-file benchmark.json --epochs 90 --prof 100 --amp \ --static-loss-scale 256 /data/imagenet

重新启动 Viewer 并检查结果,您将看到大多数以前符合条件的操作现在正在使用 Tensor Core:

op_summary_amp.png
op_details_amp.png

14.1. 加载 libnvidia-ml.so.1 时出错

如果您收到此错误

复制
已复制!
            

dlprof: error while loading shared libraries: libnvidia-ml.so.1: cannot open shared object file: No such file or directory

您可能不符合先决条件驱动程序和 CUDA 版本。更新您的驱动程序和 CUDA SDK 以匹配此版本所需的最低版本。

14.2. 无法识别的 token:“0xFFFFFF”

如果您收到此错误

复制
已复制!
            

[DLProf-10:01:52] unrecognized token: "0xFFFFFF"

您的 sqlite3 版本太旧。将 sqlite3 更新到至少 3.8.6 或更高版本,然后重试。

以下部分包含其他参考资料。

15.1. 命令行选项

DLProf 命令行可以有两种形式

复制
已复制!
            

dlprof [optional switch_options] [application] [optional application_options]

复制
已复制!
            

dlprof [optional swith_options] --database=dbdlprof.sqlite

所有命令行选项都区分大小写。对于可选开关选项,当使用短选项时,参数应在空格后跟在开关之后;例如 -m simple。当使用长选项时,开关后应跟一个等号,然后是参数;例如--mode=simple

并非所有命令行开关选项和功能都适用于每种模式和框架构建。有关特定框架构建可用的开关选项的完整列表,请参阅dlprof --help

15.1.1. CLI 全局选项

除非另有说明,否则以下选项适用于每种模式和框架构建。

全局选项短 全局选项长 描述
-h --help 帮助消息,提供有关可用命令开关及其选项的信息。
-V --version 输出 DLProf CLI 版本信息。

通用选项短 通用选项长 可能参数 默认 描述
-f --force true, false false 如果为 true,则使用相同的输出文件名(QDSTREM、QDREP、SQLITE、CSV、JSON)覆盖所有现有结果文件。
-v --verbosity quiet, minimal, normal, detailed, diagnostic normal 指定输出详细级别。
-m --mode simple, tensorflow1, tensorflow2, tensorrt,pytorch 构建依赖 指定要分析的目标框架。使用“simple”仅生成与任何框架无关的高级指标。使用所有其他选项生成特定于框架的详细指标和报告。

模式选项和可用性取决于特定的容器构建。对于仅简单模式构建,--mode 开关不可用,并且默认为“simple”。对于所有其他特定于框架的构建,默认模式是目标框架;例如,为 TensorFlow 1.x NGC 容器构建的 DLProf 的“tensorflow1”。所有特定于框架的构建都将始终可以选择在简单模式下运行。

15.1.2. Nsight System 选项

除非另有说明,否则以下 Nsight System 选项适用于所有 profile 模式。

可能参数 默认 描述
  --database < 数据库文件名 > NA 输入 SQLITE 文件。它可以是由 Nsight Systems 生成的文件,也可以是由 DLProf 创建的文件。指定后,DLProf 将直接从数据库聚合 profile 数据。如果指定,则忽略其他应用程序命令,并且不会对应用程序进行 profile 分析。
  --nsys_base_name [ 基本名称 ] nsys_profile 指定所有 Nsight Systems 输出文件的基本名称。
  --nsys_options “[<nsys args>]” “-t cuda,nvtx -s none” 自定义传递给 Nsight Systems 的 args。选项必须包含 DLProf 正常运行的默认值。
-y --delay < 秒数 > 0 收集开始延迟(秒)。
-d --duration < 秒数 > NA 收集持续时间(秒),持续时间必须大于零。
  --detailed_mode true, false true 收集详细的 NVTX 信息,包括张量形状和数据类型。

注意

--detailed_mode 是一项仅在 tensorflow1 和 tensorflow2 操作模式或 TensorFlow NGC 容器中提供的功能。此功能默认启用,并将向 NVTX 标记添加更多信息,这可能会增加 profile 分析开销。

设置自定义 Nsight Systems 选项需要在引号中将自定义选项括起来,例如 --nsys_options="-t cuda,nvtx -s none"。

15.1.3. 数据聚合选项

数据聚合选项在简单模式或 DLProf 的仅简单模式构建中不可用。

可能参数 默认 描述
  --key_node < 操作名称或操作 ID > global_step 迭代间隔由每个关键节点实例的 NVTX 开始时间确定。如果 DLProf 未正确检测到间隔,请尝试指定其他关键节点。
  --iter_start < 迭代编号 > 0 设置迭代间隔以开始聚合数据。来自小于起始间隔的迭代间隔的 Profile 数据将从所有聚合报告中排除。
  --iter_stop < 迭代编号 > NA 设置迭代间隔以停止聚合数据。来自大于停止间隔的迭代间隔的 Profile 数据将从所有聚合报告中排除。停止迭代编号必须大于或等于起始迭代。

15.1.4. 输出报告选项

除非另有说明,否则以下输出报告选项在所有模式和构建中均可用。

可能参数 默认 描述
  --output_path < 路径 > ./ 指定所有生成的聚合附属物的输出路径。
  --base_name < profile 名称 > dlprof 指定 profile 的名称,该名称将添加到所有生成的报告文件名的前面并在 Viewer 中显示。
  --reports summary, detail, kernel, iteration, tensor, op_type, group_node, expert_systems NA 选择要生成的聚合报告。可以选择多个报告,仅用逗号分隔(无空格)。
  --formats csv, json csv 指定输出文件格式。可以选择多种格式,仅用逗号分隔(无空格)。为每种文件格式创建一个单独的报告。
  --dump_model_data true, false false 如果为 true,则会创建一个 json 文件,其中包含原始的、相关联的模型数据。

注意

简单模式下唯一可用的报告类型是“kernel”。

声明

本文档仅供参考,不得视为对产品的特定功能、条件或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含信息的准确性或完整性不作任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对使用此类信息造成的后果或由此类信息的使用或因其使用而可能导致的侵犯第三方专利或其他权利的行为不承担任何责任。本文档不构成对开发、发布或交付任何材料(如下定义)、代码或功能的承诺。

NVIDIA 保留随时对此文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。

客户在下订单之前应获取最新的相关信息,并应验证此类信息是最新的和完整的。

NVIDIA 产品根据订单确认时提供的 NVIDIA 标准销售条款和条件进行销售,除非 NVIDIA 和客户的授权代表签署的单独销售协议(“销售条款”)另有约定。NVIDIA 特此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档未直接或间接形成任何合同义务。

NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于 NVIDIA 产品的故障或失灵可能合理预期会导致人身伤害、死亡或财产或环境损害的应用。NVIDIA 对 NVIDIA 产品包含和/或用于此类设备或应用不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。

NVIDIA 不保证基于本文档的产品适用于任何特定用途。NVIDIA 不一定对每种产品的所有参数进行测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适合客户计划的应用和用途,并进行必要的应用测试,以避免应用或产品的默认设置。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的额外或不同的条件和/或要求。NVIDIA 对可能基于或归因于以下原因的任何默认设置、损坏、成本或问题不承担任何责任:(i) 以任何违反本文档的方式使用 NVIDIA 产品;或 (ii) 客户产品设计。

本文档未授予 NVIDIA 专利权、版权或其他 NVIDIA 知识产权下的任何明示或暗示的许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予使用此类产品或服务的许可,也不构成对其的保证或认可。使用此类信息可能需要获得第三方在其专利或其他知识产权下的许可,或获得 NVIDIA 在其专利或其他知识产权下的许可。

只有在事先获得 NVIDIA 书面批准的情况下,才允许复制本文档中的信息,并且复制时不得进行更改,并完全遵守所有适用的出口法律和法规,并附带所有相关的条件、限制和声明。

本文档和所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均按“原样”提供。NVIDIA 对材料不作任何明示、暗示、法定或其他保证,并且明确否认所有关于不侵权、适销性和特定用途适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对因使用本文档而引起的任何损害(包括但不限于任何直接、间接、特殊、偶然、惩罚性或后果性损害,无论其如何引起,也无论责任理论如何)承担责任,即使 NVIDIA 已被告知可能发生此类损害。尽管客户可能因任何原因遭受任何损害,但 NVIDIA 对本文所述产品的累计总责任应根据产品的销售条款进行限制。

HDMI

HDMI、HDMI 徽标和 High-Definition Multimedia Interface 是 HDMI Licensing LLC 的商标或注册商标。

OpenCL

OpenCL 是 Apple Inc. 的商标,已获得 Khronos Group Inc. 的许可使用。

商标

NVIDIA、NVIDIA 徽标以及 cuBLAS、CUDA、DALI、DGX、DGX-1、DGX-2、DGX Station、DLProf、Jetson、Kepler、Maxwell、NCCL、Nsight Compute、Nsight Systems、NvCaffe、PerfWorks、Pascal、SDK Manager、Tegra、TensorRT、Triton Inference Server、Tesla、TF-TRT 和 Volta 是 NVIDIA Corporation 在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其关联的各自公司的商标。

© 2020-2024 NVIDIA Corporation 和附属公司。保留所有权利。 上次更新时间:2024 年 7 月 26 日。