Руководство разработчика
Руководство разработчика
Структура репозитория
.
├── docker-compose.yml
├── docker-compose.mac.yml
├── nginx/
├── schemion-api/
├── schemion-inference/
├── schemion-training/
└── system_model_importer/Каждый из трех основных сервисов является отдельным Python-проектом со своими requirements.txt, Dockerfile, тестами и внутренней архитектурой.
Локальный запуск
Для полного интеграционного запуска предпочтительно использовать Docker Compose:
docker compose up --buildНа macOS:
docker compose -f docker-compose.mac.yml up --buildПосле запуска:
- API:
http://localhost:8000 - API через nginx:
http://localhost/api - OpenAPI:
http://localhost:8000/docs - MinIO console:
http://localhost:9001 - Bobber:
localhost:50051 - PostgreSQL:
localhost:5432
Разработка API
Код API находится в schemion-api.
Ключевые директории:
app/presentation/routers- FastAPI маршруты;app/presentation/schemas- Pydantic-схемы запросов и ответов;app/core/services- бизнес-логика;app/core/validation- валидация файлов;app/infrastructure/persistence- SQLAlchemy-модели и репозитории;app/infrastructure/services- MinIO, cache, Bobber publisher;app/infrastructure/di- DI-контейнер Dishka;alembic- миграции БД.
При добавлении нового endpoint желательно сохранять текущий паттерн:
- Pydantic schema в
presentation/schemas. - Метод сервиса в
core/services. - Интерфейс репозитория в
core/interfaces, если нужен новый persistence contract. - Реализация в
infrastructure/persistence/repositories. - Роут в
presentation/routers. - Инвалидация кэша, если endpoint меняет состояние.
- Тесты в
schemion-api/tests.
Разработка воркеров
Training и inference не являются HTTP-сервисами. Это долгоживущие процессы, которые подписываются на Bobber.
При изменении формата сообщения нужно синхронно обновлять:
- publisher в
schemion-api; - parser/use case в соответствующем воркере;
- документацию Архитектура системы и материалы по ML-пайплайнам;
- тесты use case.
Добавление новой архитектуры модели
Для inference:
- Реализовать детектор, совместимый с
IDetector. - Добавить mapping или ветку в
DetectorFactory. - Обновить
models_config.py. - Убедиться, что формат весов и список классов корректно загружаются.
Для training:
- Реализовать trainer, совместимый с
IDetectorTrainer. - Добавить создание trainer в
DetectorTrainerFactory. - Описать требования к датасету.
- Реализовать экспорт весов в
.ptили.pth. - Добавить сбор метрик.
Для API:
- Обновить
ModelArchitectures, если появляется новый верхнеуровневый тип. - Обновить валидацию и документацию.
Тесты
В репозитории есть тесты для:
- API services;
- API schemas;
- API MinIO storage;
- API Bobber publisher;
- training use cases and factories;
- inference use cases, repositories, services and factories.
Запуск зависит от окружения конкретного submodule. Общий паттерн:
cd schemion-api
pytestcd schemion-training
pytestcd schemion-inference
pytestЕсли тесты требуют внешних сервисов, поднимите Docker Compose или используйте test doubles, уже описанные в tests/conftest.py.
Безопасность
Текущие значения секретов в compose и config являются development defaults:
JWT_SECRET=supersecret
POSTGRES_PASSWORD=admin
MINIO_SECRET_KEY=minioadminДля production необходимо:
- заменить все секреты;
- ограничить CORS вместо
allow_origins=["*"]; - включить TLS на внешнем контуре;
- не публиковать PostgreSQL и MinIO API наружу без необходимости;
- пересмотреть срок жизни access и refresh token;
- добавить постоянное распределенное кэш-хранилище, если API масштабируется горизонтально.
Эксплуатационные замечания
- Статус задачи является главным источником правды для клиента.
- Если задача зависла в
queued, проверьте доступность Bobber и соответствующего воркера. - Если задача зависла в
running, смотрите логи воркера и наличие GPU/CUDA. - Если
output_urlне открывается, проверьте доступность MinIO наlocalhost:9000и срок жизни presigned URL. - Если обучение YOLO падает на macOS, причина может быть в жестком
device="cuda". - Если inference на PDF падает, требуется отдельная конвертация PDF в изображение перед
PIL.Image.open.
Известные места для улучшения
- Добавить постоянное распределенное кэш-хранилище, если предполагается несколько API-инстансов.
- Добавить NMS при объединении тайлов inference.
- Унифицировать
MINIO_PUBLIC_ENDPOINTи фактический endpoint, используемый для presigned URL. - Явно валидировать структуру датасета на API-слое, а не только в training-воркере.
- Разделить admin endpoints и публичный API на уровне маршрутизации и политик доступа.
- Добавить поддержку CPU fallback для YOLO training.
- Уточнить и зафиксировать профили Faster R-CNN между training и inference.