提问人:sdg 提问时间:9/20/2023 更新时间:9/28/2023 访问量:146
识别 OpenBLAS 和 OpenMP 警告的来源并理解
Identifying source of and understanding OpenBLAS and OpenMP warnings
问:
我正在使用 、 和 开发深度学习模型。当我运行时,我收到数百条以下警告:pytorch
pytorch-lightning
segmentation-models-pytorch
pytorch_lightning.Trainer.fit()
OpenBLAS Warning : Detect OpenMP Loop and this application may hang. Please rebuild the library with USE_OPENMP=1 option.
我有以下问题:
- 如何确定我的代码或源代码的哪一部分引发了此警告?
- 如何评估此警告是否相关或可以忽略?
- 如果我决定可以忽略该警告,如何禁止显示该警告?
我熟悉通过python的模块处理警告。但是,这在这里无济于事,因为警告来自 ,它不是 python 库。warnings
OpenBLAS
关于如何解决导致此警告的问题,还有其他几个问题,例如 这里 和 这里。我的问题是了解警告的来源,决定我是否关心它,如果我不在乎,就压制它。
提前感谢您对上述问题的任何提示或答案。如果这些是愚蠢或表述不当的问题,我深表歉意,因为我完全不熟悉和.OpenBLAS
OpenMP
答:
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/34 和 https://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 来实现。
评论
conda-forge
.fit()
我相信这是由于对 OpenMP 的内部调用与底层 .若要缓解此问题,请尝试遵循建议和pytorch_lightning
openBLAS
export OPENBLAS_NUM_THREADS=1
在运行 Python 之前。(如果您使用的是 Windows,请将其设置为环境变量)。
此消息意味着某些代码段一遍又一遍地调用相同的函数,而无需等待上一次调用完成。此问题的结果是,有时在训练阶段,同一批数据可能会得到不同的结果,具体取决于 CPU 负载。
由于这不会直接发生在您的代码中,而是在编译的库中,因此无法捕获它或禁止来自 Python 代码的警告。
另请参阅此相关问题。
评论