ZH ·
🌏 English

使用 Docker 部署 GPU 与 Web 相机应用程序

引言

在操作系统中分发应用程序(尤其是 Python 应用)时,环境配置往往是极其关键的一环。如果像开发阶段那样手动配置,不仅工作量巨大,且容易出现各种兼容性问题。手动构建环境深受目标操作系统的版本、底层依赖库及文件系统的影响;此外,开发时使用的依赖包版本可能在发布时已更新,若未精确记录版本,极易导致线上运行故障。使用 Docker 可以有效隔离并固化运行环境,确保“一次构建,到处运行”。

安装和配置

要部署 GPU Docker 环境,首先需要安装 Docker,随后安装 NVIDIA Container Toolkit。

安装 Docker

参考官方文档:https://docs.docker.com/engine/install/ubuntu

安装 NVIDIA Container Toolkit

参考官方指南:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker

在 Docker 中显示 GUI

若 Docker 容器内运行的是带有图形界面(GUI)的应用程序,则需要配置以允许容器访问宿主机的显示服务。

首先,在宿主机上授权 X Server 访问:

xhost +local:docker

或者使用更简单的(但不推荐用于生产环境):

xhost +

启动 Docker 时,需要挂载 X11 套接字并设置环境变量:

-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY

完整启动命令示例:

docker run --name mydocker --gpus all --shm-size=1g --ulimit memlock=-1 -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY snn-server:basic

注:--gpus all 指定使用所有 GPU;若只需使用单块 GPU,可改为 --gpus 0

在 Docker 中访问 USB 相机

若需在容器内调用宿主机的 USB 相机,需将设备路径映射到容器中:

-v /dev/video0:/dev/video0 --device=/dev/video0

完整命令示例:

docker run --name mydocker --gpus all --shm-size=1g --ulimit memlock=-1 -v /dev/video0:/dev/video0 --device=/dev/video0 -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY myimage:latest

在 Docker 镜像中开放端口

若要从宿主机访问容器内的服务,需进行端口映射:

-p 8080:8080

这将把宿主机的 8080 端口映射到容器内的 8080 端口。

开启更多 GPU 高级功能

若应用程序需要调用 GPU 的高级功能(如 nvcuvid 解码),且在运行时遇到 Cannot load libnvcuvid.so.1 错误,需在启动时显式声明驱动能力:

--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video

请确保宿主机驱动程序支持上述功能。

创建本地镜像仓库

对于体积巨大的镜像(通常在 GB 级别),直接从 Docker Hub 上传下载速度较慢。建议在局域网内搭建私有镜像仓库:

docker run -d -p 5000:5000 --restart=always --name xy-registry -v /home/centos/registry:/registry registry:latest

参数说明

上传镜像

docker commit container_id ip:port/image_name:tag
docker push ip:port/image_name:tag

回收空间

使用以下命令查看磁盘占用:

docker system df

清理无用镜像

清理所有悬空的镜像:

docker image prune

删除指定镜像

首先列出镜像:

docker images

删除指定 ID 的镜像:

docker rmi image_id

GPU Docker 与 Anaconda

若需在 GPU Docker 中使用 Anaconda,可采用以下两种方式:

1. 使用 Dockerfile 构建

FROM nvidia/cuda:11.3.0-devel-ubuntu20.04

# 添加依赖
RUN apt-get clean && apt-get update -y -qq
RUN apt-get install -y curl git build-essential

ENV PATH="/root/anaconda3/bin:${PATH}"

RUN curl --silent -O https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh \
    && bash Anaconda3-2023.03-Linux-x86_64.sh -b -p /root/anaconda3

RUN pip install keras && conda install pygpu
RUN /bin/bash

2. 手动构建

拉取基础 GPU 镜像并手动安装配置,步骤同上。

参考资料