Это сообщение получено от запуска скрипта, чтобы проверить, работает ли 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 компилироваться с использованием двух библиотек?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
источник
источник
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
на Xeon E5 v3, что дает мне 3-кратное улучшение скорости процессора 8k matmul по сравнению с официальным выпуском (0,35 -> 1,05 т / с)NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package.
отсюда tenorflow.org/install/install_sourcesОтветы:
Я только что столкнулся с этой же проблемой, похоже, что предложение Ярослава Булатова не распространяется на поддержку SSE4.2, добавления
--copt=-msse4.2
будет достаточно. В конце концов, я успешно построил сбез каких-либо предупреждений или ошибок.
Вероятно, лучший выбор для любой системы:
( Обновление: сценарии сборки могут быть съедены
-march=native
, возможно, потому что они содержат=
.)-mfpmath=both
работает только с gcc, а не clang.-mfpmath=sse
вероятно так же хорошо, если не лучше, и по умолчанию для x86-64. 32-битные сборки по умолчанию-mfpmath=387
, так что изменение, которое поможет для 32-битных. (Но если вам нужна высокая производительность при обработке чисел, вы должны создать 64-разрядные двоичные файлы.)Я не уверен , что по умолчанию TensorFlow для
-O2
или-O3
это.gcc -O3
обеспечивает полную оптимизацию, включая автоматическую векторизацию, но иногда это может замедлить выполнение кода.Что это делает:
--copt
forbazel 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
приведет к созданию двоичного файла, который не работает с недопустимыми инструкциями.По
./configure
умолчанию TensorFlow разрешает включение-march=native
, поэтому при его использовании не нужно указывать параметры компилятора вручную.-march=native
позволяет-mtune=native
, поэтому он оптимизирует для вашего процессора такие вещи, как, например, какая последовательность инструкций AVX лучше всего подходит для невыровненных нагрузок.Это все относится к gcc, clang или ICC. (Для ICC вы можете использовать
-xHOST
вместо-march=native
.)источник
-march=native
, не его работа. Кроме того, удаление--config=cuda
(если поддержка CUDA не требуется) и-k
(так как во время компиляции не было ошибок) также работает.--copt=-mfpmath=both
чтобы заставить его работатьclang
на MacOS. Влияет ли это на полученный бинарный файл?Давайте начнем с объяснения того, почему вы видите эти предупреждения в первую очередь .
Скорее всего, вы не установили TF из источника и вместо него использовали что-то вроде
pip install tensorflow
. Это означает, что вы установили предварительно созданные (кем-то еще) двоичные файлы, которые не были оптимизированы для вашей архитектуры. И эти предупреждения говорят вам именно это: что-то доступно в вашей архитектуре, но оно не будет использоваться, потому что двоичный файл не был скомпилирован с ним. Вот часть из документации .Хорошо, что, скорее всего, вы просто хотите изучить / поэкспериментировать с TF, чтобы все работало правильно, и вам не следует об этом беспокоиться
Что такое SSE4.2 и AVX?
В Википедии есть хорошее объяснение SSE4.2 и AVX . Эти знания не обязаны быть хорошими в машинном обучении. Вы можете рассматривать их как набор некоторых дополнительных инструкций для компьютера, чтобы использовать несколько точек данных против одной инструкции для выполнения операций, которые могут быть естественным образом распараллелены (например, добавление двух массивов).
И SSE, и AVX являются воплощением абстрактной идеи SIMD (одна инструкция, несколько данных), которая
Этого достаточно, чтобы ответить на ваш следующий вопрос.
Как эти SSE4.2 и AVX улучшают вычисления CPU для задач 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
источник
bazel
в этом случае?FAILED: Build did NOT complete successfully
. Это не так просто скомпилировать самостоятельно.Позвольте мне сначала ответить на ваш третий вопрос:
Если вы хотите запустить самостоятельно скомпилированную версию в conda-env, вы можете. Это общие инструкции, которые я запускаю, чтобы установить тензорный поток в моей системе с дополнительными инструкциями. Примечание. Эта сборка предназначалась для сборки AMD A10-7850 (проверьте, какие инструкции поддерживаются вашим процессором ... она может отличаться) под управлением Ubuntu 16.04 LTS. Я использую Python 3.5 в моем conda-env. Кредит идет на страницу установки источника tenorflow и ответы, представленные выше.
Что касается вашего второго вопроса:
Само скомпилированная версия с оптимизацией, на мой взгляд, стоит усилий. На моей конкретной установке вычисления, которые раньше занимали 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 :
источник
Благодаря всем этим ответам + пробам и ошибкам, мне удалось установить его на Mac с
clang
. Так что просто делюсь своим решением на тот случай, если оно кому-нибудь пригодится.Следуйте инструкциям по документации - Установка TensorFlow из источников
Когда предложено для
Пожалуйста, укажите флаги оптимизации для использования во время компиляции, когда задана базовая опция "--config = opt" [по умолчанию -march = native]
затем скопируйте и вставьте эту строку:
(Опция по умолчанию вызвала ошибки, как и некоторые другие флаги. Я не получил ошибок с вышеуказанными флагами. Кстати, я ответил
n
на все остальные вопросы)После установки я проверяю ускорение от ~ 2x до 2.5x при обучении глубинных моделей относительно другой установки на основе колес по умолчанию - Установка TensorFlow на macOS
Надеюсь, поможет
источник
-march=native
должно быть еще лучше, если ваш компилятор поддерживает это правильно. Он также устанавливает-mtune=native
хороший выбор инструкций для вашего процессора. например, в Haswell и более поздних версиях он отключает-mavx256-split-unaligned-store
и-mavx256-split-unaligned-load
, которые по умолчанию включены-mtune=generic
и снижают производительность, когда данные, как известно, не выровнены, но оказываются во время выполнения.-march=native
вызвала ошибка, в то время как другие варианты не сделали. Может быть, это конкретный компилятор. Я поделился этим точно на тот случай, если другие столкнулись с тем же препятствием.=
ее, или вы не используетеgcc
илиclang
, она должна работать. И-mtune=native -mavx2 -mfma
работает ли у вас? Или-mtune=skylake
? (Или какой у вас процессор). Кстати,-mavx2
подразумевает-mavx
и-msse4.2
. Не повредит включить их всех в рецепт, и я полагаю, что людям будет проще оставить тех, кого их процессор не поддерживает.-march=native
его системой сборки, я хотел бы знать. (И / или вы должны сообщить об этом выше, чтобы они могли исправить свои сценарии сборки).-march=native
этим, и это ошибка: / Users / jose / Documents / code / tmptensorflow / tennflowflow / tennflowflow / core / BUILD: 1442: 1: C ++ компиляция Правило "// tenorflow / core: lib_internal_impl" не выполнено (выход 1). В файле, включенном в файл tenorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: ошибка: «Набор инструкций SSE3 не включен» # ошибка «Набор инструкций SSE3 не включен» с использованием Apple LLVM версии 7.0.2 (clang-700.1.81)Я недавно установил его из исходного кода, и ниже приведены все шаги, необходимые для его установки из исходного кода, с указанными выше инструкциями.
Другие ответы уже описывают, почему эти сообщения отображаются. Мой ответ дает пошаговое руководство по установке, что может помочь людям, которые борются с реальной установкой, как я.
Загрузите его из одного из доступных выпусков , например, 0.5.2 . Распакуйте его, перейдите в каталог и настроить его:
bash ./compile.sh
. Скопируйте исполняемый файл в/usr/local/bin
:sudo cp ./output/bazel /usr/local/bin
Клон тензор потока:
git clone https://github.com/tensorflow/tensorflow.git
перейдите в клонированный каталог, чтобы настроить его:./configure
Он подскажет вам несколько вопросов, ниже я предложил ответ на каждый из вопросов, вы, конечно же, можете выбрать свои собственные ответы, которые вы предпочитаете:
Скрипт сборки 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 он больше не будет жаловаться на пропущенные инструкции.
источник
-c opt --copt=-march=native
должно быть по крайней мере так же хорошо, как--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2
. (Оба отключат предупреждение, но-march=native
могут сделать код еще быстрее, настроившись специально для процессора в системе, на которой вы строите). Также обратите внимание, что--copt=-mavx2 --copt=-mfma
подразумеваются все более ранние опции AVX и SSE, поэтому эта длинная строка опций была явно написана кем-то, кто не понимает опций gcc.--copt=-mavx2
это не сработало. Если--copt=-mfma
работает,--copt=-march=native
должно работать, если разбор не=
является проблемой. Для gcc / clang / icc вы определенно хотите, чтобы скрипт сборки в конечном итоге передавался-march=native
компилятору. Сделать это с помощью сценариев сборки становится хитростью.Это самый простой способ. Всего один шаг.
Это оказывает существенное влияние на скорость. В моем случае время, затраченное на тренировочный шаг, сократилось почти вдвое.
См пользовательские сборки tensorflow
источник
TensFlow
версия 1.10.0 и используетсяMacOS Sierra
. Помогите мне в поиске файла.Я скомпилировал небольшой скрипт Bash для Mac (его легко перенести на Linux), чтобы получить все функции процессора и применить некоторые из них для сборки TF. Я на TF master и пользуюсь довольно часто (пару раз в месяц).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
источник
Чтобы скомпилировать TensorFlow с SSE4.2 и AVX, вы можете использовать напрямую
Источник: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
источник
--copt="-march=native"
ел=
. (И кстати, эти двойные кавычки ничего не делают; они будут удалены оболочкой до того, какbazel
увидит вашу командную строку.)2.0 СОВМЕСТИМОЕ РЕШЕНИЕ:
Выполните следующие команды в терминале (Linux / MacOS) или из командной строки (Windows) , чтобы установить Tensorflow 2.0 с помощью Bazel :
источник
-march=native
, или другие параметры GCC / Clang? Я не вижу никакого упоминания об AVX, FMA или SSE4.2 в этом. (А сценарий сборки Bazel или Tensorflow все еще не работает таким образом, чтобы-mavx
работали только такие опции, как нет-march=native
? Если проблема была в самом верхнем ответе на этот вопрос)При сборке TensorFlow из исходного кода вы запустите
configure
скрипт. Один из вопросов, которыеconfigure
задает сценарий, заключается в следующем:configure
Сценарий будет прикрепить флаг (ы) вы указываете в команде Базэл , который строит пакет TensorFlow пипсов. Вообще говоря, вы можете ответить на это приглашение одним из двух способов:-march=native
). Эта опция оптимизирует сгенерированный код для типа процессора вашей машины.После настройки TensorFlow, как описано в предыдущем маркированном списке, вы сможете создать TensorFlow, полностью оптимизированный для целевого процессора, просто добавив
--config=opt
флаг к любой команде bazel, которую вы выполняете.источник
Чтобы скрыть эти предупреждения, вы можете сделать это до фактического кода.
источник