Изграждане на високопроизводителен, готов за производство LLM API с FastAPI: Ръководство стъпка по стъпка
Изграждане на високопроизводителен, готов за производство LLM API с FastAPI: Ръководство стъпка по стъпка
FastAPI, като модерна, високопроизводителна Python уеб рамка, е популярна заради своята лекота на използване, скорост и автоматично генерирани API документи. Особено в изграждането на бекенд API за LLM (Large Language Model) приложения, FastAPI демонстрира силни предимства. Тази статия ще ви научи стъпка по стъпка как да използвате FastAPI за изграждане на готов за производство LLM API и ще проучи някои най-добри практики.
Защо да изберете FastAPI?
При изграждането на API за LLM приложения, FastAPI предлага следните ключови предимства:
- Висока производителност: Базиран на ASGI, FastAPI може да обработва заявки с висока степен на едновременност, което е от решаващо значение за LLM приложения, които изискват бърза реакция.
- Асинхронна поддръжка: FastAPI има вградена поддръжка за ключовите думи
asyncиawait, което улеснява обработката на асинхронни операции, като например извикване на LLM inference, избягвайки блокирането на основния поток. - Автоматична 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 inference логика
В зависимост от избрания от вас LLM модел, добавете съответната inference логика. Тук ще използваме 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, за да контейнеризирате вашето приложение за лесно разполагане и управление.
- Облачна платформа: Разположете в облачна платформа, като 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 библиотеки за ускорение, за да увеличите скоростта на заключение.





