Развертывание GPT-NeoX 20B в производстве и фокус на Deepspeed

Развертывание GPT-NeoX 20B в производстве - непростая задача, и мы в NLP Cloud узнали об этом на собственном опыте... В этой статье мы расскажем вам о нескольких хитростях, связанных с использованием GPT-NeoX 20B, и особенно о том, как работать с DeepSpeed в производстве.

GPT-NeoX

GPT-NeoX 20B

GPT-NeoX 20B - самая большая модель обработки естественного языка с открытым исходным кодом на момент написания этой статьи.

Он был выпущен компанией EleutherAI 2 недели назад. Она была обучена на 20 миллиардах параметров после 1 года напряженной работы, полной трудностей. Одной из главных трудностей, похоже, была возможность установить правильную параллельную архитектуру, чтобы модель можно было эффективно обучать на нескольких GPU.

Их предыдущая модель, GPT-J, обучалась на TPU Google и была разработана для использования на TPU. Внутренняя архитектура GPT-NeoX 20B радикально отличается и предназначена для использования на графических процессорах. Идея заключается в том, что она должна стать первой в серии еще более крупных моделей (цель - догнать GPT-3).

GPT-NeoX 20 - это модель генерации текста, что означает, что она может писать текст за вас и фактически достигать практически любых целей обработки естественного языка с высокой точностью: генерация сообщений в блогах, чат-боты, классификация текста, анализ настроений, извлечение ключевых слов, генерация кода, извлечение сущностей, классификация намерений, ответы на вопросы и многое другое...

Несомненно, многие исследователи и компании будут использовать эту новую модель и получат отличные результаты. Но есть проблема: как развернуть GPT-NeoX 20B?

Требования к оборудованию

Первая проблема, с которой сталкиваются при попытке развернуть GPT-NeoX 20B на производстве, - это передовое оборудование, которое для этого требуется.

GPT-J все еще можно было развернуть на потребительском оборудовании, даже если оно было очень дорогим. Например, его можно было развернуть на очень хорошем CPU (даже если результат был мучительно медленным) или на продвинутом игровом GPU, таком как NVIDIA RTX 3090. Но GPT-NeoX 20B настолько велик, что это уже невозможно.

В основном GPT-NeoX требует не менее 42 ГБ VRAM и 40 ГБ дискового пространства (и да, мы говорим о тонкой версии fp16). Немногие графические процессоры соответствуют этим требованиям. Основными являются NVIDIA A100, A40 и RTX A6000.

Эти графические процессоры не только очень дороги, но и трудно достать их в наши дни из-за глобального дефицита полупроводников.

Лучшим решением здесь является архитектура с несколькими GPU.

Multi-GPU с Deepspeed

Если вы не можете разместить свою модель на одном GPU, вы можете попробовать разделить ее на несколько GPU.

Это интересный вариант по двум причинам. Во-первых, горизонтальное масштабирование инфраструктуры часто обходится дешевле, чем вертикальное. Это верно для серверов, и это верно для GPU тоже. Во-вторых, легче получить в свое распоряжение несколько небольших GPU, таких как NVIDIA Tesla T4, чем большие GPU, такие как NVIDIA A40.

К сожалению, разделение модели машинного обучения на несколько GPU является сложной технической задачей. Hugging Face подготовил отличную статью о параллелизме моделей и выборе, который у вас есть. Читайте ее здесь. Но, к счастью, компания EleutherAI разработала GPT-NeoX 20B таким образом, что он легко распараллеливается на нескольких GPU, будь то обучение или вывод.

Архитектура GPT-NeoX основана на Deepspeed. Deepspeed - это фреймворк от Microsoft, который изначально был разработан для распараллеливания тренировок на нескольких GPU, но он все чаще используется и для выводов. EleutherAI проделала всю тяжелую работу, поэтому распараллелить GPT-NeoX так же просто, как изменить число в конфигурационном файле.

Параллелизм GPT-NeoX
Extract from the GPT-NeoX docs about parallelism

Однако развернуть Deepspeed в производстве для онлайновых выводов через API сложно... Deepspeed не был разработан для легкой интеграции в веб-серверы. В NLP Cloud мы узнали об этом нелегким путем, но после напряженной работы нам наконец удалось придумать эффективный способ заставить Deepspeed и GPT-NeoX работать с нашим API.

Приемы использования

Итак, предположим, что вам удалось установить соответствующее оборудование и правильно развернуть GPT-NeoX 20B с помощью Deepspeed. Теперь есть несколько предостережений, о которых вы должны знать.

Во-первых, по сравнению с GPT-J, параметры (top k, top p и температура) не оказывают одинакового влияния на модель. Поэтому, если вам удалось найти хорошую конфигурацию для GPT-J, не принимайте это как должное: вам придется провести новые тесты с GPT-NeoX.

И последнее, даже если размер входных данных может быть увеличен до 2048 токенов, это потребует больше памяти, чем базовые 42 ГБ, упомянутые выше...

Пакетный вывод?

Модели GPT довольно медленные, и GPT-NeoX 20B не является исключением. Поэтому, чтобы повысить пропускную способность вашего приложения, возможно, вам стоит поработать над решением для пакетного вывода.

На данный момент мы не нашли хорошего решения для этого в NLP Cloud.

Код GPT-NeoX сделан таким образом, что можно выполнять несколько выводов одновременно в рамках одного запроса. Но в наших тестах время отклика росло линейно с количеством выводов, что в некотором смысле сводит на нет цель пакетного вывода...

Заключение

GPT-NeoX 20B определенно трудно внедрить в производство. Качество генерации текста потрясающее, но мало у кого будет возможность реально установить эту модель.

Сейчас, как никогда ранее, кажется, что для использования этой модели необходимо полагаться на облачный сервис, такой как NLP Cloud.

Если у вас есть отзывы об этой статье, пожалуйста, не стесняйтесь связаться с нами, будет здорово услышать ваше мнение об этом!

Julien Salinas
Технический директор NLP Cloud