Создание высокопроизводительного, готового к производству LLM API с помощью FastAPI: пошаговое руководство
Создание высокопроизводительного, готового к производству LLM API с помощью FastAPI: пошаговое руководство
FastAPI, современный, высокопроизводительный Python Web-фреймворк, популярен благодаря своей простоте использования, скорости и автоматически генерируемой документации API. В частности, FastAPI демонстрирует мощные преимущества при создании серверных API для LLM (Large Language Model) приложений. В этой статье мы шаг за шагом покажем вам, как использовать 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, вам нужно будет получить ключ API OpenAI. Если вы выберете 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 модели, добавьте соответствующую логику логического вывода. Здесь мы используем API OpenAI в качестве примера:
import openai
import os
# Получите ключ API OpenAI
openai.api_key = os.environ.get("OPENAI_API_KEY") # Рекомендуется использовать переменные среды
```@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", # Выберите модель
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):
"""
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))
Шаг 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: Развертывание в production
Разверните приложение FastAPI в production-среде, например:
- 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 для повышения скорости логического вывода.





