banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

Nvidia CUDA开发环境 Docker容器启用显卡

Nvidia CUDA 开发环境 Docker 容器启用显卡

1. 准备 docker>19.03 环境,配置好 nvidia-container-toolkit 2. 确定本机已安装的显卡驱动版本,匹配需要的容器版本 3.Pull 基础 docker 镜像,可以从官方或者 dockerhub 下载 https://ngc.nvidia.com/catalog/containers/nvidia:cuda/tags https://gitlab.com/nvidia/container-images/cuda

cuda10-py36-conda 的 Dockerfile

FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04
MAINTAINER Limc #close frontend
ENV DEBIAN_FRONTEND noninteractive

add cuda user#

--disabled-password = 不分配密码#

使用 root 组以兼容 OpenShift#

ENV CUDA_USER_NAME=cuda10
ENV CUDA_USER_GROUP=root

add user#

RUN adduser --system --group --disabled-password --no-create-home --disabled-login $CUDA_USER_NAME
RUN adduser $CUDA_USER_NAME $CUDA_USER_GROUP

安装基本依赖#

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
cmake \
git \
wget \
libopencv-dev \
libsnappy-dev \
python-dev \
python-pip \
#tzdata \
vim

为 python 安装 conda#

RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py37\_4.8.2-Linux-x86\_64.sh -O ~/miniconda.sh && \
/bin/bash ~/miniconda.sh -b -p /opt/conda && \
rm ~/miniconda.sh

设置区域#

ENV LANG C.UTF-8 LC_ALL=C.UTF-8

ENV PATH /opt/conda/bin:$PATH

RUN ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
echo "conda activate base" >> ~/.bashrc && \
find /opt/conda/ -follow -type f -name '*.a' -delete && \
find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
/opt/conda/bin/conda clean -afy

copy entrypoint.sh#

#COPY ./entrypoint.sh /entrypoint.sh

install#

#ENTRYPOINT ["/entrypoint.sh"]

初始化工作区#

COPY ./app /app

创建工作目录#

WORKDIR /app

如果需要,更新 pip#

#RUN pip install --upgrade --no-cache-dir pip

安装 gunicorn#

RUN pip install --no-cache-dir -r ./requirements.txt#

使用 conda 安装#

#RUN conda install --yes --file ./requirements.txt
RUN while read requirement; do conda install --yes $requirement; done < requirements.txt

copy entrypoint.sh#

COPY ./entrypoint.sh /entrypoint.sh

install#

ENTRYPOINT ["/entrypoint.sh"]

切换到非 root 用户#

USER $CUDA_USER_NAME

运行容器 Makefile

IMG:=`cat Name`
GPU_OPT:=all
MOUNT_ETC:=
MOUNT_LOG:=
MOUNT_APP:=-v `pwd`/work/app:/app
MOUNT:=$(MOUNT_ETC) $(MOUNT_LOG) $(MOUNT_APP)
EXT_VOL:=
PORT_MAP:=
LINK_MAP:=
RESTART:=no
CONTAINER_NAME:=docker-cuda10-py36-hello

echo:
echo $(IMG)

run:
docker rm $(CONTAINER_NAME) || echo
docker run -d --gpus $(GPU_OPT) --name $(CONTAINER_NAME) $(LINK_MAP) $(PORT_MAP) --restart=$(RESTART) \
$(EXT_VOL) $(MOUNT) $(IMG)

run_i:
docker rm $(CONTAINER_NAME) || echo
docker run -i -t --gpus $(GPU_OPT) --name $(CONTAINER_NAME) $(LINK_MAP) $(PORT_MAP) \
$(EXT_VOL) $(MOUNT) $(IMG) /bin/bash

exec_i:
docker exec -i -t --name $(CONTAINER_NAME) /bin/bash

stop:
docker stop $(CONTAINER_NAME)

rm: stop
docker rm $(CONTAINER_NAME)

Entrypoint.sh

set -e

如果需要,添加 python 作为命令#

if [ "${1:0:1}" = '-' ]; then
set -- python "$@"
fi

如果我们正在运行 gunicorn,则放弃 root 权限#

允许容器以--user启动#

if [ "$1" = 'python' -a "$(id -u)" = '0' ]; then
# 将用户可变目录的所有权更改为 gunicorn
for path in \
/app \
/usr/local/cuda/ \
; do
chown -R cuda10 "$path"
done

set -- su-exec python "$@"
#exec su-exec elasticsearch "$BASH\_SOURCE" "$@"

fi

由于参数与 gunicorn 无关,#

因此假设用户想要运行自己的进程,#

例如一个bash shell 来探索这个镜像#

exec "$@"

几个注意点 1. 显卡运行需要 root 用户权限,否则会出现以下, docker: Error response from daemon: OCI runtime create failed: container_linux.go:345 考虑安全性可以在容器内创建新用户并加入到 root 组 2. 本机显卡驱动和 CUDA 必须匹配官方容器的版本,cudnn 则不需要匹配,可以使用多个不同版本的 cudnn,但是必须满足显卡要求的使用范围 3.docker 运行容器非正常结束时会占用显卡,如果卡死,会造成容器外部无法使用,重启 docker-daemon 也无效,这时只能重启电脑

完整的源代码 https://github.com/limccn/ultrasound-nerve-segmentation-in-tensorflow/commit/d7de1cbeb641d2fae4f5a78ff590a0254667b398

参考 https://gitlab.com/nvidia/container-images/cuda

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。