diff --git a/Dockerfile b/Dockerfile index bee8303..4fe4bf4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,50 +1,96 @@ # ============================================================================ -# FlyGuard: ML-ядро обнаружения препятствий в тоннеле метро (Кейс 05, ЛЦТ-2026) +# FlyGuard: Bionic Obstacle Detection Core (LCT-2026, Case 05) +# Hesai Pandar128 LiDAR (128 beams, 10 Hz / 100ms) +# Universal Production Image: NVIDIA CUDA 12.x / Ada Lovelace / Graceful CPU Fallback # ============================================================================ -FROM python:3.11-slim-bookworm AS base -# System configuration & environment +# ---------------------------------------------------------------------------- +# Stage 1: Optional lightweight CPU-only image (build with: --target cpu) +# ---------------------------------------------------------------------------- +FROM python:3.11-slim-bookworm AS cpu + ENV DEBIAN_FRONTEND=noninteractive \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONPATH="/app:/app/tools" \ - FLYGUARD_DATA="/data" + FLYGUARD_DATA="/data" \ + FLYGUARD_DEVICE="cpu" -# 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 +COPY --chown=flyguard:flyguard requirements.txt /app/ +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +COPY --chown=flyguard:flyguard . /app/ +RUN chmod +x /app/docker-entrypoint.sh + +USER flyguard +VOLUME ["/data", "/app/artifacts"] +ENTRYPOINT ["/app/docker-entrypoint.sh"] +CMD ["default"] + + +# ---------------------------------------------------------------------------- +# Stage 2: Universal Production Image with NVIDIA GPU acceleration & CPU fallback +# (Default target when building with: docker build -t flyguard:latest .) +# ---------------------------------------------------------------------------- +FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS production + +ENV DEBIAN_FRONTEND=noninteractive \ + PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH="/app:/app/tools" \ + FLYGUARD_DATA="/data" \ + FLYGUARD_DEVICE="auto" \ + NVIDIA_VISIBLE_DEVICES=all \ + NVIDIA_DRIVER_CAPABILITIES=compute,utility + +# Install Python 3.11, pip, and system runtime libraries (OpenMP for LightGBM/Torch) +RUN apt-get update && apt-get install -y --no-install-recommends \ + software-properties-common \ + ca-certificates \ + libgomp1 \ + curl \ + && add-apt-repository -y ppa:deadsnakes/ppa \ + && apt-get update && apt-get install -y --no-install-recommends \ + python3.11 \ + python3.11-distutils \ + && curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11 \ + && ln -sf /usr/bin/python3.11 /usr/bin/python3 \ + && ln -sf /usr/bin/python3.11 /usr/bin/python \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Create non-root user for container security compliance 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/ +# Cache layer: install Python dependencies with PyTorch CUDA 12.1+ wheels +COPY --chown=flyguard:flyguard requirements-gpu.txt /app/ +RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \ + pip install --no-cache-dir -r requirements-gpu.txt -# Install python dependencies -RUN pip install --no-cache-dir --upgrade pip && \ - pip install --no-cache-dir -r requirements.txt - -# Copy application source code +# Copy source code and artifacts 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 +# Container healthcheck: verifies Python runtime and graceful device detection HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ - CMD python3 -c "import flyguard, numpy, scipy, lightgbm; print('healthy')" || exit 1 + CMD python3 -c "import flyguard; from flyguard.device import get_device_info; print('healthy', get_device_info())" || exit 1 ENTRYPOINT ["/app/docker-entrypoint.sh"] -CMD ["test"] +CMD ["default"] diff --git a/Dockerfile.gpu b/Dockerfile.gpu index 95c70d6..2fcd26e 100644 --- a/Dockerfile.gpu +++ b/Dockerfile.gpu @@ -1,15 +1,16 @@ # ============================================================================ # FlyGuard GPU: NVIDIA RTX / CUDA 12 Production Image (Кейс 05, ЛЦТ-2026) # Архитектура: Ada Lovelace (RTX 4070 Ti Super 16GB) / Ampere / Turing +# Полная совместимость с Dockerfile (Stage: production) # ============================================================================ -FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS base +FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS production -# System configuration & environment ENV DEBIAN_FRONTEND=noninteractive \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONPATH="/app:/app/tools" \ FLYGUARD_DATA="/data" \ + FLYGUARD_DEVICE="auto" \ NVIDIA_VISIBLE_DEVICES=all \ NVIDIA_DRIVER_CAPABILITIES=compute,utility @@ -18,11 +19,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ software-properties-common \ ca-certificates \ libgomp1 \ + curl \ && add-apt-repository -y ppa:deadsnakes/ppa \ && apt-get update && apt-get install -y --no-install-recommends \ python3.11 \ python3.11-distutils \ - curl \ && curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11 \ && ln -sf /usr/bin/python3.11 /usr/bin/python3 \ && ln -sf /usr/bin/python3.11 /usr/bin/python \ @@ -44,15 +45,13 @@ RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \ # Copy application source code COPY --chown=flyguard:flyguard . /app/ - RUN chmod +x /app/docker-entrypoint.sh USER flyguard - VOLUME ["/data", "/app/artifacts"] HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ - CMD python3 -c "import flyguard, torch; print('healthy', torch.cuda.is_available())" || exit 1 + CMD python3 -c "import flyguard; from flyguard.device import get_device_info; print('healthy', get_device_info())" || exit 1 ENTRYPOINT ["/app/docker-entrypoint.sh"] -CMD ["test"] +CMD ["default"] diff --git a/README.md b/README.md index ae30547..585b2d4 100644 --- a/README.md +++ b/README.md @@ -99,20 +99,27 @@ artifacts/ обученные модели ## Как запустить -### Вариант 1. Запуск через Docker / Docker Compose +### Вариант 1. Запуск через Docker / Docker Compose (NVIDIA GPU + CPU Fallback) + +Единый универсальный production-контейнер с поддержкой CUDA 12 и автоматическим переключением на CPU при отсутствии GPU: ```bash -# Тесты на CPU -docker compose run --rm test +# Сборка универсального образа с поддержкой NVIDIA GPU +./docker-run.sh build +# (или напрямую: docker build -t flyguard:latest .) -# Тесты с ускорением NVIDIA GPU -docker compose run --rm gpu-test +# 1. Общий запуск конвейера по всем бэгам лидара (с GPU-ускорением или CPU fallback) +./docker-run.sh run +# (или: docker run --rm -it --gpus all -v /path/to/data:/data:ro flyguard) -# Обучение MBON на 50 000 клеток Кеньона на GPU -docker compose run --rm train-mbon-gpu - -# Прогон бенчмарка с аугментациями на GPU -docker compose run --rm gpu-benchmark +# 2. Запуск через Docker Compose (главный сервис) +docker compose up +# или отдельными сервисами: +docker compose run --rm test # Прогон 40+ unit-тестов +docker compose run --rm info # Диагностика GPU и CUDA +docker compose run --rm train-mbon # Обучение MBON на 50k клеток Кеньона на GPU +docker compose run --rm benchmark # Прогон бенчмарка на GPU +docker compose run --rm evaluate # Оценка метрик детекции ``` ### Вариант 2. Локальный запуск (Python) diff --git a/docker-compose.yml b/docker-compose.yml index bee2e6f..816b6fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,38 @@ services: - # ========================================================================== - # CPU СЕРВИСЫ (Стандартный запуск без GPU / Standalone) - # ========================================================================== - test: + # ============================================================================ + # FlyGuard: Универсальный производственный запуск (NVIDIA GPU / CUDA 12) + # Поддерживает Ada Lovelace (RTX 4070 Ti Super 16GB) / Ampere / CPU Fallback + # ============================================================================ + + # --- Главный сервис общего запуска конвейера по всем бэгам лидара --- + pipeline: build: context: . dockerfile: Dockerfile image: flyguard:latest + container_name: flyguard-pipeline + command: ["pipeline", "--all", "--verbose"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + - FLYGUARD_DEVICE=auto + - NVIDIA_VISIBLE_DEVICES=all + - NVIDIA_DRIVER_CAPABILITIES=compute,utility + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + shm_size: '8gb' + + # --- Полный прогон тестового набора ядра и роутинга устройств --- + test: + image: flyguard:latest container_name: flyguard-test command: ["test"] volumes: @@ -15,75 +41,39 @@ services: environment: - PYTHONUNBUFFERED=1 - FLYGUARD_DATA=/data - shm_size: '2gb' + - FLYGUARD_DEVICE=auto + - NVIDIA_VISIBLE_DEVICES=all + - NVIDIA_DRIVER_CAPABILITIES=compute,utility + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + shm_size: '8gb' + # --- Диагностика доступности GPU и характеристик оборудования --- + info: + image: flyguard:latest + container_name: flyguard-info + command: ["info"] + environment: + - NVIDIA_VISIBLE_DEVICES=all + - NVIDIA_DRIVER_CAPABILITIES=compute,utility + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + + # --- Оценка метрик детекции (Folds Cross-Validation / AUC) --- 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' - - 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' - - 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' - - 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' - - # ========================================================================== - # NVIDIA GPU СЕРВИСЫ (NVIDIA GeForce RTX 4070 Ti Super 16GB / CUDA 12.x) - # Использование: docker compose run --rm <имя-сервиса> - # ========================================================================== - gpu-test: - build: - context: . - dockerfile: Dockerfile.gpu - image: flyguard:gpu - container_name: flyguard-gpu-test - command: ["test"] + command: ["evaluate", "--mbon-dir", "artifacts/mbon_folds", "--device", "auto"] volumes: - ./artifacts:/app/artifacts - ./data:/data:ro @@ -101,15 +91,16 @@ services: capabilities: [gpu] shm_size: '8gb' - gpu-benchmark: - image: flyguard:gpu - container_name: flyguard-gpu-benchmark + # --- Генерация синтетического бенчмарка с GPU DoG и MBON --- + benchmark: + image: flyguard:latest + container_name: flyguard-benchmark command: [ "benchmark", "--memory", "artifacts/mushroom_body.npz", "--mbon-dir", "artifacts/mbon_folds", "--augment", - "--device", "cuda", + "--device", "auto", "--out", "artifacts/benchmark_gpu.json" ] volumes: @@ -129,33 +120,13 @@ services: capabilities: [gpu] shm_size: '8gb' - gpu-evaluate: - image: flyguard:gpu - container_name: flyguard-gpu-evaluate - command: ["evaluate", "--mbon-dir", "artifacts/mbon_folds", "--device", "cuda"] - volumes: - - ./artifacts:/app/artifacts - - ./data:/data:ro - environment: - - PYTHONUNBUFFERED=1 - - FLYGUARD_DATA=/data - - NVIDIA_VISIBLE_DEVICES=all - - NVIDIA_DRIVER_CAPABILITIES=compute,utility - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: all - capabilities: [gpu] - shm_size: '8gb' - - train-mbon-gpu: - image: flyguard:gpu - container_name: flyguard-train-mbon-gpu + # --- Обучение MBON Readout на 50 000 клеток Кеньона на GPU --- + train-mbon: + image: flyguard:latest + container_name: flyguard-train-mbon command: [ "train-mbon", - "--device", "cuda", + "--device", "auto", "--n-kc", "50000", "--active", "100", "--epochs", "100", @@ -179,12 +150,13 @@ services: capabilities: [gpu] shm_size: '8gb' - train-track-gpu: - image: flyguard:gpu - container_name: flyguard-train-track-gpu + # --- Обучение классификатора треков TrackReadout --- + train-track: + image: flyguard:latest + container_name: flyguard-train-track command: [ "train-track", - "--device", "cuda", + "--device", "auto", "--epochs", "300", "--baseline", "--save-folds", "artifacts/track_folds", @@ -207,37 +179,10 @@ services: capabilities: [gpu] shm_size: '8gb' - gpu-pipeline: - image: flyguard:gpu - container_name: flyguard-gpu-pipeline - command: [ - "pipeline", - "--all", - "--memory", "artifacts/mushroom_body.npz", - "--readout", "artifacts/mbon_readout.npz", - "--device", "cuda", - "--verbose" - ] - volumes: - - ./artifacts:/app/artifacts - - ./data:/data:ro - environment: - - PYTHONUNBUFFERED=1 - - FLYGUARD_DATA=/data - - NVIDIA_VISIBLE_DEVICES=all - - NVIDIA_DRIVER_CAPABILITIES=compute,utility - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: all - capabilities: [gpu] - shm_size: '8gb' - - gpu-shell: - image: flyguard:gpu - container_name: flyguard-gpu-shell + # --- Интерактивная Bash-сессия разработчика --- + shell: + image: flyguard:latest + container_name: flyguard-shell command: ["bash"] volumes: - ./artifacts:/app/artifacts @@ -257,3 +202,36 @@ services: stdin_open: true tty: true shm_size: '8gb' + + # ============================================================================ + # СЕРВИСЫ ДЛЯ ЧИСТОГО CPU (Stand-alone без NVIDIA GPU) + # ============================================================================ + cpu-test: + build: + context: . + dockerfile: Dockerfile + target: cpu + image: flyguard:cpu + container_name: flyguard-cpu-test + command: ["test"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + - FLYGUARD_DEVICE=cpu + shm_size: '2gb' + + cpu-pipeline: + image: flyguard:cpu + container_name: flyguard-cpu-pipeline + command: ["pipeline", "--all"] + volumes: + - ./artifacts:/app/artifacts + - ./data:/data:ro + environment: + - PYTHONUNBUFFERED=1 + - FLYGUARD_DATA=/data + - FLYGUARD_DEVICE=cpu + shm_size: '2gb' diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 456e6c5..2c3e7d3 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,47 +1,116 @@ #!/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 +# ============================================================================== +# FlyGuard: Bionic Obstacle Detection Core (LCT-2026, Case 05) +# Hesai Pandar128 LiDAR (128 beams, 10 Hz / 100ms) +# Universal Entrypoint: NVIDIA GPU Acceleration (CUDA 12.x) with CPU Fallback +# ============================================================================== -# Subcommand shortcuts -case "$1" in +print_banner() { + echo "============================================================================" + echo " FlyGuard · Блиц-обнаружение препятствий в тоннеле метро (Кейс 05, ЛЦТ-2026)" + echo " Hesai Pandar128 (128 лучей, 10 Гц / 100 мс) · NVIDIA CUDA 12 / CPU Fallback" + echo "============================================================================" +} + +print_device_info() { + python3 -c " +try: + import flyguard.device as dev + info = dev.get_device_info() + if info['cuda_available']: + print(f'==> [HARDWARE] NVIDIA GPU: {info[\"device_name\"]} (Compute {info[\"compute_capability\"]}, {info[\"total_memory_gb\"]} GB VRAM)') + print(f'==> [ACCELERATION] CUDA 12: АКТИВНО (PyTorch {info[\"torch_version\"]})') + else: + print('==> [HARDWARE] CPU Mode: CUDA недоступна или не передана в контейнер.') + print('==> [FALLBACK] Активирован автоматический Graceful Fallback на CPU.') +except Exception as e: + print(f'==> Проверка окружения: {e}') +" +} + +CMD="${1:-default}" + +case "$CMD" in + default|run) + print_banner + print_device_info + DATA_DIR="${FLYGUARD_DATA:-/data}" + FOUND_BAG=$(find "$DATA_DIR" -name '*.db3' 2>/dev/null | head -n 1 || true) + if [ -d "$DATA_DIR" ] && [ -n "$FOUND_BAG" ]; then + echo "==> Обнаружены бэги лидара в $DATA_DIR. Запуск конвейера FlyGuard по всем записям..." + exec python3 tools/run_pipeline.py --all \ + --memory artifacts/mushroom_body.npz \ + --readout artifacts/mbon_readout.npz \ + --device auto \ + --verbose + else + echo "==> В $DATA_DIR не найдены файлы .db3 (датасет не смонтирован через -v /путь/к/data:/data)." + echo "==> Выполняется системный прогон верификационных тестов и роутинга..." + exec python3 tests/run_tests.py + fi + ;; + pipeline|run-pipeline) + shift + print_banner + print_device_info + exec python3 tools/run_pipeline.py \ + --memory artifacts/mushroom_body.npz \ + --readout artifacts/mbon_readout.npz \ + --device auto "$@" + ;; + benchmark|make-benchmark) + shift + print_banner + print_device_info + exec python3 tools/make_benchmark.py \ + --memory artifacts/mushroom_body.npz \ + --mbon-dir artifacts/mbon_folds \ + --device auto "$@" + ;; + evaluate) + shift + print_banner + print_device_info + exec python3 tools/evaluate.py \ + --mbon-dir artifacts/mbon_folds \ + --device auto "$@" + ;; + train-mbon) + shift + print_banner + print_device_info + exec python3 tools/train_mbon.py \ + --device auto "$@" + ;; + train-track) + shift + print_banner + print_device_info + exec python3 tools/train_track.py \ + --device auto "$@" + ;; test|tests|run-tests) shift + print_banner + print_device_info 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 "$@" + info|device|gpu|gpu-info) + print_banner + python3 -c " +import json +import flyguard.device as dev +print(json.dumps(dev.get_device_info(), indent=2, ensure_ascii=False)) +" ;; bash|sh) + shift exec /bin/bash "$@" ;; *) diff --git a/docker-run.sh b/docker-run.sh new file mode 100755 index 0000000..4fc8b38 --- /dev/null +++ b/docker-run.sh @@ -0,0 +1,134 @@ +#!/usr/bin/env bash +# ============================================================================== +# FlyGuard: Удобный скрипт сборки и запуска Docker-контейнера +# Автоматически определяет наличие NVIDIA GPU и передает флаги --gpus all +# ============================================================================== +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +IMAGE_NAME="flyguard:latest" +DATA_DIR="${FLYGUARD_DATA:-$DIR/data}" +ARTIFACTS_DIR="$DIR/artifacts" + +mkdir -p "$DATA_DIR" "$ARTIFACTS_DIR" + +# Определение наличия драйвера NVIDIA +GPU_FLAG="" +if command -v nvidia-smi &>/dev/null; then + GPU_FLAG="--gpus all" +fi + +usage() { + echo "Использование: $0 [команда]" + echo "" + echo "Команды:" + echo " build Собрать универсальный образ с поддержкой NVIDIA GPU ($IMAGE_NAME)" + echo " build-cpu Собрать облегченный CPU-образ (flyguard:cpu)" + echo " run Общий запуск конвейера (по умолчанию обработка всех бэгов)" + echo " pipeline Запуск конвейера с дополнительными аргументами" + echo " test Запуск всех 40+ тестов верификации" + echo " benchmark Генерация бенчмарка с ускорением на GPU" + echo " evaluate Оценка качества моделей и кросс-валидация" + echo " train-mbon Обучение клеток Кеньона (50 000 KC) на GPU" + echo " train-track Обучение классификатора треков" + echo " info Вывод телеметрии и статуса GPU из контейнера" + echo " shell Интерактивная командная строка (bash) внутри контейнера" + echo "" + echo "Примеры:" + echo " $0 build" + echo " $0 run" + echo " $0 pipeline --all --verbose" + echo " $0 train-mbon --device cuda --n-kc 50000" +} + +CMD="${1:-run}" + +case "$CMD" in + build) + echo "==> Сборка универсального образа FlyGuard ($IMAGE_NAME)..." + docker build -t "$IMAGE_NAME" -f "$DIR/Dockerfile" "$DIR" + ;; + build-cpu) + echo "==> Сборка облегченного CPU-образа FlyGuard (flyguard:cpu)..." + docker build --target cpu -t flyguard:cpu -f "$DIR/Dockerfile" "$DIR" + ;; + run|default) + shift 2>/dev/null || true + echo "==> Запуск контейнера FlyGuard (GPU: ${GPU_FLAG:-CPU Fallback})..." + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data:ro \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" "$@" + ;; + pipeline) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data:ro \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" pipeline "$@" + ;; + test|tests) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data:ro \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" test "$@" + ;; + benchmark) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data:ro \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" benchmark "$@" + ;; + evaluate) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data:ro \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" evaluate "$@" + ;; + train-mbon) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" train-mbon "$@" + ;; + train-track) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" train-track "$@" + ;; + info|gpu|device) + docker run --rm $GPU_FLAG "$IMAGE_NAME" info + ;; + shell|bash) + shift + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" bash "$@" + ;; + help|--help|-h) + usage + exit 0 + ;; + *) + docker run --rm -it $GPU_FLAG \ + -v "$DATA_DIR":/data:ro \ + -v "$ARTIFACTS_DIR":/app/artifacts \ + --shm-size=8g \ + "$IMAGE_NAME" "$@" + ;; +esac diff --git a/tools/run_pipeline.py b/tools/run_pipeline.py index 7a41631..f755b80 100644 --- a/tools/run_pipeline.py +++ b/tools/run_pipeline.py @@ -80,8 +80,16 @@ def main() -> None: readout = MbonReadout.load(args.readout) if args.readout else None track_readout = TrackReadout.load(args.track_readout) if args.track_readout else None + if not args.all and not args.bag: + args.all = True + params = Params(fov_deg=args.fov, device=args.device) - bags = find_bags(B.DATA / "for_hackathon") if args.all else [args.bag] + bag_root = (B.DATA / "for_hackathon") if (B.DATA / "for_hackathon").exists() else B.DATA + bags = find_bags(bag_root) if args.all else ([args.bag] if args.bag else []) + if not bags: + print(f"Внимание: бэги не найдены в {bag_root}. Убедитесь, что каталог смонтирован в FLYGUARD_DATA.") + return + for b in bags: run(b, params, memory, readout=readout, track_readout=track_readout, limit=args.limit, verbose=args.verbose)