Construindo uma API LLM de Alto Desempenho e Pronta para Produção com FastAPI: Um Guia Passo a Passo
Construindo uma API LLM de Alto Desempenho e Pronta para Produção com FastAPI: Um Guia Passo a Passo
FastAPI, como um framework Web Python moderno e de alto desempenho, é popular devido à sua facilidade de uso, velocidade e documentação de API gerada automaticamente. Especialmente na construção de APIs de backend para aplicações LLM (Large Language Model), o FastAPI demonstra uma forte vantagem. Este artigo irá ensiná-lo passo a passo como construir uma API LLM pronta para produção usando FastAPI e explorar algumas das melhores práticas.
Por que escolher FastAPI?
Ao construir a API de uma aplicação LLM, o FastAPI oferece as seguintes vantagens principais:
- Alto desempenho: Baseado em ASGI, o FastAPI pode lidar com solicitações de alta concorrência, o que é crucial para aplicações LLM que exigem respostas rápidas.
- Suporte assíncrono: O FastAPI possui suporte integrado para as palavras-chave
asynceawait, o que facilita o tratamento de operações assíncronas, como chamar a inferência LLM, evitando o bloqueio da thread principal. - Documentação automática da API: O FastAPI usa OpenAPI e JSON Schema para gerar automaticamente documentação de API interativa (Swagger UI), facilitando para os desenvolvedores testar e usar sua API.
- Validação de dados: O FastAPI usa Pydantic para validação de dados, garantindo a correção dos parâmetros de solicitação e reduzindo erros.
- Injeção de dependência: O sistema de injeção de dependência do FastAPI facilita o gerenciamento e o compartilhamento de recursos, como modelos LLM.
- Comunidade ativa: O FastAPI possui uma comunidade grande e ativa, onde você pode obter recursos e suporte abundantes.
Preparação
-
Instale o Python: Certifique-se de ter o Python 3.7 ou superior instalado.
-
Instale FastAPI e Uvicorn: Use pip para instalar FastAPI e Uvicorn (servidor ASGI):
pip install fastapi uvicorn -
Escolha um modelo LLM: Escolha o modelo LLM que você deseja usar. Pode ser um modelo da OpenAI ou um modelo de código aberto, como o TinyLlama. Se você escolher OpenAI, precisará obter uma chave de API da OpenAI. Se você escolher TinyLlama, precisará baixar o arquivo do modelo.
Passo 1: Criar uma aplicação FastAPI
Crie um arquivo chamado main.py e adicione o seguinte código:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="LLM API", description="A simple API for interacting with LLMs.")
class InputText(BaseModel):
text: str
class OutputText(BaseModel):
generated_text: str
Este código define uma aplicação FastAPI e define dois modelos Pydantic: InputText para receber texto de entrada e OutputText para retornar o texto gerado.
Passo 2: Adicionar lógica de inferência LLM
Dependendo do modelo LLM que você escolher, adicione a lógica de inferência correspondente. Aqui, usaremos a API OpenAI como exemplo:
import openai
import os
# Obtenha a chave da API OpenAI
openai.api_key = os.environ.get("OPENAI_API_KEY") # Recomenda-se usar variáveis de ambiente
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Gera texto baseado no texto de entrada usando OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # Seleciona o modelo
prompt=input_text.text,
max_tokens=150,
n=1,
stop=None,
temperature=0.7,
)
generated_text = response.choices[0].text.strip()
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Este código define uma rota /generate que recebe um objeto InputText como entrada, chama a API OpenAI para gerar texto e retorna o texto gerado como um objeto OutputText. Observe que você deve substituir text-davinci-003 pelo modelo apropriado de sua escolha.
Se você estiver usando um modelo local como o TinyLlama, você precisa instalar as bibliotecas correspondentes, como transformers, e carregar o modelo na memória. Um exemplo de código é mostrado abaixo:
from transformers import pipeline
import torch
generator = pipeline('text-generation', model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", torch_dtype=torch.bfloat16, device_map="auto")
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Gera texto baseado no texto de entrada usando TinyLlama.
"""
try:
generated_text = generator(input_text.text, max_length=50, do_sample=True, temperature=0.7)[0]['generated_text']
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Passo 3: Executando a aplicação FastAPI
Use Uvicorn para executar a aplicação FastAPI:
uvicorn main:app --reload
```Isso iniciará um servidor local, e você pode acessar `http://127.0.0.1:8000/docs` no seu navegador para ver a documentação da API gerada automaticamente. O parâmetro `--reload` pode reiniciar o servidor automaticamente após as modificações no código, o que facilita o desenvolvimento.
## Passo 4: Testar a API
Use a documentação da API ou ferramentas como curl para testar sua API. Por exemplo, use curl para enviar uma requisição POST:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
Você deverá receber uma resposta JSON contendo o texto gerado.
Passo 5: Implantação em Produção
Implante sua aplicação FastAPI em um ambiente de produção, por exemplo:
- Docker: Use Docker para containerizar sua aplicação, facilitando a implantação e o gerenciamento.
- Plataforma de Nuvem: Implante em uma plataforma de nuvem, como AWS, Google Cloud Platform ou Azure. O Azure Cosmos DB e o Azure Functions mencionados no texto podem ser usados para construir uma API serverless. Modal também pode ser usado para implantar aplicações FastAPI com escalonamento automático.
- Servidor: Implante em seu próprio servidor.
Melhores Práticas
- Use variáveis de ambiente para armazenar informações sensíveis: Não coloque informações sensíveis, como chaves de API, diretamente no código. Em vez disso, use variáveis de ambiente.
- Adicione registro de logs: Use o módulo de registro de logs para registrar o status de execução da API, facilitando a depuração e o monitoramento.
- Adicione tratamento de erros: Use blocos
try...exceptpara tratar possíveis exceções e retornar mensagens de erro apropriadas. - Limitação de taxa: Use um limitador de taxa para evitar o uso indevido da API. O FastAPI possui algumas bibliotecas de limitação de taxa prontas para uso.
- Cache: Para requisições repetidas, você pode usar cache para melhorar o desempenho.
- Monitoramento: Use ferramentas de monitoramento para monitorar o desempenho e a disponibilidade da API.
Dicas Avançadas
- Processamento assíncrono: Para inferência de LLM demorada, use as palavras-chave
asynceawaitpara processamento assíncrono, evitando o bloqueio da thread principal. - Resposta em fluxo: Usar resposta em fluxo (StreamingResponse) pode retornar o texto gerado em tempo real, melhorando a experiência do usuário.
- Multithreading/Multiprocessing: Para inferência de LLM intensiva em CPU, você pode usar multithreading ou multiprocessing para melhorar o desempenho.
- Aceleração por GPU: Se o seu modelo LLM suportar aceleração por GPU, você pode usar CUDA ou outras bibliotecas de aceleração por GPU para aumentar a velocidade de inferência.





