1. 程式人生 > >在Docker容器中搭建MXNet/Gluon開發環境

在Docker容器中搭建MXNet/Gluon開發環境

在這篇文章中沒有直接使用MXNet官方提供的docker image,而是從一個乾淨的nvidia/cuda映象開始,一步一步部署mxnet需要的相關軟體環境,這樣做是為了更加細緻的瞭解mxnet的執行環境,方便後續我們更加靈活的去修改相關的配置。

1. 通過docker建立乾淨的系統環境

docker run -itd --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=2,3 --name=mxnet-cu90 -p 9999:8888 -p 1234:22 -v /docker_share/:/root/share nvidia/cuda:9.0-cudnn7-devel bash
docker exec -it mxnet-cu90  bash

這裡映象使用了nvida最新的cuda9.0的映象,使用--runtime=nvidia是為了使用nvidia-docker在容器中使用GPU資源, 環境變數NVIDIA_VISIBLE_DEVICES用來控制在容器中可見的GPU的id,這裡選擇2和3,是因為我的機器上一共有4塊GPU卡,容器中只使用後兩塊。-v選項是為了方便主機與容器之間進行資料交換而掛載的一塊空間,使用-p選擇進行主機與容器之間的埠對映,這裡分別映身了容器中的22號埠是為了使用ssh進行遠端訪問,以及8888埠是jupyter-notebook預設使用的埠號。

2. 替換阿里雲的源

容器中預設的軟體包的更新源都是國外的,在國外使用起來速度較慢,這裡更新為阿里雲的即可。也可以直接在/etc/apt/sources.list

檔案中將http://archive.ubuntu.com/ubuntu/直接替換為http://cn.archive.ubuntu.com/ubuntu/。

apt-get update
apt-get install -y vim
mv /etc/apt/sources.list /etc/apt/sources.list.bark #備份
vim /etc/apt/sources.list #修改
apt-get update #更新

阿里雲的源:

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

3. 安裝必要的軟體工具

sudo apt-get update && sudo apt-get install -y build-essential git libgfortran3
apt-get install -y vim git openssh-server # 安裝 vim git ssh遠端登入
apt-get install -y bash-completion man # 安裝命令列的自動提示的功能,以及幫助手冊的檢視工具
adduser username #建立新使用者
adduser username sudo #把使用者加入到sudo許可權
service ssh start # 啟動ssh服務
exit #退出容器 
docker exec mxnet-cu90  /usr/sbin/sshd # 在host上開啟容器的sshd服務

這樣我們後續就可以通過ssh -p 1234 [email protected]訪問容器了。

4. 安裝Miniconda

wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh #下載
sh Miniconda3-latest-Linux-x86_64.sh #安裝
conda config --prepend channels http://mirrors.ustc.edu.cn/anaconda/pkgs/free/ # 配置國內科大的源

進一步閱讀:

5. 替換pip的源

mkdir ~/.pip
vim ~/.pip/pip.conf

貼上如下內容,新增阿里雲的源

[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/

6. MXNet/Gluon開發環境的配置

使用conda提供的虛擬環境機制在容器裡建立一個虛擬環境配置檔案environment.yml,檔案內容如下:

name: mxnet
dependencies:
- python=3
- jupyter
- matplotlib
- pandas
- pip:
  - requests
  - mxnet-cu90>=1.0.1b20180125

然後通過下面的命令,建立虛擬環境mxnet並激活使用。

conda env create -f environment.yml # 安裝執行mxnet所需要的Python包
source activate mxnet # 啟用虛擬環境,Windows下不需要 source

使用notedown

source activate mxnet # 啟用mxnet環境
pip install https://github.com/mli/notedown/tarball/master # 安裝外掛
jupyter notebook --generate-config # 生成jupyter notebook的配置檔案
echo "c.NotebookApp.contents_manager_class = 'notedown.NotedownContentsManager' " >> ~/.jupyter/jupyter_notebook_config.py # 在配置檔案最後增加一行

安裝notebook每個cell的計時程式

source activate mxnet # 啟用gluon環境
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime

7. 開發環境驗證

import mxnet as mx
import mxnet.ndarray as nd
a = nd.ones((2,3), ctx=mx.gpu())
a.asnumpy()

如果整個環境安裝正確,則執行上面的程式碼,不會報錯,且有如下的輸出:

array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]], dtype=float32)

8. 通過原始碼安裝

在步驟6中,我們演示瞭如何使用虛擬環境工具conda以及python的包管理工具pip來安裝mxnet最新的GPU版本,我們可以得到一個mxnet的python開發環境。我們也可以從原始碼開始,編譯安裝。

安裝MXNet的依賴庫

apt-get install -y libopenblas-dev liblapack-dev libopencv-dev

下載mxnet原始碼並編譯

$ git clone --recursive https://github.com/apache/incubator-mxnet
$ cd incubator-mxnet
$ make -j $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1

編譯python介面

sudo apt-get install -y python-dev python-setuptools python-pip libgfortran3 # 安裝python相關的環境
cd python
pip install --upgrade pip
pip install -e . #通過目錄下的requirement.txt來管理pip安裝的包
sudo apt-get install graphviz #安裝graphviz用來計算圖的顯示
pip install graphviz