Сообщение изначально опубликовано на casey.li/tensorflow-from-source
tl; dr: Да. Я получил ~ 40% более быстрое обучение только для ЦП на небольшой CNN, построив TensorFlow из исходников для использования инструкций SSE / AVX / FMA. Посмотрите несколько примеров флагов сборки. Затем сделать его"!
MNIST - это Привет, мир машинного обучения, а MNIST для начинающих TensorFlow - довольно удобный способ начать работу. Во всяком случае, настолько удобным, насколько может быть ML.
Установка TensorFlow из рекомендованного pip
.whl выполняется быстро и безболезненно. Но при тестировании своей установки я получил следующие предупреждения:
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] 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:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
Быстрый поиск в Google дает эту ветку GitHub, в которой есть множество советов о том, как отключить предупреждения.
Но подождите! Может ли процессор ускорить вычисления? Звучит неплохо. Однако единственный способ воспользоваться преимуществами этих улучшений скорости - собрать TensorFlow из исходного кода.
Хотя забавно - TensorFlow на самом деле предупреждает вас об этом. Отправляйся на эту неизведанную территорию на свой страх и риск, детка - вот драконы:
Я знаю людей, которые будут платить несколько дополнительных сотен долларов за микроволновую печь немного большей мощности, чтобы они могли сэкономить несколько секунд каждый раз, разогревая обед. Если вы один из этих людей, то чувство, что вы можете ждать дольше, чем это абсолютно необходимо, для обучения на неоптимально настроенной установке TensorFlow, может не понравиться. Но насколько это изменится? Стоит драконов? Что вообще означают эти инструкции? Во имя науки давайте выясним.
Измерение времени обучения с помощью MNIST
Я использовал mnist_softmax.py, приведенный в руководстве, в качестве своего первого теста. Записать время обучения довольно просто - просто оберните несколько вызовов time.time()
вокруг цикла обучения и выведите в конце прошедшее время вместе с точностью:
# run training step many times! start = time.time() for _ in range(2000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) end = time.time()
# .... [some lines not shown]
correct_prediction = tf.equal(tf.argmax(y, 1), y_) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) print("Training time: {} sec".format(end - start))
«Подождите секундочку», - можете возразить вы. «Это даже не настоящая нейронная сеть! Это всего лишь полиномиальная логистическая регрессия. Это недостаточно вычислительно, чтобы быть интересным ". И справедливое замечание, о котором вы говорите. Давайте также протестируем это на небольшой, но реальной сверточной нейронной сети (CNN) для MNIST.
Я сделал свой mnist_cnn.py в качестве упражнения по инструкции здесь. Но он в основном идентичен файлу примера TensorFlow по адресу mnist_deep.py.
Что такое SSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA? И зачем им делать Tensorflow быстрее?
SSE означает Streaming SIMD Extensions, а SIMD означает Single Instruction Multiple Data. Короче говоря, похоже, что эти инструкции позволяют вашему процессору вести себя немного больше как графический процессор, выполняя одну и ту же операцию с несколькими объектами данных, а не обрабатывать их по одному. Удобен для обработки 3D-графики или, как вы уже догадались, для обучения слоев нейронной сети.
Инструкции AVX (Advanced Vector Extensions) и FMA (Fused Multiply Add) также являются расширениями операций SIMD.
С технической точки зрения Википедия и документация Intel по SSE выходят далеко за рамки моей головы. Если кто-то может ELI5, пожалуйста, сделайте это!
Итак, как мне создать Tensorflow с поддержкой SSE / AVX / FMA?
Сначала прочтите все инструкции TensorFlow по сборке из исходного кода для вашей ОС.
В зависимости от вашей конкретной конфигурации, вы можете захотеть проконсультироваться с этой веткой и выбрать свой собственный набор флагов для процесса сборки. Вот что я использовал, когда дошел до bazel build
части инструкций:
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both -k //tensorflow/tools/pip_package:build_pip_package
Я не использовал --config=cuda
для этой конкретной сборки, так как я делаю сборку только для ЦП. Следующим забавным шагом было бы попытаться оптимизировать самую быструю сборку Tensorflow с поддержкой CUDA с использованием графического процессора NVIDIA!
Процесс сборки занял намного больше времени, чем ожидалось - 6718,2 секунды или почти 2 часа на моем ноутбуке. Планируйте соответственно и убедитесь, что у вас будет доступ к электричеству.
Это сгенерирует build_pip_package
скрипт. Запустите это, чтобы создать файл .whl, который вы можете вывести в /tmp/tensorflow_pkg
или другую папку по вашему выбору.
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Наконец, cd
в репо, в котором вы создали свой .whl, и запустите pip install [filename of .whl]
. Все остальное должно выглядеть точно так же.
Результат? Увеличение скорости на 43% на небольшом CNN
Вот результаты на CNN. Стоит затраченных усилий!
Файл: mnist_cnn.py
Как и следовало ожидать, mnist_softmax.py
среда выполнения не показала каких-либо значимых изменений - возможно, в ней недостаточно вычислений:
Файл: mnist_softmax.py
Я не выполнял рекомендуемые 10 000 шагов обучения для достижения точности 99,2% на MNIST CNN (потому что ни у кого нет на это времени на TensorFlow, предназначенном только для ЦП). Однако, учитывая эти данные, приятно знать, что я смогу сделать это примерно за 17 минут, используя исходный код TensorFlow, по сравнению с 30 минутами при установке по умолчанию.
Технические характеристики
Вот спецификации, использованные для запуска тестов. YMMV:
- Ubuntu 16.04
- conda 4.5.4
- Python 3.6.5
- Intel (R) Core (TM) i5–5200U
- 8 ГБ DDR3
.whl используется при обычной установке:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp36-cp36m-linux_x86_64.whl < br /> (Обычная установка: инструкции здесь)
Источник (основная ветка):
git clone https://github.com/tensorflow/tensorflow
(Сборка из источника: инструкции здесь)
Нашли это полезным? Первоначально опубликовано на notsquirrel.com.