Как запускать большие языковые модели на локальном сервере

Использование моделей OpenAI GPT возможно только через OpenAI API. Другими словами, вы должны поделиться своими данными с OpenAI, чтобы использовать их модели GPT.

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

По этим причинам вам может быть интересно запустить собственные модели GPT для локальной обработки ваших личных или деловых данных.

К счастью, существует множество альтернатив OpenAI GPT с открытым исходным кодом. Они пока не так хороши, как GPT-4, но вполне могут составить конкуренцию GPT-3.

Например, EleutherAI предлагает несколько моделей GPT: GPT-J, GPT-Neo и GPT-NeoX. Все они полностью задокументированы, открыты и находятся под лицензией, разрешающей коммерческое использование.

Эти модели также большие. Самый маленький, GPT-J, при сжатии занимает почти 10 Гб дискового пространства (6 миллиардов параметров). На некоторых машинах загрузка таких моделей может занять много времени. В идеале нам нужен был бы локальный сервер, на котором модель была бы полностью загружена в фоновом режиме и готова к использованию.

Один из способов сделать это — запустить GPT на локальном сервере с помощью специальной среды, такой как nVidia Triton (лицензия BSD-3). Примечание. Под сервером я не подразумеваю физическую машину. Triton — это всего лишь фреймворк, который можно установить на любую машину.

Triton с бэкендом FasterTransformer (лицензия Apache 2.0) управляет загрузкой процессора и графического процессора на всех этапах обработки запроса. Как только Triton разместит вашу модель GPT, каждое из ваших приглашений будет предварительно и постобработано FastTransformer оптимальным образом в зависимости от конфигурации вашего оборудования.

В этой статье я покажу вам, как обслуживать модель GPT-J для ваших приложений с помощью Triton Inference Server. Я выбрал GPT-J, потому что это одна из самых маленьких моделей GPT, одновременно производительная и пригодная для коммерческого использования (лицензия Apache 2.0).

Требования

Аппаратное обеспечение

Вам нужен как минимум один графический процессор с поддержкой CUDA 11 или выше. Мы будем использовать большую модель GPT-J, поэтому ваш графический процессор должен иметь не менее 12 ГБ видеопамяти.

Настройка сервера Triton и обработка модели также занимают значительное место на жестком диске. У вас должно быть не менее 50 ГБ свободного места.

OS

Вам нужна ОС UNIX, предпочтительно Ubuntu или Debian. Если у вас есть другая ОС UNIX, она тоже будет работать, но вам придется адаптировать все команды, загружающие и устанавливающие пакеты, к диспетчеру пакетов вашей ОС.

Я запускал все команды, представленные в этом руководстве, на Ubuntu 20.04 под WSL2. Примечание. Я столкнулся с некоторыми проблемами с WSL2, которые я объясню, но которых у вас может не быть, если вы используете родную Ubuntu.

Для некоторых команд вам потребуются привилегии «sudo».

Зависимости

FasterTransformer требует CMAKE для компиляции.

Существуют и другие зависимости, но при необходимости я предоставлю руководство по их установке в этом руководстве.

Настройка докер-контейнера для Triton

Мы будем использовать образ докера, уже подготовленный nVidia. Он предоставляется в специальной ветке «fastertransformer_backend».

Итак, сначала мы должны клонировать этот репозиторий и получить эту ветку.

git clone https://github.com/triton-inference-server/fastertransformer_backend.git
cd fastertransformer_backend && git checkout -b t5_gptj_blog remotes/origin/dev/t5_gptj_blog

Если у вас нет Docker, перейдите к концу этой статьи, где вы найдете краткое руководство по его установке.

Следующая команда создает докер для сервера Triton.

docker build --rm  --build-arg TRITON_VERSION=22.03 -t triton_with_ft:22.03 -f docker/Dockerfile .
cd ../

Он должен работать плавно. Примечание. В моем случае у меня было несколько проблем с ключами GPG, которые отсутствовали или были неправильно установлены. Если у вас есть похожая проблема, пишите в комментариях. Я буду рад помочь вам!

Затем мы можем запустить образ докера:

docker run -it --rm --gpus=all --shm-size=4G  -v $(pwd):/ft_workspace -p 8888:8888 triton_with_ft:22.03 bash

Если это удастся, вы увидите что-то вроде этого:

Примечание. Если вы видите ошибку «docker: Ошибка ответа от демона: не удалось выбрать драйвер устройства «» с возможностями: [[gpu]]., это может означать, что у вас не установлен контейнер nVidia. Инструкции по установке я привожу в конце статьи.

Не покидайте и не закрывайте этот контейнер: все остальные шаги должны выполняться внутри него.

Подготовьте GPT-J для FasterTransformer

Следующие шаги подготавливают модель GPT-J.

Нам нужно получить и настроить FasterTransformer. Примечание. Для этого шага вам понадобится CMAKE.

git clone https://github.com/NVIDIA/FasterTransformer.git

mkdir -p FasterTransformer/build && cd FasterTransformer/build
git submodule init && git submodule update
cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_MULTI_GPU=ON ..
#I put -j8 below because my CPU has 8 cores.
#Since this compilation can take some time, I recommend that you change this number to the number of cores your CPU has.
make -j8

Может потребоваться достаточно времени, чтобы выпить кофе ☕.

FasterTransformer используется для запуска модели внутри сервера Triton. Он может управлять предварительной и последующей обработкой ввода/вывода.

Теперь мы можем получить GPT-J:

cd ../../
mkdir models
wget https://the-eye.eu/public/AI/GPT-J-6B/step_383500_slim.tar.zstd
tar -axf step_383500_slim.tar.zstd -C ./models/  

Эта команда сначала загружает модель, а затем извлекает ее.

Это может занять достаточно времени, чтобы выпить две чашки кофе ☕☕или вздремнуть, если у вас нет высокоскоростного интернета. Для загрузки доступно около 10 ГБ.

Следующим шагом является преобразование весов модели в формат FasterTransformer.

cd models
pip install nvidia-cuda-nvcc
python3 ../FasterTransformer/examples/pytorch/gptj/utils/gptj_ckpt_convert.py --output-dir ./gptj6b_ckpt/ --ckpt-dir ./step_383500/ --n-inference-gpus 1

Я поставил «1» для «— n-inference-gpus», потому что у меня только 1 графический процессор, но если у вас есть больше, вы можете указать большее число. Примечание. Я добавил «nvidia-cuda-nvcc», потому что это было необходимо в моей среде. Возможно, он уже установлен у вас. Если у вас есть другие проблемы с другой библиотекой под названием «ptxas», оставьте комментарий, я отвечу на него.

Если вы столкнулись с ошибкой с предыдущей командой о «jax» или «jaxlib», следующая команда решила ее для меня:

pip install --upgrade "jax[cuda11_local]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

Оптимизация

Перед запуском сервера также рекомендуется запустить автонастройку ядра. Среди всех низкоуровневых алгоритмов он найдет лучший, учитывая архитектуру GPT-J и аппаратное обеспечение вашей машины. gpt_gemm сделает это:

./FasterTransformer/build/bin/gpt_gemm 8 1 32 12 128 6144 51200 1 2

Он должен создать файл с именем «gemm_config.in».

Конфигурация FasterTransformer

Теперь мы хотим настроить сервер для запуска GPT-J. Найдите и откройте следующий файл:

fastertransformer_backend/all_models/gptj/fastertransformer/config.pbtxt

Настройте параметр для вашего количества графических процессоров. Примечание. Оно должно совпадать с тем, которое вы указали с помощью «n-inference-gpus» при преобразовании весов GPT-J.

parameters {
  key: "tensor_para_size"
  value: {
    string_value: "1"
  }
}

Затем укажите, где найти GPT-J:

parameters {
  key: "model_checkpoint_path"
  value: {
    string_value: "./models/gptj6b_ckpt/1-gpu/"
  }
}

Запустите сервер Тритон

Чтобы запустить сервер Triton, выполните следующую команду: Примечание. Измените «CUDA_VISIBLE_DEVICES», чтобы установить идентификаторы ваших графических процессоров, например, «0,1», если у вас есть два графических процессора, которые вы хотели бы использовать.

CUDA_VISIBLE_DEVICES=0 /opt/tritonserver/bin/tritonserver  --model-repository=./triton-model-store/mygptj/ &

Если все работает правильно, вы увидите в своем терминале ожидающий сервер с 1 моделью, загруженной FasterTransformer.

Осталось создать клиент, который опрашивает сервер. Это может быть, например, ваше приложение, которое будет использовать модель GPT-J.

nVidia предоставляет пример клиента в:

fastertransformer_backend/tools/end_to_end_test.py

Этот сценарий может показаться довольно сложным, но он только подготавливает все аргументы и группирует ваши подсказки, а затем отправляет все на сервер, который отвечает за все остальное.

Измените переменную input0, чтобы она включала ваши подсказки. Он находится здесь:

Наконец, вы можете запустить этот сценарий, чтобы запросить ваш сервер Triton. Вы должны получить ответ быстро, так как модель уже полностью загружена и оптимизирована.

Вот и все! Теперь у вас есть все необходимое, чтобы начать использовать локальную модель GPT в своих приложениях.

Заключение

Шаги, описанные в этой статье, также применимы ко всем другим моделям, поддерживаемым FasterTransformer (за исключением определенных частей, которые вам придется адаптировать). Вы можете найти список здесь. Если модели, которую вы хотите использовать, нет в списке, она может работать, или вам придется изменить некоторые команды, которые я предоставляю.

Если в вашем распоряжении много графических процессоров, вы можете напрямую применить те же действия к моделям GPT-Neo*. Вам нужно будет только изменить config.pbtxt, чтобы адаптироваться к этим моделям. Примечание. Возможно, nVidia уже подготовила эти файлы конфигурации, поэтому перед созданием собственных файлов конфигурации загляните в репозиторий FasterTransformer.

Если вы хотите использовать T5 вместо модели GPT, вы можете посмотреть это руководство, написанное nVidia. Примечание. Руководство nVidia устарело, вам придется изменить некоторые команды.

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

Дальнейшие инструкции по установке отсутствующих зависимостей

Установка Докера (Ubuntu):

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

#Add the official GPG key
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

#Set up the repository
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" |  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#Update again
sudo apt-get update

#Then we can finally install docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#Optional: If you run Ubuntu under WSL2, you may need to start Docker manually
sudo service docker start

#If everything is properly installed, this should work
sudo docker run hello-world

Установка nvidia-container-toolkit (Ubuntu):

#Add the repository
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

#Get and install the nvidia container toolkit
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

#Restart docker
sudo systemctl restart docker

#or run "sudo service docker start" if you use WSL2