【问题标题】:Pytorch C++ (Libtroch), using inter-op parallelismPytorch C++ (Libtroch),使用互操作并行
【发布时间】: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


    【解决方案1】:

    问题

    这两者的区别

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

    • 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,请参阅您发布的链接中的第一个代码 sn-p),否则您不会看到任何性能改进。

    很可能

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

    我是否需要自己创建新线程来使用互操作线程,还是 torch 在内部以某种方式为我做这件事?

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

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

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

    【讨论】:

    • 感谢您有见地的回答,并编辑我的问题,我会努力解决这个问题!我也无法在 C++ API 中找到任何相应的 fork 功能,这很遗憾,因为我想运行 f.exp。模型的两个不同部分同时进行。我可能会对其进行更多研究,并可能在 github 上发布功能请求。作为最后一个问题,如果我在我的代码中将模型作为 torch::Module 进行转换,是否值得将模型转换为 torchscript?现在我们将torch::module模型序列化为torch::output_archive,并自己保存字节,并通过input_archive加载它们。
    • @Bohaterowicz torchscript 可能会由于图形优化(层融合等)而提高性能。值得一试的是,每个新的 PyTorch 版本都会对其进行增量改进。
    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 2019-01-19
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2010-10-19
    相关资源
    最近更新 更多