From 5b01992b339c4704aa5afe62b2f53fccbb66a0c0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 22 Sep 2025 23:58:31 +1200 Subject: [PATCH] multiarch accelerated base image --- Dockerfile.accelerated_base | 185 +++++++++++++----------------------- 1 file changed, 65 insertions(+), 120 deletions(-) diff --git a/Dockerfile.accelerated_base b/Dockerfile.accelerated_base index c57bac2..102d08c 100644 --- a/Dockerfile.accelerated_base +++ b/Dockerfile.accelerated_base @@ -1,155 +1,100 @@ -# Accelerated Base Image with Intel QuickSync, NVIDIA CUDA, FFmpeg, and Python support -# Provides a comprehensive base for ML/CV applications with hardware acceleration +# Multi-architecture accelerated base image with hardware encoding support +# Supports Intel QuickSync, NVIDIA CUDA, FFmpeg, and Python FROM ubuntu:22.04 -LABEL maintainer="j" -LABEL description="Base image with Intel QuickSync, NVIDIA CUDA support, FFmpeg, and Python 3.11" - # Prevent interactive prompts during package installation ENV DEBIAN_FRONTEND=noninteractive -# Install system dependencies including Intel and NVIDIA support +# Install base dependencies and development tools RUN apt-get update && apt-get install -y \ - # Base utilities + # Basic tools curl \ wget \ git \ build-essential \ pkg-config \ - software-properties-common \ - # Python 3.11 - python3.11 \ - python3.11-dev \ + cmake \ + # Python and pip + python3 \ python3-pip \ - python3.11-venv \ - # FFmpeg with hardware acceleration support - ffmpeg \ - # VAAPI dependencies (generic, works on both x86_64 and arm64) + python3-dev \ + # Media libraries + libavcodec-dev \ + libavformat-dev \ + libavutil-dev \ + libswscale-dev \ + libavdevice-dev \ + libavfilter-dev \ + # Intel Media SDK dependencies (for QuickSync) + intel-media-va-driver-non-free \ vainfo \ - libva-drm2 \ libva-dev \ - libva2 \ - # OpenGL/Graphics libraries - libgl1 \ + libva-drm2 \ + libva-x11-2 \ + # Additional libraries libglib2.0-0 \ libsm6 \ libxext6 \ libxrender-dev \ libgomp1 \ - libglu1-mesa \ - libglu1-mesa-dev \ - libgl1-mesa-dev \ - libgl1-mesa-glx \ - # OpenCV dependencies - libopencv-dev \ - libgstreamer1.0-0 \ - libgstreamer-plugins-base1.0-0 \ - libgstreamer-plugins-bad1.0-0 \ - gstreamer1.0-plugins-base \ - gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-bad \ - gstreamer1.0-plugins-ugly \ - gstreamer1.0-libav \ - gstreamer1.0-tools \ - # Video codec libraries - libx264-dev \ - libx265-dev \ - libvpx-dev \ - libfdk-aac-dev \ - libmp3lame-dev \ - libopus-dev \ - # Image format libraries - libjpeg-dev \ - libpng-dev \ - libtiff-dev \ - libwebp-dev \ - # Additional ML/numeric libraries - libhdf5-dev \ - libatlas-base-dev \ - gfortran \ + # Clean up + && apt-get clean \ && rm -rf /var/lib/apt/lists/* -# Install architecture-specific Intel drivers (only on x86_64) -RUN if [ "$(dpkg --print-architecture)" = "amd64" ]; then \ - apt-get update && apt-get install -y \ - intel-media-va-driver-non-free \ - i965-va-driver \ - && rm -rf /var/lib/apt/lists/*; \ +# Install FFmpeg with hardware acceleration support +# Using static build for consistency across architectures +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "x86_64" ]; then \ + wget -q https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz && \ + tar -xf ffmpeg-master-latest-linux64-gpl.tar.xz && \ + mv ffmpeg-master-latest-linux64-gpl/bin/* /usr/local/bin/ && \ + rm -rf ffmpeg-master-latest-linux64-gpl*; \ + elif [ "$ARCH" = "aarch64" ]; then \ + wget -q https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linuxarm64-gpl.tar.xz && \ + tar -xf ffmpeg-master-latest-linuxarm64-gpl.tar.xz && \ + mv ffmpeg-master-latest-linuxarm64-gpl/bin/* /usr/local/bin/ && \ + rm -rf ffmpeg-master-latest-linuxarm64-gpl*; \ fi -# Set Python 3.11 as default -RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1 && \ - update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ - update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 +# Install NVIDIA CUDA support (will be ignored on non-NVIDIA systems) +# Using a minimal CUDA runtime that works on both architectures +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "x86_64" ]; then \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + cuda-compat-11-8 \ + libnvidia-encode-515 \ + libnvidia-decode-515 \ + || echo "CUDA packages not available, skipping"; \ + elif [ "$ARCH" = "aarch64" ]; then \ + echo "ARM64 CUDA support will be provided by host system if available"; \ + fi && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* -# Upgrade pip and install essential Python packages -RUN python -m pip install --upgrade pip setuptools wheel +# Create non-root user for running applications +RUN useradd -m -s /bin/bash appuser -# Install core Python ML/CV packages (CPU versions by default) -# CUDA versions can be overlaid at runtime or in derived images -RUN pip install --no-cache-dir \ +# Set up Python environment +RUN pip3 install --no-cache-dir --upgrade pip setuptools wheel + +# Install commonly needed Python packages for media processing +RUN pip3 install --no-cache-dir \ numpy \ - scipy \ - pandas \ - matplotlib \ - pillow \ + Pillow \ opencv-python-headless \ - scikit-learn \ - tqdm \ - pyyaml \ - requests - -# Install PyTorch CPU version (can be overridden in derived images for CUDA) -# Note: PyTorch provides different wheels for different architectures -RUN pip install --no-cache-dir \ - torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu - -# Set environment variables for hardware acceleration -# VAAPI driver configuration (paths will be set at runtime via entrypoint) - -# Python environment -ENV PYTHONUNBUFFERED=1 -ENV PYTHONDONTWRITEBYTECODE=1 - -# OpenCV -ENV OPENCV_VIDEOIO_PRIORITY_GSTREAMER=1 - -# FFmpeg hardware acceleration preference -ENV FFMPEG_HWACCEL_PRIORITY="vaapi,cuda,auto" - -# NVIDIA Container Toolkit environment variables (will be used if NVIDIA runtime is available) -ENV NVIDIA_VISIBLE_DEVICES=all -ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility,video - -# Create a non-root user for running applications -RUN useradd -m -s /bin/bash -u 1000 appuser && \ - usermod -a -G video appuser - -# Create common directories -RUN mkdir -p /app /data /models && \ - chown -R appuser:appuser /app /data /models - -# Create entrypoint script to set architecture-specific environment variables -RUN echo '#!/bin/bash\n\ -export LIBVA_DRIVERS_PATH=/usr/lib/$(uname -m)-linux-gnu/dri\n\ -if [ "$(uname -m)" = "x86_64" ]; then\n\ - export LIBVA_DRIVER_NAME=iHD\n\ -fi\n\ -exec "$@"' > /entrypoint.sh && \ - chmod +x /entrypoint.sh + imageio \ + imageio-ffmpeg # Set working directory WORKDIR /app -# Health check command to verify Python and FFmpeg are working -HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD python -c "import torch, cv2, numpy; print('OK')" && ffmpeg -version > /dev/null 2>&1 - -# Default to non-root user (can be overridden in derived images) +# Switch to non-root user by default USER appuser -# Set entrypoint -ENTRYPOINT ["/entrypoint.sh"] +# Set environment variables for hardware acceleration +ENV LIBVA_DRIVER_NAME=iHD +ENV LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri -# Default command - can be overridden in derived images +# Default command CMD ["/bin/bash"] \ No newline at end of file