Сервер Rust, Python и gRPC для вывода текста. Используется в производстве Hugging Face для поддержки Hugging Chat, API вывода и конечной точки вывода.
Text Generation Inference (TGI) — это набор инструментов для развертывания и обслуживания больших языковых моделей (LLM). TGI обеспечивает высокопроизводительную генерацию текста для самых популярных LLM с открытым исходным кодом, включая Llama, Falcon, StarCoder, BLOOM, GPT-NeoX и других. TGI реализует множество функций, таких как:
Подробное руководство по началу работы см. в кратком обзоре. Самый простой способ начать — использовать официальный контейнер Docker:
model=HuggingFaceH4/zephyr-7b-beta
# share a volume with the Docker container to avoid downloading weights every run
volume= $PWD /data
docker run --gpus all --shm-size 1g -p 8080:80 -v $volume :/data
ghcr.io/huggingface/text-generation-inference:2.4.1 --model-id $model
И тогда вы можете делать такие запросы, как
curl 127.0.0.1:8080/generate_stream
-X POST
-d ' {"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":20}} '
-H ' Content-Type: application/json '
Вы также можете использовать API сообщений TGI для получения ответов, совместимых с API завершения чата Open AI.
curl localhost:8080/v1/chat/completions
-X POST
-d ' {
"model": "tgi",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "What is deep learning?"
}
],
"stream": true,
"max_tokens": 20
} '
-H ' Content-Type: application/json '
Примечание. Чтобы использовать графические процессоры NVIDIA, вам необходимо установить NVIDIA Container Toolkit. Мы также рекомендуем использовать драйверы NVIDIA с CUDA версии 12.2 или выше. Для запуска контейнера Docker на машине без графических процессоров или поддержки CUDA достаточно удалить флаг --gpus all
и добавить --disable-custom-kernels
. Обратите внимание, что процессор не является целевой платформой для этого проекта, поэтому производительность может быть некачественным.
Примечание. TGI поддерживает графические процессоры AMD Instinct MI210 и MI250. Подробности можно найти в документации по поддерживаемому оборудованию. Чтобы использовать графические процессоры AMD, используйте docker run --device /dev/kfd --device /dev/dri --shm-size 1g -p 8080:80 -v $volume:/data ghcr.io/huggingface/text-generation-inference:2.4.1-rocm --model-id $model
вместо приведенной выше команды.
Чтобы просмотреть все варианты обслуживания ваших моделей (в коде или в командной строке):
text-generation-launcher --help
Вы можете ознакомиться с документацией OpenAPI text-generation-inference
используя маршрут /docs
. Пользовательский интерфейс Swagger также доступен по адресу: https://huggingface.github.io/text-generation-inference.
У вас есть возможность использовать переменную среды HF_TOKEN
для настройки токена, используемого text-generation-inference
. Это позволяет получить доступ к защищенным ресурсам.
Например, если вы хотите обслуживать закрытые варианты модели Llama V2:
HF_TOKEN=
или с Докером:
model=meta-llama/Meta-Llama-3.1-8B-Instruct
volume= $PWD /data # share a volume with the Docker container to avoid downloading weights every run
token= < your cli READ token >
docker run --gpus all --shm-size 1g -e HF_TOKEN= $token -p 8080:80 -v $volume :/data ghcr.io/huggingface/text-generation-inference:2.4.1 --model-id $model
NCCL
— это коммуникационная среда, используемая PyTorch
для распределенного обучения/вывода. text-generation-inference
использует NCCL
, чтобы включить тензорный параллелизм и значительно ускорить вывод для больших языковых моделей.
Чтобы обмениваться данными между различными устройствами группы NCCL
, NCCL
может вернуться к использованию памяти хоста, если одноранговая связь с использованием NVLink или PCI невозможна.
Чтобы позволить контейнеру использовать 1 ГБ общей памяти и поддерживать совместное использование SHM, мы добавляем --shm-size 1g
в приведенную выше команду.
Если вы используете text-generation-inference
внутри Kubernetes
. Вы также можете добавить общую память в контейнер, создав том с помощью:
- name : shm
emptyDir :
medium : Memory
sizeLimit : 1Gi
и монтируем его в /dev/shm
.
Наконец, вы также можете отключить совместное использование SHM, используя переменную среды NCCL_SHM_DISABLE=1
. Однако учтите, что это повлияет на производительность.
text-generation-inference
оснащен распределенной трассировкой с использованием OpenTelemetry. Вы можете использовать эту функцию, задав адрес сборщика OTLP с аргументом --otlp-endpoint
. Имя службы по умолчанию можно переопределить с помощью аргумента --otlp-service-name
.
Подробный пост в блоге Адьена о внутренней работе TGI: выводы LLM в масштабе TGI (Мартин Иглесиас Гойанес - Адьен, 2024 г.)
Вы также можете выбрать установку text-generation-inference
локально.
Сначала установите Rust и создайте виртуальную среду Python с версией Python не ниже 3.9, например, используя conda
:
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
conda create -n text-generation-inference python=3.11
conda activate text-generation-inference
Вам также может потребоваться установить Protoc.
В Linux:
PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/ $PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local ' include/* '
rm -f $PROTOC_ZIP
В MacOS с использованием Homebrew:
brew install protobuf
Затем запустите:
BUILD_EXTENSIONS=True make install # Install repository and HF/transformer fork with CUDA kernels
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2
Примечание. На некоторых машинах вам также могут понадобиться библиотеки OpenSSL и gcc. На машинах Linux запустите:
sudo apt-get install libssl-dev gcc -y
Другой вариант — установить text-generation-inference
локально с помощью Nix. В настоящее время мы поддерживаем Nix только на Linux x86_64 с графическими процессорами CUDA. При использовании Nix все зависимости можно извлечь из двоичного кеша, что устраняет необходимость их локальной сборки.
Сначала следуйте инструкциям по установке Cachix и включению кэша TGI. Настройка кеша важна, иначе Nix создаст множество зависимостей локально, что может занять несколько часов.
После этого вы можете запустить TGI с помощью nix run
:
nix run . -- --model-id meta-llama/Llama-3.1-8B-Instruct
Примечание. Когда вы используете Nix в системе, отличной от NixOS, вам необходимо создать несколько символических ссылок, чтобы сделать библиотеки драйверов CUDA видимыми для пакетов Nix.
Для разработки TGI вы можете использовать impure
оболочку разработки:
nix develop . # impure
# Only needed the first time the devshell is started or after updating the protobuf.
(
cd server
mkdir text_generation_server/pb || true
python -m grpc_tools.protoc -I../proto/v3 --python_out=text_generation_server/pb
--grpc_python_out=text_generation_server/pb --mypy_out=text_generation_server/pb ../proto/v3/generate.proto
find text_generation_server/pb/ -type f -name " *.py " -print0 -exec sed -i -e ' s/^(import.*pb2)/from . 1/g ' {} ;
touch text_generation_server/pb/__init__.py
)
Все зависимости разработки (cargo, Python, Torch) и т. д. доступны в этой оболочке разработки.
TGI работает «из коробки», предоставляя оптимизированные модели для всех современных моделей. Их можно найти в этом списке.
Другие архитектуры поддерживаются по мере возможности с использованием:
AutoModelForCausalLM.from_pretrained(
или
AutoModelForSeq2SeqLM.from_pretrained(
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2
Вы также можете запускать предварительно квантованные веса (AWQ, GPTQ, Marlin) или квантовать веса «на лету» с битами и байтами, EETQ, fp8, чтобы уменьшить требования к VRAM:
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2 --quantize
Доступно 4-битное квантование с использованием типов данных NF4 и FP4 из битов и байтов. Его можно включить, указав --quantize bitsandbytes-nf4
или --quantize bitsandbytes-fp4
в качестве аргумента командной строки для text-generation-launcher
.
Подробнее о квантовании читайте в документации по квантованию.
make server-dev
make router-dev
# python
make python-server-tests
make python-client-tests
# or both server and client tests
make python-tests
# rust cargo tests
make rust-tests
# integration tests
make integration-tests