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 的步骤进行安装即可。
安装完成之后,使用以下命令启用。
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
1.2 禁用 Systemd CG Group
在使用过程当中,当某个 CUDA 容器运行一段时间之后就出现错误:
NOTICE: Containers losing access to GPUs with error: "Failed to initialize NVML: Unknown Error"
查询得知是这个 Issue #48 提到的问题,根据里面的描述,最快的解决办法就是修改 /etc/docker/daemon.json
文件,然后在里面加上:
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
随后重启 Docker 服务。
sudo systemctl restart docker
sudo systemctl daemon-reload
2. 构建新的镜像
默认情况下 nvidia/cuda:12.4.1-runtime-ubuntu22.04
镜像已经包含了 NVIDIA 驱动,但是没有包含编码器和解码器,所以我们要让 ffmpeg 能够正常工作,就需要安装对应的编解码器。
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
命令要运行指定镜像时,需要加上一些参数,如下:
docker run -it --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all --rm nvidia/cuda:12.4.1-runtime-ubuntu22.04 bash
如果使用 docker compose 文件,下面就是示例:
services:
demo:
image: demo-image:latest
container_name: "demo"
restart: always
environment:
NVIDIA_DRIVER_CAPABILITIES: all
runtime: nvidia