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

Я просто столкнулся с этой же проблемой, похоже, что предложение Ярослава Булатова не распространяется на поддержку 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 , возможно потому, что они содержат a = .)

-mfpmath=both работают только с gcc, а не clang. -mfpmath=sse , вероятно, так же хорошо, если не лучше, и по умолчанию для x86-64. 32-разрядная -mfpmath=387 по умолчанию -mfpmath=387 , поэтому ее изменение поможет 32-битным. (Но если вы хотите высокопроизводительные для хрустания чисел, вы должны создать 64-битные двоичные файлы.)

Я не уверен, что TensorFlow по умолчанию для -O2 или -O3 . gcc -O3 обеспечивает полную оптимизацию, включая автоинтеграцию, но иногда может замедлять работу кода.


Что это делает: --copt для bazel build передает опцию непосредственно в gcc для компиляции файлов C и C ++ (но не связывание, поэтому вам нужна другая опция для оптимизации --copt по bazel build в разных файлах)

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 .)

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


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

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

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


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

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

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

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

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


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

 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 минут.

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

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

Цитирование документации по установке тензорного streamа :

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

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

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

  2. Когда будет предложено

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

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

 -mavx -mavx2 -mfma -msse4.2 

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

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

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

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

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

  1. Установить Bazel

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

  1. Установите Tensorflow

Clone 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 pip, который вы только что создали: sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl

Теперь, в следующий раз, когда вы запустите Tensorflow, он больше не будет жаловаться на недостающие инструкции.

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

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

Это самый простой метод. Только один шаг.

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

Обратитесь к пользовательским assemblyм тензорного streamа

При создании 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 pip. В широком смысле вы можете ответить на это приглашение одним из двух способов:

  • Если вы создаете 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 

Чтобы скомпилировать TensorFlow с SSE4.2 и AVX, вы можете использовать напрямую

bazel build –config = mkl –config = “opt” –copt = “- march = broadwell” –copt = “- O3” // tensorflow / tools / pip_package: build_pip_package

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

  • Как выбрать размер сетки и блока для ядер CUDA?
  • Как определить неиспользуемые определения css
  • Можно использовать профилировщик, но почему бы не просто остановить программу?
  • Каковы основные нападающие производительности в AS3, помимо рендеринга векторов?
  • Где я могу найти стандартную реализацию карты на основе Trie в Java?
  • Перетащить пакетный файл для нескольких файлов?
  • Действительно ли ADD 1 быстрее INC? x86
  • Встроенные функции в C #?
  • Округление до следующей мощности 2
  • Какова механика оптимизации коротких строк в libc ++?
  • Различные результаты с плавающей запятой с включенной оптимизацией - ошибка компилятора?
  • Interesting Posts

    Потяните за обновлениями на Windows Phone

    Инвертирование направления колеса прокрутки мыши

    Как установить новую копию Windows XP или Windows 7 на USB-флэш-память

    Почему я получаю java.lang.AbstractMethodError при попытке загрузить blob в db?

    Самый эффективный способ добавления массивов в C #?

    4 ГБ оперативной памяти в MacOSX 10.5, только 3 ГБ в MacOSX 10.6

    Передача параметра в командную строку сценария MySQL

    Получить путь к файловому каталогу из пути к файлу

    PowerShell, форматирование ценностей в другой культуре

    Как отключить раздражающее всплывающее окно после автоматического обновления установленных в Windows XP

    Префиксная форма унарного оператора в Haskell

    Мой компьютер перезагружается, когда я говорю об отключении

    Условное форматирование DataGridView

    Как удалить расширения из столбца Name в FreeCommander

    RPM не удалит установленные каталоги, если они были изменены после первоначальной установки

    Давайте будем гением компьютера.