文章目錄
-
- 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無法運作容器的問題。
- 錯誤提示:
- 參考文章
- 注意事項:
- 一定要保證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.04
ARG 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 \
unzip
RUN [ ${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_PATH
ARG 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-8
RUN apt-get update && apt-get install -y \
${PYTHON} \
${PYTHON}-pip
RUN ${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建立鏡像
參考文章