Nsight System模型性能分析工具入坑记录

起因


在windows环境下使用torch的profiler+TensorBoard试图进行模型的性能分析,发现在TB上只有CPU的信息,缺少GPU的信息,试图去社区寻找解决方案,发现早在22年该问题就被提出来了,但是帖子里只有提问而无人解答。所以至此也一直无法解决(本人能力有限,等一个大佬救救孩子)。。。。原帖url:Pytorch官方社区的原帖

于是乎,改变思路转而换成Nsight System进行。但是关于ns用于性能分析的教程较少,我也是啃了一上午官方文档才勉强实现需求。

关于Nsight System

Nsight Systems是一款由NVIDIA开发的性能分析工具,旨在帮助开发人员优化并深入了解其CUDA应用程序的性能特征。以下是关于Nsight Systems的简要介绍:

  1. 用途

    • Nsight Systems用于分析和优化CUDA应用程序的性能,帮助开发人员找到性能瓶颈并实现优化。
  2. 功能特点

    • 提供可视化的性能分析工具,用于捕获和分析CUDA应用程序的执行情况。
    • 支持查看CUDA核心活动、内核执行时间、内存操作、调用堆栈等详细信息。
    • 提供时间线视图、统计信息和图表,帮助用户深入了解应用程序的性能表现。
  3. 适用范围

    • 适用于CUDA应用程序的性能分析和优化。
    • 可用于不同领域的GPU加速应用程序的性能调优,包括深度学习、科学计算、图形渲染等。
  4. 工作流程

    • 用户可以使用Nsight Systems执行性能分析命令,生成性能分析文件。
    • 分析文件可以进一步在Nsight Systems图形化界面中打开,并进行性能分析和优化。
  5. 优势

    • 提供全面的性能分析工具,帮助用户发现应用程序的性能瓶颈。
    • 可视化展示分析结果,方便用户理解和解决性能问题。
    • 支持详细的时间线视图和统计信息,帮助用户精确定位性能瓶颈。

总的来说,Nsight Systems是一款强大的性能分析工具,专为CUDA应用程序开发者设计,帮助他们深入了解和优化应用程序的性能,提高应用程序的效率和性能表现。

下载并安装NS

正片:性能分析流程

  • 我们需要用到两个程序:
    • nsys.exe(位于:安装路径/NVIDIA Corporation\Nsight Systems 2024.2.1\target-windows-x64)
    • nsys-ui.exe(位于:安装路径/NVIDIA Corporation\Nsight Systems 2024.2.1\host-windows-x64)
    • 将nsys.exe加入到环境变量,方便命令行直接调用
  1. 第一步需要我们编写一个py脚本引入我们需要的模型并执行几轮推理,用于给nsys调用收集设备信息。(这是我的,我需要分析MobileNetV2模型)
import torch
import torchvision.transforms as transforms
from torchvision import datasets
from torch.utils.data import DataLoader
from torchvision.models import mobilenet_v2
from tqdm import tqdm

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 1. 加载并修改模型
model = mobilenet_v2(pretrained=False, num_classes=2).cuda(device)  # 加载模型,pretrained=False表示不加载预训练权重
# model.classifier[1] = torch.nn.Linear(model.classifier[1].in_features, 2)  # 修改分类器以输出2个类别
# 加载权重文件
model.load_state_dict(torch.load('path/to/your/weight.pt'))
criterion = torch.nn.CrossEntropyLoss().cuda(device)  # 交叉熵损失
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 使用Adam优化器

# 设置图像的预处理
transform = transforms.Compose([
    transforms.Resize((512, 512)),  # 将图像大小调整为512x512
    transforms.ToTensor(),  # 转换成Tensor
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 归一化
])

train_dataset = datasets.ImageFolder(root='path/to/your/dataset',
                                     transform=transform)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)


# 定义训练环节
def train(data):
    model.train()
    inputs, labels = data[0].to(device=device), data[1].to(device=device)
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    # print(model.device, inputs.device, labels.device)


def predict(data):
    model.eval()
    inputs, labels = data[0].to(device=device), data[1].to(device=device)
    with torch.no_grad():
        outputs = model(inputs)
    return outputs.argmax()


def main():
    for step, batch_data in enumerate(tqdm(train_loader, desc='Train Data')):
        # train(batch_data)
        pred = predict(batch_data)


if __name__ == '__main__':
    main()

  1. 接着我们要使用nsys.exe调用python脚本,通过运行py脚本完成trace,并输出一个类似profile的.nsys-rep的trace文件。
    1. 使用管理员模式打开cmd

    2. 在cmd中输入如下指令:nsys profile -t cuda,nvtx --force-overwrite true -o mobilenetv2_batchsize8_profile python nsight_trace.py这个命令主要是使用Nsight Systems的nsys命令来进行性能分析。通过使用这个命令,我们可以分析CUDA应用程序的性能,捕获CUDA和NVTX的相关信息,并生成相应的性能分析文件以供进一步分析和优化。

      1. nsys profile:这部分指明要使用nsys命令以进行性能分析。

      2. -t cuda,nvtx:这个选项表示在分析中包含CUDA和NVTX(NVIDIA Tools Extension)的信息。CUDA是NVIDIA的并行计算平台,用于GPU加速计算;而NVTX可以允许用户在代码中注入标记,用于更好地跟踪和可视化程序执行情况。

      3. --force-overwrite true:这个选项用于指示如果已经存在同名文件,是否强制覆盖。在这个情况下,设置为true表示如果已经存在相同名字的输出文件,将强制覆盖该文件。

      4. -o /path/to/your/nsys-reg/where/save:这个选项指定了性能分析输出文件的路径和名称。在这个例子中,输出文件被命名为mobilenetv2_batchsize8_profile,并保存在/路径下。

      5. python nsight_trace.py:这部分是需要进行性能分析的命令。在这个例子中,是运行nsight_trace.py这个Python脚本。nsys会捕获该命令的执行过程,并生成相应的性能分析文件。

    3. 补充一句:如果我们使用了conda,还需要conda activate your_py_env

    4. 此时我们已经得到了追踪文件追踪文件
      ,所以打开nsys-ui.exe. 依次鼠标单击:菜单栏-》File-》Open-》选中到nsys-rep文件目标并双击该文件。此时等待软件读取即可看见设备运行的详细过程了。
      nsys-ui.exe软件主页,带有设备运行详细信息

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐