识别 OpenBLAS 和 OpenMP 警告的来源并理解

Identifying source of and understanding OpenBLAS and OpenMP warnings

提问人:sdg 提问时间:9/20/2023 更新时间:9/28/2023 访问量:146

问:

我正在使用 、 和 开发深度学习模型。当我运行时,我收到数百条以下警告:pytorchpytorch-lightningsegmentation-models-pytorchpytorch_lightning.Trainer.fit()

OpenBLAS Warning : Detect OpenMP Loop and this application may hang. Please rebuild the library with USE_OPENMP=1 option.

我有以下问题:

  1. 如何确定我的代码或源代码的哪一部分引发了此警告?
  2. 如何评估此警告是否相关或可以忽略?
  3. 如果我决定可以忽略该警告,如何禁止显示该警告?

我熟悉通过python的模块处理警告。但是,这在这里无济于事,因为警告来自 ,它不是 python 库。warningsOpenBLAS

关于如何解决导致此警告的问题,还有其他几个问题,例如 这里 和 这里我的问题是了解警告的来源,决定我是否关心它,如果我不在乎,就压制它。

提前感谢您对上述问题的任何提示或答案。如果这些是愚蠢或表述不当的问题,我深表歉意,因为我完全不熟悉和.OpenBLASOpenMP

python openmp 警告 pytorch-lightning openblas

评论


答:

1赞 inarighas 9/23/2023 #1

OpenBLAS 是一个低级库,提供(大多数(如果不是全部)线性代数运算的快速实现,而 OpenMP 则为共享内存机器上的并行计算提供基元。

Pytorch 以及其他 ML/sci 计算库使用一个或两个库。例如,Numpy 基于 openBLAS,它保证了非常快速的矩阵运算,scikit-learn 使用 OpenMP 来执行并行作业。

一个问题是 OpenBLAS 是使用 OpenMP 构建的。数值计算库需要构建特定版本的 OpenBLAS(OpenMP 的某些特定构建配置),这可能会与其他可能也依赖于 OpenMP 构建的库发生冲突。

以下是有关如何跨不同包发行版管理这些依赖项的详细信息: https://pypackaging-native.github.io/key-issues/native-dependencies/blas_openmp/

根据同一消息来源,PyTorch 使用 OpenMP,并且没有明确指定使用哪个 openMP 实例或如何使用它。这与其他多线程库冲突,并可能导致生成问题。

在您的案例中,OpenBLAS 引发的警告意味着 openBLAS 检测到多个 OpenMP 线程,这是意外的(参见 https://github.com/open-ce/pytorch-feedstock/issues/34https://github.com/pytorch/pytorch/issues/52047,https://github.com/OpenMathLib/OpenBLAS/issues/2197)。

从PyTorch端解决此问题的解决方案(因为它是我们案例中的根本原因)是告诉PyTorch使用另一个可用的并行计算依赖项,称为TBB(参见 https://pytorch.org/docs/stable/notes/cpu_threading_torchscript_inference.html)。它通过在构建 Torch 时设置 USE_TBB=1 来实现。

评论

1赞 sdg 9/26/2023
谢谢,这是非常有用的信息。但是,它并没有真正回答我的核心问题:(1) 识别引发警告的特定代码行,(2) 评估我是否关心警告(例如,如果威胁是应用程序可能会挂起,但事实并非如此,我认为我可以忽略警告),以及 (3) 禁止显示警告。我将尝试使用 TBB 重建 pytorch,但很高兴知道是否有更简单的解决方案来解决该问题,特别是允许我不从源代码重新构建 pytorch 而是使用 上的默认版本。conda-forge
0赞 inarighas 9/26/2023
很抱歉我没有明确回答您的具体问题,但在我看来,我认为它们没有一个简单的答案。(1.) 它的 pytorch 库,内部方法,调用 openBLAS,然后引发此警告,因为 pytorch 也直接和隐式使用相同的依赖项。(2.) 此警告表示 OpenBLAS 配置存在潜在问题,可能导致挂起或性能问题。忽略它可能会导致不可预知的行为或性能欠佳。(3.) 也许你应该重建 OpenBLAS,这样它就不会引发警告:).fit()
0赞 igrinis 9/27/2023 #2

我相信这是由于对 OpenMP 的内部调用与底层 .若要缓解此问题,请尝试遵循建议和pytorch_lightningopenBLAS

export OPENBLAS_NUM_THREADS=1

在运行 Python 之前。(如果您使用的是 Windows,请将其设置为环境变量)。

此消息意味着某些代码段一遍又一遍地调用相同的函数,而无需等待上一次调用完成。此问题的结果是,有时在训练阶段,同一批数据可能会得到不同的结果,具体取决于 CPU 负载。

由于这不会直接发生在您的代码中,而是在编译的库中,因此无法捕获它或禁止来自 Python 代码的警告。

另请参阅此相关问题