เซิร์ฟเวอร์ Rust, Python และ gRPC สำหรับการอนุมานการสร้างข้อความ ใช้ในการผลิตที่ Hugging Face เพื่อขับเคลื่อน Hugging Chat, Inference API และ Inference Endpoint
Text Generation Inference (TGI) เป็นชุดเครื่องมือสำหรับการปรับใช้และให้บริการ Large Language Models (LLM) TGI ช่วยให้การสร้างข้อความประสิทธิภาพสูงสำหรับ LLM โอเพ่นซอร์สที่ได้รับความนิยมสูงสุด รวมถึง Llama, Falcon, StarCoder, BLOOM, GPT-NeoX และอื่นๆ TGI ใช้คุณสมบัติมากมาย เช่น:
สำหรับคู่มือเริ่มต้นโดยละเอียด โปรดดูที่ Quick Tour วิธีเริ่มต้นที่ง่ายที่สุดคือการใช้คอนเทนเนอร์ 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 '
คุณยังสามารถใช้ Messages API ของ TGI เพื่อรับการตอบสนองที่เข้ากันได้กับ 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 เราขอแนะนำให้ใช้ไดรเวอร์ NVIDIA กับ CUDA เวอร์ชัน 12.2 หรือสูงกว่า สำหรับการรันคอนเทนเนอร์ Docker บนเครื่องที่ไม่มี GPU หรือ CUDA รองรับ ก็เพียงพอที่จะลบ --gpus all
flag และเพิ่ม --disable-custom-kernels
โปรดทราบว่า CPU ไม่ใช่แพลตฟอร์มที่มีไว้สำหรับโปรเจ็กต์นี้ ดังนั้นประสิทธิภาพ อาจจะต่ำกว่ามาตรฐาน
หมายเหตุ: TGI รองรับ GPU AMD Instinct MI210 และ MI250 รายละเอียดสามารถพบได้ในเอกสารประกอบฮาร์ดแวร์ที่รองรับ หากต้องการใช้ 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
แทนคำสั่งด้านบน
หากต้องการดูตัวเลือกทั้งหมดเพื่อรองรับโมเดลของคุณ (ในโค้ดหรือใน cli):
text-generation-launcher --help
คุณสามารถดูเอกสาร OpenAPI ของ REST API text-generation-inference
โดยใช้เส้นทาง /docs
Swagger UI ยังมีอยู่ที่: https://huggingface.github.io/text-genere-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
เพื่อเปิดใช้งาน Tensor Parallelism เพื่อเร่งความเร็วในการอนุมานอย่างมากสำหรับโมเดลภาษาขนาดใหญ่
เพื่อแบ่งปันข้อมูลระหว่างอุปกรณ์ต่างๆ ของกลุ่ม NCCL
นั้น NCCL
อาจถอยกลับไปใช้หน่วยความจำโฮสต์ หากไม่สามารถใช้เพียร์ทูเพียร์โดยใช้ NVLink หรือ PCI ได้
เพื่อให้คอนเทนเนอร์ใช้ 1G ของ Shared Memory และรองรับการแชร์ SHM เราได้เพิ่ม --shm-size 1g
ในคำสั่งด้านบน
หากคุณกำลังเรียกใช้ text-generation-inference
ภายใน Kubernetes
คุณยังสามารถเพิ่ม Shared Memory ไปยังคอนเทนเนอร์ได้โดยการสร้างโวลุ่มด้วย:
- name : shm
emptyDir :
medium : Memory
sizeLimit : 1Gi
และติดตั้งไปที่ /dev/shm
สุดท้าย คุณยังสามารถปิดใช้งานการแบ่งปัน SHM ได้โดยใช้ตัวแปรสภาพแวดล้อม NCCL_SHM_DISABLE=1
อย่างไรก็ตาม โปรดทราบว่าสิ่งนี้จะส่งผลต่อประสิทธิภาพการทำงาน
text-generation-inference
พร้อมกับการติดตามแบบกระจายโดยใช้ OpenTelemetry คุณสามารถใช้คุณลักษณะนี้ได้โดยการตั้งค่าที่อยู่เป็นตัวรวบรวม OTLP ด้วยอาร์กิวเมนต์ --otlp-endpoint
ชื่อบริการเริ่มต้นสามารถแทนที่ได้ด้วยอาร์กิวเมนต์ --otlp-service-name
บล็อกโพสต์โดยละเอียดโดย Adyen เกี่ยวกับผลงานภายในของ TGI: การอนุมาน LLM ในวงกว้างด้วย TGI (Martin Iglesias Goyanes - Adyen, 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 ด้วย
บนลินุกซ์:
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 บน x86_64 Linux ที่มี CUDA GPU เท่านั้น เมื่อใช้ Nix การขึ้นต่อกันทั้งหมดสามารถดึงมาจากแคชไบนารี่ได้ ทำให้ไม่จำเป็นต้องสร้างแคชเหล่านั้นในเครื่อง
ขั้นแรกให้ทำตามคำแนะนำเพื่อติดตั้ง Cachix และเปิดใช้งานแคช TGI การตั้งค่าแคชเป็นสิ่งสำคัญ ไม่เช่นนั้น Nix จะสร้างการขึ้นต่อกันจำนวนมากในเครื่อง ซึ่งอาจใช้เวลาหลายชั่วโมง
หลังจากนั้นคุณสามารถรัน TGI ด้วย nix run
:
nix run . -- --model-id meta-llama/Llama-3.1-8B-Instruct
หมายเหตุ: เมื่อคุณใช้ Nix บนระบบที่ไม่ใช่ NixOS คุณต้องสร้างลิงก์สัญลักษณ์เพื่อทำให้ไลบรารีไดรเวอร์ CUDA มองเห็นได้ในแพ็คเกจ Nix
สำหรับการพัฒนา TGI คุณสามารถใช้เชลล์ 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
)
การพึ่งพาการพัฒนาทั้งหมด (สินค้า, Python, คบเพลิง) ฯลฯ มีอยู่ในเชลล์ dev นี้
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
อ่านเพิ่มเติมเกี่ยวกับการหาปริมาณในเอกสารประกอบของ Quantization
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