- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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))
探查器输出如下
------------------------------------------------------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
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% 6.333ms 39.93% 1.046s 1.504ms 28.758ms 7.69% 29.035ms 41.777us 695
cudaHostAlloc 36.02% 943.053ms 36.02% 943.053ms 30.421ms 0.000us 0.00% 0.000us 0.000us 31
cudaLaunchKernel 35.93% 940.773ms 35.93% 940.773ms 86.619us 0.000us 0.00% 0.000us 0.000us 10861
aten::repeat 0.04% 979.000us 33.77% 884.170ms 30.489ms 0.000us 0.00% 204.000us 7.034us 29
aten::conv2d 0.06% 1.481ms 8.71% 228.183ms 695.680us 0.000us 0.00% 145.688ms 444.171us 328
aten::convolution 0.05% 1.391ms 8.66% 226.702ms 691.165us 0.000us 0.00% 145.688ms 444.171us 328
aten::_convolution 0.10% 2.742ms 8.61% 225.311ms 686.924us 0.000us 0.00% 145.688ms 444.171us 328
aten::cudnn_convolution 0.53% 13.803ms 8.33% 218.051ms 664.790us 137.822ms 36.87% 137.822ms 420.189us 328
cudaFree 7.46% 195.373ms 7.46% 195.373ms 48.843ms 0.000us 0.00% 0.000us 0.000us 4
------------------------------------------------------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------
Self CPU time total: 2.618s
Self CUDA time total: 373.844ms
我注意到大部分时间(自 CPU)被
cudaHostAlloc
占用了。和
cudaLaunchKernel
.这些是什么
cudaHostAlloc
和
cudaLaunchKernel
?可以减少这个时间吗?如果是如何?是否有任何我遗漏的标准操作会导致如此高的时间消耗?
最佳答案
我不是专家,但我认为每次使用 cuda 完成的操作都会调用 cudaLaunchKernel。所以我认为你不能优化它。
如果您绘制详细的跟踪 https://pytorch.org/tutorials/recipes/recipes/profiler_recipe.html#using-tracing-functionality ,您会看到每次对线性层执行像此处这样的 cuda 操作时都会调用它。
关于分析器输出的一个注释:aten::copy_
cudaHostAlloc
cudaLaunchKernel
和 aten::repeat
全部占用大约 40% 的 CPU 总时间。我觉得可能和ProfilerActivity.CUDA
有关记录 CUDA 操作但它也添加了 很多分析的第一个 CUDA 操作的 CPU 时间。就我而言,一个简单的 torch.ones(1000, device="cuda")
花了整整一秒的 CPU 时间,因为这是第一个 cuda 操作。
这可能是您的问题,请尝试删除 ProfilerActivity.CUDA
也许 aten::copy_
cudaHostAlloc
cudaLaunchKernel
和 aten::repeat
将具有更短的 CPU 时间并将从表中消失。
关于deep-learning - 如何在pytorch训练中优化cudaHostAlloc和cudaLaunchKernel时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69127080/
我在看 Page-Locked Host Memory在 Cuda Programming Guide并想知道在使用函数 cudaHostAlloc 创建时分配的固定内存在哪里?它在内核地址空间中吗?
我试图找出在将数据传输到设备之前将数据复制到固定内存是否有意义,因为我对输入数据的分配没有影响(它是一个库)。 std::vector idata(WORK_SIZE); int *idata_ali
我多次启动内核,直到找到解决方案。解决方案将被至少一个 block 找到。 因此,当一个 block 找到解决方案时,它应该通知 cpu 找到了解决方案,以便 cpu 打印该 block 提供的解决方
在 CUDA 文档中,特别是在有关 cudaSetDevice 的设备管理部分的 CUDA Runtime API 中,它是这样写的 Any host memory allocated from th
我是 CUDA 的新手,我想使用 cudaHostAlloc。我能够将我的问题隔离到以下代码。使用 malloc 进行主机分配工作,使用 cudaHostAlloc 导致段错误,可能是因为分配的区域无
我想通过 cudaHostGetDevicePointer 在映射内存上使用零拷贝.我可以用thrust::host_vector或者我必须使用 cudaHostAlloc(...,cudaHostA
在 CUDA 中,我想知道 cudaMallocHost() 之间的区别和 cudaHostAlloc() . 它们在 API 引用中的各自摘要说: cudaMallocHost():“在主机上分配页
我正在执行一个简单的测试,比较主机(CPU 正在执行访问)使用 malloc() 分配的数据和使用 cudaHostAlloc() 分配的数据的访问延迟。我注意到在 Jetson Tk1 上访问使用
我刚接触 Nvidia 的这些 API,有些表达对我来说不太清楚。我想知道是否有人可以帮助我以简单的方式了解何时以及如何使用这些 CUDA 命令。更准确地说: 研究如何通过并行执行内核(例如使用 CU
我是一名优秀的程序员,十分优秀!