Распределенное обучение модели глубокого обучения становится все более важным, поскольку объемы данных растут во многих отраслях. Многие приложения в области компьютерного зрения и обработки естественного языка в настоящее время требуют обучения моделей глубокого обучения, сложность которых растет в геометрической прогрессии и которые часто обучаются на сотнях терабайт данных. Затем становится важным использовать обширную облачную инфраструктуру для масштабирования обучения таких больших моделей.
Разработчики могут использовать платформы с открытым исходным кодом, такие как PyTorch, для простого проектирования интуитивно понятных архитектур моделей. Однако масштабирование обучения этих моделей на нескольких узлах может быть затруднено из-за повышенной сложности оркестровки.
Обучение распределенной модели в основном состоит из двух парадигм:
- Параллельная модель – При параллельном обучении модели сама модель настолько велика, что не может поместиться в памяти одного графического процессора, а для обучения модели необходимо несколько графических процессоров. Хорошим примером этого является модель Open AI GPT-3 со 175 миллиардами обучаемых параметров (размером примерно 350 ГБ).
- Параллельные данные – При параллельном обучении данных модель может располагаться на одном графическом процессоре, но из-за большого объема данных на обучение модели могут уйти дни или недели. Распределение данных по нескольким узлам GPU может значительно сократить время обучения.
В этом посте мы предоставляем пример архитектуры для обучения моделей PyTorch с использованием Распределенная эластичная горелка фреймворк в распределенном параллельном режиме данных с использованием Амазон Эластик Кубернетес Сервис (Амазон ЭКС).
Предпосылки
Чтобы воспроизвести результаты, описанные в этом посте, единственным предварительным условием является учетная запись AWS. В этой учетной записи мы создаем кластер EKS и Amazon FSx для блеска файловая система. Мы также помещаем образы контейнеров в Реестр Amazon Elastic Container (Amazon ECR) репозиторий в учетной записи. Инструкции по настройке этих компонентов предоставляются по мере необходимости на протяжении всей публикации.
Кластеры EKS
Amazon EKS — это управляемый контейнерный сервис для запуска и масштабирования приложений Kubernetes на AWS. С помощью Amazon EKS вы можете эффективно выполнять распределенные задания по обучению, используя новейшие Эластичное вычислительное облако Amazon (Amazon EC2) без необходимости устанавливать, эксплуатировать и поддерживать собственную плоскость управления или узлы. это популярный оркестратором для машинного обучения (ML) и рабочих процессов ИИ. Типичный кластер EKS в AWS выглядит следующим образом.
Мы выпустили проект с открытым исходным кодом, AWS DevOps для EKS (aws-do-eks), который предоставляет большой набор простых в использовании и настраиваемых сценариев и инструментов для подготовки кластеров EKS и выполнения распределенных учебных заданий. Этот проект построен по принципам Сделать фреймворк: Простота, гибкость и универсальность. Вы можете настроить желаемый кластер с помощью экс.конф файл, а затем запустите его, запустив экс-create.sh сценарий. Подробные инструкции приведены в Репо GitHub.
Обучайте модели PyTorch с помощью Torch Distributed Elastic
Torch Distributed Elastic (TDE) — это собственная библиотека PyTorch для обучения крупномасштабных моделей глубокого обучения, где критически важно динамически масштабировать вычислительные ресурсы в зависимости от доступности. Контроллер TorchElastic для Kubernetes — это нативная реализация Kubernetes для TDE, которая автоматически управляет жизненным циклом модулей и сервисов, необходимых для обучения TDE. Это позволяет динамически масштабировать вычислительные ресурсы во время обучения по мере необходимости. Он также обеспечивает отказоустойчивое обучение, восстанавливая задания после сбоя узла.
В этом посте мы обсуждаем шаги по обучению PyTorch. Эффективная сеть-B7 и Реснет50 модели с использованием IMAGEnet данные в распределенном виде с TDE. Мы используем PyTorch РаспределенныеДанныеПараллельный API и контроллер Kubernetes TorchElastic, а также запускать наши обучающие задания в кластере EKS, содержащем несколько узлов GPU. На следующей диаграмме показана схема архитектуры для обучения этой модели.
TorchElastic для Kubernetes состоит в основном из двух компонентов: TorchElastic Kubernetes Controller (TEC) и сервера параметров (etcd). Контроллер отвечает за мониторинг и управление обучающими заданиями, а сервер параметров отслеживает рабочие узлы для распределенной синхронизации и обнаружения одноранговых узлов.
Чтобы учебные модули могли получить доступ к данным, нам нужен общий том данных, который может быть подключен каждым модулем. Некоторые варианты общих томов через Интерфейс хранения контейнеров (CSI) драйверы, включенные в AWS DevOps для EKS Он Эластичная файловая система Amazon (Amazon EFS) и FSx для блеска.
Настройка кластера
В нашей конфигурации кластера мы используем один экземпляр c5.2xlarge для системных модулей. Мы используем три экземпляра p4d.24xlarge в качестве рабочих модулей для обучения модели EfficientNet. Для обучения ResNet50 мы используем экземпляры p3.8xlarge в качестве рабочих модулей. Кроме того, мы используем общую файловую систему FSx для хранения наших обучающих данных и артефактов модели.
Инстансы AWS p4d.24xlarge оснащены Эластичный тканевый адаптер (EFA) для обеспечения сетевого взаимодействия между узлами. Мы обсудим EFA позже в посте. Чтобы включить связь через EFA, нам нужно настроить настройку кластера с помощью файла .yaml. Ан пример файла предоставляется в репозитории GitHub.
После правильной настройки этого файла .yaml мы можем запустить кластер с помощью сценария, предоставленного в репозитории GitHub:
См. Репо GitHub для получения подробных инструкций.
Разницы между запуском заданий на p4d.24xlarge и p3.8xlarge практически нет. Шаги, описанные в этом посте, работают для обоих. Единственное отличие заключается в наличии EFA на инстансах p4d.24xlarge. Для небольших моделей, таких как ResNet50, стандартная сеть по сравнению с сетью EFA оказывает минимальное влияние на скорость обучения.
FSx для файловой системы Lustre
FSx предназначен для высокопроизводительных вычислительных рабочих нагрузок и обеспечивает задержку менее миллисекунды при использовании томов хранения на твердотельных накопителях. Мы выбрали FSx, потому что он обеспечивает лучшую производительность при масштабировании до большого количества узлов. Важно отметить, что FSx может существовать только в одной зоне доступности. Поэтому все узлы, имеющие доступ к файловой системе FSx, должны находиться в той же зоне доступности, что и файловая система FSx. Один из способов добиться этого — указать соответствующую зону доступности в файле .yaml кластера для определенных групп узлов перед созданием кластера. Кроме того, мы можем изменить сетевую часть группы автоматического масштабирования для этих узлов после настройки кластера и ограничить ее использованием одной подсети. Это легко сделать на консоли Amazon EC2.
Предполагая, что кластер EKS запущен и работает, а идентификатор подсети для зоны доступности известен, мы можем настроить файловую систему FSx, предоставив необходимую информацию в fsx.conf файл, как описано в ридми и запуск развернуть.sh сценарий в FSX папка. Это устанавливает правильную политику и группу безопасности для доступа к файловой системе. Скрипт также устанавливает водитель CSI для FSx в качестве набора демонов. Наконец, мы можем создать утверждение постоянного тома FSx в Kubernetes, применив один файл .yaml:
Это создает файловую систему FSx в зоне доступности, указанной в fsx.conf
файл, а также создает постоянную претензию тома fsx-pvc
, который может быть смонтирован любым модулем в кластере в режиме чтения-записи-многих (RWX).
В нашем эксперименте мы использовали полные данные ImageNet, которые содержат более 12 миллионов обучающих изображений, разделенных на 1,000 классов. Данные можно скачать с Веб-сайт ImageNet. Оригинальный шар TAR имеет несколько каталогов, но для обучения нашей модели нас интересуют только ILSVRC/Data/CLS-LOC/
, который включает в себя train
и val
подкаталоги. Перед тренировкой нам нужно переставить изображения в val
подкаталог, чтобы соответствовать структуре каталогов, требуемой PyTorch Папка изображения учебный класс. Это можно сделать с помощью простого Скрипт Python после того, как данные будут скопированы на постоянный том на следующем шаге.
Чтобы скопировать данные из Простой сервис хранения Amazon (Amazon S3) в файловую систему FSx мы создаем образ Docker, который включает в себя скрипты для этой задачи. Пример Dockerfile и сценарий оболочки включены в CSI папка в репозитории GitHub. Мы можем построить образ, используя build.sh
сценарий, а затем отправить его в Amazon ECR с помощью push.sh
сценарий. Прежде чем использовать эти сценарии, нам необходимо указать правильный URI для репозитория ECR в .env
файл в корневой папке репозитория GitHub. После отправки образа Docker в Amazon ECR мы можем запустить модуль для копирования данных, применив соответствующий файл .yaml:
Модуль автоматически запускает скрипт данные-prep.sh для копирования данных из Amazon S3 на общий том. Поскольку данные ImageNet содержат более 12 миллионов файлов, процесс копирования занимает пару часов. Скрипт Python imagenet_data_prep.py также запускается для перестановки val
набор данных, как и ожидалось PyTorch.
Сетевое ускорение
Мы можем использовать адаптер эластичной ткани (EFA) в сочетании с поддерживаемые типы инстансов EC2 для ускорения сетевого трафика между узлами GPU в вашем кластере. Это может быть полезно при выполнении больших распределенных учебных заданий, когда стандартная сетевая связь может быть узким местом. Сценарии для развертывания и тестирования подключаемого модуля устройства EFA в кластере EKS, которые мы здесь используем, включены в efa-устройство-плагин папка в репозитории GitHub. Чтобы включить задание с EFA в вашем кластере EKS, в дополнение к узлам кластера, имеющим необходимое аппаратное и программное обеспечение, в кластере необходимо развернуть подключаемый модуль устройства EFA, а ваш контейнер заданий должен иметь совместимые CUDA и NCCL. версии установлен.
Чтобы продемонстрировать выполнение тестов NCCL и оценить производительность EFA на экземплярах p4d.24xlarge, мы сначала должны развернуть оператор Kubeflow MPI, запустив соответствующий развернуть.sh сценарий в mpi-оператор папка. Затем мы запускаем развернуть.sh скрипт и обновить тест-эфа-nccl.yaml манифест, поэтому ограничения и запросы на ресурс vpc.amazonaws.com
установлено значение 4. Четыре доступных адаптера EFA в узлах p4d.24xlarge объединяются для обеспечения максимальной пропускной способности.
Run kubectl apply -f ./test-efa-nccl.yaml
чтобы применить тест, а затем отобразить журналы тестового модуля. Следующая строка в выходных данных журнала подтверждает, что EFA используется:
Результаты теста должны выглядеть примерно так:
По результатам тестов видно, что максимальная пропускная способность составляет около 42 ГБ/с, а средняя пропускная способность шины — около 8 ГБ.
Мы также провели эксперименты с одним включенным адаптером EFA, а также без адаптеров EFA. Все результаты сведены в следующую таблицу.
Количество адаптеров EFA | Net/OFI Выбранный провайдер | Сред. Пропускная способность (ГБ/с) | Максимум. Полоса пропускания (ГБ/с) |
4 | EFA | 8.24 | 42.04 |
1 | EFA | 3.02 | 5.89 |
0 | гнездо | 0.97 | 2.38 |
Мы также обнаружили, что для относительно небольших моделей, таких как ImageNet, использование ускоренной сети сокращает время обучения на эпоху только на 5–8% при размере пакета 64. Для более крупных моделей и меньших размеров пакетов, когда требуется повышенная сетевая передача весов. , использование ускоренной сети оказывает большее влияние. Мы наблюдали сокращение времени обучения эпохи на 15–18% для обучения EfficientNet-B7 с размером пакета 1. Фактическое влияние EFA на ваше обучение будет зависеть от размера вашей модели.
Мониторинг GPU
Перед запуском задания обучения мы также можем настроить Amazon CloudWatch метрики для визуализации использования графического процессора во время обучения. Может быть полезно узнать, используются ли ресурсы оптимально, или потенциально определить нехватку ресурсов и узкие места в процессе обучения.
Соответствующие сценарии для настройки CloudWatch находятся в GPU-метрики папка. Сначала мы создаем образ Docker с amazon-cloudwatch-agent
и nvidia-smi
. Мы можем использовать Dockerfile в gpu-metrics
папку для создания этого образа. Предполагая, что реестр ECR уже установлен в .env
файл из предыдущего шага, мы можем создать и отправить изображение, используя build.sh
и push.sh
. После этого запустив deploy.sh
скрипт автоматически завершает настройку. Он запускает набор демонов с amazon-cloudwatch-agent
и отправляет различные показатели в CloudWatch. Метрики графического процессора отображаются под CWAgent
пространство имен в консоли CloudWatch. Остальные метрики кластера отображаются под ContainerInsights
пространство имен.
Модельное обучение
Все скрипты, необходимые для обучения PyTorch, находятся в папке эластичная работа папка в репозитории GitHub. Перед запуском обучающего задания нам нужно запустить etcd
сервер, который используется TEC для обнаружения рабочих процессов и обмена параметрами. развернуть.sh сценарий в elasticjob
папка делает именно это.
Чтобы воспользоваться преимуществами EFA в экземплярах p4d.24xlarge, нам нужно использовать определенный образ Docker, доступный в Публичная галерея Amazon ECR который поддерживает связь NCCL через EFA. Нам просто нужно скопировать наш обучающий код в этот образ Docker. Dockerfile под образцы Папка создает образ, который будет использоваться при выполнении обучающего задания на экземплярах p4d. Как всегда, мы можем использовать build.sh и push.sh scripts в папке для сборки и отправки образа.
Ассоциация imagenet-efa.yaml файл описывает обучающую работу. Этот файл .yaml устанавливает ресурсы, необходимые для выполнения задания обучения, а также монтирует постоянный том с данными обучения, настроенными в предыдущем разделе.
Здесь стоит отметить несколько вещей. Количество реплик должно быть равно количеству узлов, доступных в кластере. В нашем случае мы установили значение 3, потому что у нас было три узла p4d.24xlarge. в imagenet-efa.yaml
файл, nvidia.com/gpu
параметр по ресурсам и nproc_per_node
под args
должно быть установлено количество GPU на узел, которое в случае p4d.24xlarge равно 8. Кроме того, аргумент worker для скрипта Python устанавливает количество CPU на процесс. Мы выбрали значение 4, поскольку в наших экспериментах это обеспечивает оптимальную производительность при работе на инстансах p4d.24xlarge. Эти настройки необходимы для того, чтобы максимально использовать все аппаратные ресурсы, доступные в кластере.
Когда задание выполняется, мы можем отслеживать использование графического процессора в CloudWatch для всех графических процессоров в кластере. Ниже приведен пример одного из наших учебных заданий с тремя узлами p4d.24xlarge в кластере. Здесь мы выбрали по одному графическому процессору из каждого узла. С настройками, упомянутыми ранее, использование графического процессора близко к 100% на этапе обучения эпохи для всех узлов в кластере.
Для обучения модели ResNet50 с использованием экземпляров p3.8xlarge нам нужны точно такие же шаги, как описано для обучения EfficientNet с использованием p4d.24xlarge. Мы также можем использовать тот же образ Docker. Как упоминалось ранее, инстансы p3.8xlarge не оснащены EFA. Однако для модели ResNet50 это не является существенным недостатком. imagenet-fsx.yaml сценарий, предоставленный в репозитории GitHub, настраивает задание обучения с соответствующими ресурсами для типа узла p3.8xlarge. В задании используется тот же набор данных из файловой системы FSx.
Масштабирование графического процессора
Мы провели несколько экспериментов, чтобы посмотреть, как масштабируется время обучения для модели EfficientNet-B7 за счет увеличения количества графических процессоров. Для этого мы изменили количество реплик с 1 на 3 в нашем тренировочном файле .yaml для каждого тренировочного прогона. Мы наблюдали время только для одной эпохи при использовании полного набора данных ImageNet. На следующем рисунке показаны результаты нашего эксперимента по масштабированию графического процессора. Красная пунктирная линия показывает, как должно сократиться время обучения при использовании 8 GPU за счет увеличения количества GPU. Как мы видим, масштабирование довольно близко к ожидаемому.
Точно так же мы получили график масштабирования графического процессора для обучения ResNet50 на инстансах p3.8xlarge. Для этого случая мы изменили реплики в нашем файле .yaml с 1 на 4. Результаты этого эксперимента показаны на следующем рисунке.
Убирать
Важно сократить ресурсы после обучения модели, чтобы избежать затрат, связанных с запуском простаивающих экземпляров. С каждым скриптом, создающим ресурсы, Репо GitHub предоставляет соответствующий скрипт для их удаления. Чтобы очистить нашу настройку, мы должны удалить файловую систему FSx перед удалением кластера, поскольку она связана с подсетью в VPC кластера. Чтобы удалить файловую систему FSx, нам просто нужно запустить следующую команду (изнутри FSX папка):
Обратите внимание, что это удалит не только постоянный том, но и файловую систему FSx, и все данные в файловой системе будут потеряны. Когда этот шаг завершен, мы можем удалить кластер, используя следующий скрипт в эКС Папка:
Это приведет к удалению всех существующих модулей, удалению кластера и удалению VPC, созданного в начале.
Заключение
В этом посте мы подробно описали шаги, необходимые для запуска обучения параллельной модели распределенных данных PyTorch на кластерах EKS. Эта задача может показаться сложной, но AWS DevOps для EKS Проект, созданный командой ML Frameworks в AWS, предоставляет все необходимые сценарии и инструменты для упрощения процесса и облегчения обучения распределенной модели.
Для получения дополнительной информации о технологиях, используемых в этом посте, посетите Амазон ЭКС и Распределенная эластичная горелка. Мы рекомендуем вам применить описанный здесь подход к вашим собственным примерам использования распределенного обучения.
Полезные ресурсы
Об авторах
Имран Юнус является главным архитектором решений для команды ML Frameworks в AWS. Он занимается крупномасштабными рабочими нагрузками машинного обучения и глубокого обучения в таких сервисах AWS, как Amazon EKS и AWS ParallelCluster. Он имеет большой опыт применения глубокого обучения в области компьютерного зрения и промышленного Интернета вещей. Имран получил докторскую степень в области физики частиц высоких энергий, где он участвовал в анализе экспериментальных данных в петабайтных масштабах.
Алекс Янкульский является комплексным архитектором программного обеспечения и инфраструктуры, который любит выполнять глубокую практическую работу. В настоящее время он является главным архитектором решений для самоуправляемого машинного обучения в AWS. В своей роли он фокусируется на помощи клиентам в контейнеризации и оркестрации рабочих нагрузок машинного обучения и искусственного интеллекта в сервисах AWS на базе контейнеров. Он также является автором открытого исходного кода. Сделать фреймворк и капитан Docker, который любит применять контейнерные технологии для ускорения темпов инноваций при решении самых больших мировых проблем. В течение последних 10 лет Алекс работал над борьбой с изменением климата, демократизацией ИИ и машинного обучения, повышением безопасности путешествий, улучшением здравоохранения и повышением энергоэффективности.
- AI
- ай искусство
- генератор искусств ай
- искусственный интеллект
- Амазон Эластик Кубернетес Сервис
- искусственный интеллект
- сертификация искусственного интеллекта
- искусственный интеллект в банковском деле
- робот с искусственным интеллектом
- роботы с искусственным интеллектом
- программное обеспечение искусственного интеллекта
- Машинное обучение AWS
- блокчейн
- конференция по блокчейну
- Coingenius
- разговорный искусственный интеллект
- криптоконференция ИИ
- дал-и
- глубокое обучение
- google ai
- Средний (200)
- обучение с помощью машины
- Платон
- Платон Ай
- Платон Интеллектуальные данные
- Платон игра
- ПлатонДанные
- платогейминг
- масштаб ай
- синтаксис
- зефирнет