Ein Rust-, Python- und gRPC-Server für die Inferenz der Textgenerierung. Wird in der Produktion bei Hugging Face verwendet, um Hugging Chat, die Inference API und den Inference Endpoint zu betreiben.
Text Generation Inference (TGI) ist ein Toolkit für die Bereitstellung und Bereitstellung von Large Language Models (LLMs). TGI ermöglicht eine leistungsstarke Textgenerierung für die beliebtesten Open-Source-LLMs, darunter Llama, Falcon, StarCoder, BLOOM, GPT-NeoX und mehr. TGI implementiert viele Funktionen, wie zum Beispiel:
Eine detaillierte Startanleitung finden Sie in der Quick Tour. Der einfachste Einstieg ist die Verwendung des offiziellen Docker-Containers:
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
Und dann können Sie Anfragen stellen wie
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 '
Sie können auch die Nachrichten-API von TGI verwenden, um mit der Open AI Chat Completion API kompatible Antworten zu erhalten.
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 '
Hinweis: Um NVIDIA-GPUs verwenden zu können, müssen Sie das NVIDIA Container Toolkit installieren. Wir empfehlen außerdem die Verwendung von NVIDIA-Treibern mit CUDA Version 12.2 oder höher. Um den Docker-Container auf einer Maschine ohne GPUs oder CUDA-Unterstützung auszuführen, reicht es aus, das Flag --gpus all
zu entfernen und --disable-custom-kernels
hinzuzufügen. Bitte beachten Sie, dass die CPU nicht die vorgesehene Plattform für dieses Projekt ist, also die Leistung könnte unterdurchschnittlich sein.
Hinweis: TGI unterstützt AMD Instinct MI210- und MI250-GPUs. Einzelheiten finden Sie in der Dokumentation zur unterstützten Hardware. Um AMD-GPUs zu verwenden, verwenden Sie bitte 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
anstelle des obigen Befehls.
So sehen Sie alle Optionen zur Bereitstellung Ihrer Modelle (im Code oder in der CLI):
text-generation-launcher --help
Sie können die OpenAPI-Dokumentation der text-generation-inference
REST-API über die Route /docs
einsehen. Die Swagger-Benutzeroberfläche ist auch verfügbar unter: https://huggingface.github.io/text-generation-inference.
Sie haben die Möglichkeit, die Umgebungsvariable HF_TOKEN
zum Konfigurieren des von text-generation-inference
verwendeten Tokens zu verwenden. Dadurch erhalten Sie Zugriff auf geschützte Ressourcen.
Wenn Sie beispielsweise die geschlossenen Llama V2-Modellvarianten bedienen möchten:
HF_TOKEN=
oder mit 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
ist ein Kommunikationsframework, das von PyTorch
für verteiltes Training/Inferenz verwendet wird. text-generation-inference
nutzt NCCL
, um Tensor-Parallelität zu ermöglichen und die Inferenz für große Sprachmodelle erheblich zu beschleunigen.
Um Daten zwischen den verschiedenen Geräten einer NCCL
-Gruppe auszutauschen, greift NCCL
möglicherweise auf die Verwendung des Hostspeichers zurück, wenn Peer-to-Peer mit NVLink oder PCI nicht möglich ist.
Damit der Container 1 GB Shared Memory nutzen und die SHM-Freigabe unterstützen kann, fügen wir dem obigen Befehl --shm-size 1g
hinzu.
Wenn Sie text-generation-inference
in Kubernetes
ausführen. Sie können dem Container auch Shared Memory hinzufügen, indem Sie ein Volume erstellen mit:
- name : shm
emptyDir :
medium : Memory
sizeLimit : 1Gi
und mounten Sie es in /dev/shm
.
Schließlich können Sie die SHM-Freigabe auch mithilfe der Umgebungsvariablen NCCL_SHM_DISABLE=1
deaktivieren. Beachten Sie jedoch, dass dies Auswirkungen auf die Leistung hat.
text-generation-inference
wird mit verteilter Ablaufverfolgung mithilfe von OpenTelemetry instrumentiert. Sie können diese Funktion nutzen, indem Sie die Adresse mit dem Argument --otlp-endpoint
auf einen OTLP-Kollektor festlegen. Der Standarddienstname kann mit dem Argument --otlp-service-name
überschrieben werden
Ausführlicher Blogbeitrag von Adyen über das Innenleben von TGI: LLM-Inferenz im Maßstab mit TGI (Martin Iglesias Goyanes – Adyen, 2024)
Sie können text-generation-inference
auch lokal installieren.
Installieren Sie zunächst Rust und erstellen Sie eine virtuelle Python-Umgebung mit mindestens Python 3.9, z. B. mit 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
Möglicherweise müssen Sie auch Protoc installieren.
Unter 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
Unter MacOS mit Homebrew:
brew install protobuf
Führen Sie dann Folgendes aus:
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
Hinweis: Auf einigen Computern benötigen Sie möglicherweise auch die OpenSSL-Bibliotheken und gcc. Führen Sie auf Linux-Rechnern Folgendes aus:
sudo apt-get install libssl-dev gcc -y
Eine andere Möglichkeit besteht darin text-generation-inference
lokal mit Nix zu installieren. Derzeit unterstützen wir Nix nur auf x86_64 Linux mit CUDA-GPUs. Bei Verwendung von Nix können alle Abhängigkeiten aus einem Binärcache abgerufen werden, sodass sie nicht mehr lokal erstellt werden müssen.
Befolgen Sie zunächst die Anweisungen, um Cachix zu installieren und den TGI-Cache zu aktivieren. Das Einrichten des Caches ist wichtig, da Nix sonst viele der Abhängigkeiten lokal erstellt, was Stunden dauern kann.
Danach können Sie TGI mit nix run
ausführen:
nix run . -- --model-id meta-llama/Llama-3.1-8B-Instruct
Hinweis: Wenn Sie Nix auf einem Nicht-NixOS-System verwenden, müssen Sie einige Symlinks erstellen, um die CUDA-Treiberbibliotheken für Nix-Pakete sichtbar zu machen.
Für die TGI-Entwicklung können Sie die impure
Dev-Shell verwenden:
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
)
Alle Entwicklungsabhängigkeiten (Cargo, Python, Torch) usw. sind in dieser Entwicklungsshell verfügbar.
TGI ist sofort einsatzbereit, um optimierte Modelle für alle modernen Modelle bereitzustellen. Sie finden sie in dieser Liste.
Andere Architekturen werden nach bestem Wissen und Gewissen unterstützt durch:
AutoModelForCausalLM.from_pretrained(
oder
AutoModelForSeq2SeqLM.from_pretrained(
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2
Sie können auch vorquantisierte Gewichte (AWQ, GPTQ, Marlin) ausführen oder Gewichte im laufenden Betrieb mit Bitsandbytes, EETQ, fp8 quantisieren, um den VRAM-Bedarf zu reduzieren:
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2 --quantize
Die 4-Bit-Quantisierung ist mit den Datentypen NF4 und FP4 von bitsandbytes verfügbar. Es kann aktiviert werden, indem --quantize bitsandbytes-nf4
oder --quantize bitsandbytes-fp4
als Befehlszeilenargument für text-generation-launcher
bereitgestellt wird.
Weitere Informationen zur Quantisierung finden Sie in der Quantisierungsdokumentation.
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