深度學習軟體開發環境搭建

  • 2019 年 11 月 21 日
  • 筆記

這幾天,我花了一些時間,裝系統,裝軟體,進行系統設置,搭建了一套令我比較滿意的深度學習環境。下面就介紹一下我的深度學習軟體配置。

在作業系統的選擇上,我毫不猶豫的選擇了Ubuntu 180.4 LTS(長期支援系統)。Linux雖然對普通用戶不友好,但對開發人員卻非常友好,各種開發軟體,在Linux系統上均首先得到支援(微信小程式開發工具是個例外,這點很讓人無語)。Linux的發行版本眾多,而Ubuntu系統是我長期使用的髮型版本,上手容易,使用方便,所以選擇Ubuntu是自然而然的事情。版本上當然選擇新版本,但我沒有選擇Ubuntu 19.04或Ubuntu 19.10,因為Ubuntu版本出的非常勤,每年都會出兩個版本,但每隔兩年會出一個LTS版本,支援期為4年,所以為了穩定起見,選擇LTS版本是一個穩妥的選擇,最近的一個LTS版本就是18.04。

選擇Linux系統還有一個好處,就是專心開發,雖然這台主機很適合玩大型遊戲,但沒裝Windows系統,玩不了。另外好多常見的軟體,都沒有Linux版本。總結一下,這台機器就是用來幹活的。

這篇文章略過Ubuntu系統的安裝,重點說一說各種深度學習軟體的安裝與配置。

安裝基本的開發工具

作為一名Linux開發人員,通常gcc、jdk、git是必不可少的,另外ssh登錄,可以方便遠程登錄。下面是我安裝的一些基本軟體:

sudo apt-get update  sudo apt-get install build-essential git openssh-server vim openjdk-8-jdk bash-completion wget zlib1g-dev unzip

接下來設置github訪問。首先,使用您會記住的密碼(或者為空)生成一個公共RSA密鑰。

ssh-keygen -t rsa -b 4096

這將在 ~/.ssh/ 目錄中生成一個公共密鑰 id_rsa.pub 和一個標識符 id_rsa。現在,用文本編輯器打開 id_rsa.pub 文件,將其中的內容複製到剪貼板。

登錄到您的GitHub帳戶,然後在「設置」下單擊SSH和GPG密鑰並添加新的SSH密鑰。

將剪貼板中的內容貼到 key 這一欄。嘗試一下,是否能夠通過SSH協議克隆你的項目程式碼。

CUDA及cuDNN

這個主機主要用於進行深度學習,Nvidia的CUDA肯定首先需要安裝的。雖然CUDA的最新版本是10.1,但由於TensorFlow GPU僅和CUDA 10.0兼容,所以不要安裝最新的CUDA 10.1,請按照如下命令安裝CUDA 10.0:

# 添加NVIDIA包倉庫$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb  $ sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb  $ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub  $ sudo apt-get update  wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb  $ sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb  $ sudo apt-get update# 安裝 NVIDIA 驅動$ sudo apt-get install --no-install-recommends nvidia-driver-418

重啟。檢查GPU是否正常工作,使用命令:

nvidia-smi

接下來安裝CUDA開發與運行時庫:

# 安裝大約4GB  $ sudo apt-get install --no-install-recommends   cuda-10-0   libcudnn7=7.6.2.24-1+cuda10.0    libcudnn7-dev=7.6.2.24-1+cuda10.0    # 安裝TensorRT. 要求以上的libcudnn7已經安裝.  $ sudo apt-get install -y --no-install-recommends libnvinfer5=5.1.5-1+cuda10.0   libnvinfer-dev=5.1.5-1+cuda10.0

要檢查CUDA開發庫是否正確安裝,可以編譯CUDA提供的示常式序。

$ cuda-install-samples-10.0.sh ~ $ cd ~/NVIDIA_CUDA-10.0_Samples $ make

運行編譯示常式序:

$ ./bin/x86_64/linux/release/deviceQuery  ./bin/x86_64/linux/release/deviceQuery Starting...    CUDA Device Query (Runtime API) version (CUDART static linking)    Detected 1 CUDA Capable device(s)    Device 0: "GeForce RTX 2080 Ti"  CUDA Driver Version / Runtime Version          10.1 / 10.0  CUDA Capability Major/Minor version number:    7.5  Total amount of global memory:                 10986 MBytes (11519983616 bytes)  (68) Multiprocessors, ( 64) CUDA Cores/MP:     4352 CUDA Cores  GPU Max Clock rate:                            1545 MHz (1.54 GHz)  Memory Clock rate:                             7000 Mhz  Memory Bus Width:                              352-bit  L2 Cache Size:                                 5767168 bytes  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers  Total amount of constant memory:               65536 bytes  Total amount of shared memory per block:       49152 bytes  Total number of registers available per block: 65536  Warp size:                                     32  Maximum number of threads per multiprocessor:  1024  Maximum number of threads per block:           1024  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)  Maximum memory pitch:                          2147483647 bytes  Texture alignment:                             512 bytes  Concurrent copy and kernel execution:          Yes with 3 copy engine(s)  Run time limit on kernels:                     Yes  Integrated GPU sharing Host Memory:            No  Support host page-locked memory mapping:       Yes  Alignment requirement for Surfaces:            Yes  Device has ECC support:                        Disabled  Device supports Unified Addressing (UVA):      Yes  Device supports Compute Preemption:            Yes  Supports Cooperative Kernel Launch:            Yes  Supports MultiDevice Co-op Kernel Launch:      Yes  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0  Compute Mode:  < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 10.0, NumDevs = 1  Result = PASS

輸出結果中包含Result = PASS,表明CUDA是正常工作的。

Docker

關於Docker以及Docker中的硬體加速支援,請參考我前面一篇文章:

啟用Docker虛擬機GPU,加速深度學習

關於Docker虛擬機,這裡補充一點知識。docker在安裝完成之後,是需要root許可權才能執行docker命令。通常情況下,使用sudo是一個危險的操作,應該盡量避免,Docker給出解決方案,將用戶加入到名為docker的用戶組,這個用戶組在安裝docker軟體的過程中會創建。

$ sudo usermod -aG docker ${USER}

登出機器再登入,或者執行以下的命令,即可生效:

$ su - ${USER}

確定當前用戶是否屬於docker用戶組:

$ id -nG  alex adm cdrom sudo dip plugdev lpadmin sambashare docker

這個時候直接運行 docker 命令就不會出錯了,可以運行以下命令驗證一下:

docker run hello-world

Anaconda

談到機器學習,python肯定是首選語言。但是Python語言發展過程中,一直深受Python 2和Python 3兩個版本分裂的困擾,雖然Python 3是大勢所趨,但Python 2的生命力很頑強,現在依然有許多程式碼只能運行在python 2下。另外Tensorflow 1.X和Tensorflow 2.0也不兼容,讓開發人員頭疼不已。所以Python虛擬環境就非常有存在的必要。

前面講到的docker虛擬機能解決這一問題,但是docker虛擬機相對而言比較「重」,更優雅的方案是Python虛擬環境,雖然只適用於python編程,但足夠輕量。Python虛擬環境也有很多方案,這裡我推薦Anaconda。

Anaconda就是可以便捷獲取包且對包能夠進行管理,同時對環境可以統一管理的發行版本。Anaconda包含了conda、Python在內的超過180個科學包及其依賴項。

Anaconda具有如下特點:

  • 開源
  • 安裝過程簡單
  • 高性能使用Python和R語言
  • 免費的社區支援

我之前針對Win 10作業系統寫過一篇,有興趣可以看看:

Win10下配置機器學習python開發環境

Ubuntu下的安裝和Win 10下差不多,首先去Anaconda官網下載安裝包,下載地址為:

https://www.anaconda.com/distribution/#download-section

下載得到一個自解壓shell包,用shell執行即可:

$ sh Anaconda3-2019.10-Linux-x86_64.sh

按照安裝說明:

  • 回車 通讀許可條款。
  • yes 同意許可條款。
  • 回車 接受默認安裝位置(/home/{User}/anaconda3),或指定其他目錄
  • yes 將Anaconda3安裝位置添加到 ~/.bashrc 文件中

為了方便後續使用anaconda中的命令,登出再登入當前會話,或者簡單的使 ~/.bashrc 生效:

source ~/.bashrc

有了anaconda,接下來可以創建各種python虛擬環境,比如為python 2的程式碼建立一個名為py2的虛擬環境,並激活這個虛擬環境:

$ conda create --name py2 python=2.7  $ conda activate py2    (py2) alex@alex-MS-7C22:~/Downloads$ python  Python 2.7.17 |Anaconda, Inc.| (default, Oct 21 2019, 19:04:46)  [GCC 7.3.0] on linux2  Type "help", "copyright", "credits" or "license" for more information.  >>>

可以看出現在python解釋器的版本是2.7.17。

還可以嘗試為tensorflow 2.0 GPU創建一個虛擬環境,python版本可以選擇3.6。

$ conda create --name tf2-gpu python=3.6  $ conda activate tf2-gpu  (tf2-gpu) alex@alex-MS-7C22:~/Downloads$ conda install tensorflow-gpu

創建python虛擬環境是如此輕量,如此方便。你可以查看現有所創建的虛擬環境列表:

(tf2-gpu) alex@alex-MS-7C22:~/Downloads$ conda env list  # conda environments:  #  base                     /data/ai/anaconda3  py2                      /data/ai/anaconda3/envs/py2  py38                     /data/ai/anaconda3/envs/py38  tf2-gpu               *  /data/ai/anaconda3/envs/tf2-gpu

前面有 * 標記的表明當前激活的虛擬環境。

驗證 tf2-gpu 虛擬環境是否啟用了GPU加速:

import tensorflow as tf  from tensorflow.python.client import device_lib    print(tf.__version__)  tf.test.is_gpu_available()  tf.test.gpu_device_name()  device_lib.list_local_devices()

Jupyter notebook

在很多深度學習教程中,我們都可以看到Jupyter notebook,作為一種WEB交互環境,做演示、寫samples非常方便。

我們可在 tf2-gpu 虛擬環境中安裝Jupyter notebook,當然也可以為Jupyter notebook新建一個虛擬環境,看情形而定。

$ conda activate tf2-gpu # 'source activate jnb' deprecated  $ conda install -y -q -c numpy matplotlib jupyter nb_conda

運行 jupyter notebook 命令即可啟動服務。

Visual Studio Code

作為一名開發人員,擁有一個趁手的程式碼編寫工具無疑能使我們心情愉悅,提高開發效率。在此我推薦Visual Studio Code,由微軟出品。雖然打上了Visual Studio標記,但是和Windows下的Visual Studio開發套件並沒有什麼關係,而是一款免費開源的現代化輕量級程式碼編輯器,支援幾乎所有主流的開發語言的語法高亮、智慧程式碼補全、自定義快捷鍵、括弧匹配和顏色區分、程式碼片段、程式碼對比 Diff、GIT命令 等特性,支援插件擴展。VS Code 基於 Electron 開發。Electron 是一個基於 Chromium 的項目,可用於開發基於 Node.js 的本地應用程式。軟體跨平台支援 Win、Mac 以及 Linux,運行流暢。

前往 https://code.visualstudio.com/download# 下載deb包,然後安裝:

sudo dpkg -i ~/Downloads/code_1.40.1-1573664190_amd64.deb

VS Code的精華在於其豐富的插件,正式藉助於插件,才能將一款文本編輯器打造成無所不能的開發環境,只要你願意折騰,這點應該挺對程式設計師的胃口。藉助Markdown插件,我現在寫公眾號、寫文檔都用VS Code。下面介紹幾個Python開發插件:

  • Python: 請認準微軟出品,提供了程式碼分析,高亮,規範化等很多基本功能,裝好這個就可以開始愉快的寫python了。
  • Anaconda Extension Pack: 依然是微軟出品,配合前面推薦的Anaconda使用,非常方便切換Anaconda虛擬環境,還大大增強了程式碼提示功能,各種第三方庫基本都能實現程式碼提示了,並且還會額外顯示每個方法的幫助。
  • Bracket Pair Colorizer: 程式碼顏色高亮一般只會幫你區分不同的變數,這款插件給不同的括弧換上了不同的顏色,括弧的多的時候非常實用。
  • filesize: 一款在左下角顯示文件大小的插件,還是挺實用的
  • Trailing Spaces: 自動刪除行尾的空格,程式碼提交到gerrit上,如果程式碼行存在空格符,就會出現刺眼的紅色,這個插件可以解決這一問題。
  • Project Manager: 顧名思義,就是管理VS Code的多個項目,方便在不同項目間切換。

當然VS Code還有很多主題、皮膚,只要你願意折騰,可以打造一個非常炫酷的開發環境,這裡就不過多介紹。


至此,我的深度學習開發環境介紹完畢,你覺得還有哪些必備軟體呢,歡迎留言。

參考

  1. How To Install and Use Docker on Ubuntu 18.04
  2. TensorFlow GPU support