forked from Dan4ick/Lidar_Muxa
добавлена контейнеризация Docker и docker-compose для запуска и тестов
- Dockerfile на python:3.11-slim с libgomp1, непривилегированным пользователем и healthcheck; - docker-entrypoint.sh с поддержкой шорткатов test/benchmark/evaluate/pipeline; - docker-compose.yml с профилями тестирования, оценки и бенчмарка; - docs/DOCKER.md: руководство по сборке, запуску и монтированию томов.
This commit is contained in:
parent
3c59e1f87a
commit
c0af4fd712
6 changed files with 311 additions and 0 deletions
38
.dockerignore
Normal file
38
.dockerignore
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Git
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
|
.github
|
||||||
|
|
||||||
|
# Python caches
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
.pytest_cache
|
||||||
|
.coverage
|
||||||
|
htmlcov/
|
||||||
|
*.egg-info/
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
|
||||||
|
# Virtual environments
|
||||||
|
venv/
|
||||||
|
.venv/
|
||||||
|
env/
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Editor & OS artifacts
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Agent & temporary files
|
||||||
|
scratch/
|
||||||
|
.gemini/
|
||||||
|
|
||||||
|
# Raw lidar data (mounted via volume, never baked into image)
|
||||||
|
data/
|
||||||
50
Dockerfile
Normal file
50
Dockerfile
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
# ============================================================================
|
||||||
|
# FlyGuard: ML-ядро обнаружения препятствий в тоннеле метро (Кейс 05, ЛЦТ-2026)
|
||||||
|
# ============================================================================
|
||||||
|
FROM python:3.11-slim-bookworm AS base
|
||||||
|
|
||||||
|
# System configuration & environment
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
|
PYTHONUNBUFFERED=1 \
|
||||||
|
PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONPATH="/app:/app/tools" \
|
||||||
|
FLYGUARD_DATA="/data"
|
||||||
|
|
||||||
|
# Install runtime system dependencies (libgomp1 is required by LightGBM/OpenMP)
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
libgomp1 \
|
||||||
|
ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Create non-root user and directories
|
||||||
|
RUN useradd -m -u 1000 -s /bin/bash flyguard && \
|
||||||
|
mkdir -p /app /data /app/artifacts && \
|
||||||
|
chown -R flyguard:flyguard /app /data
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Cache layer: copy only requirements first
|
||||||
|
COPY --chown=flyguard:flyguard requirements.txt /app/
|
||||||
|
|
||||||
|
# Install python dependencies
|
||||||
|
RUN pip install --no-cache-dir --upgrade pip && \
|
||||||
|
pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy application source code
|
||||||
|
COPY --chown=flyguard:flyguard . /app/
|
||||||
|
|
||||||
|
# Make sure entrypoint script is executable
|
||||||
|
RUN chmod +x /app/docker-entrypoint.sh
|
||||||
|
|
||||||
|
# Switch to non-root user for security
|
||||||
|
USER flyguard
|
||||||
|
|
||||||
|
# Volume mount points
|
||||||
|
VOLUME ["/data", "/app/artifacts"]
|
||||||
|
|
||||||
|
# Container healthcheck
|
||||||
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||||
|
CMD python3 -c "import flyguard, numpy, scipy, lightgbm; print('healthy')" || exit 1
|
||||||
|
|
||||||
|
ENTRYPOINT ["/app/docker-entrypoint.sh"]
|
||||||
|
CMD ["test"]
|
||||||
91
docker-compose.yml
Normal file
91
docker-compose.yml
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
services:
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
# 1. Запуск набора тестов
|
||||||
|
# docker compose run --rm test
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
test:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: flyguard:latest
|
||||||
|
container_name: flyguard-test
|
||||||
|
command: ["test"]
|
||||||
|
volumes:
|
||||||
|
- ./artifacts:/app/artifacts
|
||||||
|
- ./data:/data:ro
|
||||||
|
environment:
|
||||||
|
- PYTHONUNBUFFERED=1
|
||||||
|
- FLYGUARD_DATA=/data
|
||||||
|
shm_size: '2gb'
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
# 2. Оценка ложных тревог (leave-one-bag-out)
|
||||||
|
# docker compose run --rm evaluate
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
evaluate:
|
||||||
|
image: flyguard:latest
|
||||||
|
container_name: flyguard-evaluate
|
||||||
|
command: ["evaluate", "--mbon-dir", "artifacts/mbon_folds"]
|
||||||
|
volumes:
|
||||||
|
- ./artifacts:/app/artifacts
|
||||||
|
- ./data:/data:ro
|
||||||
|
environment:
|
||||||
|
- PYTHONUNBUFFERED=1
|
||||||
|
- FLYGUARD_DATA=/data
|
||||||
|
shm_size: '2gb'
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
# 3. Полигон дальности обнаружения с аугментациями
|
||||||
|
# docker compose run --rm benchmark
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
benchmark:
|
||||||
|
image: flyguard:latest
|
||||||
|
container_name: flyguard-benchmark
|
||||||
|
command: [
|
||||||
|
"benchmark",
|
||||||
|
"--memory", "artifacts/mushroom_body.npz",
|
||||||
|
"--mbon-dir", "artifacts/mbon_folds",
|
||||||
|
"--augment",
|
||||||
|
"--out", "artifacts/benchmark.json"
|
||||||
|
]
|
||||||
|
volumes:
|
||||||
|
- ./artifacts:/app/artifacts
|
||||||
|
- ./data:/data:ro
|
||||||
|
environment:
|
||||||
|
- PYTHONUNBUFFERED=1
|
||||||
|
- FLYGUARD_DATA=/data
|
||||||
|
shm_size: '2gb'
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
# 4. Прогон конвейера по бэгу
|
||||||
|
# docker compose run --rm pipeline --bag /data/for_hackathon/doubleT_obstacle --verbose
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
pipeline:
|
||||||
|
image: flyguard:latest
|
||||||
|
container_name: flyguard-pipeline
|
||||||
|
command: ["pipeline", "--all", "--memory", "artifacts/mushroom_body.npz"]
|
||||||
|
volumes:
|
||||||
|
- ./artifacts:/app/artifacts
|
||||||
|
- ./data:/data:ro
|
||||||
|
environment:
|
||||||
|
- PYTHONUNBUFFERED=1
|
||||||
|
- FLYGUARD_DATA=/data
|
||||||
|
shm_size: '2gb'
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
# 5. Интерактивная оболочка
|
||||||
|
# docker compose run --rm shell
|
||||||
|
# --------------------------------------------------------------------------
|
||||||
|
shell:
|
||||||
|
image: flyguard:latest
|
||||||
|
container_name: flyguard-shell
|
||||||
|
command: ["bash"]
|
||||||
|
volumes:
|
||||||
|
- ./artifacts:/app/artifacts
|
||||||
|
- ./data:/data:ro
|
||||||
|
environment:
|
||||||
|
- PYTHONUNBUFFERED=1
|
||||||
|
- FLYGUARD_DATA=/data
|
||||||
|
stdin_open: true
|
||||||
|
tty: true
|
||||||
|
shm_size: '2gb'
|
||||||
50
docker-entrypoint.sh
Executable file
50
docker-entrypoint.sh
Executable file
|
|
@ -0,0 +1,50 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Default to run_tests if no arguments provided
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "==> FlyGuard container started without arguments. Running verification tests..."
|
||||||
|
exec python3 tests/run_tests.py
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Subcommand shortcuts
|
||||||
|
case "$1" in
|
||||||
|
test|tests|run-tests)
|
||||||
|
shift
|
||||||
|
exec python3 tests/run_tests.py "$@"
|
||||||
|
;;
|
||||||
|
pytest)
|
||||||
|
shift
|
||||||
|
exec pytest tests "$@"
|
||||||
|
;;
|
||||||
|
pipeline|run-pipeline)
|
||||||
|
shift
|
||||||
|
exec python3 tools/run_pipeline.py "$@"
|
||||||
|
;;
|
||||||
|
benchmark|make-benchmark)
|
||||||
|
shift
|
||||||
|
exec python3 tools/make_benchmark.py "$@"
|
||||||
|
;;
|
||||||
|
evaluate)
|
||||||
|
shift
|
||||||
|
exec python3 tools/evaluate.py "$@"
|
||||||
|
;;
|
||||||
|
train-mbon)
|
||||||
|
shift
|
||||||
|
exec python3 tools/train_mbon.py "$@"
|
||||||
|
;;
|
||||||
|
train-track)
|
||||||
|
shift
|
||||||
|
exec python3 tools/train_track.py "$@"
|
||||||
|
;;
|
||||||
|
plot|plot-benchmark)
|
||||||
|
shift
|
||||||
|
exec python3 tools/plot_benchmark.py "$@"
|
||||||
|
;;
|
||||||
|
bash|sh)
|
||||||
|
exec /bin/bash "$@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
81
docs/DOCKER.md
Normal file
81
docs/DOCKER.md
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
# Руководство по запуску FlyGuard в Docker
|
||||||
|
|
||||||
|
## 1. Быстрая сборка образа
|
||||||
|
|
||||||
|
Сборка легковесного образа на базе `python:3.11-slim-bookworm` (включает OpenMP/BLAS и зависимости):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -t flyguard:latest .
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Запуск тестов
|
||||||
|
|
||||||
|
Контейнер по умолчанию выполняет самодиагностику и тестовый набор:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Прямой запуск через Docker
|
||||||
|
docker run --rm flyguard:latest
|
||||||
|
|
||||||
|
# Либо через docker compose
|
||||||
|
docker compose run --rm test
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Запуск конвейера и бенчмарка с данными лидара
|
||||||
|
|
||||||
|
Датасеты монтируются в контейнер в каталог `/data`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Оценка ложных тревог по всем бэгам
|
||||||
|
docker run --rm \
|
||||||
|
-v /path/to/lidar/data:/data:ro \
|
||||||
|
-v $(pwd)/artifacts:/app/artifacts \
|
||||||
|
--shm-size=2g \
|
||||||
|
flyguard:latest evaluate --mbon-dir artifacts/mbon_folds
|
||||||
|
|
||||||
|
# Запуск полигона дальности с новыми аугментациями
|
||||||
|
docker run --rm \
|
||||||
|
-v /path/to/lidar/data:/data:ro \
|
||||||
|
-v $(pwd)/artifacts:/app/artifacts \
|
||||||
|
--shm-size=2g \
|
||||||
|
flyguard:latest benchmark --memory artifacts/mushroom_body.npz --augment
|
||||||
|
|
||||||
|
# Прогон по конкретному бэгу с выводом телеметрии в реальном времени
|
||||||
|
docker run --rm \
|
||||||
|
-v /path/to/lidar/data:/data:ro \
|
||||||
|
flyguard:latest pipeline --bag /data/for_hackathon/doubleT_obstacle --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Интерактивная отладка
|
||||||
|
|
||||||
|
Войти внутрь контейнера с настроенным окружением:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose run --rm shell
|
||||||
|
# или
|
||||||
|
docker run -it --rm \
|
||||||
|
-v /path/to/lidar/data:/data:ro \
|
||||||
|
-v $(pwd)/artifacts:/app/artifacts \
|
||||||
|
flyguard:latest bash
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Доступные команды шорткатов entrypoint
|
||||||
|
|
||||||
|
Точка входа `docker-entrypoint.sh` поддерживает удобные псевдонимы:
|
||||||
|
|
||||||
|
* `test` — запускает автономный набор юнит-тестов (`tests/run_tests.py`)
|
||||||
|
* `pytest` — запускает `pytest tests`
|
||||||
|
* `pipeline` — вызывает `tools/run_pipeline.py`
|
||||||
|
* `benchmark` — вызывает `tools/make_benchmark.py`
|
||||||
|
* `evaluate` — вызывает `tools/evaluate.py`
|
||||||
|
* `train-mbon` — вызывает `tools/train_mbon.py`
|
||||||
|
* `train-track` — вызывает `tools/train_track.py`
|
||||||
|
* `plot` — вызывает `tools/plot_benchmark.py`
|
||||||
|
* `bash` / `sh` — открывает командную оболочку
|
||||||
|
|
@ -2,6 +2,7 @@ numpy>=1.24
|
||||||
scipy>=1.10
|
scipy>=1.10
|
||||||
# только для контрольного бустинга в tools/train_mbon.py --baseline
|
# только для контрольного бустинга в tools/train_mbon.py --baseline
|
||||||
lightgbm>=4.0
|
lightgbm>=4.0
|
||||||
|
matplotlib>=3.7
|
||||||
# только для обучения на GPU (tools/train_mbon.py --device cuda); ядру не нужен
|
# только для обучения на GPU (tools/train_mbon.py --device cuda); ядру не нужен
|
||||||
# torch>=2.0
|
# torch>=2.0
|
||||||
pytest>=7.0
|
pytest>=7.0
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue