深度學習軟體開發環境搭建
- 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密鑰。
![](https://ask.qcloudimg.com/http-save/yehe-1927950/qy4ufhni6u.png)
將剪貼板中的內容貼到 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
![](https://ask.qcloudimg.com/http-save/yehe-1927950/ffz03kadrp.png)
接下來安裝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虛擬機,這裡補充一點知識。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作業系統寫過一篇,有興趣可以看看:
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還有很多主題、皮膚,只要你願意折騰,可以打造一個非常炫酷的開發環境,這裡就不過多介紹。
至此,我的深度學習開發環境介紹完畢,你覺得還有哪些必備軟體呢,歡迎留言。
參考
- How To Install and Use Docker on Ubuntu 18.04
- TensorFlow GPU support