Как скомпилировать 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 компилироваться с использованием двух библиотек?

Ответ 1

Я просто столкнулся с этой же проблемой, похоже, что предложение Ярослава Булатова не распространяется на поддержку 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 и С++ (но не связывание, поэтому вам нужна другая опция для оптимизации ссылок на ссылки между файлами)

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, поэтому команда Ярослава должна быть в порядке). Кроме того, если вы используете CPU, который не поддерживает одну из этих опций (например, FMA), использование -mfma сделает двоичный код, который будет работать с нелегальными инструкциями.

TensorFlow ./configure по умолчанию включает -march=native, поэтому при использовании этого следует избегать необходимости вручную указывать параметры компилятора.

-march=native позволяет -mtune=native, поэтому он оптимизирует ваш процессор для таких вещей, как последовательность инструкций AVX лучше всего подходит для невыровненных нагрузок.

Все это относится к gcc, clang или ICC. (Для ICC вы можете использовать -xHOST вместо -march=native.)

Ответ 2

Начнем с объяснения , почему вы видите эти предупреждения в первую очередь.


Скорее всего, вы не установили TF из исходного кода, а вместо него использовали что-то вроде pip install tensorflow. Это означает, что вы установили предварительно созданные (кем-то еще) двоичные файлы, которые не были оптимизированы для вашей архитектуры. И эти предупреждения говорят вам именно об этом: что-то доступно в вашей архитектуре, но оно не будет использоваться, потому что двоичный файл не был скомпилирован с ним. Вот часть из документации.

TensorFlow проверяет при запуске, был ли он скомпилирован с оптимизация доступна на CPU. Если оптимизация не включен, TensorFlow выдаст предупреждения, например. AVX, AVX2 и FMA инструкции не включены.

Хорошо, что, скорее всего, вы просто хотите научиться/экспериментировать с TF, чтобы все работало правильно, и вы не должны беспокоиться об этом


Что такое SSE4.2 и AVX?

В Википедии есть хорошее объяснение SSE4.2 и AVX. Это знание не должно быть хорошим для машинного обучения. Вы можете подумать о них как о наборе дополнительных инструкций для компьютера, чтобы использовать несколько точек данных против одной команды для выполнения операций, которые могут быть естественными (например, добавление двух массивов).

Оба SSE и AVX - это реализация абстрактной идеи SIMD (одна инструкция, несколько данных), которая

класс параллельных компьютеров в таксономии Флинна. Он описывает компьютеры с несколькими элементами обработки, которые выполняют одинаковые одновременная работа с несколькими точками данных. Таким образом, такие машины использовать уровень данных parallelism, но не concurrency: есть одновременные (параллельные) вычисления, но только один процесс (инструкция) в данный момент

Этого достаточно, чтобы ответить на ваш следующий вопрос.


Как эти 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

Ответ 3

Позвольте мне сначала ответить на ваш третий вопрос:

Если вы хотите запустить самокомпилированную версию внутри conda-env, вы можете. Это общие инструкции, которые я запускаю, чтобы загрузить testor для моей системы с дополнительными инструкциями. Примечание. Эта сборка предназначена для сборки AMD A10-7850 (проверьте свой процессор, какие инструкции поддерживаются... он может отличаться), работающий с Ubuntu 16.04 LTS. Я использую Python 3.5 в моей conda-env. Кредит переходит на страницу установки источника тензорного потока и ответы, приведенные выше.

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 инструкций).

В контексте компиляции tensorflow, если компьютер поддерживает AVX2 и AVX, SSE4.1 и SSE4.2, вы должны поместить эти оптимизирующие флаги для всех. Не делайте так, как я, и просто заходите с SSE4.2, думая, что он новее и должен superseed SSE4.1. Это явно НЕПРАВИЛЬНО! Мне пришлось перекомпилировать из-за того, что стоило мне хороших 40 минут.

Ответ 4

Это SIMD набор инструкций для векторной обработки,

Использование векторных инструкций выполняется быстрее для многих задач; машинное обучение - такая задача.

Обозначение docs:

Чтобы поддерживать совместимость с широким диапазоном машин, TensorFlow по умолчанию использует только инструкции SSD4.1 SIMD на машинах x86. Большинство современных ПК и Mac поддерживают более сложные инструкции, поэтому, если вы создаете двоичный файл, который будет работать только на вашем собственном компьютере, вы можете включить их, используя --copt=-march=native в своей команде сборки bazel.

Ответ 5

Благодаря всем этим ответам + пробам и ошибкам, мне удалось установить его на Mac с clang. Так что просто делюсь своим решением на тот случай, если оно кому-нибудь пригодится.

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

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

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

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

-mavx -mavx2 -mfma -msse4.2

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

  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

Создайте пакет pip: 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 он больше не будет жаловаться на пропущенные инструкции.

Ответ 8

Я скомпилировал небольшой Bash script для Mac (легко можно портировать на Linux), чтобы извлечь все функции ЦП и применить некоторые из них для создания TF. Im на TF-хозяине и часто использую (пару раз в месяц).

https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f

Ответ 10

При создании TensorFlow из источника вы запустите configure script. Один из вопросов, который задает configure script, выглядит следующим образом:

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]

configure script будет прикреплять флаг (ы), который вы указываете к команде bazel, которая строит пакет TensorFlow. В широком смысле вы можете ответить на это приглашение одним из двух способов:

  • Если вы создаете TensorFlow на том же типе типа процессора, что и тот, на котором вы запустите TensorFlow, вы должны принять значение по умолчанию (-march=native). Эта опция оптимизирует сгенерированный код для вашего типа CPU вашего компьютера.
  • Если вы создаете TensorFlow по одному типу процессора, но будете запускать TensorFlow на другом типе процессора, тогда рассмотрите возможность предоставления более конкретного флага оптимизации, как описано в НКУ документация.

После настройки TensorFlow, как описано в предыдущем маркированном списке, вы должны иметь возможность полностью оптимизировать TensorFlow для целевого ЦП, просто добавив флаг --config=opt к любой команде bazel, которую вы запускаете.

Ответ 11

Чтобы скрыть эти предупреждения, вы можете сделать это до вашего фактического кода.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf