Користење на FastAPI за градење на високо-перформансен, спремен за продукција LLM API: Водич чекор-по-чекор
Користење на FastAPI за градење на високо-перформансен, спремен за продукција LLM API: Водич чекор-по-чекор
FastAPI, како модерен, високо-перформансен Python Web framework, е популарен поради неговата леснотија на користење, брзина и автоматски генерирана API документација. Особено во градењето на LLM (Large Language Model) апликации за backend API, FastAPI покажува силни предности. Оваа статија ќе ве научи чекор-по-чекор како да користите FastAPI за да изградите LLM API спремен за продукција и ќе истражи некои најдобри практики.
Зошто да изберете FastAPI?
При градење на API за LLM апликации, FastAPI ги нуди следните клучни предности:
- Високи перформанси: Базиран на ASGI, FastAPI може да обработува барања со висока конкурентност, што е од клучно значење за LLM апликации кои бараат брз одговор.
- Асинхрона поддршка: FastAPI има вградена поддршка за клучните зборови
asyncиawait, што го олеснува справувањето со асинхрони операции, како што е повикување на LLM заклучување, избегнувајќи го блокирањето на главната нишка. - Автоматска API документација: FastAPI користи OpenAPI и JSON Schema за автоматско генерирање на интерактивна API документација (Swagger UI), што им олеснува на програмерите да го тестираат и користат вашиот API.
- Валидација на податоци: FastAPI користи Pydantic за валидација на податоци, осигурувајќи ја точноста на параметрите на барањето и намалувајќи ги грешките.
- Инјекција на зависности: Системот за инјекција на зависности на FastAPI го олеснува управувањето и споделувањето на ресурси, како што се LLM модели.
- Активна заедница: FastAPI има голема и активна заедница, каде што можете да добиете богати ресурси и поддршка.
Подготовка
-
Инсталирајте Python: Осигурете се дека имате инсталирано Python 3.7 или понова верзија.
-
Инсталирајте FastAPI и Uvicorn: Користете pip за да ги инсталирате FastAPI и Uvicorn (ASGI сервер):
pip install fastapi uvicorn -
Изберете LLM модел: Изберете го LLM моделот што сакате да го користите. Тоа може да биде модел на OpenAI или модел со отворен код, како што е TinyLlama. Ако изберете OpenAI, треба да добиете OpenAI API клуч. Ако изберете TinyLlama, треба да ја преземете датотеката со моделот.
Чекор 1: Креирање на FastAPI апликација
Креирајте датотека наречена main.py и додадете го следниот код:
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
Овој код дефинира FastAPI апликација и дефинира два Pydantic модели: InputText за примање на влезен текст и OutputText за враќање на генерираниот текст.
Чекор 2: Додавање на LLM логика за заклучување
Во зависност од LLM моделот што ќе го изберете, додадете ја соодветната логика за заклучување. Овде, како пример, се користи OpenAI API:
import openai
import os
# Земете го OpenAI API клучот
openai.api_key = os.environ.get("OPENAI_API_KEY") # Се препорачува да се користи променлива на околината
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Генерира текст врз основа на внесениот текст користејќи OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # Изберете модел
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))
Овој код дефинира /generate рута, која прима InputText објект како влез, го повикува OpenAI API за да генерира текст и го враќа генерираниот текст како OutputText објект. Забележете да го замените text-davinci-003 со соодветен модел по ваш избор.
Ако користите локален модел како TinyLlama, треба да ги инсталирате соодветните библиотеки, како на пример transformers, и да го вчитате моделот во меморија. Пример за код:
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):
"""
Генерира текст врз основа на внесениот текст користејќи 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))
Чекор 3: Стартување на FastAPI апликацијата
Користете Uvicorn за да ја стартувате FastAPI апликацијата:
uvicorn main:app --reload
```Ова ќе стартува локален сервер, кој може да го посетите во вашиот прелистувач на `http://127.0.0.1:8000/docs` за да ја видите автоматски генерираната API документација. Параметарот `--reload` може автоматски да го рестартира серверот по промените во кодот, што е погодно за развој.
## Чекор 4: Тестирање на API
Користете ја API документацијата или алатки како curl за да го тестирате вашиот API. На пример, користете curl за да испратите 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
Треба да добиете JSON одговор што го содржи генерираниот текст.
Чекор 5: Продукциска дистрибуција
Дистрибуирајте ја вашата FastAPI апликација во продукциска околина, на пример:
- Docker: Користете Docker за да ја контејнеризирате вашата апликација, што го олеснува дистрибуирањето и управувањето.
- Cloud платформа: Дистрибуирајте на cloud платформа, како што се AWS, Google Cloud Platform или Azure. Azure Cosmos DB и Azure Functions споменати во текстот може да се користат за градење serverless API. Modal исто така може да се користи за дистрибуирање на FastAPI апликации кои автоматски се прошируваат.
- Сервер: Дистрибуирајте на ваш сопствен сервер.
Најдобри практики
- Користете променливи на околината за да складирате чувствителни информации: Не кодирајте чувствителни информации како API клучеви во кодот, туку користете променливи на околината.
- Додајте логирање: Користете модул за логирање за да го евидентирате статусот на работа на API, што го олеснува дебагирањето и мониторингот.
- Додајте обработка на грешки: Користете
try...exceptблокови за да ги обработите можните исклучоци и да вратите соодветни пораки за грешка. - Ограничување на стапката: Користете ограничувач на стапката за да спречите злоупотреба на API. FastAPI има неколку готови библиотеки за ограничување на стапката.
- Кеширање: За повторувачки барања, можете да користите кеширање за да ги подобрите перформансите.
- Мониторинг: Користете алатки за мониторинг за да ги следите перформансите и достапноста на API.
Напредни техники
- Асинхрона обработка: За долготрајно LLM заклучување, користете ги клучните зборови
asyncиawaitза асинхрона обработка за да избегнете блокирање на главната нишка. - Стриминг одговор: Користењето стриминг одговор (StreamingResponse) може да го врати генерираниот текст во реално време, подобрувајќи го корисничкото искуство.
- Мулти-нишки/Мулти-процеси: За CPU интензивно LLM заклучување, можете да користите мулти-нишки или мулти-процеси за да ги подобрите перформансите.
- GPU забрзување: Ако вашиот LLM модел поддржува GPU забрзување, можете да користите CUDA или други GPU библиотеки за забрзување за да ја подобрите брзината на заклучување.





