Um servidor Rust, Python e gRPC para inferência de geração de texto. Usado na produção no Hugging Face para potencializar o Hugging Chat, a API Inference e o Inference Endpoint.
Text Generation Inference (TGI) é um kit de ferramentas para implantar e servir Large Language Models (LLMs). O TGI permite a geração de texto de alto desempenho para os LLMs de código aberto mais populares, incluindo Llama, Falcon, StarCoder, BLOOM, GPT-NeoX e muito mais. TGI implementa muitos recursos, como:
Para obter um guia inicial detalhado, consulte o Tour rápido. A maneira mais fácil de começar é usando o contêiner oficial do 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
E então você pode fazer solicitações como
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 '
Você também pode usar a API de mensagens do TGI para obter respostas compatíveis com a API Open AI Chat Completion.
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 '
Nota: Para usar GPUs NVIDIA, você precisa instalar o NVIDIA Container Toolkit. Também recomendamos o uso de drivers NVIDIA com CUDA versão 12.2 ou superior. Para executar o contêiner Docker em uma máquina sem suporte a GPUs ou CUDA, basta remover o sinalizador --gpus all
e adicionar --disable-custom-kernels
, observe que CPU não é a plataforma pretendida para este projeto, portanto, desempenho pode estar abaixo da média.
Nota: TGI suporta GPUs AMD Instinct MI210 e MI250. Detalhes podem ser encontrados na documentação de Hardware Suportado. Para usar GPUs AMD, use 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
em vez do comando acima.
Para ver todas as opções para atender seus modelos (no código ou no CLI):
text-generation-launcher --help
Você pode consultar a documentação OpenAPI da API REST text-generation-inference
usando a rota /docs
. A IU do Swagger também está disponível em: https://huggingface.github.io/text-generation-inference.
Você tem a opção de utilizar a variável de ambiente HF_TOKEN
para configurar o token empregado por text-generation-inference
. Isso permite que você obtenha acesso a recursos protegidos.
Por exemplo, se você deseja servir as variantes do modelo fechado Llama V2:
HF_TOKEN=
ou com 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
é uma estrutura de comunicação usada pelo PyTorch
para fazer treinamento/inferência distribuída. text-generation-inference
faz uso do NCCL
para permitir que o Paralelismo Tensor acelere drasticamente a inferência para grandes modelos de linguagem.
Para compartilhar dados entre os diferentes dispositivos de um grupo NCCL
, NCCL
pode voltar a usar a memória do host se o ponto a ponto usando NVLink ou PCI não for possível.
Para permitir que o contêiner use 1G de memória compartilhada e suporte ao compartilhamento SHM, adicionamos --shm-size 1g
ao comando acima.
Se você estiver executando text-generation-inference
dentro Kubernetes
. Você também pode adicionar memória compartilhada ao contêiner criando um volume com:
- name : shm
emptyDir :
medium : Memory
sizeLimit : 1Gi
e montá-lo em /dev/shm
.
Finalmente, você também pode desabilitar o compartilhamento SHM usando a variável de ambiente NCCL_SHM_DISABLE=1
. No entanto, observe que isso afetará o desempenho.
text-generation-inference
é instrumentada com rastreamento distribuído usando OpenTelemetry. Você pode usar esse recurso definindo o endereço para um coletor OTLP com o argumento --otlp-endpoint
. O nome do serviço padrão pode ser substituído pelo argumento --otlp-service-name
Postagem detalhada de Adyen sobre o funcionamento interno do TGI: inferência LLM em escala com TGI (Martin Iglesias Goyanes - Adyen, 2024)
Você também pode optar por instalar text-generation-inference
localmente.
Primeiro instale o Rust e crie um ambiente virtual Python com pelo menos Python 3.9, por exemplo, usando 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
Você também pode precisar instalar o Protoc.
No 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
No MacOS, usando Homebrew:
brew install protobuf
Então execute:
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
Nota: em algumas máquinas, você também pode precisar das bibliotecas OpenSSL e do gcc. Em máquinas Linux, execute:
sudo apt-get install libssl-dev gcc -y
Outra opção é instalar text-generation-inference
localmente usando Nix. Atualmente, oferecemos suporte apenas a Nix em Linux x86_64 com GPUs CUDA. Ao usar o Nix, todas as dependências podem ser extraídas de um cache binário, eliminando a necessidade de construí-las localmente.
Primeiro siga as instruções para instalar o Cachix e habilitar o cache TGI. Configurar o cache é importante, caso contrário o Nix construirá muitas das dependências localmente, o que pode levar horas.
Depois disso você pode executar o TGI com nix run
:
nix run . -- --model-id meta-llama/Llama-3.1-8B-Instruct
Nota: quando você estiver usando o Nix em um sistema não-NixOS, será necessário criar alguns links simbólicos para tornar as bibliotecas do driver CUDA visíveis para os pacotes Nix.
Para desenvolvimento TGI, você pode usar o 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
)
Todas as dependências de desenvolvimento (cargo, Python, Torch), etc. estão disponíveis neste shell de desenvolvimento.
O TGI funciona imediatamente para fornecer modelos otimizados para todos os modelos modernos. Eles podem ser encontrados nesta lista.
Outras arquiteturas são suportadas na base do melhor esforço usando:
AutoModelForCausalLM.from_pretrained(
ou
AutoModelForSeq2SeqLM.from_pretrained(
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2
Você também pode executar pesos pré-quantizados (AWQ, GPTQ, Marlin) ou quantizar pesos em tempo real com bitsandbytes, EETQ, fp8, para reduzir o requisito de VRAM:
text-generation-launcher --model-id mistralai/Mistral-7B-Instruct-v0.2 --quantize
A quantização de 4 bits está disponível usando os tipos de dados NF4 e FP4 de bits e bytes. Ele pode ser habilitado fornecendo --quantize bitsandbytes-nf4
ou --quantize bitsandbytes-fp4
como argumento de linha de comando para text-generation-launcher
.
Leia mais sobre quantização na documentação de quantização.
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