テキスト生成推論用の Rust、Python、gRPC サーバー。 Hugging Face の実稼働環境で、Hugging Chat、推論 API、推論エンドポイントを強化するために使用されます。
Text Generation Inference (TGI) は、Large Language Model (LLM) を展開して提供するためのツールキットです。 TGI を使用すると、Llama、Falcon、StarCoder、BLOOM、GPT-NeoX などの最も一般的なオープンソース LLM の高性能テキスト生成が可能になります。 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 '
TGI の Messages API を使用して、Open AI Chat Completion API と互換性のある応答を取得することもできます。
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 GPU を使用するには、NVIDIA Container Toolkit をインストールする必要があります。また、CUDA バージョン 12.2 以降で NVIDIA ドライバーを使用することをお勧めします。 GPU または CUDA サポートのないマシンで Docker コンテナを実行するには、 --gpus all
フラグを削除して--disable-custom-kernels
を追加するだけで十分です。CPU はこのプロジェクトの対象プラットフォームではないため、パフォーマンスが低下することに注意してください。平均以下かもしれない。
注: TGI は、AMD Instinct MI210 および MI250 GPU をサポートしています。詳細については、サポートされているハードウェアのドキュメントを参照してください。 AMD GPU を使用するには、 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
使用してください。 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
上記のコマンドの代わりに。
モデルを提供するためのすべてのオプションを表示するには (コードまたは CLI で):
text-generation-launcher --help
/docs
ルートを使用して、 text-generation-inference
REST API の OpenAPI ドキュメントを参照できます。 Swagger UI は、https://huggingface.github.io/text-generation-inference からも入手できます。
text-generation-inference
で使用されるトークンを構成するためにHF_TOKEN
環境変数を利用するオプションがあります。これにより、保護されたリソースにアクセスできるようになります。
たとえば、ゲート付き Llama V2 モデル バリアントを提供する場合は、次のようにします。
HF_TOKEN=
または Docker を使用して:
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
を利用して Tensor Parallelism を有効にし、大規模な言語モデルの推論を劇的に高速化します。
NCCL
グループの異なるデバイス間でデータを共有するために、NVLink または PCI を使用したピアツーピアが不可能な場合、 NCCL
ホスト メモリの使用にフォールバックすることがあります。
コンテナーが 1G の共有メモリを使用して SHM 共有をサポートできるようにするには、上記のコマンドに--shm-size 1g
を追加します。
Kubernetes
内でtext-generation-inference
実行している場合。次の内容でボリュームを作成して、コンテナに共有メモリを追加することもできます。
- name : shm
emptyDir :
medium : Memory
sizeLimit : 1Gi
そしてそれを/dev/shm
にマウントします。
最後に、 NCCL_SHM_DISABLE=1
環境変数を使用して SHM 共有を無効にすることもできます。ただし、これはパフォーマンスに影響することに注意してください。
text-generation-inference
OpenTelemetry を使用した分散トレーシングが組み込まれています。この機能を使用するには、 --otlp-endpoint
引数を使用して OTLP コレクターにアドレスを設定します。デフォルトのサービス名は--otlp-service-name
引数で上書きできます。
TGI の内部動作に関する Adyen による詳細なブログ投稿: TGI を使用した大規模な LLM 推論 (Martin Iglesias Goyanes - Adyen、2024)
text-generation-inference
ローカルにインストールすることも選択できます。
まず Rust をインストールし、少なくとも Python 3.9 を使用して Python 仮想環境を作成します (例: 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
もう 1 つのオプションは、Nix を使用してtext-generation-inference
ローカルにインストールすることです。現在、CUDA GPU を搭載した x86_64 Linux 上の Nix のみをサポートしています。 Nix を使用すると、すべての依存関係をバイナリ キャッシュから取得できるため、依存関係をローカルで構築する必要がなくなります。
まず、指示に従って Cachix をインストールし、TGI キャッシュを有効にします。キャッシュを設定することは重要です。そうでないと、Nix は多くの依存関係をローカルに構築することになり、これには数時間かかる場合があります。
その後、 nix run
で TGI を実行できます。
nix run . -- --model-id meta-llama/Llama-3.1-8B-Instruct
注:非 NixOS システムで Nix を使用している場合は、いくつかのシンボリックリンクを作成して、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
VRAM 要件を削減するために、事前に量子化されたウェイト (AWQ、GPTQ、Marlin) を実行したり、bitsandbytes、EETQ、fp8 を使用してオンザフライでウェイトを量子化することもできます。
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2 --quantize
4 ビット量子化は、bitsandbytes の 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