[HowTo] Nvidia hardware transcoding on OMV 5 in a Plex docker container

  • It is quite tricky to get Plex hardware transcoding working on OMV in a docker container with nvidia graphics cards.

    It took me some weeks to find out all the little details and I want to share it with you.


    My configuration is tested for:

    - Debian 10 Buster (wich is OMV5)

    - OMV 5.6.1-1 Usul

    - Kernel Linux 5.10.0-0.bpo.3-amd64

    - Docker 5:20.10.5~3-0~debian-buster

    - Portainer 2.1.1

    - Nvidia driver 460.39

    - Cuda Version 11.2

    - Nvidia Quadro P1000 graphics card

    - Plex 1.22.0.4145


    First of all and very important:

    Hardware transcoding must work on the intel hardware ! There are several tutorials for that. Mainly it is related to access rights like the "noexex" to "exec" option in the fstab.


    Step 1:

    if you already tried to install nvidia driver: purge it out !

    Code
    apt-get purge *nvidia*
    apt autoremove
    apt autoclean


    Step 2:

    prepare your header files. Very important !

    Code
    apt-get install module-assistant
    sudo m-a prepare



    Step 3: installing Nvidia Driver

    follow the instructions given by Nvidia:


    https://wiki.debian.org/Nvidia…28via_buster-backports.29



    in detail:


    Add buster-backports to your /etc/apt/sources.list , for example:

    Code
    #Busterter-backports
    deb http://deb.debian.org/debian buster-backports main contrib non-free


    then:


    Code
    apt update
    apt install -t buster-backports nvidia-driver firmware-misc-nonfree


    IMPORTANT:


    watch the messages during intallation. It there are any error messages something is wrong and you might not have debian buster with backports ! You have to solve this issue first before proceeding !!!



    now we have to configure nvidia:

    Code
    apt install -t buster-backports nvidia-xconfig
    sudo nvidia-xconfig


    Since Docker 5.20.10.2 (I think) there was a change how docker gets access to hardware via cgroups. You need this workaround in the kernel boot parameters:


    Code
    echo 'GRUB_CMDLINE_LINUX=systemd.unified_cgroup_hierarchy=false' > /etc/default/grub.d/cgroup.cfg
    update-grub


    now reboot and the nvidia driver should already work.


    Step 4: Install Nvidia container toolkit

    Follow the Installation guide by Nvidia:

    https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit


    in detail:


    Install curl if you don't have it already:

    Code
    sudo apt install curl

    Setup the stable repository and the GPG key:


    Code
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
    && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list


    Install the <span style="font-size: 10pt;">nvidia-docker2</span> package (and dependencies) after updating the package listing:

    Code
    sudo apt-get update
    apt install -t buster-backports nvidia-docker2


    Now install Nvidia encode library and nvidia-smi:

    Code
    apt install -t buster-backports libnvidia-encode1
    apt install -t buster-backports nvidia-smi


    Step 5: install Nvidia container runtime:

    Code
    apt install -t buster-backports nvidia-container-runtime


    Step 6: some modifications:

    Change/edit the Daemon configuration file

    /etc/docker/daemon.json :


    Code
    {
    "runtimes": {
    "nvidia": {
    "path": "/usr/bin/nvidia-container-runtime",
    "runtimeArgs": []
    }
    },
    "default-runtime": "nvidia",
    "data-root": "/var/lib/docker"
    }


    and the

    /etc/nvidia-container-runtime/config.toml

    to:



    Restart docker:

    Code
    sudo systemctl restart docker



    Step 7: starting Plex (in Portainer)

    in Portainer you have to add the following parameters in the "Env" tab:

    name:




    NVIDIA_DRIVER_CAPABILITIES




    Value




    compute,video,utility




    name




    NVIDIA_VISIBLE_DEVICES




    Value




    all




    and in the tab "Runtime & Ressources":

    change the "Runtime" Value from runc to nvidia !!!


    No Privileged mode and no Init set.




    Step 8: try and error:

    this is how it worked for me. If you want to check operation you can display GPU load with:


    Code
    watch -d -n 0.5 nvidia-smi


    or install:


    Code
    apt install nvtop


    and use:


    Code
    nvtop



    You can also try/use the docker command line interface (cli) to start Plex:





    Step 9: get rid of the session limit:

    If you want to disable the session limit (my P1000 had a limit of 3) go ahead with this link. It worked for me also:

    https://github.com/keylase/nvidia-patch


    in detail:


    if you don't have git, install it:


    Code
    apt git install

    then

    Code
    git clone https://github.com/keylase/nvidia-patch.git nvidia-patch


    Patch the nvidia driver:

    Code
    cd nvidia-patch
    bash ./patch.sh


    If you want to rollback:

    Code
    bash ./patch.sh -r


    Step 10: Nvidia Power Management:

    You need these modifications if you are using autoshutdown as the nvidia driver (or the pci-bus of the card?) is falling of if restarting from hibernate or suspend mode !

    You can read more about that in the nvidia documentation:

    http://us.download.nvidia.com/…namicpowermanagement.html

    http://us.download.nvidia.com/…ADME/powermanagement.html

    http://us.download.nvidia.com/…/nvidia-persistenced.html



    First of all you need the dedicated nvidia scripts for power management and you have to find them in the nvidia driver install package:


    Download the nvidia install package from:

    https://www.nvidia.com/de-de/drivers/unix/


    or for the 460 driver the direct link:

    https://www.nvidia.de/Download/driverResults.aspx/170214/de


    Or on the system:

    Code
    wget http://us.download.nvidia.com/XFree86/Linux-x86_64/460.39/NVIDIA-Linux-x86_64-460.39.run


    Now do not install the driver (!) - just extract it:



    Code
    sh NVIDIA-Linux-x86_64-460.39.run --extract-only



    In the next step you have to search for the following files and copy them to the given directories (I used an ssh client for this)


    Code
    /etc/systemd/system/nvidia-suspend.service
    /etc/systemd/system/nvidia-hibernate.service
    /etc/systemd/system/nvidia-resume.service
    /lib/systemd/system-sleep/nvidia
    /usr/bin/nvidia-sleep.sh



    then enable the services:


    Code
    sudo systemctl enable nvidia-suspend.service
    sudo systemctl enable nvidia-hibernate.service
    sudo systemctl enable nvidia-resume.service


    change nvidia kernel config:


    /etc/modprobe.d/nvidia-kernel-common.conf

    Code
    options nvidia NVreg_PreserveVideoMemoryAllocations=1
    options nvidia NVreg_DynamicPowerManagementVideoMemoryThreshold=100
    options nvidia NVreg_DynamicPowerManagement=0x02
    options nvidia NVreg_EnableMSI=0


    now make nvidia-sleep.sh executable and update modules:


    Code
    chmod a+x /usr/bin/nvidia-sleep.sh
    sudo update-initramfs -u


    Remark:

    I still use the script files from the 450 driver version and they still work with 460. So I think they are more general and not driver specific. But if you experience problems

    with hardware transcoding on a new driver version after a resume maybe you have to extract them fresh from the new driver package.




    And I don't know if this final part is really needed, but if you still have issues with resume from suspend you can try to disable active state power management on pcie:


    Change/add kernel parameter pcie_aspm=off in /etc/default/grub to:

    Code
    GRUB_CMDLINE_LINUX_DEFAULT="quiet pcie_aspm=off"


    and after changing grub:


    Code
    sudo update-grub
    reboot



    That was a long way :-)


    Please let me know if there are still issues with htis guide. I'll try to keep it up to date...


    Good luck,


    Chris

  • geaves

    Changed the title of the thread from “Nvidia hardware transcoding on OMV 5 in a Plex docker container” to “[HowTo] Nvidia hardware transcoding on OMV 5 in a Plex docker container”.
  • chris_kmn

    Added the Label OMV 5.x

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!