Nsight System模型性能分析工具入坑记录
起因
在windows环境下使用torch的profiler+TensorBoard试图进行模型的性能分析,发现在TB上只有CPU的信息,缺少GPU的信息,试图去社区寻找解决方案,发现早在22年该问题就被提出来了,但是帖子里只有提问而无人解答。所以至此也一直无法解决(本人能力有限,等一个大佬救救孩子)。。。。原帖url:Pytorch官方社区的原帖
于是乎,改变思路转而换成Nsight System进行。但是关于ns用于性能分析的教程较少,我也是啃了一上午官方文档才勉强实现需求。
关于Nsight System
Nsight Systems是一款由NVIDIA开发的性能分析工具,旨在帮助开发人员优化并深入了解其CUDA应用程序的性能特征。以下是关于Nsight Systems的简要介绍:
-
用途:
- Nsight Systems用于分析和优化CUDA应用程序的性能,帮助开发人员找到性能瓶颈并实现优化。
-
功能特点:
- 提供可视化的性能分析工具,用于捕获和分析CUDA应用程序的执行情况。
- 支持查看CUDA核心活动、内核执行时间、内存操作、调用堆栈等详细信息。
- 提供时间线视图、统计信息和图表,帮助用户深入了解应用程序的性能表现。
-
适用范围:
- 适用于CUDA应用程序的性能分析和优化。
- 可用于不同领域的GPU加速应用程序的性能调优,包括深度学习、科学计算、图形渲染等。
-
工作流程:
- 用户可以使用Nsight Systems执行性能分析命令,生成性能分析文件。
- 分析文件可以进一步在Nsight Systems图形化界面中打开,并进行性能分析和优化。
-
优势:
- 提供全面的性能分析工具,帮助用户发现应用程序的性能瓶颈。
- 可视化展示分析结果,方便用户理解和解决性能问题。
- 支持详细的时间线视图和统计信息,帮助用户精确定位性能瓶颈。
总的来说,Nsight Systems是一款强大的性能分析工具,专为CUDA应用程序开发者设计,帮助他们深入了解和优化应用程序的性能,提高应用程序的效率和性能表现。
下载并安装NS
- 官网下载地址
- 不想出去并登录nvidia的话也可以直接下载这个链接:windows_x86_2024.2.1.106-3403790.msi
- 正常选择安装位置,一路next就好
正片:性能分析流程
- 我们需要用到两个程序:
- 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加入到环境变量,方便命令行直接调用
- 第一步需要我们编写一个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()
- 接着我们要使用nsys.exe调用python脚本,通过运行py脚本完成trace,并输出一个类似profile的.nsys-rep的trace文件。
-
使用管理员模式打开cmd
-
在cmd中输入如下指令:
nsys profile -t cuda,nvtx --force-overwrite true -o mobilenetv2_batchsize8_profile python nsight_trace.py
这个命令主要是使用Nsight Systems的nsys
命令来进行性能分析。通过使用这个命令,我们可以分析CUDA应用程序的性能,捕获CUDA和NVTX的相关信息,并生成相应的性能分析文件以供进一步分析和优化。-
nsys profile
:这部分指明要使用nsys
命令以进行性能分析。 -
-t cuda,nvtx
:这个选项表示在分析中包含CUDA和NVTX(NVIDIA Tools Extension)的信息。CUDA是NVIDIA的并行计算平台,用于GPU加速计算;而NVTX可以允许用户在代码中注入标记,用于更好地跟踪和可视化程序执行情况。 -
--force-overwrite true
:这个选项用于指示如果已经存在同名文件,是否强制覆盖。在这个情况下,设置为true
表示如果已经存在相同名字的输出文件,将强制覆盖该文件。 -
-o /path/to/your/nsys-reg/where/save
:这个选项指定了性能分析输出文件的路径和名称。在这个例子中,输出文件被命名为mobilenetv2_batchsize8_profile
,并保存在/
路径下。 -
python nsight_trace.py
:这部分是需要进行性能分析的命令。在这个例子中,是运行nsight_trace.py
这个Python脚本。nsys
会捕获该命令的执行过程,并生成相应的性能分析文件。
-
-
补充一句:如果我们使用了conda,还需要
conda activate your_py_env
-
此时我们已经得到了追踪文件
,所以打开nsys-ui.exe. 依次鼠标单击:菜单栏-》File-》Open-》选中到nsys-rep文件目标并双击该文件。此时等待软件读取即可看见设备运行的详细过程了。
-