Server Rust, Python, dan gRPC untuk inferensi pembuatan teks. Digunakan dalam produksi di Hugging Face untuk mendukung Hugging Chat, Inference API, dan Inference Endpoint.
Inferensi Pembuatan Teks (TGI) adalah perangkat untuk menerapkan dan menyajikan Model Bahasa Besar (LLM). TGI memungkinkan pembuatan teks berkinerja tinggi untuk LLM sumber terbuka paling populer, termasuk Llama, Falcon, StarCoder, BLOOM, GPT-NeoX, dan banyak lagi. TGI mengimplementasikan banyak fitur, seperti:
Untuk panduan awal yang terperinci, silakan lihat Tur Singkat. Cara termudah untuk memulai adalah menggunakan container Docker resmi:
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
Dan kemudian Anda dapat membuat permintaan seperti
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 '
Anda juga dapat menggunakan API Pesan TGI untuk mendapatkan respons yang kompatibel dengan 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 '
Catatan: Untuk menggunakan GPU NVIDIA, Anda perlu menginstal NVIDIA Container Toolkit. Kami juga merekomendasikan penggunaan driver NVIDIA dengan CUDA versi 12.2 atau lebih tinggi. Untuk menjalankan container Docker pada mesin tanpa dukungan GPU atau CUDA, cukup dengan menghapus flag --gpus all
dan menambahkan --disable-custom-kernels
, harap diperhatikan bahwa CPU bukanlah platform yang dimaksudkan untuk proyek ini, jadi performa mungkin di bawah standar.
Catatan: TGI mendukung GPU AMD Instinct MI210 dan MI250. Detailnya dapat ditemukan di dokumentasi Perangkat Keras yang Didukung. Untuk menggunakan GPU AMD, silakan gunakan 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
alih-alih perintah di atas.
Untuk melihat semua opsi untuk menayangkan model Anda (dalam kode atau di klien):
text-generation-launcher --help
Anda dapat melihat dokumentasi OpenAPI dari REST API text-generation-inference
menggunakan rute /docs
. UI Swagger juga tersedia di: https://huggingface.github.io/text-generasi-inference.
Anda memiliki opsi untuk menggunakan variabel lingkungan HF_TOKEN
untuk mengonfigurasi token yang digunakan oleh text-generation-inference
. Ini memungkinkan Anda mendapatkan akses ke sumber daya yang dilindungi.
Misal ingin menyajikan varian model gated Llama V2:
HF_TOKEN=
atau dengan 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
adalah kerangka komunikasi yang digunakan oleh PyTorch
untuk melakukan pelatihan/inferensi terdistribusi. text-generation-inference
memanfaatkan NCCL
untuk memungkinkan Paralelisme Tensor mempercepat inferensi secara dramatis untuk model bahasa besar.
Untuk berbagi data antara perangkat berbeda dalam grup NCCL
, NCCL
mungkin kembali menggunakan memori host jika penggunaan NVLink atau PCI secara peer-to-peer tidak memungkinkan.
Agar container dapat menggunakan Memori Bersama 1G dan mendukung berbagi SHM, kami menambahkan --shm-size 1g
pada perintah di atas.
Jika Anda menjalankan text-generation-inference
di dalam Kubernetes
. Anda juga dapat menambahkan Memori Bersama ke wadah dengan membuat volume menggunakan:
- name : shm
emptyDir :
medium : Memory
sizeLimit : 1Gi
dan memasangnya ke /dev/shm
.
Terakhir, Anda juga dapat menonaktifkan berbagi SHM dengan menggunakan variabel lingkungan NCCL_SHM_DISABLE=1
. Namun perlu diingat bahwa hal ini akan memengaruhi kinerja.
text-generation-inference
diinstrumentasi dengan penelusuran terdistribusi menggunakan OpenTelemetry. Anda dapat menggunakan fitur ini dengan mengatur alamat ke kolektor OTLP dengan argumen --otlp-endpoint
. Nama layanan default dapat diganti dengan argumen --otlp-service-name
Posting blog terperinci oleh Adyen tentang cara kerja TGI: Inferensi LLM dalam skala besar dengan TGI (Martin Iglesias Goyanes - Adyen, 2024)
Anda juga dapat memilih untuk menginstal text-generation-inference
secara lokal.
Pertama instal Rust dan buat lingkungan virtual Python dengan setidaknya Python 3.9, misalnya menggunakan 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
Anda mungkin juga perlu menginstal Protoc.
Di 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
Di MacOS, menggunakan Homebrew:
brew install protobuf
Kemudian jalankan:
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
Catatan: pada beberapa mesin, Anda mungkin juga memerlukan perpustakaan OpenSSL dan gcc. Di mesin Linux, jalankan:
sudo apt-get install libssl-dev gcc -y
Pilihan lainnya adalah menginstal text-generation-inference
secara lokal menggunakan Nix. Saat ini, kami hanya mendukung Nix di x86_64 Linux dengan GPU CUDA. Saat menggunakan Nix, semua dependensi dapat ditarik dari cache biner, sehingga menghilangkan kebutuhan untuk membangunnya secara lokal.
Pertama ikuti instruksi untuk menginstal Cachix dan mengaktifkan cache TGI. Menyiapkan cache itu penting, jika tidak, Nix akan membangun banyak dependensi secara lokal, yang bisa memakan waktu berjam-jam.
Setelah itu Anda dapat menjalankan TGI dengan nix run
:
nix run . -- --model-id meta-llama/Llama-3.1-8B-Instruct
Catatan: ketika Anda menggunakan Nix pada sistem non-NixOS, Anda harus membuat beberapa symlink agar pustaka driver CUDA terlihat oleh paket Nix.
Untuk pengembangan TGI, Anda dapat menggunakan shell dev 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
)
Semua dependensi pengembangan (cargo, Python, Torch), dll. tersedia di shell dev ini.
TGI bekerja dengan baik untuk menyajikan model yang dioptimalkan untuk semua model modern. Mereka dapat ditemukan di daftar ini.
Arsitektur lain didukung berdasarkan upaya terbaik menggunakan:
AutoModelForCausalLM.from_pretrained(
atau
AutoModelForSeq2SeqLM.from_pretrained(
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2
Anda juga dapat menjalankan bobot kuantisasi sebelumnya (AWQ, GPTQ, Marlin) atau bobot kuantisasi langsung dengan bitsandbytes, EETQ, fp8, untuk mengurangi persyaratan VRAM:
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2 --quantize
Kuantisasi 4bit tersedia menggunakan tipe data NF4 dan FP4 dari bitsandbytes. Ini dapat diaktifkan dengan menyediakan --quantize bitsandbytes-nf4
atau --quantize bitsandbytes-fp4
sebagai argumen baris perintah ke text-generation-launcher
.
Baca selengkapnya tentang kuantisasi di dokumentasi Kuantisasi.
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