基於NVidia開源的nvidia/cuda
image,構建適用於DeepLearning的基礎image。
思路就是先把常用的東西都塞進去,再裝某個框架就省事兒了。
為了體驗重裝系統的樂趣,所以采用慢慢來比較快的步驟,而不是通過Dockerfile
來build。
環境信息
已經安裝了Docker CE
和nvidia-docker2
Host OS: Ubuntu 18.04 64 bit
CUDA: 10.0
cuDNN: 7.4
Docker CE: 18.09.1
nvidia-docker2: 2.0.3
鏡像信息
拉取鏡像nvidia/cuda
:
$ sudo docker pull nvidia/cuda
目前拉取到的鏡像nvidia/cuda
信息如下:
OS: Ubuntu 18.04.1 LTS
CUDA: 10.0
Size: 2.24GB
啟動鏡像
創建目錄base
,方便數據導入導出,映射為容器內的/host
目錄,然后在這個目錄下運行命令創建容器dl-base
。
$ sudo nvidia-docker run -it --name dl-base -v `pwd`:/host nvidia/cuda
一切順利的話,出現類似下面的命令行:
root@a336efb2d5b0:/host#
可以運行nvidia-smi
驗證容器內的CUDA環境正常。
替換阿里源
大陸的網絡環境下,阿里源速度還不錯。
將下面的內容存為base
目錄下的sources.list
文件。
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ bionic universe
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates universe
deb http://mirrors.aliyun.com/ubuntu/ bionic multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ bionic-security universe
deb http://mirrors.aliyun.com/ubuntu/ bionic-security multiverse
在容器命令行下運行命令更新源。
$ cp /host/sources.list /etc/apt/sources.list
$ apt update
安裝基本工具
$ apt install -y vim curl git iputils-ping net-tools telnet tmux unzip
創建工作及下載目錄
$ mkdir -p /work/download
修改~/.bashrc
在文件尾部添加下面內容:
alias u='cd ..'
alias ins='apt install -y'
alias ta='tmux a -t'
export PATH=/usr/local/cuda-10.0/bin:$PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/cuda-10.0/lib64:/home/etworker/anaconda3/lib:$LD_LIBRARY_PATH"
export CUDNN_PATH="/usr/local/cuda-10.0/lib64/libcudnn.so"
再使其生效:
$ source ~/.bashrc
安裝cnDNN
Host下雖然已經安裝了cnDNN環境,但是容器內沒法使用,所以需要再搞一把。
先將cnDNN的壓縮包解壓到base
目錄,此處為cudnn-10.0-linux-x64-v7.4.2.24
目錄,在容器命令行下運行:
$ cp /host/cudnn-10.0-linux-x64-v7.4.2.24/cuda/include/cudnn.h /usr/local/cuda-10.0/include
$ cp /host/cudnn-10.0-linux-x64-v7.4.2.24/cuda/lib64/libcudnn* /usr/local/cuda-10.0/lib64
$ chmod a+r /usr/local/cuda-10.0/include/cudnn.h /usr/local/cuda-10.0/lib64/libcudnn*
然后驗證一下,不報錯就OK了。
$ echo -e '#include"cudnn.h"\n void main(){}' | nvcc -x c - -o /dev/null -lcudnn
安裝openssh-server
$ apt install -y openssh-server
修改/etc/ssh/sshd_config
,找到#PermitRootLogin
開頭的這一行,修改為PermitRootLogin yes
,這樣就可以通過root登錄了。
然后修改密碼:
$ passwd
兩次輸入密碼,然后重啟ssh:
$ /etc/init.d/ssh restart
出現下面內容就OK了。
* Restarting OpenBSD Secure Shell server sshd [ OK ]
這里為了簡單粗暴,采用了root來登陸。
如果考慮安全,可自行創建用戶,並對ssh進行配置。
安裝python常用組件
Ubuntu 18.04的容器,默認安裝了python 3.6.7
,此時還需安裝pip:
$ apt install -y python3-pip
建議不要更新pip,否則容易出現問題。
創建pip的配置文件目錄~/.pip
,再創建文件~/.pip/pip.conf
,內容如下:
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
安裝常用的包:
$ pip3 install numpy matplotlib Pillow scipy jupyter pandas h5py easydict sklearn
安裝opencv-python
$ apt install -y libsm6 libxext6 libfontconfig1 libxrender1
$ pip3 install opencv-python
此時安裝的opencv版本是4.0.0。
保存鏡像
至此,就可以在Host下運行命令將容器保存為鏡像了。
$ sudo nvidia-docker commit dl-base dl/base
這樣就生成了一個鏡像dl/base
,大小為4.36GB。
在此鏡像基礎上,可以自行安裝不同的框架。
jupyter notebook
如果希望在容器中啟動jupyter notebook
,需要加上參數如下:
$ jupyter notebook --ip=0.0.0.0 --allow-root