Как скомпилировать 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, Так что просто делюсь своим решением на тот случай, если оно кому-нибудь пригодится.

  1. Следуйте инструкциям по документации - Установка TensorFlow из источников

  2. Когда предложено для

    Пожалуйста, укажите флаги оптимизации, которые будут использоваться во время компиляции, когда задана базовая опция "--config=opt" [по умолчанию -march=native]

затем скопируйте и вставьте эту строку:

-mavx -mavx2 -mfma -msse4.2

(Опция по умолчанию вызвала ошибки, как и некоторые другие флаги. Я не получил ошибок с вышеупомянутыми флагами. Кстати, я ответил n на все остальные вопросы)

После установки я проверяю ускорение от ~2x до 2.5x при обучении глубинных моделей относительно другой установки на основе колес по умолчанию - Установка TensorFlow на macOS

Надеюсь, поможет

Я недавно установил его из исходного кода, и ниже приведены все шаги, необходимые для его установки из исходного кода, с указанными выше инструкциями.

Другие ответы уже описывают, почему эти сообщения отображаются. Мой ответ дает пошаговое руководство по установке, что может помочь людям, которые борются с реальной установкой, как я.

  1. Установить Базель

Загрузите его из одного из доступных выпусков, например, 0.5.2. Распакуйте его, перейдите в каталог и настройте его: bash ./compile.sh, Скопируйте исполняемый файл в /usr/local/bin: sudo cp ./output/bazel /usr/local/bin

  1. Установить 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
  1. Пип-пакет. Чтобы построить его, вы должны описать, какие инструкции вы хотите (вы знаете, эти 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, он больше не будет жаловаться на пропущенные инструкции.

Это самый простой способ. Всего один шаг.

Это оказывает существенное влияние на скорость. В моем случае время, затраченное на тренировочный шаг, сократилось почти вдвое.

Ссылайтесь на пользовательские сборки tenorflow

Я скомпилировал небольшой скрипт 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

Источник: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl

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
Другие вопросы по тегам