【发布时间】:2021-09-22 10:34:30
【问题描述】:
我正在使用 PyTorch (libtorch) 的 C++ API 开发机器学习系统。
我最近一直在研究libtorch 的性能、CPU 利用率和 GPU 使用率。通过我的研究,我了解到 Torch 在 CPU 上使用了两种并行化方式:
-
inter-op并行化 -
intra-op并行化
我的主要问题是:
- 这两者的区别
- 如何利用
inter-op并行性
我知道我可以使用torch::set_num_threads() 函数指定用于intra-op 并行性的线程数(据我了解,这是使用openmp 后端执行的),因为我监控模型的性能,我可以清楚地看到它利用了我使用此函数指定的线程数,并且通过更改intra-op 线程数可以看到明显的性能差异。
还有另外一个函数torch::set_num_interop_threads(),不过好像不管我指定多少互操作线程,我都看不出性能上有什么区别。
现在我已经阅读了this PyTorch documentation article,但我仍然不清楚如何利用互操作线程池。
文档说:
PyTorch 使用单个线程池来实现互操作并行性,该线程池由应用程序进程中派生的所有推理任务共享。
我对这部分有两个问题:
- 我是否需要自己创建新线程来使用
interop线程,或者torch 是否在内部以某种方式为我做这件事? - 如果我需要自己创建新线程,如何在 C++ 中创建,以便从
interop线程池中创建一个新线程?
在python 示例中,他们使用来自torch.jit 模块的fork 函数,但我在C++ API 中找不到类似的东西。
【问题讨论】:
标签: python c++ multithreading pytorch libtorch