如何使用docker配置深度学习开发环境

文章目录

    • 1.底层驱动的安装
      • 1.1 操作系统的安装
      • 1.2 显卡驱动的安装
      • 1.3 cuda的安装
    • 2.使用docker配置深度学习开发环境
      • 2.1 docker的安装
      • 2.2 nvidia_docker的安装
      • 2.3 安装过程中的问题
        • 2.3.1 docker和nvidia_docker的版本不匹配的问题。
        • 2.3.2 解决每次运行docker命令的时候要加sudo.
        • 2.3.3 解决每次docker pull镜像速度慢的问题。
        • 2.2.4 解决docker无法运行容器的问题。
    • 3.nvidia_docker的使用
      • 3.1 docker 的常用的命令
      • 3.2 docker使用过程中的注意事项
    • 4.dockerfile的使用
        • 4.1 dockerfile的例子
        • 4.2基于dockerfile创建镜像

深度环境的搭建对于深度学习是非常重要的。其中深度学习开发环境中因为用到非常多的第三方库,往往搭建起来非常费劲,如果有一个工具能够往我们只需要搭建一次,以后换了开发环境后,直接copy过去就能用该多好!docker就是用于解决这个问题的好方法。下面将介绍一下如何使用docker配置深度学习开发环境。

在这里插入图片描述

1.底层驱动的安装

1.1 操作系统的安装

参考文章:Linux操作系统的安装

1.2 显卡驱动的安装

参考文章:英伟达显卡驱动的安装

1.3 cuda的安装

参考文章:cuda的安装

2.使用docker配置深度学习开发环境

2.1 docker的安装

注意docker和nvidia_docker的版文好要对应
参考文章:docker的安装

  • 运行sudo docker run hello-world 测试docker是否安装和启动成功

如果之前或者系统自带的有docker,一定要卸载掉之前的docker,然后运行上面的命令安装docker

2.2 nvidia_docker的安装

注意docker和nvidia_docker的版文好要对应
参考文章:nvidia_docker的安装

  • 运行docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi命令测试nvidia_docker是否安装成功。

上面的测试命令需要你下载nvidia/cuda镜像,这个镜像比较大,下载非常耗时,所以一般查看是否拥有nvidia_docker命令即可,如果有这个命令说明安装成功

2.3 安装过程中的问题

2.3.1 docker和nvidia_docker的版本不匹配的问题。

  • 问题提示:
docker-ce (= 5:18.09.0~3-0~ubuntu-xenial) but 18.06.0~ce~3-0~ubuntu is to be installed
  • 解决方法:
    • 卸载掉原先安装的docker(一定要注意卸载干净,一般的卸载方法是无法卸载干净的,请自行百度),然后运行上面给的命令,就可以不出现上面的错误了。
    • 一般如果系统没有自带docker或者后面没有安装docker,直接运行上面给出的命令是不会出问题的。

2.3.2 解决每次运行docker命令的时候要加sudo.

参考文章

其实就是常见一个docker用户组,然后将用户都加入进去即可。

2.3.3 解决每次docker pull镜像速度慢的问题。

参考文章

我觉得这是比较好的方法,网上还有直接添加镜像网站的方法,效果不是很好,此处建议使用上面的方法。

2.2.4 解决docker无法运行容器的问题。

  • 错误提示:
Error response from daemon: Unknown runtime specified nvidia.
  • 参考文章
  • 注意事项:
    • 一定要保证nvidia_docker安装成功
    • 查看/usr/bin/nvidia-container-runtime执行文件是否存在
    • 按照上面的要求修改文件:/etc/systemd/system/docker.service.d/override.conf
    • 查看该/etc/docker/daemon.json是否出错,记住一定只能有一个一级的大括号,不能出现并集的两个。
## /etc/docker/daemon.json
{                                                                    "registry-mirrors": ["http://f136**2.m.daocloud.io"],       "runtimes": {                                                "nvidia": {                                          "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": []                            }                                            }                                                            
}
## /etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart= ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime                                                                    

3.nvidia_docker的使用

3.1 docker 的常用的命令

启动容器命令示例:

通过运行命令“nvidia_docker run --rm --it --name=“myTorch” --volume=”/home/deep_wfy/project:/home/deep_wfy/workspace:rw" pytorch:latest /bin/bash",

  • "–rm"表示在退出(使用快捷键Ctrl+d)退出时,同时删除该镜像文件的缓存,如果不加该选项,则该镜像的缓存会存在电脑中,通过运行命令“docker start myTorch”可以重新进入到该镜像的环境中,可以使用命令“docker rm myTorch”将缓存删除,此时使用命令“docker ps -a”查看发现没有。
  • “–it”表示该镜像运行在终端环境中,不加则无法进入到该镜像中。
  • “–name”表示给该镜像命名为"myTorch",同一个镜像,可以在不同运行时起不同的名字,用于区分不同的环境。
  • “–volume”表示有镜像创建的虚拟环境和物理环境中文件的共享映射,此处表示将物理环境中的“/home/deep_wfy/project”路径下的文件和虚拟环境中的“/home/deep_wfy/workspace”文件相对应,而且具有读写的权限,即在虚拟环境中修改文件在物理环境中也会改变,这样即使把镜像创建的虚拟环境删除,文件依然保存。
  • “pytorch:latest”是你要运行的镜像的名称
  • “/bin/bash”表示执行镜像环境中的bin文件夹下的bash可执行文件(这个可以通过查看该镜像的dockerFile看出)
  • 进行入到镜像的虚拟环境中便可以完成相应的操作,可以直接使用该镜像中环境了。与使用真实的环境并无差异。

只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档

在这里插入图片描述

  • Docker环境信息 — docker [info|version]
  • 容器生命周期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作运维 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [build|images|rmi|tag|save|import|load]
  • 容器资源管理 — docker [volume|network]
  • 系统日志信息 — docker [events|history|logs]
  • 退出某个镜像的操作是:CTRL + D
  • 其实docker中的很多命令与Linux是非常相似的,所以用起来非常简单
  • docker help [command]可以查看具体命令的一些详细信息

3.2 docker使用过程中的注意事项

  • 镜像查找网站,一般网站中会给出镜像拉取和容器创建的命令
  • 如果要开启GUI,声音等权限,需要去查相关的命令
  • 如果要使用tensorboard,则需要指明容器与服务器的端口映射。

4.dockerfile的使用

4.1 dockerfile的例子

Ubuntu 16.04

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# (see also https://bugs.launchpad.net/cloud-images/+bug/1699913)# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \&& echo 'exit 101' >> /usr/sbin/policy-rc.d \&& chmod +x /usr/sbin/policy-rc.d \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56&& dpkg-divert --local --rename --add /sbin/initctl \&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests# make systemd-detect-virt return "docker"
# See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]

ubuntu 18.04 + cuda10 + tensorflow1.13

# Copyright 2018 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============================================================================
#
# THIS IS A GENERATED DOCKERFILE.
#
# This file was assembled from multiple pieces, whose use is documented
# throughout. Please refer to the TensorFlow dockerfiles documentation
# for more information.ARG UBUNTU_VERSION=18.04ARG ARCH=
ARG CUDA=10.0
FROM nvidia/cuda${ARCH:+-$ARCH}:${CUDA}-base-ubuntu${UBUNTU_VERSION} as base
# ARCH and CUDA are specified again because the FROM directive resets ARGs
# (but their default value is retained if set previously)
ARG ARCH
ARG CUDA
ARG CUDNN=7.4.1.5-1# Needed for string substitution 
SHELL ["/bin/bash", "-c"]
# Pick up some TF dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \build-essential \cuda-command-line-tools-${CUDA/./-} \cuda-cublas-${CUDA/./-} \cuda-cufft-${CUDA/./-} \cuda-curand-${CUDA/./-} \cuda-cusolver-${CUDA/./-} \cuda-cusparse-${CUDA/./-} \curl \libcudnn7=${CUDNN}+cuda${CUDA} \libfreetype6-dev \libhdf5-serial-dev \libzmq3-dev \pkg-config \software-properties-common \unzipRUN [ ${ARCH} = ppc64le ] || (apt-get update && \apt-get install nvinfer-runtime-trt-repo-ubuntu1804-5.0.2-ga-cuda${CUDA} \&& apt-get update \&& apt-get install -y --no-install-recommends libnvinfer5=5.0.2-1+cuda${CUDA} \&& apt-get clean \&& rm -rf /var/lib/apt/lists/*)# For CUDA profiling, TensorFlow requires CUPTI.
ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATHARG USE_PYTHON_3_NOT_2
ARG _PY_SUFFIX=${USE_PYTHON_3_NOT_2:+3}
ARG PYTHON=python${_PY_SUFFIX}
ARG PIP=pip${_PY_SUFFIX}# See http://bugs.python.org/issue19846
ENV LANG C.UTF-8RUN apt-get update && apt-get install -y \${PYTHON} \${PYTHON}-pipRUN ${PIP} --no-cache-dir install --upgrade \pip \setuptools# Some TF tools expect a "python" binary
RUN ln -s $(which ${PYTHON}) /usr/local/bin/python # Options:
#   tensorflow
#   tensorflow-gpu
#   tf-nightly
#   tf-nightly-gpu
# Set --build-arg TF_PACKAGE_VERSION=1.11.0rc0 to install a specific version.
# Installs the latest version by default.
ARG TF_PACKAGE=tensorflow
ARG TF_PACKAGE_VERSION=
RUN ${PIP} install ${TF_PACKAGE}${TF_PACKAGE_VERSION:+==${TF_PACKAGE_VERSION}}COPY bashrc /etc/bash.bashrc
RUN chmod a+rwx /etc/bash.bashrc

4.2基于dockerfile创建镜像

参考文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反射全解

反射的概念 反射的引入: Object obj new Student(); 若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法: 1.若编译和运行类型都知道,使用 instanceof判断后&…

CRegKey 注册表操作

1.简介 CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便的打开注册表的某个分支或子键(CRegKey::Open),可以方便的修改一个键的键值(CRegKey::SetValue),也可以查询某…

进程基础

进程的基本概念 程序顺序执行的特征: 1)顺序性:处理机严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2)封闭性:程序在封闭的环境下运行,程序独占资源,资源的状…

用Docker容器自带的tensorflow serving部署模型对外服务

相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了。幸运的是在同事的建议下,我…

C资源

云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的现状没有怎么描写,有些意犹未尽。在这里想比较系统的谈谈个人对…

面试题汇总---深度学习(图像识别,NLP内容)

文章目录1.基本概念1.1 为什么神经网络中深度网络的表现比广度网络表现好?1.2 推导BP算法1.3 什么是梯度消失和梯度爆炸?1.4 常用的激活函数有哪些?1.5 常用的参数更新方法有哪些?1.6 解决过拟合的方法?数据层面模型层…

Python(28)-文件,os模块

文件1. 文件2. 文件的基本操作3. 读取文件open()3.1 文件指针: 标记从哪一个位置开始读取数据.3.2 文件的打开方式mode3.3 文件按行读取3.3.1 readline()3.3.2 readlines()4.文件输出f.write(),print()5.文件复制5.1 小文件复制(搬家)5.2 大文件复制&…

IOCP的程序

C代码 #include <winsock2.h> #include <mswsock.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "vld.h" #pragma message("automatic link to ws2_32.lib and…

PaperNotes(3)-图像分割-RCNN-FCN-Boxsup

图像分割算法对比小结1.{基本概念}2.{R-CNN}2.1R-CNN 网络结构选择性搜索算法为什么选择SVM作分类器边框回归2.2{R-CNN 训练}2.3{R-CNN实验结果}2.4{R-CNN语义分割}2.5{补充材料}2.5.1{R-CNN建议区域放缩}2.5.2{IOU阈值设置不一样的原因}2.5.3{Bounding-box回归修正}2.6{R-CNN存…

Python模块(3)--PIL 简易使用教程

PIL模块-用与记1.图片导入Image.open()2.图像显示.show()4.查看图片属性.format,.size,.mode3.图像格式转换.convert()4.图像模式“L”&#xff0c;“RGB”,"CYMK"5. 图片旋转.rotate()旋转方式1&#xff1a;旋转不扩展旋转方式2&#xff1a;旋转扩展旋转方式3&#…

输入输出系统

I/O设备&#xff1a;输入输出和存储功能的设备 I/O设备的分类 按传输的速度&#xff1a; 低速设备&#xff08;如键盘、鼠标、语音输入输出设备&#xff09; 中速设备&#xff08;如行式打印机、激光打印机等&#xff09; 高速设备&#xff08;如磁带机、磁盘机、光盘机等&…

模拟银行家算法

介绍 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h>#define ElemType PCB #define Status int #define true 1 #define false 0 #define OK 1 #define ERROR 0 #define RESOURCE_NUM …

js知识点汇总

1.本门课的作用&#xff08;JavaScript的作用&#xff09;所有基于Web的程序开发基础 2.一种计算机客户端脚本语言&#xff0c;主要在Web浏览器解释执行。 3.浏览器中Javascript&#xff0c;用于与用户交互&#xff0c;以及实现页面中各种动态特效 4.在HTML文件中&#xff0…

关于Java中String的问题

String 对象的两种创建方式&#xff1a; String str1 "abcd";//先检查字符串常量池中有没有"abcd"&#xff0c;如果字符串常量池中没有&#xff0c;则创建一个&#xff0c;然后 str1 指向字符串常量池中的对象&#xff0c;如果有&#xff0c;则直接将 st…

如何判断对象已经死亡

引用计数 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 这个方法实现简单&#xff0c;效率高&#xff0c;但是目前主流…

算法(2)-二叉树的遍历(递归/迭代)python实现

二叉树的遍历1.深度优先DFS1.1 DFS 递归解法1.1.1先序遍历1.1.2中序遍历1.1.3后序遍历1.2 DFS迭代解法1.2.1先序遍历1.2.2中序遍历1.2.3后序遍历2.广度优先BFS3.二叉树的最大深度3.1递归3.2迭代4.翻转二叉树4.1递归4.1迭代5.合并两棵二叉树5.1递归5.2迭代有两种通用的遍历树的策…

利用posix_fadvise清理系统中的文件缓存

利用posix_fadvise清理系统中的文件缓存leoncom c/c,unix2011-08-03当我们需要对某段读写文件并进行处理的程序进行性能测试时&#xff0c;文件会被系统cache住从而影响I/O的效率&#xff0c;必须清理cache中的对应文件的才能正确的进行性能测试。通常清理内存可以采用下面的这…

空间分配

目前主流的垃圾收集器都会采用分代回收算法&#xff0c;因此需要将堆内存分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 大多数情况下&#xff0c;对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时&#xff0c;虚拟…

创建与打开IPC通道的POSIX和SYSTEM V方法

先说&#xff30;&#xff2f;&#xff33;&#xff29;&#xff38;的吧&#xff1a; mq_open&#xff0c;sem_open&#xff0c;shm_open着三个函数用于创建或者打开一个IPC通道。 由此可见&#xff0c;消息队列的读写权限是任意的&#xff0c;然而信号灯就没有&#xff0c;…

软件测试基础知识

第一章 1.1 软件测试背景知识和发展史 互联网公司职位架构&#xff1a;产品 运营 技术 市场 行政软件测试&#xff1a;使用人工或自动化手段&#xff0c;来运行或测试某个系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别&#…