Pytorch C++ (Libtroch),使用操作间并行性

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 是否在内部以某种方式为我完成它?
  • 如果我需要自己创建新线程,我该如何在C++中执行此操作,以便从线程池中创建一个新线程interop

python示例中,他们使用模块fork中的函数torch.jit,但我在 C++ API 中找不到类似的东西。

Szy*_*zke 5

问题

这两者之间的区别

帧内_帧间

正如在这张照片上看到的:

  • intra-op-针对单个操作完成的并行化(如matmul或任何其他“每个张量”)
  • inter-op- 您有多个操作并且它们的计算可以交织在一起

inter-op“例子”:

  • op1启动并返回“Future”对象(这是一个我们可以在该操作完成后查询结果的对象)
  • op2之后立即开始(op1现在是非阻塞的)
  • op2完成
  • 我们可以查询op1结果(希望已经完成或至少接近完成)
  • 我们将op1op2结果加在一起(或者我们想用它们做的任何事情)

由于上述原因:

  • intra-op无需任何添加即可工作(因为它是由 PyTorch 处理的)并且应该提高性能
  • inter-op是用户驱动的(尤其是模型的架构forward),因此在创建架构时必须牢记inter-op

我如何利用操作间并行性

除非您在构建模型时inter-op考虑到(例如使用Futures,请参阅您发布的链接中的第一个代码片段),否则您不会看到任何性能改进。

最可能

  • 您的模型是用 Python 编写的,转换为 C torchscript++,并且仅用 C++ 完成推理
  • 您应该用inter-opPython 编写(或重构现有)代码,例如使用torch.jit.forktorch.jit.wait

我是否需要自己创建新线程来利用互操作线程,或者 torch 是否在内部以某种方式为我完成它?

不确定目前在 C++ 中是否可行,找不到任何torch::jit::fork或相关的功能。

如果我需要自己创建新线程,我该如何在 C++ 中执行此操作,以便从互操作线程池创建新线程?

不太可能,因为 C++ API 的目标是模仿 Python 的 API 尽可能接近现实。您可能需要更深入地挖掘与之相关的源代码和/或在需要时在其 GitHub 存储库上发布功能请求