Как запускать большие языковые модели на локальном сервере
Использование моделей 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