Машинное обучение, Программирование

Как я использую Docker для обучения ботов Rasa 2.1.x на графическом процессоре

Вступление

В этой статье я расскажу о подходе на основе Docker к использованию графического процессора для обучения чат-ботов, построенных на платформе Rasa 2.1.x.

Весь код для настройки окружения можно найти здесь.

Эта статья основывается на настройке, описанной в другой моей статье под названием Моя настройка кода VS для прототипирования чат-ботов Rasa, поэтому обязательно ознакомьтесь с ней, чтобы получить дополнительные сведения.

Мотивация

Обучение бота Rasa на GPU - популярный вопрос на форуме Rasa (например, см. Здесь, здесь, здесь и здесь). Распространенная проблема для правильной работы - это согласование установки TensorFlow с правильными драйверами NVIDIA.

Я предпочитаю решение на основе Docker, чтобы не возиться с конфигурацией моей машины. Я хочу, чтобы все мои драйверы обновлялись, и мне не приходилось переходить на более раннюю версию, чтобы я мог использовать библиотеку. Если вы находитесь в одном лагере, то надеюсь, эта статья будет вам полезна.

Предпосылки

Само собой разумеется, что вам понадобится машина с установленным графическим процессором NVIDIA. Вам также потребуются Docker, docker-compose и установленный NVIDIA Container Toolkit. Машина, которую я буду использовать в этой статье, представляет собой экземпляр AWS EC2 со следующими характеристиками:

  • Тип экземпляра: g4dn.xlarge
  • AMI: Deep Learning AMI (Ubuntu 18.04), версия 38.0
  • Графический процессор: NVIDIA Tesla T4

Это версии docker и docker-compose, которые я установил:

Чтобы убедиться, что у вас все настроено правильно, вы можете запустить эту команду:

docker run --gpus all --rm nvidia/cuda nvidia-smi

Это должно дать вам распечатку деталей графического процессора на вашем хост-компьютере. Например, на моей машине это:

Установка

Обзор

Как и раньше, у нас будет файл компоновки докеров, который описывает сервер Rasa и сервер действий. Спецификация для сервера действий останется прежней, в то время как сервер rasa будет обновлен, чтобы он мог использовать графический процессор хоста.

Как только это будет сделано, мы можем использовать docker compose для вызова сервера rasa для выполнения обучающей команды, то есть rasa train.

Определение образа сервера Rasa

Давайте создадим файл с именем gpu.Dockerfile, который будет описывать контейнер, который будет использоваться в качестве сервера rasa. Этих двух строк достаточно:

На рисунке 1 показано, что нужно взять образ версии TensorFlow 2.3.1 для графического процессора и установить в него Rasa 2.1.3. Мы создаем этот конкретный образ TensorFlow, потому что это версия, используемая Rasa 2.1.3, и в этом образе правильно установлены все необходимые драйверы.

Определение службы сервера Rasa

Вот как была определена служба сервера rasa в docker-compsose.yml в предыдущей статье:

По сути, мы извлекаем последнее изображение rasa (мы также можем указать конкретную версию) и используем это изображение как есть в качестве сервера rasa.

Чтобы включить поддержку графического процессора, нам необходимо изменить определение службы сервера rasa следующим образом:

Теперь служба сервера rasa будет построена на основе gpu.Dockerfile, которые мы определили в предыдущем разделе и использовали среду выполнения NVIDIA (строка 8).

Обучение

Выполнив предыдущие шаги, мы можем выполнить следующую команду для обучения бота:

Команда на рисунке 4 вызовет подключение службы rasa-server только для выполнения команды rasa train. По окончании обучения контейнер раса-сервера будет удален.

Результат обучения будет сохранен в папке models.

Одним из недостатков этого метода является то, что право собственности на папку models будет передано пользователю и группе root после обучения. К счастью, для исправления достаточно запустить эту команду:

Если вы регулярно делаете это, вы можете определить задачу VS Code, которая автоматически переназначит права доступа к папке после завершения обучения:

Контрольные точки

У меня был бот, которому требовалось около 80 минут для обучения на инстансе z1d.large EC2. Этому же боту потребовалось всего 10 минут для обучения на инстансе EC2 g4dn.xlarge.

На момент написания статьи стоимость Linux по требованию для инстансов z1d.large и g4d.xlarge составляла 0,186 доллара США в час и 0,526 доллара США в час соответственно.

Таким образом, g4dn.xlarge - явный победитель с точки зрения общей стоимости и времени обучения.

При этом я не уверен, какой экземпляр ЦП подходит для сравнения с экземпляром g4dn.xlarge. Дайте мне знать в комментариях, что вы думаете.

Заключение

В этой статье описан способ обучения ботов, созданных на платформе Rasa 2.1.x, на графическом процессоре с использованием контейнеров Docker. Надеюсь, вы нашли это полезным.