Авторы статьи: Ракшитх Васудев (Rakshith Vasudev) и Джон Локмен (John Lockman), HPC AI Innovation Lab, октябрь 2019 г.
Как было указано ранее, CheXNet — это модель ассистента рентгенолога на основе ИИ, которая использует DenseNet для идентификации до 14 патологий на изображении рентгена грудной клетки. Были изучены несколько подходов горизонтального масштабирования обучения модели, которая может работать также или лучше, чем оригинальная модель CheXNet-121 с RESNET-50, демонстрирующих положительные перспективы как для масштабируемости, так и для повышения точности обучения (положительное значение AUROC). Авторы продемонстрировали масштабируемость систем с ЦП, однако мы заинтересованы в использовании параллелизма графических процессоров для ускорения процесса обучения. В этой статье описаны передовые практики достижения максимальной производительности при распределенном горизонтально масштабируемом обучении CheXNet с использованием графических процессоров Nvidia V100 SXM2 на серверах Dell EMC C4140. Сервер Dell EMC PowerEdge C4140 обеспечивает как плотность, так и производительность благодаря четырем графическим процессорам Nvidia V100 в конфигурации SXM2.
Конфигурация оборудования: | Конфигурация программного обеспечения: |
---|---|
|
|
Поскольку новые вычислительные устройства (такие как графические процессоры и тензорные процессоры) позволяют обучать нейронные сети с возрастающей скоростью, обработка с помощью ЦП может стать узким местом. API tf.data предоставляет пользователям компоновочные блоки для проектирования входных конвейеров, которые эффективно используют ЦП, оптимизируя каждый этап процесса ETL.
Для выполнения этапа обучения необходимо сначала извлечь и преобразовать данные обучения, а затем перевести их в модель, запущенную на ускорителе. Однако во встроенной синхронной реализации, когда ЦП подготавливает данные, ускоритель простаивает. И наоборот, пока ускоритель обучает модель, ЦП простаивает. Таким образом, время этапа обучения представляет собой сумму времени предварительной обработки ЦП и времени обучения в ускорителе.
Конвейеризация накладывает друг на друга предварительную обработку и выполнение модели этапа обучения. Пока ускоритель выполняет этап обучения N, ЦП подготавливает данные для этапа N+1. Это максимально сокращает время шага (в отличие от суммы) обучения и время, необходимое для извлечения и преобразования данных.
Без конвейеризации ЦП и графический процессор/тензорный процессор находятся в режиме простоя в течение большей части времени:
Рис. 1. При последовательном выполнении графический процессор часто простаивает
При конвейеризации время простоя значительно уменьшается:
Рис. 2. Конвейеризация накладывает друг на друга использование ЦП и графического процессора, что позволяет максимально повысить коэффициент использования графического процессора.
API tf.data предоставляет программный механизм конвейеризации с помощью преобразования tf.data.Dataset.prefetch, который можно использовать для разделения времени, за которое данные производятся, и времени, за которое они потребляются. В частности, преобразование использует фоновый поток и внутренний буфер для предварительной выборки элементов из входного набора данных до того момента, когда они запрашиваются.
Более подробную информацию можно найти здесь: https://www.tensorflow.org/guide/performance/datasets
Если следовать указаниям, предоставленным tensorflow, можно получить конвейер данных, который выглядит так (старый подход):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py
При таком подходе, также называемым старым подходом, конвейер данных tf выполняет следующее (при условии, что набор данных рентгена грудной клетки является последовательностью TFRecords):
Однако это не самый производительный код. Он приводит к остановкам и частому использованию графического процессора на 0%. По сути, он не использует ускорители эффективно.
Чтобы правильно настроить конвейер данных tf, мы используем подход, который применяется в официальных моделях tensorflow, в частности, для ResNet. Разница между старым и новым подходом заключается в том, как выполняется настройка конвейера данных перед подачей данных в модель.
Вот как выглядит новый подход:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
Официальный подход моделей TensorFlow также называется новым подходом, выполняются следующие действия:
Ниже приведено сравнение производительности старого и нового подходов, использующих официальные модели TF.
Рис. 3. При использовании нового подхода можно ожидать почти линейного масштабирования.
Как можно видеть, наблюдается значительный прирост производительности, и при использовании старого подхода масштабирование вообще не выполняется. Графические процессоры часто практически не используются, что приводит к стабильным показателям производительности. Повышение эффективности вычислений на одном графическом процессоре переходит в повышение эффективности вычислений на нескольких графических процессорах на нескольких узлах, если хорошо настроен обмен данными.
Использование ЦП для параллельной предварительной обработки данных, предварительной выборки обработанных данных в памяти, перенос большого количества операций умножения матрицы на графические процессоры при быстром обмене данными является еще одним аспектом, который делает этот новый подход более привлекательным для масштабирования многоузловых систем.
Среда, в которой выполняются задания, так же важна, как и сами задания, поскольку наличие нужных библиотек/модулей оказывает влияние на эффективность обучения. Кроме того, наличие последних библиотек, связанных с CUDA, может повысить производительность.
Если у вас нет рабочей среды, следуйте инструкциям в этом руководства, чтобы установить ее.
MPI — это библиотека обмена данными, которая помогает horovod распределять задания. Были изучены различные параметры привязки и сопоставления, и лучшим параметром для C4140 оказалось сопоставление по сокету. Рекомендуемая настройка:mpirun --map-by socket -np x python pyfile.py --pyoptions
Если несколько процессов выполняются на одном графическом процессоре, они вполне могут бороться за ресурсы графического процессора, потребляя память графического процессора и не обрабатывать эффективно больше изображений на пакет, что приводит к тому, что производительность графического процессора становится все более низкой. Tensorflow 1.13.1 был изучен, но казалось, что в то время в нем была ошибка. Он запускал более одного процесса на графическом процессоре.
Подводя итог,