我正在尝试使用 pytorch profiler 来分析我的模型。我使用下面的代码来分析
with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA], record_shapes=True) as prof:
with record_function("model_inference"):
output_batch = self.model(input_batch)
print(prof.key_averages().table(sort_by="cpu_time_total", row_limit=10))
Run Code Online (Sandbox Code Playgroud)
分析器输出如下
------------------------------------------------------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
Name Self CPU % Self CPU CPU total % CPU total CPU time avg Self CUDA Self CUDA % CUDA total CUDA time avg # of Calls
------------------------------------------------------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
model_inference 3.17% 83.011ms 63.97% 1.675s 1.675s 0.000us 0.00% 373.844ms 373.844ms 1
aten::copy_ 0.24% …Run Code Online (Sandbox Code Playgroud) 我有两个网络,我正在对它们进行分析以查看哪些操作占用了大部分时间。我注意到不同网络的操作是不同的CUDA time avg。aten::conv2d这也增加了一个数量级。在我的第一个网络中,它是22us,而对于第二个网络,它是3ms。我的第一个网络具有最多带有512滤波器的卷积层,但第二个网络仅具有最多192滤波器。因此,我预计第二个网络中卷积运算所花费的平均时间应该更短。相反,它高出 3 个数量级。为什么会出现这种情况呢?
完整的分析输出如下
网络1:
Name Self CPU % Self CPU CPU total % CPU total CPU time avg Self CUDA Self CUDA % CUDA total CUDA time avg # of Calls
cudaLaunchKernel 99.80% 933.739ms 99.80% 933.739ms 20.750ms 0.000us 0.00% 0.000us 0.000us 45
model_inference 0.05% 453.000us 100.00% 935.567ms 935.567ms 0.000us 0.00% 195.000us 195.000us 1
aten::cudnn_convolution 0.04% 388.000us 99.84% 934.047ms 103.783ms 195.000us 100.00% 195.000us 21.667us 9
aten::_convolution …Run Code Online (Sandbox Code Playgroud)