Как скомпилировать 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,
- Что такое SSE4.2 и AVX?
- Как эти SSE4.2 и AVX улучшают вычисления ЦП для задач Tensorflow.
- Как заставить 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
. Так что просто делюсь своим решением на тот случай, если оно кому-нибудь пригодится.
-
Следуйте инструкциям по документации - Установка TensorFlow из источников
-
Когда предложено для
Пожалуйста, укажите флаги оптимизации, которые будут использоваться во время компиляции, когда задана базовая опция "--config = opt" [По умолчанию -march = native]
затем скопируйте и вставьте эту строку:
-mavx -mavx2 -mfma -msse4.2
(Вариант по умолчанию вызвал ошибку, так же некоторые других флагов. Я не получил никаких ошибок с вышеупомянутыми флагами. Кстати, я ответил n
на все остальные вопросы)
После установки я проверяю ускорение от ~ 2x до 2.5x при обучении глубоких моделей относительно другой установки на основе колес по умолчанию - Установка TensorFlow на macOS
Надеюсь, поможет
Ответ 6
Это самый простой способ. Всего один шаг.
Это оказывает существенное влияние на скорость. В моем случае время, затраченное на тренировочный шаг, сократилось почти вдвое.
Ссылайтесь на пользовательские сборки tenorflow
Ответ 7
Я недавно установил его из исходного кода, и ниже приведены все шаги, необходимые для его установки из исходного кода, с указанными выше инструкциями.
Другие ответы уже описывают, почему эти сообщения отображаются. Мой ответ дает пошаговое руководство по установке, что может помочь людям, которые борются с фактической установкой, как я.
- Установить Базель
Загрузите его из одного из доступных выпусков, например, 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
Создайте пакет 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
Ответ 9
Чтобы скомпилировать TensorFlow с SSE4.2 и AVX, вы можете использовать напрямую
bazel build --config = mkl --config = "opt" --copt = "-march = broadwell" --copt = "-O3"//tenorflow/tools/pip_package: build_pip_package
Источник: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
Ответ 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