Boh*_*icz 2 c++ python multithreading pytorch libtorch
我正在使用 PyTorch 的 C++ API 开发机器学习系统 ( libtorch)。
我最近一直在做的一件事是研究libtorch. 通过我的研究,我了解到 Torch 在 CPU 上使用两种并行化方式:
inter-op并行化intra-op并行化我的主要问题是:
inter-op并行性我知道我可以使用该函数指定用于并行性的线程数intra-op(根据我的理解,这是使用openmp后端执行的)torch::set_num_threads(),当我监视模型的性能时,我可以清楚地看到它使用了我指定的线程数使用这个函数,我可以通过改变intra-op线程数看到明显的性能差异。
还有另一个函数torch::set_num_interop_threads(),但似乎无论我指定多少个互操作线程,我都看不到性能有任何差异。
现在我已经阅读了这篇 PyTorch 文档文章,但我仍然不清楚如何利用互操作线程池。
文档说:
PyTorch 使用单个线程池来实现操作间并行性,该线程池由应用程序进程中分叉的所有推理任务共享。
我对这部分有两个问题:
interop线程,或者 torch 是否在内部以某种方式为我完成它?interop?在python示例中,他们使用模块fork中的函数torch.jit,但我在 C++ API 中找不到类似的东西。
这两者之间的区别
正如在这张照片上看到的:
intra-op-针对单个操作完成的并行化(如matmul或任何其他“每个张量”)inter-op- 您有多个操作并且它们的计算可以交织在一起inter-op“例子”:
op1启动并返回“Future”对象(这是一个我们可以在该操作完成后查询结果的对象)op2之后立即开始(op1现在是非阻塞的)op2完成op1结果(希望已经完成或至少接近完成)op1和op2结果加在一起(或者我们想用它们做的任何事情)由于上述原因:
intra-op无需任何添加即可工作(因为它是由 PyTorch 处理的)并且应该提高性能inter-op是用户驱动的(尤其是模型的架构forward),因此在创建架构时必须牢记inter-op!我如何利用操作间并行性
除非您在构建模型时inter-op考虑到(例如使用Futures,请参阅您发布的链接中的第一个代码片段),否则您不会看到任何性能改进。
最可能:
torchscript++,并且仅用 C++ 完成推理inter-opPython 编写(或重构现有)代码,例如使用torch.jit.fork和torch.jit.wait我是否需要自己创建新线程来利用互操作线程,或者 torch 是否在内部以某种方式为我完成它?
不确定目前在 C++ 中是否可行,找不到任何torch::jit::fork或相关的功能。
如果我需要自己创建新线程,我该如何在 C++ 中执行此操作,以便从互操作线程池创建新线程?
不太可能,因为 C++ API 的目标是模仿 Python 的 API 尽可能接近现实。您可能需要更深入地挖掘与之相关的源代码和/或在需要时在其 GitHub 存储库上发布功能请求