【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)
长篇博文记录学习流程不容易,请关注、转发、点赞、评论
,谢谢!
上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一)
文章末尾附加nvidia455.23、cuda11.1、cudnn8.0.4完美安装教程
Docker学习笔记与深度学习环境的搭建和部署
- 一、Docker图形化界面
- 1.0、Portainer + 仅介绍
- 1.1、DockStation + 仅介绍
- 1.2、Docker Desktop + 仅介绍
- 1.3、Lazydocker + 仅介绍
- 1.4、Docui + 仅介绍
- 1.5、Rancher与Rancher的安装和部署
- 二、创建深度学习镜像和容器
- 2.0、拉取官网tensorflow:nightly-gpu-jupyter
- 2.1、安装NVIDIA-docker
- 2.1.0、管理员查看NVIDIA
- 2.1.1、设置Docker的curl
- 2.1.2、设置NVIDIA Container Toolkit
- 2.1.3、切记:一定要更新保证依赖生成
- 2.1.4、开始安装nvidia-docker2
- 2.1.5、重新启动Docker守护程序
- 2.1.6、测试以上的设置是否有效
- 2.2、测试拉取的深度学习框架
- 2.2.0、选取国内深度学习镜像
- 2.2.1、测试MNIST手写字符识别
- 2.2.1.0. 首先基于ufoym/deepo镜像启动一个交互式容器
- 2.2.1.1.进入python环境(这里使用IPython终端)
- 2.2.1.2. 输入代码
- 2.2.1.3.载入并准备好 MNIST 数据集。将样本从整数转换为浮点数:
- 2.2.1.4.训练并验证模型
- 附加安装nvidia驱动教程(强力推荐)
- 001、安装nvidia455.23驱动
- 002、安装cuda11.1
- 003、安装cudnn8.0.4
- 参考文献
一、Docker图形化界面
Docker 有不少好用的图形化管理客户端,可以简化我们的工作,提供效率。
下面介绍目前比较流行的几款 Docker 客户端工具。
此处参考来源:
https://cloud.tencent.com/developer/article/1647274
1.0、Portainer + 仅介绍
Portainer 是开源的,是 Web 应用的形式。
github 上项目地址:https://github.com/portainer/portainer
官网地址:https://www.portainer.io
支持的系统:Linux, Mac OS X, Windows。
功能特性:
- 管理仓库、网络、数据卷、密钥、镜像、容器
- 管理你的配置,例如告警、监控
- 支持容器的健康检查
- 容器的启动、停止、恢复、删除
- 检查容器、查看容器日志、可视化状态查看
- 进入容器控制台
- 可以添加扩展
- 有一套 RBAC 基于角色的权限控制系统
1.1、DockStation + 仅介绍
DockStation 是免费的,是桌面应用的形式。
官网地址:https://dockstation.io/
支持的系统:Linux, Mac, Windows
功能特性:
- 可以非常方便的操作 Docker 和 DockerCompose。
- 可以帮助我们管理容器、Service服务(本地远程都可以),并监控他们
- 可以轻松跟踪 CPU、内存、网络、磁盘I/O、开放端口
- 可以把常用的操作组织成一个项目,通过项目的方式来检查容器状态,以图形化的方式管理。
1.2、Docker Desktop + 仅介绍
Docker Desktop 是 Docker 自己的客户端。
官网地址:http://www.docker.com
支持的系统:Mac, Windows
功能特性:
- 可以设置 Docker 的资源限制(例如 CPU、内存、交换空间、磁盘镜像大小、文件共享、网络)
- 配置 Docker 引擎
- 运行命令行
- 支持 Kubernetes,可以配置发布到 Kubernetes
- 查看日志、容器状态
1.3、Lazydocker + 仅介绍
Lazydocker 是开源,是终端 UI 的形式。
项目地址:https://github.com/jesseduffield/lazydocker
支持的系统:Linux, OSX, Windows
功能特性:
- 鼠标、键盘都可操作
- 快速查看 docker/docker-compose 容器环境,一目了然
- 查看 container/service 的日志
- 容器指标可视化
- 自己配置你关注的各项指标图形
- containers/services 重启、删除、重新构建
- 清理无用镜像、容器、数据卷
1.4、Docui + 仅介绍
Docui 是开源的,形式与 Lazydocker 一样,也是 终端 UI 的形式。
项目地址:https://github.com/skanehira/docui
支持的系统:Mac, Linux
功能特性:
- 镜像
- 搜索、拉取、删除
- 保存、导入、加载
- 监查、过滤
- 容器
- 创建、删除
- 启动、停止
- 导出、提交
- 监查、重命名、过滤
- 执行命令
- 数据卷
- 创建、删除
- 监查、过滤
- 网络
- 删除
- 监查、过滤
Docui 和 Lazydocker 都是终端界面,他们都有一个共同的优势,就是支持大量的快捷键,熟练后会极其便利。
1.5、Rancher与Rancher的安装和部署
本文将使用此Rancher工具,其他图形化界面请选择适合自己的进行开发。
Rancher是一个开源的企业级全栈化容器部署及管理平台。Rancher为容器提供一揽子基础架构服务:CNI兼容的网络服务、存储服务、主机管理、负载均衡、防护墙Rancher让上述服务跨越公有云、私有云、虚拟机、物理机环境运行,真正实现一键式应用部署和管理。
官网地址:https://rancher.com/
中文官网地址: https://www.rancher.cn/quick-start/
项目地址:https://github.com/rancher
docker拉取地址:https://hub.docker.com/r/rancher/server
我们这里先来查看一下软件层面的信息:
查看NVIDIA显卡内存、ubuntu16.04、cuda版本等信息如下:
下面直接通过docker镜像来运行我们的rancher,首先,这里先从镜像中心下载rancher镜像,如果是1.x系列的,镜像名为rancher/server;如果2.x是rancher/rancher,我们使用2.x版本的,所以,执行如下命令即可:
docker pull rancher/rancher
注意:等价概念
docker pull rancher/rancher==docker.io/rancher/rancher:latest
根据上一篇文章的基本知识,这里可通过docker image ls或docker images
命令查看我们pull的镜像列表:
查看rancher镜像详细信息
docker inspect rancher/rancher:latest
zkpark@ovo:~$ docker inspect rancher/rancher:latest
[
{
"Id": "sha256:e02481bb39c88f0352ed7ae1998f2860a4816a8d5c3ba3b397b972849f657e2e",
"RepoTags": [
"rancher/rancher:latest"
],
"RepoDigests": [
"rancher/rancher@sha256:961980e4d64e2c9b4c6830f61b0a75b6b86695516303a2fc5e053d642e91e958"
],
"Parent": "",
"Comment": "",
"Created": "2021-01-09T01:59:51.016057118Z",
"Container": "ca5a52ea7f8628d11fc5aeda78de6a7582f075f1aa188b803c2b3503395b4572",
"ContainerConfig": {
"Hostname": "ca5a52ea7f86",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"CATTLE_SYSTEM_CHART_DEFAULT_BRANCH=release-v2.5",
"CATTLE_CHART_DEFAULT_BRANCH=main",
"CATTLE_PARTNER_CHART_DEFAULT_BRANCH=main",
"CATTLE_HELM_VERSION=v2.16.8-rancher1",
"CATTLE_K3S_VERSION=v1.18.8+k3s1",
"CATTLE_MACHINE_VERSION=v0.15.0-rancher49",
"CATTLE_ETCD_VERSION=v3.4.3",
"CATTLE_CHANNELSERVER_VERSION=v0.5.0",
"LOGLEVEL_VERSION=v0.1.3",
"TINI_VERSION=v0.18.0",
"TELEMETRY_VERSION=v0.5.12",
"KUBECTL_VERSION=v1.18.2",
"DOCKER_MACHINE_LINODE_VERSION=v0.1.8",
"LINODE_UI_DRIVER_VERSION=v0.3.0",
"RANCHER_METADATA_BRANCH=release-v2.5",
"HELM_VERSION=v3.3.1",
"KUSTOMIZE_VERSION=v3.5.4",
............太多了,这里省略...........
"MergedDir": "/var/lib/docker/overlay2/defb5b8ba85f4ea892e9851f78ea8a7c627bb78ebb03c128f253eb5d2fae3250/merged",
"UpperDir": "/var/lib/docker/overlay2/defb5b8ba85f4ea892e9851f78ea8a7c627bb78ebb03c128f253eb5d2fae3250/diff",
"WorkDir": "/var/lib/docker/overlay2/defb5b8ba85f4ea892e9851f78ea8a7c627bb78ebb03c128f253eb5d2fae3250/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:b43408d5f11b7b2faf048ae4eb25c296536c571fb2f937b4f1c3883386e93d64",
"sha256:23135df75b44a66efa9d8dc1a10051768c27bd95388f436eb9553e0eb17211f6",
"sha256:fe6d8881187d429af3f636c574911690455825998c9f366e985eab646665e711",
"sha256:5f1bda852a10df56c305a15531f562cd48e89c16ed1ff6e7611fa3f0dbbe1dd4",
"sha256:dd4e71b7a6269c1fb024808d41ae83ed1e8e006f4b30f19720405a407e436cd8",
"sha256:4724f23a78e0075b024b5b9a67ae52d334da85b5e57a782f1482ce768b0f75b2",
"sha256:0cf27bde30937993fb96693b7e31c767a0f7efef61207de4f2969c5fa01efd13",
"sha256:f80cdede844cc4da9bad5ba902c6bd97ff7ab202393fe0e0ce36021fc796e617",
"sha256:028549829fe7a594839142dbb0487f620c160561e8214e52965393217c7e3d2a",
"sha256:ff6dd8cbf3e1850bcc51c88ab4c8724cc5a6f0619f0d1059ce2015a37cb46991",
"sha256:829a045ff9395552dc686233a7887f85dcdd14c5164bc34b978038353e0993e8",
"sha256:ec9675e6cb667da5d58ec732248e4c99e965eb04a8b5581acb4c1ddcaa63c608",
"sha256:3029e19cc3a15fc879a62ece540c22c10fa0a52fea022d9eed2605c626153b8d",
"sha256:4f137963cdf72039c09ff35d2265688fe9f612e533e5861c36e49729017c9f93",
"sha256:c8778fe956d4b9654dddcf460fba2610fa405c390e86fae1601c3bdcd0368550",
"sha256:6a60617d8f552ed876a25726cb90ecc77916a35fc8e3db0fe3892e9dcc2692a4",
"sha256:08fc3dbbd5ac89a87c64d6e7a32fb9563c70f1ae15d4b153724c668310d097ae",
"sha256:12f70d02b7b34c37cbbdb7e7102cd778aaa53362eaef0f9cac8bf0610a2d4d13",
"sha256:e67348ea85256c7564df1b2726a872416df61a2724e9fac2be056f682268a152",
"sha256:40ebba0a9f3b1e67c0e013513dfd60d86830483b756b2b66e1f7178cc5b6d055"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
从中可以看出一些对我们有用的环境变量Env,以及数据卷Volumes等一般在Dockerfile构建中的参数。显而易见,rancher镜像主要有两个volume目录,默认方式是采用匿名卷的方式。接下来我们使用挂载到指定的主机目录方式来进行数据卷持久化同时启动rancher。
执行如下命令,在宿主机创建两个挂载目录:
mkdir -p /docker_volume/rancher_home/rancher
mkdir -p /docker_volume/rancher_home/auditlog
备注:挂载的目录一般是隐藏的,需要cmd进去,然后ls查看。
启动rancher容器:启动的方式有很多,以下只是其中一种。
docker run -d --name=rancher-zk --restart=always -p 9090:8080 rancher/server
说明:always表示在容器退出时总是启动容器
查看刚才启动的容器信息:
docker container ls
到这里rancher已经在docker容器里运行起来了,接下来将开始通过rancher的web界面来进行容器管理等操作。
查看你当前的ubuntu主机ip:ifconfig
将ip与以上端口号9090输入到浏览器中,填写格式如下:
http://{ip}:9090
即:以下通过向日葵远程链接ubuntu输入以下地址到浏览器
http://192.168.1.3:9090
如图:
设置为中文界面:由于第一启动,因此里面没什么东西,docker也是新装的。后面我们会陆续部署深度学习相关内容,敬请期待。
二、创建深度学习镜像和容器
2.0、拉取官网tensorflow:nightly-gpu-jupyter
docker pull tensorflow/tensorflow:nightly-gpu-jupyter
拉取很明显很慢,下面解决这个问题:
经过仔细检查,我的docker镜像源我填写阿里云镜像加速服务地址,不知道为什么会慢,不过总比国外的速度快些。当然,也可以换成国内的镜像源:
创建或修改 /etc/docker/daemon.json 文件:
修改为如下形式
# sudo vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker.service
或者尝试填写如下格式:
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
#systemctl restart docker.service
国内加速地址有:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
阿里云容器 服务
https://cr.console.aliyun.com/
首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com”
另一种加速方式:
#docker pull registry.国内镜像地址/拉取的镜像
docker pull registry.docker-cn.com/tensorflow/serving
如果你已经安装了NVIDIA-docke2、cuda、cudnn
请跳过该流程。
2.1、安装NVIDIA-docker
虽然我们知道怎么拉取深度学习框架镜像,但是没有NVIDIA-docker是绝对不行的,下面开始按照该显卡驱动。我们可以从NVIDIA-docker官方github推荐的安装教程可以看到:
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit#docker
根据该教程我们的操作如下:
2.1.0、管理员查看NVIDIA
当我们进入管理员查看NVIDIA有没有驱动的
(前提条件:我的主机已经安装了NVIDIA455、cuda11.1、cudnn8.0.4,具体说明请看以上链接文献)
2.1.1、设置Docker的curl
可以使用Docker的官方便捷脚本在Ubuntu上设置Docker-CE:
curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
2.1.2、设置NVIDIA Container Toolkit
设置stable存储库和GPG密钥:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
2.1.3、切记:一定要更新保证依赖生成
sudo apt-get update
2.1.4、开始安装nvidia-docker2
sudo apt-get install -y nvidia-docker2
2.1.5、重新启动Docker守护程序
设置默认运行时后,重新启动Docker守护程序以完成安装:
sudo systemctl restart docker
2.1.6、测试以上的设置是否有效
此时,可以通过运行基本CUDA容器来测试有效的设置:
sudo docker run --rm --gpus all nvidia/cuda:11.1-base nvidia-smi
这将导致控制台输出如下所示:
2.2、测试拉取的深度学习框架
2.2.0、选取国内深度学习镜像
这里大致拉取了如下现有的镜像:
这里使用镜像是deepo一款咱们中国人做出来的深度学习镜像,包含了现在多数流行的深度学习框架,而且版本也很新,所以我这个小白第一次就选择了这个。 链接:https://hub.docker.com/r/ufoym/deepo 只有安装好了本文附件中的docker和nvidia-docker,这里就很方便了
。 直接通过命令docker pull ufoym/deepo就可以把各种框架都下载下来。但是这样比较大,费时较长,不过我这里还是尝试都拉取了,如上图所示。如果你的网速不行就简单拉一个框架:官方教程里面也提供了直接安装某一种框架的方式:
因此你可以选择一个框架就行。
下面我们创建一个容器,在该容器里实现手写数字识别的测试过程
2.2.1、测试MNIST手写字符识别
2.2.1.0. 首先基于ufoym/deepo镜像启动一个交互式容器
docker run --gpus all -it ufoym/deepo bash
其中,–gpus all参数表示容器可以使用所有的GPU。
2.2.1.1.进入python环境(这里使用IPython终端)
python或ipython
2.2.1.2. 输入代码
from __future__ import absolute_import, division, print_function, unicode_literals
# 导入 TensorFlow
import tensorflow as tf
2.2.1.3.载入并准备好 MNIST 数据集。将样本从整数转换为浮点数:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
将模型的各层堆叠起来,以搭建 tf.keras.Sequential 模型。为训练选择优化器和损失函数:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
2.2.1.4.训练并验证模型
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
执行结果如下图所示:
附加安装nvidia驱动教程(强力推荐)
001、安装nvidia455.23驱动
下载驱动文件并指令安装
-
附加 1 、在英伟达的官网上查找你自己电脑的显卡型号然后下载相应的驱动: https://www.geforce.cn/drivers, 下载后的run文件拷贝至home目录下, 文件为:NVIDIA-Linux-x86_64-xxx.run
-
附加2 、 在ubuntu下按ctrl+alt+f1进入命令行界面,此时需要login:电脑账户名称,password:密码,登录到命令行界面。 有时会出现登录失败,报错incorrect login ,此时可以按下ctrl+alt+F2(F4)等进入,重新login,即可。
-
附加3、 sudo service lightdm stop //这个是关闭图形界面,必须关闭
-
附加4、 sudo apt-get remove nvidia-* //卸载系统中存在的驱动,默认有安装的,一定要执行这个
-
附加5、 sudo chmod a+x NVIDIA-Linux-x86_64-xxx.run //给文件权限
-
附加6、 sudo ./NVIDIA-Linux-x86_64-xxx.run -no-x-check -no-nouveau-check -no-opengl-files ,其中:
-no-x-check:安装驱动时关闭X服务
-no-nouveau-check:安装驱动时禁用nouveau
-no-opengl-files:只安装驱动文件,不安装OpenGL文件
在安装过程中会出现:
-
he distribution-provided pre-install script failed! Are you sure you want to continue? 选择 yes 继续。
-
Would you like to register the kernel module souces with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later? 选择NO继续
-
Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up. 选择 Yes 继续
安装成功后,在命令行输入:sudo service lightdm start //重启图形界面, 按Ctrl+Alt+F7返回图形界面
nvidia-smi , nvidia-setting//检测是否安装成功
到此驱动就安装好了。
002、安装cuda11.1
删除cuda
sudo apt-get remove cuda
sudo apt --purge remove "*cublas*" "cuda*"
sudo apt-get autoclean
sudo apt-get remove cuda*
然后在目录切换到/usr/local/下,清除干净
cd /usr/local/
sudo rm -r cuda-版本号
安装命令:
sudo chmod 777 cuda_11.1.1_455.32.00_linux.run
sudo sh cuda_11.1.1_455.32.00_linux.run
or
sudo ./cuda_11.1.1_455.32.00_linux.run
环境配置:
sudo apt-get install vim
sudo vim ~/.bashrc
填入内容:
export CUDA_HOME=/usr/local/cuda-11.1
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-11.1/bin:${PATH}
环境策略生成
source ~/.bashrc
验证是否安装成功:
nvcc -V
cd /usr/local/cuda-11.1/samples/1_Utilities/deviceQuery
ls
sudo make
./deviceQuery
003、安装cudnn8.0.4
删除原有的cudnn:
sudo rm -rf /usr/local/cuda/include/cudnn.h
sudo rm -rf /usr/local/cuda/lib64/libcudnn
卸载之后,会发现 /usr/local/cuda-x目录下仍然还有文件存在,这是cudnn文件,所以还需要将cuda-x文件删除干净
sudo rm -rf /usr/local/cuda-x
安装cudnn:
官方文档:https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
下载地址:https://developer.nvidia.com/rdp/cudnn-download
方法一:
(该方法适用于cuda7.6.5之前的版本)
将下载的 cuDNN Library for Linux (x86_64) 解压,并在解压出cuda的文件夹中打开终端,将解压出来的文件复制到安装好的CUDA中,命令如下:
需要下载的文件【四个】:第2/4/5/6个文件
解压文件:tar -xzvf cudnn-x.x-linux-x64-v8.x.x.x.tgz
tar -xzvf cudnn-11.1-linux-x64-v8.0.4.30.tgz
复制文件到Cuda目录:
sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
更改权限
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
验证:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
方法二:推荐安装的方法
安装deb文件:(cuda版本高于8.0推荐的安装方法)
模板:
sudo dpkg -i libcudnn8_x.x.x-1+cudax.x_amd64.deb
sudo dpkg -i libcudnn8-dev_8.x.x.x-1+cudax.x_amd64.deb
sudo dpkg -i libcudnn8-samples_8.x.x.x-1+cudax.x_amd64.deb
案例:
sudo dpkg -i libcudnn8_8.0.4.30-1+cuda11.1_amd64.deb
sudo dpkg -i libcudnn8-dev_8.0.4.30-1+cuda11.1_amd64.deb
sudo dpkg -i libcudnn8-samples_8.0.4.30-1+cuda11.1_amd64.deb
验证:
复制测试样例文件到可写的文件夹
sudo cp -r /usr/src/cudnn_samples_v8/ $HOME
进入文件夹:
cd $HOME/cudnn_samples_v8/mnistCUDNN
编译:make clean && make
运行测试样例:./mnistCUDNN【显示test passed说明安装成功!】
参考文献
https://zhuanlan.zhihu.com/p/29176631
https://www.jianshu.com/p/40f4fbe1ec22
关于rancher功能介绍可以看这篇文章:
https://blog.csdn.net/bbwangj/article/details/81231118
https://haokan.baidu.com/v
https://zhuanlan.zhihu.com/p/64493662