Använda FastAPI för att bygga högpresterande, produktionsklara LLM API:er: En steg-för-steg-guide
Använda FastAPI för att bygga högpresterande, produktionsklara LLM API:er: En steg-för-steg-guide
FastAPI, som ett modernt, högpresterande Python Web-ramverk, är populärt för sin användarvänlighet, hastighet och automatiskt genererade API-dokumentation. Speciellt när det gäller att bygga backend-API:er för LLM (Large Language Model) applikationer, visar FastAPI ännu starkare fördelar. Den här artikeln kommer steg för steg att lära dig hur du använder FastAPI för att bygga ett produktionsklart LLM API och utforska några bästa praxis.
Varför välja FastAPI?
När du bygger API:er för LLM-applikationer erbjuder FastAPI följande viktiga fördelar:
- Hög prestanda: Baserat på ASGI kan FastAPI hantera höga samtidiga förfrågningar, vilket är avgörande för LLM-applikationer som kräver snabba svar.
- Asynkront stöd: FastAPI har inbyggt stöd för nyckelorden
asyncochawait, vilket gör det enkelt att hantera asynkrona operationer, som att anropa LLM-inferens, och undvika att blockera huvudtråden. - Automatisk API-dokumentation: FastAPI använder OpenAPI och JSON Schema för att automatiskt generera interaktiv API-dokumentation (Swagger UI), vilket gör det enkelt för utvecklare att testa och använda ditt API.
- Datavalidering: FastAPI använder Pydantic för datavalidering, vilket säkerställer att förfrågningsparametrar är korrekta och minskar fel.
- Beroendeinjektion: FastAPIs beroendeinjektionssystem gör det enkelt att hantera och dela resurser, som LLM-modeller.
- Aktivt community: FastAPI har ett stort och aktivt community, vilket ger tillgång till rikliga resurser och support.
Förberedelser
-
Installera Python: Se till att du har installerat Python 3.7 eller senare.
-
Installera FastAPI och Uvicorn: Använd pip för att installera FastAPI och Uvicorn (ASGI-server):
pip install fastapi uvicorn -
Välj LLM-modell: Välj den LLM-modell du vill använda. Det kan vara en OpenAI-modell eller en öppen källkodsmodell, som TinyLlama. Om du väljer OpenAI måste du hämta en OpenAI API-nyckel. Om du väljer TinyLlama måste du ladda ner modellfilen.
Steg 1: Skapa en FastAPI-applikation
Skapa en fil med namnet main.py och lägg till följande kod:
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
Den här koden definierar en FastAPI-applikation och definierar två Pydantic-modeller: InputText används för att ta emot indatatext och OutputText används för att returnera genererad text.
Steg 2: Lägg till LLM-inferenslogik
Lägg till motsvarande inferenslogik baserat på den LLM-modell du väljer. Här är ett exempel på hur du använder OpenAI API:
import openai
import os
# Hämta OpenAI API-nyckeln
openai.api_key = os.environ.get("OPENAI_API_KEY") # Det rekommenderas att använda miljövariabler
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generates text based on the input text using OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # Välj 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))
Den här koden definierar en /generate-rutt som tar ett InputText-objekt som indata, anropar OpenAI API för att generera text och returnerar den genererade texten som ett OutputText-objekt. Observera att du måste ersätta text-davinci-003 med en lämplig modell som du väljer.
Om du använder lokala modeller som TinyLlama måste du installera motsvarande bibliotek, t.ex. transformers, och ladda modellen i minnet. Kodexempel som följer:
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):
"""
Generates text based on the input text using 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: Kör FastAPI-applikationen
Kör FastAPI-applikationen med Uvicorn:
uvicorn main:app --reload
```Detta startar en lokal server, och du kan besöka `http://127.0.0.1:8000/docs` i din webbläsare för att se den automatiskt genererade API-dokumentationen. `--reload`-parametern kan automatiskt starta om servern efter att koden har ändrats, vilket underlättar utvecklingen.
## Steg 4: Testa API:et
Använd API-dokumentationen eller verktyg som curl för att testa ditt API. Till exempel, använd curl för att skicka en POST-förfrågan:
```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 få ett JSON-svar som innehåller den genererade texten.
Steg 5: Produktionsdistribution
Distribuera FastAPI-applikationen till en produktionsmiljö, till exempel:
- Docker: Använd Docker för att containerisera din applikation, vilket underlättar distribution och hantering.
- Molnplattform: Distribuera till en molnplattform, till exempel AWS, Google Cloud Platform eller Azure. Azure Cosmos DB och Azure Functions som nämns i texten kan användas för att bygga serverless API:er. Modal kan också användas för att distribuera automatiskt skalande FastAPI-applikationer.
- Server: Distribuera till din egen server.
Bästa praxis
- Använd miljövariabler för att lagra känslig information: Hårdkoda inte känslig information som API-nycklar i koden, utan använd miljövariabler istället.
- Lägg till loggning: Använd loggningsmodulen för att registrera API:ets driftstatus, vilket underlättar felsökning och övervakning.
- Lägg till felhantering: Använd
try...except-block för att hantera potentiella undantag och returnera lämplig felinformation. - Hastighetsbegränsning: Använd en hastighetsbegränsare för att förhindra missbruk av API:et. Det finns några färdiga hastighetsbegränsningsbibliotek tillgängliga för FastAPI.
- Cache: För repetitiva förfrågningar kan du använda cache för att förbättra prestandan.
- Övervakning: Använd övervakningsverktyg för att övervaka API:ets prestanda och tillgänglighet.
Avancerade tips
- Asynkron bearbetning: För tidskrävande LLM-inferens, använd nyckelorden
asyncochawaitför asynkron bearbetning för att undvika att blockera huvudtråden. - Strömmande svar: Använd strömmande svar (StreamingResponse) för att returnera genererad text i realtid, vilket förbättrar användarupplevelsen.
- Multitrådning/multiprocessering: För CPU-intensiv LLM-inferens kan du använda multitrådning eller multiprocessering för att förbättra prestandan.
- GPU-acceleration: Om din LLM-modell stöder GPU-acceleration kan du använda CUDA eller andra GPU-accelerationsbibliotek för att öka inferenshastigheten.





