Linux 使用 CUDA Docker 镜像加速视频转码

0. 背景

在某些时候我们会使用到显卡对视频转码进行加速,此时可以使用 NVIDA 官方提供的 CUDA 镜像来进行加速,在这个 CUDA 镜像里面提供了完整的 NVIDA 驱动等环境,可以直接被 ffmpeg 调用以进行加速。

1. 配置基础环境

1.1 安装 NVIDIA Container Toolkit

访问网站 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 根据你自己系统的发行版选择安装方式,我这里是 Ubuntu Server,默认情况是 APT 包管理器,因此根据 APT 的步骤进行安装即可。 安装完成之后,使用以下命令启用。

1
2
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

1.2 禁用 Systemd CG Group

在使用过程当中,当某个 CUDA 容器运行一段时间之后就出现错误:

1
NOTICE: Containers losing access to GPUs with error: "Failed to initialize NVML: Unknown Error"

查询得知是这个 Issue #48 提到的问题,根据里面的描述,最快的解决办法就是修改 /etc/docker/daemon.json 文件,然后在里面加上:

1
2
3
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

随后重启 Docker 服务。

1
2
sudo systemctl restart docker
sudo systemctl daemon-reload

2. 构建新的镜像

默认情况下 nvidia/cuda:12.4.1-runtime-ubuntu22.04 镜像已经包含了 NVIDIA 驱动,但是没有包含编码器和解码器,所以我们要让 ffmpeg 能够正常工作,就需要安装对应的编解码器。

1
2
3
4
5
6
7
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS base

# Install dependencies
RUN apt update \
    && apt install -y ffmpeg \
    && apt install -y bash \
    && apt install -y libnvidia-encode-550

3. 启动容器

docker run 命令要运行指定镜像时,需要加上一些参数,如下:

1
docker run -it --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all --rm nvidia/cuda:12.4.1-runtime-ubuntu22.04 bash

如果使用 docker compose 文件,下面就是示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  demo:
    image: demo-image:latest
    container_name: "demo"
    restart: always

    environment:
      NVIDIA_DRIVER_CAPABILITIES: all

    runtime: nvidia
Built with Hugo
主题 StackJimmy 设计