Brainrot_Muxa/Dockerfile

109 lines
6.6 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FlyGuard — обнаружение посторонних объектов в тоннеле метро по данным 3D-лидара.
#
# Образ самодостаточен: во время работы сеть не нужна, все зависимости ставятся
# на этапе сборки. Базовый образ — официальный ROS 2 Humble на Ubuntu 22.04,
# ровно та среда, что указана в ТЗ.
#
# docker build -t flyguard .
# docker run --rm -it --gpus all --network host --ipc host -v /path/to/bags:/data flyguard
#
# Без --gpus all (или на машине без видеокарты NVIDIA) тот же образ считает на
# процессоре — с тем же результатом.
FROM ros:humble-ros-base-jammy
ARG DEBIAN_FRONTEND=noninteractive
# Численное ядро берётся из репозиториев Ubuntu, а не из pip: так образ собирается
# без выхода в PyPI и получает numpy/scipy, слинкованные с системным BLAS.
RUN apt-get update && apt-get install -y --no-install-recommends \
python3-numpy \
python3-scipy \
python3-opencv \
python3-pil \
fonts-dejavu-core \
python3-colcon-common-extensions \
ros-humble-rviz2 \
ros-humble-rosbag2-storage-mcap \
ros-humble-diagnostic-msgs \
&& rm -rf /var/lib/apt/lists/*
# PyTorch с CUDA 12.8 — плотные стадии конвейера на видеокарте (сетчатка,
# ламина, кластеризация; flyguard/gpu.py). Колёса несут свою среду CUDA, от
# машины нужен только драйвер NVIDIA (у стенда 580 — это до CUDA 13.0).
# 2.9.1 — последняя сборка под Python 3.10 из Ubuntu 22.04; CUDA 12.8 нужна
# для Blackwell (RTX 50xx) и годится для Ada (RTX 40xx). Весит PyTorch с
# библиотеками CUDA 6.5 ГБ, поэтому ставится одним слоем и без кэша pip.
#
# Колёса — из индекса PyTorch, а если задан TORCH_WHEELS — с этого адреса
# (сборка там, где сети нет: колёса скачиваются на соседней машине и отдаются
# любым HTTP-сервером, docker/wheels/README.md). В контекст сборки колёса не
# кладутся: это ещё 4 ГБ копий на диске.
ARG TORCH_WHEELS=
RUN set -e; \
if [ -n "$TORCH_WHEELS" ]; then \
python3 -c "import re, urllib.request as u; b = '$TORCH_WHEELS'.rstrip('/'); \
f = re.findall(r'href=\"(pip-[^\"]+\.whl)\"', u.urlopen(b + '/').read().decode())[0]; \
u.urlretrieve(b + '/' + f, '/tmp/pip.whl')"; \
python3 /tmp/pip.whl/pip install --no-cache-dir --no-index \
--find-links "$TORCH_WHEELS" torch==2.9.1; \
rm -f /tmp/pip.whl; \
else \
apt-get update && apt-get install -y --no-install-recommends python3-pip; \
pip3 install --no-cache-dir --index-url https://download.pytorch.org/whl/cu128 \
torch==2.9.1; \
rm -rf /var/lib/apt/lists/*; \
fi; \
python3 -c "import torch; print('torch', torch.__version__, 'CUDA', torch.version.cuda)"
# Видеокарта для CUDA и для RViz (OpenGL через драйвер NVIDIA при --gpus all)
ENV NVIDIA_VISIBLE_DEVICES=all \
NVIDIA_DRIVER_CAPABILITIES=all
WORKDIR /opt/flyguard
# Сначала манифесты — слой с зависимостями переживает правки кода
COPY ros2_ws/src/flyguard/package.xml ros2_ws/src/flyguard/package.xml
COPY ros2_ws/src/flyguard_msgs/package.xml ros2_ws/src/flyguard_msgs/package.xml
COPY ros2_ws/src/flyguard_msgs/CMakeLists.txt ros2_ws/src/flyguard_msgs/CMakeLists.txt
COPY ros2_ws/src ros2_ws/src
# Память тоннеля и обученное считывание MBON. Без считывания узел работает
# на ручной формуле веса улики, а у неё ложных тревог в полтора раза больше
# (13.6 против 8.0 на км, README) — замеренная конфигурация и образ должны совпадать.
COPY artifacts/mushroom_body.npz ros2_ws/src/flyguard/artifacts/mushroom_body.npz
COPY artifacts/mbon_readout.npz ros2_ws/src/flyguard/artifacts/mbon_readout.npz
# Обычная установка, без --symlink-install: тот режим оставляет в install/
# ссылки внутрь build/ и src/, и последующее удаление build/ ломает пакет.
RUN . /opt/ros/humble/setup.sh \
&& cd ros2_ws \
&& colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release \
&& rm -rf build log
COPY docker/entrypoint.sh /entrypoint.sh
COPY docker/fastdds_large.xml /opt/flyguard/fastdds_large.xml
COPY docker/fastdds_udp.xml /opt/flyguard/fastdds_udp.xml
# Пульт проигрывания для `docker exec` (пауза, перемотка, скорость)
COPY docker/flyguard-keys.sh /usr/local/bin/flyguard-keys
# Снятие CR: при клонировании на Windows git может подставить CRLF, и тогда
# ядро ищет интерпретатор «bash\r». Ошибка неочевидная, а стоит одной строки.
RUN sed -i 's/\r$//' /entrypoint.sh /usr/local/bin/flyguard-keys \
&& chmod +x /entrypoint.sh /usr/local/bin/flyguard-keys
# BLAS в один поток. Матрицы конвейера мелкие, и потоки OpenBLAS не ускоряют
# кадр, а крутятся вхолостую в ожидании работы: при 4 потоках узел занимал
# 3 ядра, при одном — 0.4 ядра, а кадр даже чуть быстрее (33.9 / 39.3 мс против
# 33.2 / 40.5, медиана / p95; синтетика 43.7 / 50.2 против 45.9 / 54.7).
ENV OMP_NUM_THREADS=1 \
OPENBLAS_NUM_THREADS=1 \
MKL_NUM_THREADS=1 \
PYTHONUNBUFFERED=1 \
RCUTILS_COLORIZED_OUTPUT=1
# Транспорт под кадр в 24 МБ: умолчания Fast DDS рассчитаны на сотни килобайт
# и теряли половину кадров ещё до подписчика. Профиль поднимает сегмент
# разделяемой памяти и буферы сокетов; снимается через FLYGUARD_DDS_PROFILE=0.
ENV FASTRTPS_DEFAULT_PROFILES_FILE=/opt/flyguard/fastdds_large.xml
ENTRYPOINT ["/entrypoint.sh"]
CMD ["ros2", "launch", "flyguard", "detect.launch.py"]