Как скомпилировать Tensorflow с инструкциями SSE4.2 и AVX?
Это сообщение получено от запуска скрипта, чтобы проверить, работает ли Tensorflow:
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
Я заметил, что он упомянул SSE4.2 и AVX,
1) Что такое SSE4.2 и AVX?
2) Как эти SSE4.2 и AVX улучшают вычисления ЦП для задач Tensorflow.
3) Как заставить Tensorflow компилироваться с использованием двух библиотек?
11 ответов
Я только что столкнулся с этой же проблемой, похоже, что предложение Ярослава Булатова не распространяется на поддержку SSE4.2, добавив --copt=-msse4.2
было бы достаточно. В конце концов, я успешно построил с
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
без каких-либо предупреждений или ошибок.
Вероятно, лучший выбор для любой системы:
bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
(Обновление: возможно, скрипты сборки -march=native
возможно, потому что он содержит =
.)
-mfpmath=both
работает только с gcc, а не clang. -mfpmath=sse
вероятно, так же хорошо, если не лучше, и по умолчанию для x86-64. 32-битные сборки по умолчанию -mfpmath=387
так что меняюсь, что поможет для 32-битной. (Но если вам нужна высокая производительность при обработке чисел, вы должны создать 64-разрядные двоичные файлы.)
Я не уверен, что по умолчанию TensorFlow для -O2
или же -O3
является. gcc -O3
обеспечивает полную оптимизацию, включая автоматическую векторизацию, но иногда это может замедлить выполнение кода.
Что это делает: --copt
за bazel build
передает параметр непосредственно в gcc для компиляции файлов C и C++ (но не для компоновки, поэтому вам нужна другая опция для кросс-файловой оптимизации времени ссылки)
x86-64 gcc по умолчанию использует только SSE2 или более старые инструкции SIMD, поэтому вы можете запускать двоичные файлы в любой системе x86-64. (См. https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html). Это не то, что вы хотите. Вы хотите создать двоичный файл, который использует все инструкции, которые может выполнять ваш процессор, потому что вы запускаете этот двоичный файл только в той системе, в которой он был создан.
-march=native
включает все параметры, поддерживаемые вашим процессором, поэтому -mavx512f -mavx2 -mavx -mfma -msse4.2
излишний. (Также, -mavx2
уже позволяет -mavx
а также -msse4.2
Так что команда Ярослава должна была быть в порядке). Также, если вы используете процессор, который не поддерживает один из этих параметров (например, FMA), используйте -mfma
сделает двоичный файл, который ошибается с недопустимыми инструкциями.
TensorFlow - х ./configure
по умолчанию включено -march=native
, поэтому при использовании этого не нужно указывать параметры компилятора вручную.
-march=native
позволяет -mtune=native
Таким образом, он оптимизирует для вашего процессора такие вещи, как, например, последовательность инструкций AVX, которая лучше всего подходит для невыровненных нагрузок.
Это все относится к gcc, clang или ICC. (Для ICC вы можете использовать -xHOST
вместо -march=native
.)
Давайте начнем с объяснения того, почему вы видите эти предупреждения в первую очередь.
Скорее всего, вы не установили TF из источника и вместо него использовали что-то вроде pip install tensorflow
, Это означает, что вы установили предварительно созданные (кем-то еще) двоичные файлы, которые не были оптимизированы для вашей архитектуры. И эти предупреждения говорят вам именно это: что-то доступно в вашей архитектуре, но оно не будет использоваться, потому что двоичный файл не был скомпилирован с ним. Вот часть из документации.
TensorFlow проверяет при запуске, была ли она скомпилирована с оптимизацией, доступной на CPU. Если оптимизации не включены, TensorFlow выдаст предупреждения, например, инструкции AVX, AVX2 и FMA не включены.
Хорошо, что, скорее всего, вы просто хотите изучить / поэкспериментировать с TF, чтобы все работало правильно, и вам не следует об этом беспокоиться
Что такое SSE4.2 и AVX?
В Википедии есть хорошее объяснение SSE4.2 и AVX. Эти знания не обязаны быть хорошими в машинном обучении. Вы можете думать о них как о наборе некоторых дополнительных инструкций для компьютера, чтобы использовать несколько точек данных против одной инструкции для выполнения операций, которые могут быть естественно распараллелены (например, добавление двух массивов).
И SSE, и AVX являются воплощением абстрактной идеи SIMD (одна инструкция, несколько данных), которая
класс параллельных компьютеров в таксономии Флинна. Он описывает компьютеры с несколькими элементами обработки, которые выполняют одну и ту же операцию одновременно для нескольких точек данных. Таким образом, такие машины используют параллелизм на уровне данных, но не параллельность: существуют одновременные (параллельные) вычисления, но только один процесс (инструкция) в данный момент
Этого достаточно, чтобы ответить на ваш следующий вопрос.
Как эти SSE4.2 и AVX улучшают вычисления ЦП для задач TF
Они позволяют более эффективно вычислять различные векторные (матричные / тензорные) операции. Вы можете прочитать больше в этих слайдах
Как заставить Tensorflow компилироваться с использованием двух библиотек?
Вам нужно иметь двоичный файл, который был скомпилирован, чтобы воспользоваться этими инструкциями. Самый простой способ - это скомпилировать его самостоятельно. Как предположили Майк и Ярослав, вы можете использовать следующую команду bazel
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
Позвольте мне сначала ответить на ваш третий вопрос:
Если вы хотите запустить самостоятельно скомпилированную версию в conda-env, вы можете. Это общие инструкции, которые я выполняю, чтобы установить тензорный поток в моей системе с дополнительными инструкциями. Примечание. Эта сборка была для сборки AMD A10-7850 (проверьте, какие инструкции поддерживаются вашим процессором... она может отличаться) под управлением Ubuntu 16.04 LTS. Я использую Python 3.5 в моем conda-env. Кредит идет на страницу установки источника tenorflow и ответы, представленные выше.
git clone https://github.com/tensorflow/tensorflow
# Install Bazel
# https://bazel.build/versions/master/docs/install.html
sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
# Create your virtual env with conda.
source activate YOUR_ENV
pip install six numpy wheel, packaging, appdir
# Follow the configure instructions at:
# https://www.tensorflow.org/install/install_sources
# Build your build like below. Note: Check what instructions your CPU
# support. Also. If resources are limited consider adding the following
# tag --local_resources 2048,.5,1.0 . This will limit how much ram many
# local resources are used but will increase time to compile.
bazel build -c opt --copt=-mavx --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package
# Create the wheel like so:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
# Inside your conda env:
pip install /tmp/tensorflow_pkg/NAME_OF_WHEEL.whl
# Then install the rest of your stack
pip install keras jupyter etc. etc.
Что касается вашего второго вопроса:
Само скомпилированная версия с оптимизацией, на мой взгляд, стоит усилий. На моей конкретной установке вычисления, которые раньше занимали 560-600 секунд, теперь занимают всего около 300 секунд! Хотя точные цифры будут отличаться, я думаю, вы можете ожидать увеличения скорости на 35-50% в целом на вашей конкретной установке.
Наконец ваш первый вопрос:
Многие ответы уже были предоставлены выше. Подводя итог: AVX, SSE4.1, SSE4.2, MFA - это различные виды расширенных наборов команд на процессорах X86. Многие содержат оптимизированные инструкции для обработки матричных или векторных операций.
Я подчеркну свое заблуждение, чтобы, надеюсь, сэкономить вам время: дело не в том, что SSE4.2 - это более новая версия инструкций, заменяющая SSE4.1. SSE4 = SSE4.1 (набор из 47 инструкций) + SSE4.2 (набор из 7 инструкций).
В контексте компиляции тензорного потока, если ваш компьютер поддерживает AVX2 и AVX, а также SSE4.1 и SSE4.2, вы должны установить эти оптимизирующие флаги для всех. Не поступайте так, как я, а просто следуйте SSE4.2, думая, что он более новый и должен заменить SSE4.1. Это явно НЕПРАВИЛЬНО! Мне пришлось перекомпилировать из-за того, что стоило мне добрых 40 минут.
Это наборы команд векторной обработки SIMD.
Использование векторных инструкций быстрее для многих задач; машинное обучение такая задача.
Цитирование установочных документов tenorflow:
Чтобы быть совместимым с максимально широким диапазоном машин, TensorFlow по умолчанию использует только инструкции SSE4.1 SIMD на машинах x86. Большинство современных ПК и Mac поддерживают более сложные инструкции, поэтому, если вы создаете двоичный файл, который будет работать только на вашем компьютере, вы можете включить его, используя
--copt=-march=native
в вашей команде сборки Bazel.
Благодаря всем этим ответам + пробам и ошибкам, мне удалось установить его на Mac с clang
, Так что просто делюсь своим решением на тот случай, если оно кому-нибудь пригодится.
Следуйте инструкциям по документации - Установка TensorFlow из источников
Когда предложено для
Пожалуйста, укажите флаги оптимизации, которые будут использоваться во время компиляции, когда задана базовая опция "--config=opt" [по умолчанию -march=native]
затем скопируйте и вставьте эту строку:
-mavx -mavx2 -mfma -msse4.2
(Опция по умолчанию вызвала ошибки, как и некоторые другие флаги. Я не получил ошибок с вышеупомянутыми флагами. Кстати, я ответил n
на все остальные вопросы)
После установки я проверяю ускорение от ~2x до 2.5x при обучении глубинных моделей относительно другой установки на основе колес по умолчанию - Установка TensorFlow на macOS
Надеюсь, поможет
Я недавно установил его из исходного кода, и ниже приведены все шаги, необходимые для его установки из исходного кода, с указанными выше инструкциями.
Другие ответы уже описывают, почему эти сообщения отображаются. Мой ответ дает пошаговое руководство по установке, что может помочь людям, которые борются с реальной установкой, как я.
- Установить Базель
Загрузите его из одного из доступных выпусков, например, 0.5.2. Распакуйте его, перейдите в каталог и настройте его: bash ./compile.sh
, Скопируйте исполняемый файл в /usr/local/bin
: sudo cp ./output/bazel /usr/local/bin
- Установить Tensorflow
Клон тензор потока: git clone https://github.com/tensorflow/tensorflow.git
Перейдите в клонированный каталог, чтобы настроить его: ./configure
Он подскажет вам несколько вопросов, ниже я предложил ответ на каждый из вопросов, вы можете, конечно, выбрать свои собственные ответы, которые вы предпочитаете:
Using python library path: /usr/local/lib/python2.7/dist-packages
Do you wish to build TensorFlow with MKL support? [y/N] y
MKL support will be enabled for TensorFlow
Do you wish to download MKL LIB from the web? [Y/n] Y
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
Do you wish to use jemalloc as the malloc implementation? [Y/n] n
jemalloc disabled
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] N
No XLA JIT support will be enabled for TensorFlow
Do you wish to build TensorFlow with VERBS support? [y/N] N
No VERBS support will be enabled for TensorFlow
Do you wish to build TensorFlow with OpenCL support? [y/N] N
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N] N
No CUDA support will be enabled for TensorFlow
- Пип-пакет. Чтобы построить его, вы должны описать, какие инструкции вы хотите (вы знаете, эти Tensorflow сообщили, что вы пропали).
Скрипт сборки pip: bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package
Построить пип пакет: bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Установите только что собранный пакет Tensorflow: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl
Теперь, когда вы в следующий раз запустите Tensorflow, он больше не будет жаловаться на пропущенные инструкции.
Это самый простой способ. Всего один шаг.
Это оказывает существенное влияние на скорость. В моем случае время, затраченное на тренировочный шаг, сократилось почти вдвое.
Я скомпилировал небольшой скрипт Bash для Mac (его легко перенести на Linux), чтобы получить все функции процессора и применить некоторые из них для сборки TF. Я нахожусь на TF master и пользуюсь довольно часто (пару раз в месяц).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
Чтобы скомпилировать TensorFlow с SSE4.2 и AVX, вы можете использовать напрямую
bazel build --config=mkl --config="opt" --copt="-march=broadwell" --copt="-O3" //tenenflowflow/tools/pip_package:build_pip_package
2.0 СОВМЕСТИМОЕ РЕШЕНИЕ:
Выполните следующие команды в терминале (Linux/MacOS) или из командной строки (Windows), чтобы установить Tensorflow 2.0 с помощью Bazel:
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
#The repo defaults to the master development branch. You can also checkout a release branch to build:
git checkout r2.0
#Configure the Build => Use the Below line for Windows Machine
python ./configure.py
#Configure the Build => Use the Below line for Linux/MacOS Machine
./configure
#This script prompts you for the location of TensorFlow dependencies and asks for additional build configuration options.
#Build Tensorflow package
#CPU support
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
#GPU support
bazel build --config=opt --config=cuda --define=no_tensorflow_py_deps=true //tensorflow/tools/pip_package:build_pip_package
При сборке TensorFlow из исходного кода вы запустите configure
скрипт. Один из вопросов, который configure
Сценарий запрашивает следующее:
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]
configure
Сценарий прикрепит указанный флаг (ы) к команде bazel, которая создает пакет пипсов TensorFlow. Вообще говоря, вы можете ответить на это приглашение одним из двух способов:
- Если вы собираете TensorFlow на том же типе процессора, на котором вы будете запускать TensorFlow, то вы должны принять значение по умолчанию (
-march=native
). Эта опция оптимизирует сгенерированный код для типа процессора вашей машины. - Если вы собираете TensorFlow на одном типе ЦП, но будете запускать TensorFlow на другом типе ЦП, подумайте о предоставлении более конкретного флага оптимизации, как описано в документации по gcc.
После настройки TensorFlow, как описано в предыдущем маркированном списке, вы сможете создать TensorFlow, полностью оптимизированный для целевого процессора, просто добавив --config=opt
Пометить любую команду bazel, которую вы используете.
Чтобы скрыть эти предупреждения, вы можете сделать это до фактического кода.
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf