Izgradnja visokoučinkovitog LLM API-ja spremnog za produkciju pomoću FastAPI-ja: Vodič korak po korak
Izgradnja visokoučinkovitog LLM API-ja spremnog za produkciju pomoću FastAPI-ja: Vodič korak po korak
FastAPI, kao moderan, visokoučinkovit Python Web framework, popularan je zbog svoje jednostavnosti korištenja, brzine i automatski generirane API dokumentacije. Posebno u izgradnji pozadinskih API-ja za LLM (Large Language Model) aplikacije, FastAPI pokazuje snažne prednosti. Ovaj će vas članak korak po korak naučiti kako izgraditi LLM API spreman za produkciju pomoću FastAPI-ja i istražiti neke najbolje prakse.
Zašto odabrati FastAPI?
Prilikom izgradnje API-ja za LLM aplikacije, FastAPI nudi sljedeće ključne prednosti:
- Visoke performanse: Temeljen na ASGI-ju, FastAPI može obraditi zahtjeve s visokom konkurentnošću, što je ključno za LLM aplikacije koje zahtijevaju brz odziv.
- Asinkrona podrška: FastAPI ima ugrađenu podršku za ključne riječi
asynciawait, što olakšava rukovanje asinkronim operacijama, poput pozivanja LLM zaključivanja, izbjegavajući blokiranje glavne niti. - Automatska API dokumentacija: FastAPI koristi OpenAPI i JSON Schema za automatsko generiranje interaktivne API dokumentacije (Swagger UI), što olakšava programerima testiranje i korištenje vašeg API-ja.
- Validacija podataka: FastAPI koristi Pydantic za validaciju podataka, osiguravajući ispravnost parametara zahtjeva i smanjujući pogreške.
- Injekcija ovisnosti: Sustav injekcije ovisnosti FastAPI-ja olakšava upravljanje i dijeljenje resursa, poput LLM modela.
- Aktivna zajednica: FastAPI ima veliku i aktivnu zajednicu, pružajući bogate resurse i podršku.
Priprema
-
Instalirajte Python: Provjerite jeste li instalirali Python 3.7 ili noviju verziju.
-
Instalirajte FastAPI i Uvicorn: Koristite pip za instalaciju FastAPI-ja i Uvicorn-a (ASGI poslužitelj):
pip install fastapi uvicorn -
Odaberite LLM model: Odaberite LLM model koji želite koristiti. Može biti OpenAI model ili model otvorenog koda, kao što je TinyLlama. Ako odaberete OpenAI, morate dobiti OpenAI API ključ. Ako odaberete TinyLlama, morate preuzeti datoteku modela.
Korak 1: Stvaranje FastAPI aplikacije
Stvorite datoteku pod nazivom main.py i dodajte sljedeći 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
Ovaj kod definira FastAPI aplikaciju i definira dva Pydantic modela: InputText za primanje ulaznog teksta i OutputText za vraćanje generiranog teksta.
Korak 2: Dodavanje LLM logike zaključivanja
Ovisno o LLM modelu koji ste odabrali, dodajte odgovarajuću logiku zaključivanja. Ovdje se kao primjer koristi OpenAI API:
import openai
import os
# Dohvatite OpenAI API ključ
openai.api_key = os.environ.get("OPENAI_API_KEY") # Preporučuje se korištenje varijabli okoline
```@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", # Odaberite model
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))
Ovaj kod definira /generate rutu koja prima InputText objekt kao ulaz, poziva OpenAI API za generiranje teksta i vraća generirani tekst kao OutputText objekt. Obratite pažnju da zamijenite text-davinci-003 s odgovarajućim modelom koji ste odabrali.
Ako koristite lokalne modele kao što je TinyLlama, morate instalirati odgovarajuće biblioteke, na primjer transformers, i učitati model u memoriju. Primjer koda slijedi:
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))
Korak 3: Pokrenite FastAPI aplikaciju
Koristite Uvicorn za pokretanje FastAPI aplikacije:
uvicorn main:app --reload
```Ovo će pokrenuti lokalni server, a automatski generiranu API dokumentaciju možete pogledati u pregledniku na `http://127.0.0.1:8000/docs`. Parametar `--reload` omogućuje automatsko ponovno pokretanje servera nakon izmjene koda, što olakšava razvoj.
## Korak 4: Testiranje API-ja
Koristite API dokumentaciju ili alate kao što je curl za testiranje vašeg API-ja. Na primjer, koristite curl za slanje POST zahtjeva:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
Trebali biste primiti JSON odgovor koji sadrži generirani tekst.
Korak 5: Implementacija u produkciju
Implementirajte FastAPI aplikaciju u produkcijsko okruženje, na primjer:
- Docker: Koristite Docker za kontejnerizaciju vaše aplikacije, što olakšava implementaciju i upravljanje.
- Cloud platforme: Implementirajte na cloud platforme, kao što su AWS, Google Cloud Platform ili Azure. Azure Cosmos DB i Azure Functions spomenuti u tekstu mogu se koristiti za izgradnju serverless API-ja. Modal se također može koristiti za implementaciju FastAPI aplikacija koje se automatski skaliraju.
- Server: Implementirajte na vlastiti server.
Najbolje prakse
- Koristite varijable okoline za pohranu osjetljivih informacija: Nemojte hardkodirati osjetljive informacije kao što su API ključevi u kodu, već koristite varijable okoline.
- Dodajte zapisivanje (logging): Koristite modul za zapisivanje za bilježenje stanja rada API-ja, što olakšava otklanjanje pogrešaka i nadzor.
- Dodajte obradu pogrešaka: Koristite
try...exceptblokove za obradu mogućih iznimaka i vraćanje odgovarajućih poruka o pogreškama. - Ograničenje brzine (Rate limiting): Koristite ograničivač brzine kako biste spriječili zlouporabu API-ja. FastAPI ima nekoliko gotovih biblioteka za ograničenje brzine.
- Predmemorija (Caching): Za ponavljajuće zahtjeve, možete koristiti predmemoriju za poboljšanje performansi.
- Nadzor (Monitoring): Koristite alate za nadzor za praćenje performansi i dostupnosti API-ja.
Napredni savjeti
- Asinkrona obrada: Za dugotrajno LLM zaključivanje, koristite ključne riječi
asynciawaitza asinkronu obradu, kako biste izbjegli blokiranje glavne niti. - Strujni odgovor (Streaming response): Korištenjem strujnog odgovora (StreamingResponse) možete u stvarnom vremenu vratiti generirani tekst, poboljšavajući korisničko iskustvo.
- Višenitnost/Višeprocesnost: Za CPU intenzivno LLM zaključivanje, možete koristiti višenitnost ili višeprocesnost za poboljšanje performansi.
- GPU ubrzanje: Ako vaš LLM model podržava GPU ubrzanje, možete koristiti CUDA ili druge GPU biblioteke za ubrzanje zaključivanja.





