I have this Dockerfile:
FROM nvcr.io/nvidia/pytorch:25.03-py3
RUN apt-get update && apt-get install -y \ yasm pkg-config libgnutls28-dev libdrm-dev libva-dev libvdpau-dev libxcb1-dev \ libxcb-shm0-dev libxcb-xfixes0-dev libssl-dev \ libx264-dev libx265-dev libnuma-dev libvpx-dev libfdk-aac-dev libmp3lame-dev \ libopus-dev libvorbis-dev
# Install NVIDIA Video Codec SDK headers (ffnvcodec) RUN git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git && \ cd nv-codec-headers && \ make && make install && \ cd .. && rm -rf nv-codec-headers
# Build and install ffmpeg 7.1 (provides v61 libraries that PyNvVideoCodec expects) RUN wget https://ffmpeg.org/releases/ffmpeg-7.1.tar.gz && \ tar -xzf ffmpeg-7.1.tar.gz && \ cd ffmpeg-7.1 && \ ./configure --prefix=/usr --enable-shared --enable-gpl --enable-nonfree \ --enable-libx264 --enable-libx265 --enable-libvpx --enable-libfdk-aac \ --enable-libmp3lame --enable-libopus --enable-libvorbis \ --enable-gnutls --enable-cuda --enable-cuvid --enable-nvdec --enable-nvenc \ --enable-libdrm --enable-vdpau \ --disable-static \ --enable-pic && \ make -j"$(nproc)" && \ make install && \ ldconfig && \ cd .. && rm -rf ffmpeg-7.1 ffmpeg-7.1.tar.gz WORKDIR /app RUN pip install --no-deps onnxruntime-gpu==1.23.2 ultralytics==8.3.244
# Official fix for OpenCV FFmpeg support in NVIDIA containers
# Remove leftover cv2 bindings and install proper opencv-python
RUN rm -rf /usr/local/lib/python3.*/dist-packages/cv2 && \ pip install opencv-python==4.11.0.86 && \ apt update && apt install -y libgl1-mesa-dev WORKDIR /app/ai-engine
COPY . . RUN pip install -r requirements.txt
WORKDIR /app
# Install PyNvVideoCodec and remove bundled libraries
RUN pip install PyNvVideoCodec==2.0.2 && \ cd /usr/local/lib/python3.12/dist-packages/PyNvVideoCodec && \ rm -f libav*.so* libsw*.so* && \ ldconfig
With this image I launch pods in RunPod or VastAI. I am having inconsistencies per hosts/datacenters where my PyNvVideoCodec fails. Seems like it only works for nvidia drivers <= 580.100. When it fails I either get: terminate called after throwing an instance of âPyNvVCExceptionâ what(): HandleVideoSequence : Error code : 100 Error Type : m_api.cuvidGetDecoderCaps(&decodecaps) returned error 100 at /project/src/VideoCodecSDKUtils/helper_classes/NvCodec/NvDecoder/NvDecoder.cpp:257 or Error getting driver version: Failed to load NVENC library: libnvidia-encode.so.1: cannot open shared object file: No such file or directory Error importing PyNvVideoCodec: Failed to load NVENC library: libnvidia-encode.so.1: cannot open shared object file: No such file or directory System: Linux Python version: 3.12.3 (main, Feb 4 2025, 14:48:35) [GCC 13.3.0] LD_LIBRARY_PATH: /usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/lib:/usr/local/cuda/lib64:/usr/lib/x86_64-linux-gnu:/usr/local/lib/python3.12/dist-packages/cv2/../../lib64:/usr/local/lib/python3.12/dist-packages/torch/lib:/usr/local/lib/python3.12/dist-packages/torch_tensorrt/lib:/usr/local/cuda/compat/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64 Traceback (most recent call last): File ââ, line 198, in _run_module_as_main File ââ, line 88, in _run_code File â/usr/local/lib/python3.12/dist-packages/uvicorn/_main_.pyâ, line 4, in uvicorn.main() File â/usr/local/lib/python3.12/dist-packages/click/core.pyâ, line 1161, in _call_ return self.main(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File â/usr/local/lib/python3.12/dist-packages/click/core.pyâ, line 1082, in main rv = self.invoke(ctx) ^^^^^^^^^^^^^^^^ File â/usr/local/lib/python3.12/dist-packages/click/core.pyâ, line 1443, in invoke return ctx.invoke(self.callback, **ctx.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File â/usr/local/lib/python3.12/dist-packages/click/core.pyâ, line 788, in invoke return __callback(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File â/usr/local/lib/python3.12/dist-packages/uvicorn/main.pyâ, line 418, in main run( File â/usr/local/lib/python3.12/dist-packages/uvicorn/main.pyâ, line 587, in run server.run() File â/usr/local/lib/python3.12/dist-packages/uvicorn/server.pyâ, line 62, in run return asyncio.run(self.serve(sockets=sockets)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File â/usr/lib/python3.12/asyncio/runners.pyâ, line 194, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File â/usr/lib/python3.12/asyncio/runners.pyâ, line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File âuvloop/loop.pyxâ, line 1518, in uvloop.loop.Loop.run_until_complete File â/usr/local/lib/python3.12/dist-packages/uvicorn/server.pyâ, line 69, in serve config.load() File â/usr/local/lib/python3.12/dist-packages/uvicorn/config.pyâ, line 458, in load self.loaded_app = import_from_string(self.app) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File â/usr/local/lib/python3.12/dist-packages/uvicorn/importer.pyâ, line 21, in import_from_string module = importlib.import_module(module_str) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File â/usr/lib/python3.12/importlib/_init_.pyâ, line 90, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File â<frozen importlib._bootstrap>â, line 1387, in _gcd_import File â<frozen importlib._bootstrap>â, line 1360, in _find_and_load File â<frozen importlib._bootstrap>â, line 1331, in _find_and_load_unlocked File â<frozen importlib._bootstrap>â, line 935, in _load_unlocked File â<frozen importlib._bootstrap_external>â, line 995, in exec_module File â<frozen importlib._bootstrap>â, line 488, in _call_with_frames_removed File â/app/ai-engine/matchlytics/api/app.pyâ, line 15, in from matchlytics.api.routes import auth, ball, benchmark, players, session, transforms, video File â/app/ai-engine/matchlytics/api/routes/benchmark.pyâ, line 11, in from matchlytics.api.test_decoders import benchmark_decoder, get_decoder File â/app/ai-engine/matchlytics/api/test_decoders.pyâ, line 8, in from matchlytics.utils.decoders import ( File â/app/ai-engine/matchlytics/utils/decoders.pyâ, line 14, in import PyNvVideoCodec as nvc File â/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/_init_.pyâ, line 156, in supportedNvEncVersion = _get_driver_version() ^^^^^^^^^^^^^^^^^^^^^ File â/usr/local/lib/python3.12/dist-packages/PyNvVideoCodec/_init_.pyâ, line 143, in _get_driver_version driver = DriverWrapper() ^^^^^^^^^^^^^^^ RuntimeError: Failed to load NVENC library: libnvidia-encode.so.1: cannot open shared object file: No such file or directory