在 Caffe2 上启用多线程

Enable multi-threading on Caffe2

使用 Caffe2 编译我的程序时,我收到以下警告:

[E init_intrinsics_check.cc:43] CPU feature avx is present on your machine, but the Caffe2 binary is not compiled with it. It means you may not get the full speed of your CPU.
[E init_intrinsics_check.cc:43] CPU feature avx2 is present on your machine, but the Caffe2 binary is not compiled with it. It means you may not get the full speed of your CPU.
[E init_intrinsics_check.cc:43] CPU feature fma is present on your machine, but the Caffe2 binary is not compiled with it. It means you may not get the full speed of your CPU.

因为我确实想获得对 Caffe2 的多线程支持,所以我搜索了该怎么做。我发现在创建 cmakeCMakeLists.

时必须重新编译 Caffe2 并设置一些参数

因为我已经在 conda 环境中安装了 pytorch,所以我首先卸载了 Caffe2:

pip uninstall -y caffe2

然后我按照 Caffe2 docs 的说明从源代码构建它。 我首先按照指示安装了依赖项。然后我在我的 conda 环境中下载了 pytorch

git clone https://github.com/pytorch/pytorch.git && cd pytorch
git submodule update --init --recursive

此时我想是时候更改刚下载的pytorch\caffe2\CMakeLists文件了。我已经读到,为了启用多线程支持足以在 CMakeLists 中启用选项 USE_NATIVE_ARCH,但是我无法在我正在寻找的地方找到这样的选项。也许我做错了什么。有什么想法吗?谢谢。

这里是关于我的平台的一些细节:

更新:

为了回答 Nega,这就是我得到的:

python3 -c 'import torch; print(torch.__config__.parallel_info())'
ATen/Parallel:
    at::get_num_threads() : 1
    at::get_num_interop_threads() : 4
OpenMP not found
Intel(R) Math Kernel Library Version 2020.0.2 Product Build 20200624 for Intel(R) 64 architecture applications
    mkl_get_max_threads() : 4
Intel(R) MKL-DNN v0.21.1 (Git Hash 7d2fd500bc78936d1d648ca713b901012f470dbc)
std::thread::hardware_concurrency() : 8
Environment variables:
    OMP_NUM_THREADS : [not set]
    MKL_NUM_THREADS : [not set]
ATen parallel backend: OpenMP

更新 2:

原来XCode自带的Clang不支持OpenMP。我使用的 gcc 只是 Clang 的符号链接。事实上 运行 gcc --version 我得到了:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

我从 Homebrew 安装 gcc-10 并像这样设置别名 alias gcc='gcc-10'。事实上现在 gcc --version 这就是我得到的:

gcc-10 (Homebrew GCC 10.2.0_4) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我还使用 8 个线程尝试了一个简单的 OpenMP Hello World,一切似乎都正常。然而在重新运行命令之后:

python3 -c 'import torch; print(torch.__config__.parallel_info())'

我得到了同样的结果。有什么想法吗?

AVX、AVX2、FMA是CPU指令集,与多线程无关。如果 pytorch/caffe2 的 pip 包在不支持它们的 CPU 上使用这些指令,则该软件将无法运行。通过 pip 安装的 Pytorch 启用了多线程。您可以通过 torch.__config__.parallel_info()

确认
❯ python3 -c 'import torch; print(torch.__config__.parallel_info())'
ATen/Parallel:
    at::get_num_threads() : 6
    at::get_num_interop_threads() : 6
OpenMP 201107 (a.k.a. OpenMP 3.1)
    omp_get_max_threads() : 6
Intel(R) Math Kernel Library Version 2020.0.1 Product Build 20200208 for Intel(R) 64 architecture applications
    mkl_get_max_threads() : 6
Intel(R) MKL-DNN v1.6.0 (Git Hash 5ef631a030a6f73131c77892041042805a06064f)
std::thread::hardware_concurrency() : 12
Environment variables:
    OMP_NUM_THREADS : [not set]
    MKL_NUM_THREADS : [not set]
ATen parallel backend: OpenMP

话虽这么说,如果您仍想继续从源代码构建 pytorch 和 caffe2,您正在寻找的标志 USE_NATIVE 在 pytorch/CMakeLists.txt 中,比 caffe2 高一级.编辑该文件并将 USE_NATIVE 更改为 ON。然后用 python3 setup.py build 继续构建 pytorch。请注意,标志 USE_NATIVE 并不像您认为的那样。它只允许使用 CPU 原生优化标志构建 MKL-DNN。它不会滴落到 caffe2(除非 caffe2 明显使用 MKL-DNN。)