Использование возможностей выделенных обучающих чипов DNN — часть 2

В октябре прошлого года AWS объявила о появлении типа инстанса Amazon EC2 DL1. DL1, оснащенный восемью ускорителями Habana Gaudi, является первым типом инстанса AWS, включающим выделенные ускорители ИИ, которые не являются графическими процессорами. Habana Gaudi, названный в честь известного каталонского архитектора Антонио Гауди, представляет собой новую ASIC с искусственным интеллектом, которая была специально разработана с нуля для рабочих нагрузок глубокого обучения. Это представляет потенциал для увеличения использования ресурсов и снижения стоимости обучения. И действительно, инстанс DL1 был представлен миру вместе с потенциальным обещанием до 40 % лучшей цены и производительности по сравнению с текущим поколением инстансов на базе графических процессоров.

В этом сообщении блога мы оценим экземпляр DL1 и продемонстрируем некоторые его уникальные свойства. Это продолжение предыдущего поста, в котором мы обсудили потенциал использования специализированных чипов ИИ и некоторые потенциальные проблемы, связанные с их внедрением. Там мы рекомендовали разбить задачу переноса вашего обучающего приложения на новый ИИ-чип на четыре этапа:

  1. Высокоуровневый анализ совместимости: получите раннюю оценку того, соответствуют ли свойства вашей рабочей нагрузки спецификациям чипа и стеку вспомогательного программного обеспечения.
  2. Настройка модели для работы на новом чипе. Возможно, вам потребуется внести некоторые коррективы в модель, например заменить операции, которые не поддерживаются выделенным чипом ИИ.
  3. Оптимизация производительности нового чипа. Чтобы в полной мере воспользоваться преимуществами чипа, необходимо проанализировать и максимально увеличить его использование.
  4. Настройка модели для сходимости на новом чипе: могут потребоваться некоторые изменения гиперпараметров модели, чтобы обеспечить своевременную сходимость.

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

Этот пост в блоге и фрагменты кода, которые мы включили, основаны на самом последнем стеке программного обеспечения, доступном на момент написания этой статьи, версии 1.2.0. Учитывая относительную новизну предложения Habana Gaudi, выпуски новых версий, вероятно, будут включать важные усовершенствования и оптимизации. Крайне важно, чтобы вы использовали самый последний доступный стек программного обеспечения и обязательно пересмотрели некоторые из сделанных нами утверждений, соответственно.
Хотя мы сосредоточимся на TensorFlow версии 2.7, большая часть того, что мы напишем, будет точно так же актуально для других сред машинного обучения, поддерживаемых Habana Gaudi.

1. Оценка совместимости высокого уровня

Цель этого шага — собрать как можно больше опубликованной информации, чтобы оценить, удовлетворяет ли предложение DL1 ваши потребности в обучении. Сюда входят такие интернет-ресурсы, как:

  • Спецификации архитектуры системы. Подробности об оборудовании DL1 вместе с Руководством по архитектуре Habana Gaudi должны дать вам общее представление о возможностях машины для обучения. В частности, вы можете убедиться, что память, вычислительные и другие аппаратные ресурсы совместимы с вашими потребностями.
  • Документация по программному обеспечению: Habana Gaudi поставляется с комплексным стеком программного обеспечения под названием SynapseAI Software Suite. Документация для разработчиков включает подробную информацию о поддерживаемых фреймворках и версиях, ограничениях API и многом другом. Существует несколько руководств пользователя, в которых показано, как использовать многие функции пакета API.
    Используйте документацию по программному обеспечению, чтобы убедиться, что поддерживаемые платформы, версии и операции соответствуют потребностям вашего проекта машинного обучения.
  • Отчеты о сравнительном анализе: Habana поделилась результатами сравнительного анализа производительности на самых разных популярных архитектурах моделей. Вы можете сравнить их с результатами производительности других поставщиков ускорителей искусственного интеллекта. Вы также можете проверить MLPerf, популярный набор тестов для обучения ИИ, который сравнивает производительность нескольких ускорителей ИИ, включая Habana Gaudi, при различных рабочих нагрузках. Резюме последнего отчета MLPerf (на момент написания этой статьи) можно найти здесь.
    Результаты тестов могут дать вам представление о типах моделей, в которых Gaudi превосходит других. Однако, как мы предупреждали в нашем предыдущем посте, если модель, которую вы обучаете, не идентична одной из моделей, включенных в отчет о тестах, прогнозирование производительности вашей собственной модели на основе заявленных тестов может быть не таким простым. Это связано с тем, что небольшие изменения в модели могут существенно повлиять на ее производительность во время выполнения.

Как и в случае с любым другим новым предложением HW, действительно нет лучшего способа получить истинное представление о возможностях DL1, кроме как пойти дальше и начать его использовать. Да, вы рискуете зайти в потенциальный тупик, но мы уверены, что знания и навыки, которые вы приобретете на этом пути, сослужат вам хорошую службу, даже если в конечном итоге вы не будете обучать свою текущую модель на DL1.

В приведенных ниже списках мы резюмируем некоторые основные особенности предложения DL1 на основе Gaudi по сравнению с другими ускорителями искусственного интеллекта и учебными экземплярами. За ними следуют некоторые из потенциальных опасений. Они основаны на наших личных впечатлениях. Наш список ни в коем случае не является исчерпывающим и не должен рассматриваться как замена официальной документации.

  • Гетерогенная архитектура. Одно ядро ​​Gaudi, иногда называемое HPU (Habana Processing Unit), состоит из кластера Tensor Processing Cores (TPC) с настраиваемым Matrix Math Engine (GEMM). GEMM отлично справляется с умножением матриц, в то время как нелинейные и поэлементные операции выполняются на TPC. Эта неоднородность позволяет Gaudi достигать высокой эффективности при выполнении самых разнообразных рабочих нагрузок. Максимальное использование может быть достигнуто за счет эффективного балансирования нагрузки между ресурсами.
  • Масштабное обучение. При разработке архитектуры особое внимание уделяется скорости передачи данных между процессорами Gaudi. Это позволяет Гауди демонстрировать исключительные, почти линейные результаты при масштабировании обучения на несколько ядер.
  • Поддержка фреймворка. API-интерфейсы SynapseAI включают поддержку как TensorFlow, так и PyTorch, двух самых популярных фреймворков машинного обучения, используемых сегодня. Он также включает поддержку Хоровод, популярного фреймворка для распределенного обучения. Эти предложения делают создание моделей для Gaudi чрезвычайно доступным для современного разработчика машинного обучения.
  • Богатый сад моделей: предложение Habana SW включает в себя широкий спектр эталонных моделей — реализаций популярных моделей, которые были перенесены и оптимизированы для работы в Gaudi.
  • Создание собственного ядра: в отличие от некоторых других специализированных ASIC для ИИ, пакет SynapseAI SW включает инструменты для реализации пользовательских ядер Gaudi (TPC). Подобно набору инструментов CUDA для разработки ядра графического процессора, эта возможность позволяет пользователям проектировать, разрабатывать и оптимизировать низкоуровневые операции, специально настроенные для их рабочих нагрузок.
  • Выполнение параллельных пробных версий. Пакет ПО поддерживает выполнение параллельных рабочих нагрузок на непересекающихся подмножествах восьми базовых ускорителей Gaudi в экземпляре DL1. Один из способов сделать это — использовать обучающий оркестратор, такой как kubernetes. Мы продемонстрируем, как использовать эту возможность для распараллеливания испытаний для настройки гиперпараметров.
  • Соотношение ЦП и вычислений Gaudi: в стандартном проекте машинного обучения вычисления будут разделены между ресурсами ЦП и ускорителями ИИ. Как правило, конвейер предварительной обработки входных данных будет работать на ЦП, а граф расчета модели (прямой обратный проход) будет работать на ускорителях ИИ. В идеальной ситуации все учебные ресурсы будут использованы полностью. Но максимальное использование наиболее важно для ресурсов ускорителя ИИ, которые обычно являются самыми мощными и дорогими ресурсами в системе. В некоторых случаях вы можете обнаружить, что ЦП не поспевают за скоростью ускорителей ИИ, что приводит к узким местам ЦП и недоиспользованию ускорителей ИИ. Вероятность узкого места ЦП определяется соотношением между общей вычислительной мощностью ЦП и общей вычислительной мощностью ускорителя. Экземпляр DL1 имеет относительно высокое соотношение ЦП и вычислений Gaudi, что снижает вероятность возникновения узких мест ЦП и недоиспользования ускорителя. Дело в том, что инстанс DL1 обладает той же вычислительной мощностью ЦП, что и инстанс EC2 p4d.24xlarge (96 масштабируемых процессорных ядер Intel Xeon второго поколения), хотя его ускоритель искусственного интеллекта A100 считается более мощным, чем Habana Gaudi.
  • Гибкость размера партии. В отличие от других ускорителей искусственного интеллекта, которые могут потребовать обучения работе с особенно большими партиями, чтобы в полной мере и с минимальными затратами использовать преимущества оборудования, Habana Gaudi может достичь высокой степени использования в широком диапазоне. спектр размеров партии. Это делает Gaudi жизнеспособным вариантом для моделей, которые могут плохо масштабироваться для больших партий.

Вот некоторые моменты, которые вы должны принять во внимание:

  • Ограничения API: обязательно ознакомьтесь с ограничениями программного пакета SynapseAI. Как четко указано в документации на момент написания этой статьи пока не все модели поддерживаются на Gaudi. Если вы не можете скомпилировать свою модель на DL1, вы можете попробовать настроить свою модель, чтобы она соответствовала поддержке API, или изучить возможность создания пользовательских операций. Кроме того, вы можете просто сообщить о своих выводах и отслеживать будущие версии выпуска SynapseAI.
  • Восемь ускорителей на инстанс DL1. На момент написания этой статьи единственное предложение инстансов AWS на базе Gaudi включало восемь ускорителей. Это означает, что для полного использования системы вам необходимо либо проводить параллельные эксперименты, либо распределять обучение по всем ускорителям. Если ни один из этих вариантов вам не подходит, то экземпляр DL1, вероятно, не лучший выбор.
  • Цена/качество: вы можете обнаружить, что ваша модель поддерживается, но ваши первоначальные пробные версии не дают ожидаемого соотношения цены и качества. В этом случае вы можете использовать Habana руководство по оптимизации, руководство по профилированию производительности, руководство по созданию пользовательских операций и другие ресурсы для повышения производительности. Если, несмотря на все ваши усилия, вы не можете достичь достаточного соотношения цены и качества, лучшим вариантом может быть сообщение о ваших выводах и ожидание обновленной версии пакета SynapseAI.

2. Адаптация вашей модели для работы на DL1

В этом разделе мы обсудим некоторые шаги, необходимые для запуска вашей модели на экземпляре DL1. Они основаны на официальной документации Habana, в частности на Руководстве по миграции TensorFlow. См. там для более подробной информации.

Настройка системы

Существует несколько способов запустить экземпляр Amazon EC2 и настроить среду выполнения DL1. Лучший вариант для вас будет зависеть от общей облачной архитектуры вашей организации.

Загрузка модуля Habana

Адаптация вашей модели TensorFlow для работы в Habana Gaudi требует всего двух строк кода, как показано в приведенном ниже фрагменте кода, взятом из примера Habana TensorFlow Hello World.

import tensorflow as tf
from habana_frameworks.tensorflow import load_habana_module
load_habana_module()
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(10),
])
loss = tf.keras.losses.SparseCategoricalCrossentropy(
                                           from_logits=True)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=128)

При запуске скрипта обязательно используйте соответствующий исполняемый файл Python. Это зависит от выбранной вами настройки, как описано здесь.

Изучите размещение устройства

Первое, что вам нужно сделать при запуске сценария, — это убедиться, что ваша модель действительно работает на ускорителе Gaudi. Среда выполнения Gaudi включает инструмент hl-smi, который сообщает об использовании ресурсов восьми ядер Gaudi. По внешнему виду он похож на инструмент nvidia-smi для графических процессоров. Вы можете использовать этот инструмент, чтобы убедиться, что запуск вашего обучающего сценария увеличивает объем памяти и вычислительные ресурсы первого ядра Gaudi.
Помимо подтверждения того, что ядро ​​Gaudi используется, вы также должны операции графа тренировочных вычислений выполняются на Гауди, а не на ЦП. Операции, не поддерживаемые Gaudi, выгружаются на ЦП, что может привести к высоким транзакционным издержкам и значительно снизить скорость обучения.
Один из способов проверить размещение устройства — использовать tf.debugging.set_log_device_placement функция. Если задано значение True, эта подпрограмма создаст журнал с размещением на устройстве всех операций TensorFlow в вашей программе. Ядра Gaudi зарегистрированы как устройства HPU в TensorFlow. Если все ваши учебные операции назначены на HPU, вы в хорошей форме. Если какая-либо из ваших обучающих операций назначена на ЦП, вы можете внести коррективы в свой график вычислений, как мы обсудим в следующем подразделе.
Альтернативный метод анализа размещения операций описан здесь.

Пример — использование неподдерживаемого типа данных. В приведенном ниже фрагменте кода мы добавили вызов tf.math.argmax, за которым следует tf.equal.

import tensorflow as tf
from habana_frameworks.tensorflow import load_habana_module
load_habana_module()
tf.debugging.set_log_device_placement(True)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(10),
            tf.keras.layers.Lambda(lambda x: 
               tf.where(tf.expand_dims(tf.equal(
                  tf.math.argmax(x,axis=-1),2),-1),
                  x,
                  tf.math.square(x)))])
loss =  tf.keras.losses.SparseCategoricalCrossentropy(
                                          from_logits=True)
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=128)

Вывод по умолчанию tf.math.argmax имеет тип tf.int64. Однако на момент написания этой статьи Int64 отсутствует в списке типов данных, поддерживаемых HPU. В результате операция tf.equal будет выполняться на процессоре. Журнал отладки размещения устройства будет содержать следующие строки:

sequential/lambda/ArgMax: (ArgMax): /job:localhost/replica:0/task:0/device:HPU:0
sequential/lambda/Equal: (Equal): /job:localhost/replica:0/task:0/device:CPU:0

В этом игрушечном примере исправление состоит в том, чтобы просто установить output_type для tf.math.argmax на tf.int32.

Корректировки модели

Обучение вашей модели на HPU может потребовать внесения некоторых изменений в вашу модель. Требуемые корректировки модели будут различаться по сложности. В некоторых случаях они будут такими же простыми, как указание базового типа данных, как в приведенном выше примере. В других случаях может потребоваться изменить поток данных или заменить последовательность операций. Например, примечания к выпуску для версии SynapseAI 1.2.0 включают ограничение, что операции потока управления, такие как «tf.cond и tf.while_loop, в настоящее время не поддерживаются в Gaudi». Другим примером операции, которая на момент написания этой статьи не поддерживается в Gaudi, является tf.numpy_function, подпрограмма, которая позволяет включать произвольный код Python в ваш граф вычислений (например, для расчета метрики) и иногда используется чтобы обойти ограничения, наложенные собственным API TensorFlow. Если ваша модель включает такие операции, вам потребуется спроектировать альтернативный поток или смириться с потерей производительности из-за того, что они будут выполняться на ЦП.

Три важных ресурса, которые вам понадобятся для настройки модели для Gaudi, — это список операций TensorFlow, которые поддерживаются в HPU, справочный каталог модели и руководство по созданию пользовательского ядра.

Поддерживаемые операции TensorFlow: используйте этот документ, чтобы найти поддержку Gaudi для операций на вашем графике.

Каталог справочных моделей: предложение Habana Gaudi включает в себя эталонные реализации для широкого спектра распространенных архитектур моделей машинного обучения. Эти реализации уже адаптированы и настроены для работы на Gaudi. Если вы используете одну из реализованных архитектур, считайте себя счастливчиком. Но даже если вы работаете с другой архитектурой модели, справочный каталог модели может включать вычислительные слои или вычислительные блоки, которые могут оказаться полезными. Например, если вы работаете над архитектурой трансформатора, вам рекомендуется взглянуть на конкретную реализацию блока трансформатора Гауди и либо использовать ее как есть, либо получить представление о том, как сделать соответствующие адаптации к вашему собственному блоку трансформатора. .

Создание пользовательского ядра: одним из свойств Habana Gaudi, которое отличает его от некоторых других специализированных ASIC AI на рынке, является его программируемость конечным пользователем. Habana предлагает исчерпывающие руководства по созданию пользовательских ядер HPU и обертыванию их операторами TensorFlow. Также ознакомьтесь с этим подробным примером и видеоуроком.

Конвейер предварительной обработки. Следует отметить, что при переносе вашей модели в Gaudi могут потребоваться изменения графа обучающих вычислений, который выполняется на ускорителе, но не требуется корректировка предварительной конвейер обработки, работающий на ядрах процессора. Это противоречит некоторым другим ускорителям ИИ, как мы видели в прошлом.

Распределенное обучение на DL1

Конечно, чтобы полностью использовать ресурсы DL1, недостаточно портировать его для работы на одном HPU; вы захотите воспользоваться преимуществами всех восьми HPU. Один из способов сделать это — параллельно обучать все восемь HPU, используя обучение с распределенными данными. Стек Habana Gaudi SW предлагает два механизма для реализации распределенного обучения. Первый использует специфичную для Habana Gaudi реализацию популярного фреймворка Хоровод. Второй использует пользовательскую реализацию API tf.distribute.Strategy. Руководство по распределенному обучению содержит подробную информацию о двух вариантах.
Преимущество выбора варианта Horovod заключается в том, что если вы уже реализовали распределенное обучение с помощью Horovod для GPU, для работы на HPU не требуется никаких изменений кода. Все, что вам нужно сделать, это проверить правильность установки пакета habana-horovod. Фактически, поддержка Horovod является одним из преимуществ предложения Habana по сравнению с другими специализированными предложениями AI ASIC.

Обратите внимание, что на момент написания этой статьи важно придерживаться определенного порядка команд импорта, как показано в этом фрагменте кода, взятом из Документации Habana Gaudi.

import tensorflow as tf
from habana_frameworks.tensorflow import load_habana_module
# ensure that load_habana_module() needs to be called before
# import horovod
load_habana_module()
import horovod.tensorflow.keras as hvd
#Initialization of Horovod. 
hvd.init()

Фреймворк Horovod также можно использовать для обучения несколько экземпляров DL1 параллельно.

3. Оптимизация производительности вашей модели на DL1

На этом этапе вы сможете успешно запустить тренировочный цикл на DL1. Далее следует важный этап анализа и оптимизации производительности. Как мы подчеркивали в нашем предыдущем посте, ускоритель ИИ хорош настолько, насколько хороши инструменты, которые он предоставляет для анализа производительности и оптимизации. Если вы не умеете анализировать и оптимизировать производительность, вы не сможете максимально использовать чип AI.

Habana предоставляет три важных ресурса для анализа и оптимизации производительности: список лучших практик, Руководство по оптимизации производительности и Профилировщик производительности. Эти руководства следует подробно изучить и регулярно обращаться к ним. К каждому из них мы дадим краткий комментарий.

Лучшие практики обучения по Гауди

На этой странице приведены общие (не зависящие от фреймворка) рекомендации по обучению работе с Гауди. Несмотря на компактность списка (всего семь пунктов на момент написания этой статьи), каждый элемент может существенно повлиять на производительность модели. Два пункта заслуживают упоминания:

  1. Динамические фигуры. Использование операторов, возвращающих фигуры неопределенного размера, не рекомендуется. См. наш предыдущий пост, в котором мы продемонстрировали, как заменить использование одной из таких функций, tf.boolean_mask.
  2. Формы тензора. В некоторых пунктах рекомендуется выбирать формы тензора (например, размер пакета и количество функций/каналов) в соответствии с определенными формулами. В этом нет ничего необычного для специального ускорителя ИИ (или для любого чипа, если на то пошло). Как мы упоминали в разделе 1, другие чипы ИИ требуют использования больших партий для максимального использования. В этом отношении Гауди предоставляет пользователю большую свободу/гибкость.

Руководство по оптимизации производительности

Эта страница посвящена рекомендациям по оптимизации для платформы TensorFlow. Одна из рекомендаций — воспользоваться встроенной поддержкой Gaudi для bfloat16 с использованием API смешанной точности TensorFlow. Использование плавающих чисел с низкой точностью (16 бит) во время обучения потенциально может сократить как использование памяти, так и время шага обучения. Существует два формата с плавающей запятой низкой точности, float16 и bfloat16, причем bfloat16 имеет ряд свойств, которые делают его предпочтительным форматом для машинного обучения. почти гарантировано, необходимо проверить уменьшенное время шага, а также способность модели сходиться.

Профилировщик производительности

Руководство пользователя Profiler содержит обширную документацию по SynapseAI Profiler, включая его настройку, выполнение и инструменты для анализа. Также доступен этот полезный видеоурок.
Как мы подробно обсуждали в предыдущих сообщениях (например, здесь и здесь), профилирование эффективности вашего обучения имеет решающее значение для максимального использования ваших учебных ресурсов, ускорения обучения и снижения затрат на обучение. .

Основным артефактом профилировщика производительности Habana является график профилирования. Подобно TensorBoard Trace Viewer, этот график показывает временную шкалу различных событий, которые произошли на разных системных ресурсах, в частности на DMA, MME и TPC. Вот несколько примеров шаблонов использования ресурсов, с которыми вы можете столкнуться, и какие уроки можно извлечь из них:

  1. Узкое место в конвейере ввода данных: большие промежутки между этапами обучения на HPU могут указывать на то, что HPU остается бездействующим, ожидая передачи обучающих данных от ЦП. В этом случае вам следует поработать над оптимизацией конвейера ввода данных. (Глянь сюда".)
  2. Перенос операций на ЦП: бездействие HPU в середине этапа обучения в сочетании с повышенной активностью прямого доступа к памяти может указывать на то, что некоторые операции графа передаются на ЦП. В этом случае вам следует пересмотреть расположение устройств для операций графа.
  3. Несоответствие между использованием MME и использованием HPC: на этапе обучения вы можете обнаружить периоды, когда MME простаивает, а HPU очень занят, или наоборот. В этом случае можно попытаться сократить время шага, улучшив балансировку нагрузки между ресурсами. Это можно сделать, запрограммировав/разработав эквивалентные ядра для конкретных устройств, как это предлагается здесь.

На момент написания этой статьи для использования профилировщика производительности Habana Gaudi требуются специальные шаги и инструменты настройки Gaudi. Мы ожидаем, что в следующих выпусках будут усовершенствованы способы использования профилировщика, включая его полную интеграцию с API-интерфейсами профилирования TensorFlow и TensorBoard.

4. Настройка вашей модели для сходимости на DL1

На данный момент ваша модель адаптирована и настроена в соответствии с вашими потребностями, и вы готовы к обучению. Возможно, вам нужно было внести некоторые изменения в вашу модель, которые требуют повторной настройки ваших гиперпараметров для обеспечения конвергенции модели. Такие изменения могут включать замену определенных операций, изменение потоков управления или изменение базовых типов данных. Даже если вы не вносили никаких изменений в свою модель, вы должны убедиться, что ваше обучение сходится на новом AI ASIC. Это связано с тем, что разные аппаратные ускорители реализованы по-разному и, вероятно, будут демонстрировать небольшие числовые различия в их поведении. Конвергенция на одном ASIC не гарантирует сходимости на другом.

Пример — настройка гиперпараметров на DL1

В этом примере мы демонстрируем, как использовать восемь ядер HPU для запуска восьми параллельных экспериментов в контексте настройки гиперпараметров. Настройка гиперпараметров относится к задаче поиска наиболее оптимальных гиперпараметров для вашей модели. Ray Tune — популярная библиотека Python для автоматизации настройки гиперпараметров, которая поддерживает широкий спектр современных алгоритмов оптимизации. Хотя версия по умолчанию распознает только ЦП и ГП в качестве возможных ресурсов для обучения, она может быть расширена для использования также и ГП. В приведенном ниже блоке кода мы демонстрируем довольно простой способ сделать это, зарегистрировав HPU как GPU. В приведенном ниже фрагменте кода, основанном на задокументированном примере mnist Ray Tune, мы выделили два необходимых изменения:

  1. Явная регистрация восьми графических процессоров с помощью команды Ray init. Это необходимо, поскольку текущий выпуск Ray не распознает ускорители HPU.
  2. Установка переменной среды HABANA_VISIBLE_DEVICES в соответствии со значением переменной среды CUDA_VISIBLE_DEVICES при входе в функцию поезда. Это гарантирует, что каждый процесс будет работать на отдельном HPU.
import os
import ray
from ray import tune
from ray.tune.schedulers import AsyncHyperBandScheduler
from ray.tune.integration.keras import TuneReportCallback
def train_mnist(config):
    os.environ['HABANA_VISIBLE_DEVICES'] = \
        os.environ['CUDA_VISIBLE_DEVICES']
    import tensorflow as tf
    from habana_frameworks.tensorflow import load_habana_module
    from tensorflow.keras.datasets import mnist
    from filelock import FileLock
    load_habana_module()
    with FileLock(os.path.expanduser("~/.data.lock")):
        (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train, x_test = x_train / 255.0, x_test / 255.0
    model = tf.keras.models.Sequential([
            tf.keras.layers.Flatten(input_shape=(28, 28)),
            tf.keras.layers.Dense(10)])
    loss = tf.keras.losses.SparseCategoricalCrossentropy(
                          from_logits=True)
    optimizer = tf.keras.optimizers.SGD(learning_rate=config['lr'])
    model.compile(optimizer=optimizer,
                  loss=loss, 
                  metrics=['accuracy'])
    model.fit(x_train, y_train, epochs=5, batch_size=128,
              verbose=0, validation_data=(x_test, y_test),
              callbacks=[TuneReportCallback({
                 "mean_accuracy": "accuracy"})])
def tune_mnist(num_training_iterations):
    sched = AsyncHyperBandScheduler(
        time_attr="training_iteration", max_t=400, grace_period=20)
    # explicitly init ray with number of accelerators set to 8 
    ray.init(num_gpus=8)
    analysis = tune.run(
        train_mnist,
        name="exp",
        scheduler=sched,
        metric="mean_accuracy",
        mode="max",
        stop={
            "mean_accuracy": 0.9,
            "training_iteration": num_training_iterations
        },
        num_samples=8,
        resources_per_trial={
            "cpu": 12,
            "gpu": 1
        },
        config={
            "lr": tune.uniform(0.001, 0.1),
        })
    print("Best hyperparameters found were: ", analysis.best_config)
if __name__ == "__main__":
    tune_mnist(num_training_iterations=1000)

Краткое содержание

Доступность нового варианта обучающего экземпляра всегда является захватывающей новостью, тем более, что он основан на специализированной AI ASIC. Предложение Habana Gaudi, на котором работает инстанс DL1, похоже, обладает всеми качествами достойной альтернативы другим ускорителям искусственного интеллекта, представленным сегодня на рынке. В частности, сопровождающий его программный стек предоставляет пользователю большую гибкость при разработке и оптимизации рабочих нагрузок машинного обучения. В то же время важно помнить, что Habana Gaudi относительно нова, и поэтому к ней следует подходить с соответствующим мышлением. Достижение оптимальных результатов может потребовать терпения и стойкости. Но это стоит потенциальной награды. На наших собственных моделях увеличение соотношения цены и качества соответствовало и даже превышало опубликованную отметку в 40%.

В этом посте рассмотрено лишь несколько аспектов обучения на экземпляре DL1. Не забудьте обратиться к огромному количеству онлайн-документации для получения дополнительной информации.

Во время исследования для этого сообщения в блоге я обнаружил, что «Гауди» означает «веселье» на немецком языке. Я не могу придумать лучшего способа описать свой опыт работы с DL1. Все, на что я могу надеяться, это то, что у вас тоже есть «Гауди» с вашим Гауди.