Bruke FastAPI for å bygge en høyytelses, produksjonsklar LLM API: En trinnvis veiledning
Bruke FastAPI for å bygge en høyytelses, produksjonsklar LLM API: En trinnvis veiledning
FastAPI, som et moderne, høyytelses Python Web-rammeverk, er populært for sin brukervennlighet, hastighet og automatisk genererte API-dokumentasjon. Spesielt når det gjelder å bygge backend-API-er for LLM (Large Language Model) applikasjoner, viser FastAPI en sterk fordel. Denne artikkelen vil trinnvis lære deg hvordan du bruker FastAPI til å bygge en produksjonsklar LLM API, og utforske noen beste praksiser.
Hvorfor velge FastAPI?
Når du bygger API-er for LLM-applikasjoner, gir FastAPI følgende viktige fordeler:
- Høy ytelse: Basert på ASGI kan FastAPI håndtere høye samtidige forespørsler, noe som er avgjørende for LLM-applikasjoner som krever rask respons.
- Asynkron støtte: FastAPI har innebygd støtte for
asyncogawaitnøkkelordene, som enkelt kan håndtere asynkrone operasjoner, for eksempel å kalle LLM-inferens, og unngå å blokkere hovedtråden. - Automatisk API-dokumentasjon: FastAPI bruker OpenAPI og JSON Schema for automatisk å generere interaktiv API-dokumentasjon (Swagger UI), som gjør det enkelt for utviklere å teste og bruke API-et ditt.
- Datavalidering: FastAPI bruker Pydantic for datavalidering, og sikrer at forespørselsparametrene er korrekte, og reduserer feil.
- Avhengighetsinjeksjon: FastAPIs avhengighetsinjeksjonssystem kan enkelt administrere og dele ressurser, for eksempel LLM-modeller.
- Aktivt fellesskap: FastAPI har et stort og aktivt fellesskap, og du kan få rikelig med ressurser og støtte.
Forberedelser
-
Installer Python: Sørg for at du har installert Python 3.7 eller nyere.
-
Installer FastAPI og Uvicorn: Bruk pip til å installere FastAPI og Uvicorn (ASGI-server):
pip install fastapi uvicorn -
Velg LLM-modell: Velg LLM-modellen du vil bruke. Det kan være en OpenAI-modell, eller en åpen kildekode-modell, for eksempel TinyLlama. Hvis du velger OpenAI, må du skaffe deg en OpenAI API-nøkkel. Hvis du velger TinyLlama, må du laste ned modellfilen.
Trinn 1: Opprett en FastAPI-applikasjon
Opprett en fil med navnet main.py, og legg til følgende kode:
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
Denne koden definerer en FastAPI-applikasjon og definerer to Pydantic-modeller: InputText brukes til å motta inndatatekst, og OutputText brukes til å returnere generert tekst.
Trinn 2: Legg til LLM-inferenslogikk
Legg til den tilsvarende inferenslogikken basert på LLM-modellen du velger. Her er et eksempel på bruk av OpenAI API:
import openai
import os
# Hent OpenAI API-nøkkel
openai.api_key = os.environ.get("OPENAI_API_KEY") # Anbefales å bruke miljøvariabler
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Genererer tekst basert på inndatateksten ved hjelp av OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # Velg modell
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))
Denne koden definerer en /generate-rute som mottar et InputText-objekt som input, kaller OpenAI API for å generere tekst, og returnerer den genererte teksten som et OutputText-objekt. Husk å erstatte text-davinci-003 med den modellen du velger.
Hvis du bruker lokale modeller som TinyLlama, må du installere de tilhørende bibliotekene, for eksempel transformers, og laste modellen inn i minnet. Kodeeksempel som følger:
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):
"""
Genererer tekst basert på inndatateksten ved hjelp av 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))
Steg 3: Kjør FastAPI-applikasjonen
Kjør FastAPI-applikasjonen med Uvicorn:
uvicorn main:app --reload
```Dette vil starte en lokal server, og du kan besøke `http://127.0.0.1:8000/docs` i nettleseren din for å se den automatisk genererte API-dokumentasjonen. `--reload`-parameteren kan automatisk starte serveren på nytt etter at koden er endret, noe som er praktisk for utvikling.
## Steg 4: Test API
Bruk API-dokumentasjonen eller verktøy som curl for å teste API-et ditt. For eksempel, bruk curl til å sende en POST-forespørsel:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
Du bør motta et JSON-svar som inneholder den genererte teksten.
Steg 5: Produksjonsdistribusjon
Distribuer FastAPI-applikasjonen din til et produksjonsmiljø, for eksempel:
- Docker: Bruk Docker til å containerisere applikasjonen din, noe som gjør det enkelt å distribuere og administrere.
- Skyplattform: Distribuer til en skyplattform, for eksempel AWS, Google Cloud Platform eller Azure. Azure Cosmos DB og Azure Functions som er nevnt i artikkelen kan brukes til å bygge serverless API-er. Modal kan også brukes til å distribuere automatisk skalerende FastAPI-applikasjoner.
- Server: Distribuer til din egen server.
Beste praksis
- Bruk miljøvariabler for å lagre sensitiv informasjon: Ikke hardkod sensitiv informasjon som API-nøkler i koden din, men bruk heller miljøvariabler.
- Legg til logging: Bruk loggingsmodulen til å registrere driftsstatusen til API-et, noe som er praktisk for feilsøking og overvåking.
- Legg til feilhåndtering: Bruk
try...except-blokker for å håndtere mulige unntak og returnere passende feilmeldinger. - Hastighetsbegrensning: Bruk en hastighetsbegrenser for å forhindre misbruk av API-et. Det finnes noen ferdige hastighetsbegrensningsbiblioteker tilgjengelig for FastAPI.
- Cache: For gjentatte forespørsler kan du bruke cache for å forbedre ytelsen.
- Overvåking: Bruk overvåkingsverktøy for å overvåke ytelsen og tilgjengeligheten til API-et.
Avanserte tips
- Asynkron behandling: For tidkrevende LLM-inferens, bruk
asyncogawait-nøkkelordene for asynkron behandling for å unngå å blokkere hovedtråden. - Strømmende respons: Bruk strømmende respons (StreamingResponse) for å returnere generert tekst i sanntid, noe som forbedrer brukeropplevelsen.
- Multitråding/multiprocessing: For CPU-intensive LLM-inferenser kan du bruke multitråding eller multiprocessing for å forbedre ytelsen.
- GPU-akselerasjon: Hvis din LLM-modell støtter GPU-akselerasjon, kan du bruke CUDA eller andre GPU-akselerasjonsbiblioteker for å øke inferenshastigheten.





