Tensorflow-gpu Docker 环境搭建 (二)

  • 构建 Tensorflow 支持 GPU Docker 镜像

  • 资料来源:

    https://www.tensorflow.org/install/docker?hl=zh-cn
    https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/user-guide.html
    https://github.com/andreivmaksimov/python_data_science

  • 更新

    1
    2
    20.10.19 初始化
    20.10.21 初稿完成

导语

在上文中,我们终于得到了能跑 gpu 加速的 docker image.但是接下来是个更大的坑…

特别参考了 GitHub - andreivmaksimov/python_data_science

需求

容器

  • 可以运行常见深度学习工具包,特别是 Sklearn 和 Keras.
  • 支持 GPU 加速
  • 对 python 环境的改动不需要重新创建容器.

分析

  • 在上文得到的 Dockerfile 基础上,可能还需要进行这些工作.
  • 处理文件权限,指定 docker 内运行的用户与宿主机相同,避免文件权限问题.
  • jupyter 启动应该有坑要处理.
  • docker-compose 至今没有 -gpu 选项,启动容器 gpu 支持需要处理.
  • 持久化 python 环境等.

处理文件权限

这里的打算是持久化用户目录,以避免每次改动都需要重新 commit 容器.

处理 docker 内外文件权限问题,在 linux笔记—docker入门 | 默 提过.要让 docker 内用户以与宿主机相同的 uid gid 运行,需要在 dockerfile 添加普通用户.

添加普通用户的同时还有以下需要

  • 账户密码
  • 使用 sudo
  • sudo 免密码

Docker 添加普通用户/使用 sudo/免密码

在 dockerfile 中添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
ENV USERNAME="user"
ENV USER_HOME="/home/${USERNAME}"

# 创建用户
RUN apt-get update && \
apt-get install -y sudo tree && \
adduser --disabled-password --gecos '' ${USERNAME} && \
adduser ${USERNAME} sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

WORKDIR ${USER_HOME}

USER "${USERNAME}"

注意:

  • USER "${USERNAME}" 命令后,docker 构建就是以 user 普通用户运行了.一般要把这一条放在最后.
  • 上面的内容只在 ubuntu 为基础镜像测试通过.(tf-gpu 也是 ubuntu 为基础的)

指定 uid gid 运行容器

docker 直接命令就不说了.

docker-compose.yml 中添加 user: 1000:1000 即可.(默认宿主机 1000:1000 情况下)

ps: 如果素主机是 1000:1000 情况下,直接启动容器,以普通用户运行也是默认 1000:1000…

jupyter

说实话对 jupyter 还不算熟悉.按照计划,日后会写更详细的定制博客吧,目前配置文件暂时拷贝了 GitHub - andreivmaksimov/python_data_science

OSError: [Errno 99] Cannot assign requested address

run_jupyter.sh 文件直接启动,如果是 root 用户没啥问题,换到普通用户后,一直有 OSError: [Errno 99] Cannot assign requested address 错误.

似乎是 docker 网络的一个问题,直接指定 jupyter 启动 ip 为 0.0.0.0 即可.

具体是将启动命令换成 jupyter notebook --ip 0.0.0.0 --no-browser "$@"

docker-compose gpu 支持

如前面所言,docker-compose 没有 gpu 选项,这意味着没法直接从 docker-compose.yml 启动 docker.

相关的讨论 Support for NVIDIA GPUs under Docker Compose.

在讨论中有一个曲线救国的方法:

  • 安装 nvidia-container-runtime
  • 配置 daemon.json
  • 在 docker-compose 配置使用 runtime.

遗憾的是 version 3 以上, runtime 已经移除了…所以配置文件 version 只能小于 3.

配置 gpu 支持

安装 nvidia-container-runtime

1
sudo apt-get install nvidia-container-runtime

配置 /etc/docker/daemon.json

1
2
3
4
5
6
7
8
{
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}

docker-compose 中配置 runtime: nvidia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '2.3'

services:

dl:
build:
context: ./Docker
container_name: dl
restart: always
ports:
- "127.0.0.1:8888:8888"
- "127.0.0.1:6006:6006"
runtime: nvidia
user: 1000:1000
# network_mode: "host"
volumes:
- ./user:/home/user

成品

代码在这里 GitHub - Jasper-1024/Dockerfile at deep-learning

还有细节需要调整,不过大体是这样了.

还没传到 dockerhub,最近找时间弄一下.

结语

至此,尚可用.

来活了,机器学习再见!.///…/./././.