Быстрый старт с FastAPI и PyTorch для ML-предсказаний
Введение в проект
Цель и обзор
В современном мире разработки программного обеспечения, где скорость и эффективность являются ключевыми критериями успеха, создание высокопроизводительных и масштабируемых веб-приложений с возможностью машинного обучения становится все более востребованным. Наш проект направлен на решение этой актуальной задачи с использованием передовых технологий в области веб-разработки и искусственного интеллекта. Целью проекта является разработка простого, но мощного веб-сервера на основе FastAPI, интегрированного с моделью машинного обучения на PyTorch для выполнения предсказаний в реальном времени.
FastAPI - это современный, быстрый (высокопроизводительный) веб-фреймворк для построения API с Python 3.7+ на основе стандартных типов Python для декларативного описания запросов и ответов, который использует асинхронное программирование. Он позволяет легко создавать надежные и эффективные веб-сервисы, поддерживая автоматическую генерацию документации через Swagger UI и ReDoc, что значительно упрощает разработку и тестирование API.
PyTorch - это открытая библиотека машинного обучения, разработанная Facebook's AI Research lab. PyTorch предоставляет гибкие инструменты и библиотеки для исследований в области искусственного интеллекта, особенно в сегментах глубокого обучения и нейронных сетей. Благодаря своей интуитивно понятной архитектуре и способности легко интегрироваться с другими технологиями, PyTorch является предпочтительным выбором для разработки и деплоймента моделей машинного обучения.
Docker представляет собой платформу для разработки, доставки и запуска приложений в контейнерах. Docker облегчает развертывание приложений, поскольку контейнер содержит все необходимое для его работы: код, библиотеки, системные инструменты и настройки. Использование Docker в проекте позволяет обеспечить легкость, портативность и консистентность среды выполнения вне зависимости от локальной разработки или продакшн среды, а также способствует упрощению процесса CI/CD.
Сочетание этих технологий позволяет нам создать эффективное и масштабируемое решение, которое может быть легко адаптировано под различные задачи предсказания в реальном времени, обеспечивая высокую скорость ответов и простоту интеграции с другими системами и сервисами. В ходе этой статьи мы подробно рассмотрим каждый шаг создания такого веб-сервера, начиная от настройки разработческого окружения и заканчивая деплойментом готового приложения.
Предварительные требования
Для успешного выполнения проекта и максимальной отдачи от предлагаемого материала, необходимо удостовериться в наличии следующих предварительных условий:
- Операционная система: Проект совместим с основными операционными системами, включая Windows, macOS и Linux. Для упрощения процесса развертывания и обеспечения единообразия сред, мы будем использовать Docker, что делает выбор операционной системы менее критичным.
- Знание языка Python: Поскольку весь проект разрабатывается на Python, наличие уверенных знаний и практического опыта программирования на этом языке является обязательным. Особое внимание стоит уделить асинхронному программированию, с которым тесно связан FastAPI, а также основам работы с библиотеками для машинного обучения, такими как PyTorch.
- Установленный Python версии 3.7 и выше: Убедитесь, что на вашем компьютере установлена актуальная версия Python, поддерживаемая FastAPI и PyTorch. Это можно проверить, выполнив команду python --version или python3 --version в терминале.
- Знакомство с FastAPI и PyTorch: Хотя данная статья включает в себя пошаговые инструкции по работе с этими фреймворками, базовое понимание их принципов работы будет значительным преимуществом. Рекомендуется ознакомиться с документацией FastAPI для понимания создания асинхронных API и документацией PyTorch для основ работы с нейронными сетями.
- Установленный Docker: Docker используется для контейнеризации и развертывания вашего приложения. Это обеспечивает легкость переноса и масштабируемость вашего проекта. Установка Docker доступна на официальном сайте, и следует убедиться в наличии последней версии.
- Базовые знания о контейнерах и Docker: Понимание основ работы с контейнерами и Docker будет полезным для настройки среды разработки и развертывания приложения. Это включает в себя создание Dockerfile, конфигурацию docker-compose и управление контейнерами.
- Текстовый редактор или IDE: Наличие удобного средства разработки, такого как Visual Studio Code, PyCharm или любого другого редактора, поддерживающего разработку на Python, упрощает процесс написания и отладки кода.
Удостоверившись в наличии всех необходимых предварительных условий, мы готовы приступить к следующему этапу проекта, где начнем настройку разработческого окружения. Эти шаги обеспечат гладкое начало работы над проектом и помогут избежать возможных трудностей на более поздних этапах разработки.
Настройка окружения
Создание виртуального окружения
Виртуальное окружение в Python — это изолированная среда, позволяющая устанавливать пакеты и зависимости отдельно для каждого проекта, предотвращая возможные конфликты и несовместимости. Это важный шаг в подготовке к разработке нашего веб-сервера на FastAPI с интеграцией PyTorch, поскольку позволяет точно контролировать версии используемых библиотек и упрощает процесс деплоймента. Далее представлены шаги для создания и активации виртуального окружения:
- Открытие терминала или командной строки: Для начала необходимо открыть терминал (Linux/macOS) или командную строку/PowerShell (Windows).
Переход в директорию проекта: Используйте команду cd для перехода в папку, где будет расположен ваш проект, например:
cd путь/до/вашего/проекта
- Создание виртуального окружения: Введите следующую команду для создания виртуального окружения внутри папки проекта. Обратите внимание, что venv — это имя папки для виртуального окружения, его можно изменить на любое другое:
Для Windows:
python -m venv venv
Для macOS и Linux:
python3 -m venv venv
Активация виртуального окружения: После создания виртуального окружения его необходимо активировать, чтобы использовать его в качестве основной среды разработки:
Для Windows:
.\venv\Scripts\activate
Для macOS и Linux:
source venv/bin/activate
После активации виртуального окружения вы увидите его название в начале строки в терминале, что указывает на то, что все последующие команды python и pip будут использовать изолированное окружение.
Обновление менеджера пакетов: Для обеспечения использования последних версий pip, setuptools и wheel, выполните следующую команду:
python -m pip install --upgrade pip setuptools wheel
Это шаг обеспечит более гладкую установку других пакетов и зависимостей.
Установка зависимостей
После создания и активации виртуального окружения следующим шагом будет установка всех необходимых зависимостей для нашего проекта. Это включает в себя библиотеки FastAPI для создания веб-сервера, PyTorch для работы с моделями машинного обучения, а также другие вспомогательные библиотеки и фреймворки. Ниже приведены пошаговые инструкции по установке этих компонентов.
Подготовка файла requirements.txt: В корне вашего проекта создайте файл requirements.txt, который будет содержать список всех необходимых пакетов с указанием их версий. Пример содержимого файла:
fastapi~=0.109.2 pydantic-settings~=2.2.1 uvicorn~=0.28.0 --find-links https://download.pytorch.org/whl/torch_stable.html torch==2.2.1+cpu transformers[torch]
В этом файле указаны основные зависимости: FastAPI для веб-фреймворка, Uvicorn как ASGI сервер для запуска FastAPI, Pydantic для валидации и управления настройками через pydantic-settings, PyTorch для работы с нейронными сетями и transformers для использования предварительно обученных моделей.
- Установка PyTorch: В связи с тем, что PyTorch может требовать специальной предварительной настройки для установки, особенно если вы хотите использовать версию, оптимизированную для работы с GPU, вам может понадобиться следовать инструкциям с официального сайта PyTorch. Однако, для большинства случаев, установка CPU-версии, указанной в requirements.txt, будет достаточной. Убедитесь, что в вашем requirements.txt указана ссылка на совместимую версию PyTorch, как показано выше.
Установка зависимостей из файла requirements.txt: Выполните следующую команду в терминале, находясь в корневой директории проекта, чтобы установить все указанные зависимости:
python -m pip install -r requirements.txt
Если ваш проект требует установки PyTorch с поддержкой GPU, следуйте специальным инструкциям с официального сайта PyTorch для выбора подходящего варианта установки.
- Установка дополнительных пакетов: В зависимости от специфики вашего проекта, может потребоваться установка дополнительных пакетов и библиотек. Это может быть выполнено по мере необходимости с помощью команды pip install имя_пакета или/и добавлено в requirements.txt.
Структура проекта
Организация файлов и папок
Организованная структура проекта не только облегчает навигацию по коду, но и упрощает поддержку, тестирование и развертывание приложения. Для нашего веб-сервера на FastAPI с интеграцией PyTorch предлагается следующая структура директорий и файлов, обеспечивающая чистоту кода и его модульность:
predict/
│
├── src/ # Исходный код приложения
│ ├── config/ # Конфигурации приложения
│ │ └── settings.py # Глобальные настройки проекта
│ │
│ ├── predictions/ # Модуль задач предсказаний
│ │ ├── routers.py # Роутеры FastAPI для обработки запросов
│ │ └── schemas.py # Pydantic схемы для валидации данных
│ │
│ └── main.py # Основной файл FastAPI приложения
│
├── venv/ # Виртуальное окружение Python
│
├── .env # Файл для переменных окружения
│
├── requirements.txt # Зависимости проекта
│
├── .dockerignore # Файлы игнорируемые при сборке
│
├── Dockerfile # Для сборки Docker-контейнера
│
└── docker-compose.yml # Управление контейнерами Docker
Подробно рассмотрим назначение основных компонентов структуры:
- src/: Эта папка содержит весь исходный код нашего приложения. Разделение кода на модули и пакеты упрощает его управление и тестирование.
- src/config/: Здесь хранятся файлы конфигурации проекта, такие как настройки, связанные с базой данных, внешними сервисами и другими параметрами, которые могут меняться в зависимости от среды выполнения приложения.
- src/tasks/: В этом каталоге расположены файлы, относящиеся к обработке и выполнению задач предсказаний. Включает в себя роутеры для обработки HTTP-запросов и схемы Pydantic для валидации входящих данных.
- src/main.py: Основной файл приложения, в котором инициализируется и конфигурируется экземпляр FastAPI. Здесь также происходит подключение всех роутеров и других компонентов приложения.
- venv/: Папка виртуального окружения, которая содержит все необходимые библиотеки Python, используемые в проекте, и изолирует их от остальной системы.
- .env: Файл для хранения переменных окружения, таких как секретные ключи и параметры конфигурации, необходимые для работы приложения в различных средах.
- requirements.txt: Список всех зависимостей Python, необходимых для работы проекта. Этот файл используется для упрощения установки зависимостей в новом окружении.
- Dockerfile, docker-compose.yml и .dockerignore: Файлы для настройки и управления Docker-контейнерами, позволяющие легко развертывать и запускать приложение в любой среде, поддерживающей Docker.
Такая структура проекта обеспечивает удобство разработки и поддержки приложения, позволяя легко масштабировать проект и добавлять новые функции.
Важные файлы проекта
При разработке веб-приложений на FastAPI с использованием PyTorch и контейнеризации через Docker, некоторые файлы играют основную роль в конфигурации, развертывании и управлении зависимостями проекта. Более детально рассмотрим назначение и содержимое трех важных файлов: requirements.txt, Dockerfile, и docker-compose.yml.
Файл requirements.txt содержит список всех внешних пакетов Python, которые требуются для вашего проекта, вместе с их версиями. Это обеспечивает легкость установки и управления зависимостями, позволяя воспроизвести одинаковую среду на различных машинах и в разных средах.
Dockerfile – это текстовый файл, содержащий все необходимые команды, на основе которых происходит сборка образа Docker для вашего приложения. Этот файл следует в корне проекта и описывает базовый образ, необходимые для установки пакеты, копирование файлов проекта в контейнер, и команды для запуска приложения.
Файл docker-compose.yml используется для определения и запуска многоконтейнерных приложений Docker. В контексте нашего проекта, он может использоваться для упрощения процесса сборки, развертывания и управления контейнером приложения, а также для организации дополнительных сервисов, таких как базы данных или системы кеширования. Ниже мы рассмотрим контеризацию более детально.
Разработка API
Настройка конфигурации в settings.py
Важным аспектом разработки современных веб-приложений является централизованное управление конфигурацией. В FastAPI, эффективное управление настройками обеспечивается через модуль settings.py. Этот файл служит для объявления и доступа к глобальным настройкам проекта, включая пути к каталогам, параметры модели, а также переменные окружения.
Создание settings.py
Файл settings.py размещается в директории src/config проекта и содержит определение класса Settings, наследующего от BaseSettings библиотеки pydantic-settings. Это позволяет легко интегрировать переменные окружения и задавать настройки по умолчанию. Пример содержания файла settings.py:
from pathlib import Path
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
# Определение настроек, загружаемых из переменных окружения, если требуется
model_config: SettingsConfigDict = SettingsConfigDict(env_prefix='MODEL_')
@property
def base_dir(self) -> Path:
# Автоматическое определение корневой директории проекта
return Path(__file__).resolve().parent.parent
settings = Settings()
В этом примере:
- model_config используется для загрузки конфигурационных параметров модели, предварительно определенных в переменных окружения с префиксом MODEL_.
- Свойство base_dir позволяет определить и использовать путь к корневой директории проекта, что упрощает доступ к ресурсам и модулям внутри проекта.
- Создается экземпляр settings, через который доступны все определенные настройки.
Интеграция settings.py в приложение
Для использования определенных в settings.py настроек в других частях приложения, достаточно импортировать экземпляр settings и обращаться к его атрибутам:
from ..config.settings import settings
# Использование пути к корневой директории проекта
base_dir = settings.base_dir
# Доступ к конфигурационным параметрам модели
model_config = settings.model_config
Настройка FastAPI
Немного теории: FastAPI — это современный, быстрый веб-фреймворк для создания API с Python 3.7+ на основе асинхронного программирования, который позволяет строить масштабируемые и эффективные веб-приложения. Настройка основного приложения FastAPI включает в себя несколько шагов, начиная от инициализации приложения до его конфигурации для обработки запросов.
- Инициализация приложения FastAPI:
В первую очередь, необходимо создать экземпляр приложения FastAPI. Для этого в файле src/main.py импортируем класс FastAPI из библиотеки fastapi и инициализируем его:
from fastapi import FastAPI app = FastAPI()
- Этот экземпляр app будет центральным элементом вашего веб-приложения, через который будут проходить все запросы и ответы.
- Пример добавление маршрутов (роутов):
Далее, к экземпляру приложения можно добавлять маршруты — спецификации эндпоинтов API, по которым будут обрабатываться запросы. Например, добавим простой маршрут для демонстрации:
@app.get("/") async def read_root(): return {"Hello": "World"}
- Здесь мы создали маршрут корневого эндпоинта ("/"), который обрабатывает GET-запросы и асинхронно возвращает простое приветственное сообщение в формате JSON.
- Конфигурация и использование Pydantic моделей для валидации:
FastAPI позволяет использовать модели Pydantic для валидации входящих данных. Это обеспечивает строгую типизацию и автоматическую документацию для вашего API. Например, определим модель Pydantic в файле src/tasks/schemas.py:
from pydantic import BaseModel class QueryText(BaseModel): text: str
И используем её в роутере для валидации входных данных:
@app.post("/predict/") async def get_prediction(item: QueryText): return {"text": item.text}
- Настройка CORS (Cross-Origin Resource Sharing):
Для того, чтобы ваше API могло быть безопасно доступно из браузеров на других доменах, необходимо настроить CORS. Это можно сделать с помощью middleware в FastAPI:
from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins=["*"], # Список доменов, для которых разрешены запросы allow_credentials=True, allow_methods=["*"], # Разрешенные методы запросов allow_headers=["*"], # Разрешенные заголовки )
- Запуск приложения:
Чтобы запустить разработанный веб-сервер, используйте ASGI-сервер, например, Uvicorn. Запустите его из командной строки, указав файл и объект приложения:
uvicorn src.main:app --reload
- Флаг --reload делает сервер перезагружаемым при изменении кода, что удобно во время разработки.
Эти шаги позволяют понять как настроить базовое приложение FastAPI.
Создание и регистрация роутеров
Роутеры в FastAPI позволяют структурировать и организовать код обработки запросов, разделяя логику по различным эндпоинтам и функциональностям. Это облегчает поддержку и развитие проекта, делая его более модульным и легко расширяемым.
- Создание роутера:
Для начала, создадим отдельный файл для наших роутеров внутри модуля (например, src/tasks/routers.py). В этом файле импортируем необходимые модули и создаем экземпляр APIRouter из FastAPI:
from fastapi import APIRouter router = APIRouter()
- Затем, к примеру можно добавить к этому роутеру различные маршруты (эндпоинты), используя декораторы, аналогичные тем, что используются в основном приложении (@app.get(), @app.post() и т.д.), но применяя их к экземпляру router.
- Регистрация роутера в приложении:
После создания роутера и определения в нем необходимых маршрутов, следующим шагом будет его регистрация в основном приложении FastAPI. Вернемся к файлу src/main.py, где инициализируется основной экземпляр приложения:
from fastapi import FastAPI from .predictions.routers import router as predictions_router app = FastAPI() app.include_router(predictions_router, prefix="/predictions", tags=["predictions"])
- Здесь метод include_router используется для добавления всех маршрутов из роутера predict_router в основное приложение. Параметр prefix добавляет указанный префикс ко всем URL-адресам в роутере, а tags помогают группировать эндпоинты в документации API.
- Организация кода и разделение логики:
- Используя роутеры, вы можете эффективно разделять логику вашего приложения на несколько модулей или компонентов. Например, можно создать отдельные роутеры для различных частей приложения, таких как управление пользователями, обработка задач и т.д.
- Это не только упрощает навигацию по коду и его поддержку, но и облегчает масштабирование приложения, позволяя добавлять новые функции и эндпоинты без значительного усложнения структуры проекта.
PyTorch для предсказаний
Подготовка модели для предсказаний
Использование моделей машинного обучения, разработанных с помощью PyTorch, для выполнения предсказаний в веб-приложениях на FastAPI, требует предварительной подготовки и загрузки этих моделей. Этот процесс включает несколько ключевых шагов, начиная от выбора модели до ее интеграции и тестирования в вашем API. Давайте рассмотрим, как подготовить модель PyTorch к использованию в вашем веб-приложении.
- Выбор модели:
- Определите, какую задачу вы хотите решить с помощью модели машинного обучения (например, классификацию текста, распознавание изображений и т.д.) и выберите подходящую предварительно обученную модель из библиотеки transformers или любую другую модель, обученную вами. Важно, чтобы модель соответствовала вашим требованиям по точности и производительности.
- Загрузка и сохранение модели:
Если вы используете предварительно обученную модель, загрузите ее с помощью соответствующего API. Для моделей из transformers это может выглядеть следующим образом:
from transformers import DistilBertTokenizer, DistilBertForSequenceClassification model_name = "distilbert-base-uncased-finetuned-sst-2-english" model = DistilBertForSequenceClassification.from_pretrained(model_name) tokenizer = DistilBertTokenizer.from_pretrained(model_name) ... манипуляции для дообучения модели trainer.train()
После, модель и токенизатор можно сохранить локально, чтобы избежать необходимости загружать их каждый раз при запуске приложения:
model.save_pretrained('./model') tokenizer.save_pretrained('./model')
- Загрузка модели в приложение:
При старте вашего FastAPI приложения загрузите модель и токенизатор из локального хранилища. Это обеспечит быстрый доступ к модели при обработке запросов:
model = DistilBertForSequenceClassification.from_pretrained('./model') tokenizer = DistilBertTokenizer.from_pretrained('./model')
- Убедитесь, что эта операция выполняется единожды при инициализации приложения, чтобы минимизировать задержку при обработке каждого запроса.
- Подготовка данных для предсказаний:
Прежде чем передавать данные в модель, они должны быть правильно подготовлены и преобразованы в формат, совместимый с моделью. Используйте токенизатор для преобразования входных данных в токены, которые затем могут быть переданы в модель:
inputs = tokenizer("Пример текста для анализа", padding=True, truncation=True, return_tensors="pt")
- Выполнение предсказаний:
С использованием подготовленных данных выполните предсказание с помощью модели:
with torch.no_grad(): outputs = model(**inputs)
- Обработайте выходные данные модели (например, преобразование логитов в вероятности с помощью softmax) для получения окончательных результатов предсказания.
Эти шаги описывают процесс подготовки и использования модели PyTorch в вашем FastAPI приложении для выполнения предсказаний. Эффективная загрузка и интеграция модели обеспечивает возможность использования мощных инструментов машинного обучения в веб-приложениях, расширяя их функциональность и повышая ценность для конечных пользователей.
Реализация API для предсказаний
После подготовки модели PyTorch к использованию следующим шагом является создание endpoint'а в вашем FastAPI приложении, который будет принимать данные от пользователей, обрабатывать их и возвращать результаты предсказаний. Реализация такого API требует внимательного подхода к деталям для обеспечения точности и эффективности предсказаний. Давайте разберемся, как можно создать и настроить такой endpoint.
- Определение эндпоинта для предсказаний:
В файле роутера (например, src/tasks/routers.py), определим новый маршрут, который будет принимать данные для предсказания через POST-запрос. Используем модель Pydantic для валидации входящих данных:
from fastapi import APIRouter, HTTPException, status from .schemas import Task from .model_utils import predict router = APIRouter() @router.post("/predict/", status_code=status.HTTP_200_OK) async def get_prediction(item: QueryText): try: prediction = await predict(item.text) return {"prediction": prediction} except Exception as e: raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
Здесь QueryText — это модель Pydantic, определяющая структуру входящего запроса, а функция predict — это ваша пользовательская функция для выполнения предсказания с использованием загруженной модели PyTorch.
- Реализация функции предсказания:
В модуле src/model_utils.py реализуем функцию predict, которая будет принимать текст, подготавливать его к обработке моделью и возвращать результат предсказания:
import torch from transformers import DistilBertTokenizer, DistilBertForSequenceClassification from ..config.settings import settings # Предварительная загрузка модели и токенизатора model_path = f"{settings.base_dir}/tasks/model" model = DistilBertForSequenceClassification.from_pretrained(model_path) tokenizer = DistilBertTokenizer.from_pretrained(model_path) async def predict(text: str): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits predictions = torch.softmax(logits, dim=-1) predicted_class = predictions.argmax().item() # Пример возвращаемого значения может быть индексом класса, который затем можно интерпретировать return predicted_class
В этом примере данные преобразуются в формат, подходящий для модели, выполняется предсказание, а результаты возвращаются в вызывающую функцию.
- Тестирование эндпоинта:
- После создания эндпоинта и функции предсказания необходимо провести тестирование, чтобы убедиться в их корректной работе. Вы можете использовать инструменты для тестирования API, такие как Postman, или документацию Swagger, автоматически генерируемую FastAPI, для отправки запросов на ваш эндпоинт и проверки ответов.
Деплой и тестирование
Контейнеризация с Docker
Контейнеризация — ключевой шаг в подготовке приложений к деплою и тестированию, обеспечивающий их портативность, консистентность и легкость в управлении. Используя Docker, вы можете легко упаковать ваше приложение вместе с его зависимостями в контейнер, который может быть запущен на любой системе с Docker, независимо от особенностей окружения. Далее представлены основные шаги по созданию Dockerfile, .dockerignore и конфигурации docker-compose.yml для приложения на FastAPI.
Создание Dockerfile
Dockerfile определяет инструкции для сборки образа Docker вашего приложения. Создайте Dockerfile в корне проекта с следующим содержанием:
# Используем официальный образ Python как базовый
FROM python:3.11-slim
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app
# Копируем файл зависимостей в рабочую директорию
COPY ./requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
# Копируем остальные файлы проекта в контейнер
COPY . .
# Задаем команду для запуска приложения
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]
Этот Dockerfile создает образ, основанный на легковесной версии официального образа Python, устанавливает необходимые зависимости из файла requirements.txt и задает команду для запуска сервера FastAPI через Uvicorn.
Настройка .dockerignore
Добавление файла .dockerignore в корневую директорию вашего проекта позволяет Docker игнорировать указанные файлы и папки при сборке образа. Вот как это может выглядеть:
**.venv
**__pycache__
**.pyc
**.pyo
**.pyd
**.DS_Store
**.env
**.env.local
**Dockerfile
**docker-compose.yml
Этот файл указывает Docker игнорировать:
- Виртуальное окружение .venv, которое не требуется в образе, так как все зависимости должны быть установлены в самом образе.
- Кэш Python __pycache__, а также скомпилированные файлы .pyc, .pyo, .pyd, которые не нужны для выполнения приложения в контейнере.
- Файлы .DS_Store, создаваемые macOS, и файлы конфигурации окружения .env, .env.local, которые могут содержать чувствительные данные, не предназначенные для размещения в общем доступе.
Использование .dockerignore не только сокращает время сборки и размер образа, но и помогает избежать случайного включения в образ файлов, которые могут представлять риски безопасности или привести к его ненужному увеличению. Это важный шаг на пути к созданию эффективного и безопасного Docker образа для вашего приложения.
Конфигурация docker-compose
Файл docker-compose.yml упрощает управление вашим Docker-контейнером, позволяя описать и запустить мультиконтейнерные приложения. Создайте файл docker-compose.yml в корне проекта с таким содержанием:
version: '3.8'
services:
predict:
build: .
container_name: fastapi-pytorch-app
ports:
- "8000:8000"
env_file:
- ./.env # если необходимо подтянуть переменные окружения
command: uvicorn src.main:app --host 0.0.0.0 --reload
Здесь сервис web настраивается для сборки образа на основе Dockerfile в текущем каталоге, пробрасывает порты для доступа к приложению извне и использует тома для синхронизации кода между хост-машиной и контейнером, что упрощает разработку и тестирование.
Запуск и тестирование сервера
После успешной контейнеризации приложения с помощью Docker, следующий шаг — это запуск и тестирование сервера для убеждения в его корректной работе и функциональности. Этот процесс включает в себя запуск контейнера на локальной машине, проверку доступности API и выполнение тестовых запросов для оценки ответов сервера.
- Запуск сервера:
Если вы следовали предыдущим шагам по созданию Dockerfile и docker-compose.yml, запустить сервер очень просто. В терминале, находясь в корневом каталоге проекта, выполните следующую команду:
docker-compose up --build
- Эта команда соберет образ Docker и запустит контейнер. Вывод в терминале покажет логи сервера, включая сообщения о его запуске и обработке запросов.
- Проверка доступности API:
- После запуска сервера убедитесь, что ваш API доступен. Откройте браузер и перейдите по адресу http://localhost:8000. Если вы включили автоматическую генерацию документации FastAPI, вы увидите интерфейс Swagger UI, который позволяет исследовать и тестировать ваш API прямо из браузера.
- Тестирование функциональности API:
- Используя интерфейс Swagger UI или инструменты для тестирования API, такие как Postman, выполните несколько тестовых запросов к вашему API. Это может быть запрос на получение данных, если API поддерживает такую операцию, или запрос на выполнение предсказания, если API интегрирован с моделью машинного обучения.
Пример запроса для API, обрабатывающего предсказания:
POST predictions/predict/ { "text": "Текст для анализа" }
- Отправьте запрос и оцените ответ сервера. Успешный ответ подтвердит корректную работу вашего API и интеграции с моделью машинного обучения.
- Логирование и отладка:
- В процессе тестирования обратите внимание на логи сервера в терминале. Они могут предоставить ценную информацию при поиске и исправлении ошибок, а также помогут оценить производительность и эффективность обработки запросов.
- Остановка сервера:
- После завершения тестирования остановите сервер, нажав Ctrl+C в терминале, где он запущен, или выполнив команду
docker-compose down
, чтобы остановить и удалить контейнеры, созданные с помощью docker-compose.
- После завершения тестирования остановите сервер, нажав Ctrl+C в терминале, где он запущен, или выполнив команду
Этот процесс запуска и тестирования сервера на локальной машине позволяет убедиться в готовности вашего приложения к более широкому развертыванию и использованию.