Використання FastAPI для створення високопродуктивного, готового до виробництва LLM API: покрокова інструкція
# Використання FastAPI для створення високопродуктивного, готового до виробництва LLM API: покрокова інструкція
FastAPI, як сучасний, високопродуктивний Python Web фреймворк, користується великою популярністю завдяки своїй простоті використання, швидкості та автоматично згенерованій API документації. Особливо при створенні LLM (Large Language Model) застосунків для backend API, 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 має велику та активну спільноту, де можна отримати багато ресурсів та підтримки.
## Підготовка
1. **Встановлення Python:** Переконайтеся, що у вас встановлено Python 3.7 або новішої версії.
2. **Встановлення FastAPI та Uvicorn:** Використовуйте pip для встановлення FastAPI та Uvicorn (ASGI сервер):
```bash
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=@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 застосунку
Запустіть FastAPI застосунок за допомогою Uvicorn:
uvicorn main:app --reload
```Це запустить локальний сервер, і ви зможете переглянути автоматично згенеровану документацію API у своєму браузері за адресою `http://127.0.0.1:8000/docs`. Параметр `--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) може повертати згенерований текст у режимі реального часу, покращуючи взаємодію з користувачем.
- Багатопоточність/багатопроцесність: Для інтенсивних обчислень LLM можна використовувати багатопоточність або багатопроцесність для підвищення продуктивності.
- Прискорення GPU: Якщо ваша модель LLM підтримує прискорення GPU, ви можете використовувати CUDA або інші бібліотеки прискорення GPU для збільшення швидкості висновування.





