Включить многопоточность на 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, я искал, что делать. Я обнаружил, что Caffe2 необходимо перекомпилировать, установив некоторые аргументы при создании файла cmake или в файле CMakeLists.

Поскольку я уже установил pytorch в окружении conda, я сначала удалил Caffe2 с помощью:

pip uninstall -y caffe2

Затем я следовал инструкциям из документов Caffe2, построить его из исходников. Сначала я установил зависимости, как указано. Затем я загрузил pytorch в свою среду conda с помощью:

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

На данный момент я думаю, что настал момент изменить только что загруженный файл pytorch\caffe2\CMakeLists. Я читал, что для включения поддержки многопоточности достаточно включить параметр USE_NATIVE_ARCH внутри этого CMakeLists, однако я не могу найти такой вариант там, где ищу. Может быть, я делаю что-то не так. Какие-нибудь мысли? Спасибо.

Вот некоторые подробности о моей платформе:

  • Я на macOS Big Sur
  • Моя python версия 3.8.5

ОБНОВЛЕНИЕ:

Чтобы ответить Неге, это то, что у меня есть:

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:

Оказалось, что Clang, поставляемый с XCode, не поддерживает 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.

Я также попробовал простой Hello World для OpenMP с использованием 8 потоков, и все работает. Однако после повторного запуска команды:

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

Я получаю тот же результат. Какие-нибудь мысли?


person claudia    schedule 22.02.2021    source источник


Ответы (1)


AVX, AVX2 и FMA представляют собой наборы инструкций ЦП и не связаны с многопоточностью. Если бы пакет pip для pytorch/caffe2 использовал эти инструкции на процессоре, который их не поддерживал, программное обеспечение не работало бы. Pytorch, установленный через pip, поставляется с включенной многопоточностью. Вы можете подтвердить это с помощью 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. Затем продолжайте сборку pytorch с помощью python3 setup.py build. Обратите внимание, что флаг USE_NATIVE не делает того, что вы думаете. Это позволяет создавать MKL-DNN только с собственными флагами оптимизации ЦП. Он не доходит до caffe2 (кроме случаев, когда caffe2 явно использует MKL-DNN).

person nega    schedule 25.02.2021
comment
Благодарю вас! Да, меня интересует только многопоточность. Я обновил свой ответ, чтобы показать вам, что у меня есть, выполнив написанную вами команду. Я думаю, мне придется сначала установить OpenMP - person claudia; 25.02.2021
comment
Я снова обновил свой ответ, убедившись, что на этот раз у меня был OpenMP. Однако факел до сих пор не нашел его. У тебя есть идеи? - person claudia; 25.02.2021
comment
все предварительно скомпилированные версии pytorch должны иметь включенный OpenMP 1) убедитесь, что ваша версия pytorch обновлена. 2) убедитесь, что вы не запускаете python3 -c 'import torch; print(torch.__config__.parallel_info())' ни в одном из исходных каталогов, которые вы недавно загрузили - person nega; 25.02.2021
comment
К сожалению, я сделал оба, но ничего. Однако спасибо. - person claudia; 25.02.2021