feat(docker): unify multi-stage Docker build with NVIDIA CUDA 12 and graceful CPU fallback for universal run
This commit is contained in:
parent
7507a123e5
commit
45870eb0ec
7 changed files with 443 additions and 202 deletions
88
Dockerfile
88
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"]
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
|
|
|||
27
README.md
27
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)
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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..."
|
||||
# ==============================================================================
|
||||
# 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
|
||||
# ==============================================================================
|
||||
|
||||
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
|
||||
|
||||
# Subcommand shortcuts
|
||||
case "$1" in
|
||||
;;
|
||||
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 "$@"
|
||||
;;
|
||||
*)
|
||||
|
|
|
|||
134
docker-run.sh
Executable file
134
docker-run.sh
Executable file
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue