1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/opendilab-DI-orchestrator

Клонировать/Скачать
architecture-cn.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 10:00 cd66dfb

DI Orchestrator архитектура

DI-engine фреймворк состоит из трёх важных модулей: coordinator, collector и learner. Обычно в рамках одной задачи DI-engine есть только один coordinator, а количество learner и collector может меняться. Функции каждого модуля следующие:

  • coordinator: поддерживает соединение с collector и learner, принимает запросы на получение исходной информации от collector и learner и отправляет задачи;
  • collector: получает местоположение RL модели в промежуточном хранилище от coordinator, загружает модель, затем генерирует данные в соответствии с моделью в сконструированной среде, сохраняет данные обратно в промежуточное хранилище и сообщает информацию о пути хранения и размере данных координатору;
  • learner: получает информацию о местоположении данных от coordinator и загружает данные из промежуточного хранилища, чтобы начать обучение RL модели. После завершения обучения модель сохраняется в промежуточное хранилище, и информация о пути хранения, размере и других характеристиках сообщается координатору.

Из-за того, что в части learner часто используется параллельное обучение, во избежание путаницы мы называем модули, взаимодействующие с coordinator, logic learner, который является основной единицей для взаимодействия с coordinator. А отдельный процесс learner в параллельном обучении называется ddp learner. Несколько процессов ddp learner предоставляют услуги параллельного обучения. Один logic learner может соответствовать одному ddp learner (одному GPU) или нескольким ddp learner (нескольким GPU). Кроме того, для предоставления услуг параллельного обучения также требуется дополнительный модуль aggregator. Агрегатор отвечает за объединение результатов обучения нескольких ddp learner и отправку их координатору. Координатор взаимодействует только с логическими обучающими модулями.

Для получения более подробной информации о DI-engine см. DI-engine developer tutorial.

Чтобы обеспечить поддержку работы DI-engine в Kubernetes (K8s), мы разработали DI Orchestrator. В этой статье будет объяснено, как различные модули DI-engine создаются, обнаруживают друг друга и начинают обучение в системе K8s с использованием DI Orchestrator. Архитектура DI Orchestrator показана на рисунке ниже:

В целом он делится на два больших модуля: di-server и di-operator. DDPL обозначает ddp learner, Lm обозначает Learner, Cn обозначает Collector, а Aggregator + DDPL образуют один логический обучающий модуль. Далее мы сначала представим процесс создания задачи после отправки DI-engine задачи в K8s, а затем представим di-server и di-operator.

Процесс создания задачи Здесь описывается процесс создания задачи, который представляет собой весь жизненный цикл одной задачи DI-engine от создания до выполнения в K8s.

  1. Напишите файл конфигурации агрегатора (AggregatorConfig yaml), чтобы определить шаблон агрегатора, который будет использоваться при создании агрегатора при последующем создании DIJob. Агрегатор может предоставлять услуги параллельного обучения для задач обучения.
  2. Напишите файл определения задачи (DIJob yaml), чтобы определить шаблоны координатора, коллектора и обучающегося, которые будут отправлены в кластер K8s.
  3. Оператор di отслеживает отправку DIJob и создаёт координатор, а также предоставляет доступное имя домена для координатора.
  4. После запуска координатора он запрашивает создание определённого количества коллекторов и обучающихся в соответствии со своей конфигурацией по умолчанию у di-сервера.
  5. Di-сервер получает запрос на создание от координатора и считывает шаблоны коллекторов и обучающихся из файла определения задачи. Затем он создаёт соответствующее количество коллекторов (на рисунке выше Cn) и обучающихся (на рисунке выше Lm) и возвращает доступные URL-адреса коллекторов и обучающихся запрашивающей стороне. В то же время он решает, создавать ли агрегатор в зависимости от количества графических процессоров, запрошенных каждым обучающимся. То есть, когда количество графических процессоров, запрашиваемых обучающимся, больше 1, создаётся агрегатор для этого обучающегося, в противном случае агрегатор не создаётся.
  6. После подключения коллекторов и обучающихся координатор начинает отправлять задачи и начинает обучение.
  7. Пользователи могут вручную отправлять запросы на увеличение или уменьшение количества коллекторов и обучающихся на сервер di. Координатор периодически проверяет количество доступных коллекторов и обучающихся и решает, следует ли устанавливать новые соединения или разрывать существующие.
  8. После завершения обучения оператор di по умолчанию удаляет коллекторы, обучающиеся и агрегаторы. Однако координатор сохраняет их для просмотра журналов и других операций пользователями.

Di Operator Di-оператор — это компонент, отвечающий за организацию DIJob в системе K8s и использующий шаблон оператора в K8s для управления состоянием DIJob через контрольный цикл в шаблоне контроллера. Он изменяет состояние DIJob, чтобы оно соответствовало предопределённому состоянию.

Определение API

Согласно характеристикам каждого модуля в DI framework, мы определили два типа пользовательских ресурсов (Custom Resource), а именно DIJob и AggregatorConfig. Первый используется для определения условий, необходимых для запуска координатора, коллекционера и обучающегося в RL задачах, включая изображения, команды запуска, необходимые вычислительные и запоминающие ресурсы, переменные среды и т. д.; второй используется для определения условий, необходимых для запуска агрегатора в RL задачах. Определение DIJob:

type DIJobSpec struct {
    // Group is a collection of DIJobs
    Group string `json:"group,omitempty"`

    //Priority labels the priority of DIJob
    PriorityClassName PriorityClassName `json:"priorityClassName,omitempty"`

    // CleanPodPolicy defines the policy to clean pods after DIJob completed
    CleanPodPolicy CleanPodPolicy `json:"cleanPodPolicy,omitempty"`

    // Volumes defines the shared volumes for DI-engine components
    Volumes []corev1.Volume `json:"volumes,omitempty"`

    Coordinator CoordinatorSpec `json:"coordinator,"`

    Collector CollectorSpec `json:"collector,"`

    Learner LearnerSpec `json:"learner,"`
}

Определение AggregatorConfig:

type AggregatorConfigSpec struct {
    Aggregator AggregatorSpec `json:"aggregator,"`
}

Почему агрегатор определяется отдельно? Агрегатор является общим ресурсом для всех задач RL, использующих DI-framework, поэтому мы определяем его как глобальный общий ресурс AggregatorConfig, и после отправки задачи di-сервер создаёт агрегатор, читая уникальный AggregatorConfig в кластере. Кроме того, агрегатор предназначен только для наиболее распространённого метода параллельного обучения, и если используются другие методы параллельного обучения, необходимо определить новый Custom Resource. Текст запроса:

means all the pods are in running state JobRunning Phase = "Running"

// JobSucceeded means job completed without error
JobSucceeded Phase = "Succeeded"

// JobFailed means some pods failed, job is also considered failed
JobFailed Phase = "Failed"

// JobUnknown means the job is in unknown state
JobUnknown Phase = "Unknown"

)

Один нормально запущенный и завершенный DIJob проходит через три этапа: Created, Running и Succeeded:

  • Когда DIJob отправляется, di-operator создает coordinator и переходит в этап Created.
  • После перехода coordinator в этап Running, DIJob переходит в этап Running.
  • Когда coordinator переходит в этап Completed, DIJob переходит в этап Succeeded.

Если coordinator находится в этапе Failed, то DIJob также переходит в этап Failed. Aggregator, collector и learner после сбоя немедленно перезапускаются, не влияя на этап DIJob.

Этап Unknown пока не определен.

Контрольный цикл

С помощью kubebuilder v3 создается проект, а необходимые компоненты (reflector, informer, indexer и др.) для оператора предоставляются controller-runtime и упаковываются в manager. Функция Reconcile предоставляется для настройки логики согласования, как показано в следующем коде:

func (r *DIJobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    // your reconcile logic here
    return ctrl.Result{}, nil
}

После отправки пользователем DIJob, informer получает уведомление о событии отправки и запускает handler. Затем вызывается функция Reconcile. В функции Reconcile вызывается метод list pod, который обнаруживает, что coordinator не создан. Затем считывается определение шаблона для coordinator из DIJob и создается соответствующий coordinator pod (где выполняется программа coordinator) и service (для связи между pods), а также некоторые переменные среды записываются в pod, включая имя pod, пространство имен pod и URL доступа к coordinator.

Каждый модуль в DI-engine имеет определенный порт по умолчанию:

DefaultCollectorPort   = 22270
DefaultLearnerPort     = 22271
DefaultAggregatorPort  = 22272
DefaultCoordinatorPort = 22273

После создания coordinator, di-operator отслеживает состояние pods и изменяет состояние DIJob. После завершения DIJob (Succeeded или Failed), di-operator по умолчанию удаляет все pods в состоянии Running и все services, оставляя coordinator pod нетронутым.

Webhook

При отправке DIJob могут возникнуть проблемы с вводом данных в yaml-файле, которые могут повлиять на ожидаемое выполнение DIJob или потребовать установки значений по умолчанию для некоторых полей DIJob. Если значения по умолчанию можно установить до отправки DIJob в кластер K8s, это поможет пользователям заранее обнаружить проблемы.

В K8s можно настроить webhook для проверки правильности перед отправкой DIJob в K8s кластер. K8s webhook делится на MutatingWebhook и ValidatingWebhook, первый используется для изменения значений ресурсов K8s, а второй — для проверки их правильности.

di-operator реализует методы проверки webhook, создавая MutatingWebhook для установки значений по умолчанию в DIJob и ValidatingWebhook для проверки правильности DIJob. Например, для поля CleanPodPolicy мы устанавливаем его значение по умолчанию равным Running в MutatingWebhook, указывая, что все запущенные pods будут удалены после завершения DIJob. Мы также проверяем значение поля CleanPodPolicy в ValidatingWebhook. Если пользовательское значение не равно None, ALL или Running, мы отклоняем отправку этого DIJob. Преимущества DI Orchestrator

DI Orchestrator предоставляет распределённую схему работы с контейнерами на основе K8s для фреймворка DI-engine. Для пользовательских DIJob, di-operator отвечает за организацию различных модулей в DI-engine, чтобы обеспечить их нормальное функционирование и выполнение тренировочных задач.

Через вызов интерфейса di-server координатору предоставляются функции добавления, удаления и запроса всех его коллекторов, учащихся и агрегаторов, что повышает способность динамического распределения ресурсов во фреймворке DI-engine.

В целом, DI Orchestrator предлагает следующие преимущества:

  1. Инкапсуляция. Благодаря способности di-operator организовывать работу, детали развёртывания распределённого RL-обучения в DI-engine (включая создание пода и обнаружение служб) остаются скрытыми от пользователя. В соответствии с требованиями к развёртыванию распределённого RL-тренинга во фреймворке DI-engine di-operator создаёт координатор, который затем запрашивает у di-server создание других модулей. Di-operator записывает состояние каждого модуля пода в статус DIJob. Жизненный цикл DIJob также поддерживается di-operator, который отображает состояние DIJob на разных этапах.
  2. Простота использования. Пользователю нужно только определить конфигурацию координатора, коллектора и учащегося в yaml-файле DIJob, после чего можно отправить его в кластер K8s одним нажатием кнопки. Di-operator возьмёт на себя все задачи по развёртыванию, освобождая пользователя от сложных процессов развёртывания распределённых RL-тренингов в кластере K8s.
  3. Надёжность. Используя механизм перезапуска пода в K8s, гарантируется автоматическое восстановление пода после неожиданного завершения работы, а координатор быстро реагирует и повторно подключается.
  4. Динамическое расширение. Количество коллекторов/учащихся/агрегаторов, необходимых для DIJob, может изменяться динамически. Поэтому di-server предоставляет HTTP-интерфейс для динамической настройки количества коллекторов и учащихся, позволяя DIJob регулировать соотношение коллекторов и учащихся в соответствии со своими потребностями и оптимизировать пропускную способность.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/opendilab-DI-orchestrator.git
git@api.gitlife.ru:oschina-mirror/opendilab-DI-orchestrator.git
oschina-mirror
opendilab-DI-orchestrator
opendilab-DI-orchestrator
main