Some checks failed
Build Worker Base and Application Images / check-base-changes (push) Successful in 8s
Build Worker Base and Application Images / build-base (push) Failing after 5m52s
Build Worker Base and Application Images / build-docker (push) Has been skipped
Build Worker Base and Application Images / deploy-stack (push) Has been skipped
173 lines
No EOL
6.9 KiB
Text
173 lines
No EOL
6.9 KiB
Text
# Base image with complete ML and hardware acceleration stack
|
|
FROM pytorch/pytorch:2.8.0-cuda12.6-cudnn9-runtime
|
|
|
|
# Install build dependencies and system libraries
|
|
RUN apt-get update && apt-get install -y \
|
|
# Build tools
|
|
build-essential \
|
|
cmake \
|
|
git \
|
|
pkg-config \
|
|
wget \
|
|
unzip \
|
|
yasm \
|
|
nasm \
|
|
# System libraries
|
|
libgl1-mesa-glx \
|
|
libglib2.0-0 \
|
|
libgomp1 \
|
|
# Core media libraries (essential ones only)
|
|
libjpeg-dev \
|
|
libpng-dev \
|
|
libx264-dev \
|
|
libx265-dev \
|
|
libvpx-dev \
|
|
libmp3lame-dev \
|
|
libv4l-dev \
|
|
# TurboJPEG for fast JPEG encoding
|
|
libturbojpeg0-dev \
|
|
# Python development
|
|
python3-dev \
|
|
python3-numpy \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install CUDA development tools (required for FFmpeg CUDA compilation)
|
|
RUN apt-get update && apt-get install -y \
|
|
cuda-nvcc-12-6 \
|
|
libcuda1 \
|
|
cuda-cudart-dev-12-6 \
|
|
cuda-driver-dev-12-6 \
|
|
|| echo "CUDA development packages not available, continuing without them" && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Try to install NVIDIA packages (may not be available in all environments)
|
|
RUN apt-get update && apt-get install -y \
|
|
libnvidia-encode-535 \
|
|
libnvidia-decode-535 \
|
|
|| echo "NVIDIA packages not available, continuing without them" && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Use pre-built FFmpeg with CUDA support using the build script
|
|
ENV FFMPEG_BUILD_SCRIPT_VERSION=1.43
|
|
# Ensure CUDA paths are available
|
|
ENV PATH="/usr/local/cuda/bin:${PATH}"
|
|
ENV LD_LIBRARY_PATH="/usr/local/cuda/lib64:${LD_LIBRARY_PATH}"
|
|
|
|
# Install NVIDIA Video Codec SDK headers first
|
|
RUN cd /tmp && \
|
|
wget https://github.com/FFmpeg/nv-codec-headers/archive/refs/tags/n12.1.14.0.zip && \
|
|
unzip n12.1.14.0.zip && \
|
|
cd nv-codec-headers-n12.1.14.0 && \
|
|
make install && \
|
|
rm -rf /tmp/*
|
|
|
|
# Build FFmpeg using the well-maintained build script with CUDA support
|
|
RUN cd /tmp && \
|
|
echo "Building FFmpeg with CUDA support using build script..." && \
|
|
curl -sL "https://raw.githubusercontent.com/markus-perl/ffmpeg-build-script/master/build-ffmpeg" -o build-ffmpeg && \
|
|
chmod +x build-ffmpeg && \
|
|
# Configure the build script for CUDA support
|
|
SKIPINSTALL=yes \
|
|
AUTOINSTALL=yes \
|
|
./build-ffmpeg \
|
|
--build \
|
|
--enable-gpl-and-non-free \
|
|
--latest \
|
|
--cuda \
|
|
&& \
|
|
# Copy built binaries to system paths
|
|
cp workspace/bin/* /usr/local/bin/ && \
|
|
cp workspace/lib/* /usr/local/lib/ && \
|
|
ldconfig && \
|
|
# Verify CUVID decoders are available
|
|
echo "=== Verifying FFmpeg CUVID Support ===" && \
|
|
(ffmpeg -hide_banner -decoders 2>/dev/null | grep cuvid || echo "No CUVID decoders found") && \
|
|
echo "=== Verifying FFmpeg NVENC Support ===" && \
|
|
(ffmpeg -hide_banner -encoders 2>/dev/null | grep nvenc || echo "No NVENC encoders found") && \
|
|
cd / && rm -rf /tmp/*
|
|
|
|
# Build OpenCV from source with custom FFmpeg and full CUDA support
|
|
ENV OPENCV_VERSION=4.8.1
|
|
RUN cd /tmp && \
|
|
wget -O opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
|
|
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \
|
|
unzip opencv.zip && \
|
|
unzip opencv_contrib.zip && \
|
|
cd opencv-${OPENCV_VERSION} && \
|
|
mkdir build && cd build && \
|
|
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH \
|
|
cmake -D CMAKE_BUILD_TYPE=RELEASE \
|
|
-D CMAKE_INSTALL_PREFIX=/usr/local \
|
|
-D WITH_CUDA=ON \
|
|
-D WITH_CUDNN=ON \
|
|
-D OPENCV_DNN_CUDA=ON \
|
|
-D ENABLE_FAST_MATH=ON \
|
|
-D CUDA_FAST_MATH=ON \
|
|
-D WITH_CUBLAS=ON \
|
|
-D WITH_NVCUVID=ON \
|
|
-D WITH_CUVID=ON \
|
|
-D BUILD_opencv_cudacodec=ON \
|
|
-D WITH_FFMPEG=ON \
|
|
-D WITH_LIBV4L=ON \
|
|
-D BUILD_opencv_python3=ON \
|
|
-D OPENCV_GENERATE_PKGCONFIG=ON \
|
|
-D OPENCV_ENABLE_NONFREE=ON \
|
|
-D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv_contrib-${OPENCV_VERSION}/modules \
|
|
-D PYTHON3_EXECUTABLE=$(which python3) \
|
|
-D PYTHON_INCLUDE_DIR=$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))") \
|
|
-D PYTHON_LIBRARY=$(python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))") \
|
|
-D BUILD_EXAMPLES=OFF \
|
|
-D BUILD_TESTS=OFF \
|
|
-D BUILD_PERF_TESTS=OFF \
|
|
.. && \
|
|
make -j$(nproc) && \
|
|
make install && \
|
|
ldconfig && \
|
|
cd / && rm -rf /tmp/*
|
|
|
|
# Set environment variables for maximum hardware acceleration
|
|
ENV LD_LIBRARY_PATH="/usr/local/cuda/lib64:/usr/local/lib:${LD_LIBRARY_PATH}"
|
|
ENV PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}"
|
|
ENV PYTHONPATH="/usr/local/lib/python3.10/dist-packages:${PYTHONPATH}"
|
|
|
|
# Optimized environment variables for hardware acceleration
|
|
ENV OPENCV_FFMPEG_CAPTURE_OPTIONS="rtsp_transport;tcp|hwaccel;cuda|hwaccel_device;0|video_codec;h264_cuvid|hwaccel_output_format;cuda"
|
|
ENV OPENCV_FFMPEG_WRITER_OPTIONS="video_codec;h264_nvenc|preset;fast|tune;zerolatency|gpu;0"
|
|
ENV CUDA_VISIBLE_DEVICES=0
|
|
ENV NVIDIA_VISIBLE_DEVICES=all
|
|
ENV NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
|
|
|
|
# Copy and install base requirements (exclude opencv-python since we built from source)
|
|
COPY requirements.base.txt .
|
|
RUN grep -v opencv-python requirements.base.txt > requirements.tmp && \
|
|
mv requirements.tmp requirements.base.txt && \
|
|
pip install --no-cache-dir -r requirements.base.txt
|
|
|
|
# Verify complete hardware acceleration setup
|
|
RUN echo "=== Hardware Acceleration Verification ===" && \
|
|
echo "FFmpeg Hardware Accelerators:" && \
|
|
(ffmpeg -hide_banner -hwaccels 2>/dev/null || echo "FFmpeg hwaccels command failed") && \
|
|
echo "" && \
|
|
echo "FFmpeg CUVID Decoders (NVIDIA):" && \
|
|
(ffmpeg -hide_banner -decoders 2>/dev/null | grep -E "cuvid" || echo "No CUVID decoders found") && \
|
|
echo "" && \
|
|
echo "FFmpeg NVENC Encoders (NVIDIA):" && \
|
|
(ffmpeg -hide_banner -encoders 2>/dev/null | grep -E "nvenc" || echo "No NVENC encoders found") && \
|
|
echo "" && \
|
|
echo "Testing CUVID decoder compilation (no GPU required):" && \
|
|
(ffmpeg -hide_banner -f lavfi -i testsrc=duration=0.1:size=64x64:rate=1 -c:v libx264 -f null - 2>/dev/null && echo "✅ FFmpeg basic functionality working" || echo "❌ FFmpeg basic test failed") && \
|
|
echo "" && \
|
|
echo "OpenCV Configuration:" && \
|
|
(python3 -c "import cv2; print('OpenCV version:', cv2.__version__); build_info = cv2.getBuildInformation(); print('CUDA support:', 'CUDA' in build_info); print('CUVID support:', 'CUVID' in build_info); print('FFmpeg support:', 'FFMPEG' in build_info)" || echo "OpenCV verification failed") && \
|
|
echo "" && \
|
|
echo "=== Verification Complete (build-time only) ==="
|
|
|
|
# Set working directory
|
|
WORKDIR /app
|
|
|
|
# Create images directory for bind mount
|
|
RUN mkdir -p /app/images && \
|
|
chmod 755 /app/images
|
|
|
|
# This base image will be reused for all worker builds
|
|
CMD ["python3", "-m", "fastapi", "run", "--host", "0.0.0.0", "--port", "8000"] |