最近因為疫情的影響,筆者一直宅在家里辦公。辦公之余琢磨着把之前自己組裝的電腦搭建一套深度學習環境,方便學習。下面就記錄下這次折騰的成果。標題是從零開始,手把手搭建,但是需要讀者具備基礎的Linux操作知識和命令行交互習慣。當然,讀者如果初入Linux也沒關系,每個人都是從新手開始的。筆者在搭建深度學習環境的過程,也重裝了好幾次,換了很多系統。所以,挫敗不可避免,只需勇往直前。
本文以TensorFlow2.0為例,但是Pytorch和MXNet等框架都可以按照本文介紹的方法搭建配置。
Let's Go!
心急的讀者可直接從 二.安裝系統 開始閱讀。
=====================================================
一. 搭建一套自己的深度學習平台
1.為什么需要自己搭建
- 雲主機太貴。一般地,AWS機器學習便宜且算力恰當的實例也要0.9美元/時。國內同樣算力的阿里雲、騰訊雲只會更貴。
- Colab這類免費平台不穩定,可以跑跑玩具實例,不宜作為嚴肅的學習和打比賽用途。最常見的問題是:有較高機率分配不到GPU;或者訓練過程連接超時;需要FQ。
- 搭建這樣一個平台,不僅可以用作深度學習,還可以搭建大數據環境(縱使單機版也足以滿足學習目的)。
- 經濟寬裕后還可以再升級配置
- 強化自己的折騰能力。不開玩笑的,組裝硬件+環境配置可以提高動手能力
2.應該如何挑選顯卡
- GTX1080Ti 11G 版本目前價位在 3800 ~ 4500 元左右,雖然性價比非常高,但是非常非常高的機率買到礦卡(別人挖礦后淘汰的二手卡),慎重選擇
- RTX2070 SUPER 8G 目前價位在3500元左右,綜合算力和性價比考慮,值得推薦。
- RTX2060 和 GTX1080 等 6G 版本的顯卡,不是非常推薦。考慮一個問題:如果是6G的顯卡,配兩塊才12G,升級的空間和價值不大。
- RTX2080Ti 和 Titan 系列的顯卡,如果預算非常充裕可以直接選購,算力非常強勁。
3.操作系統比較
- ubuntu系列:筆者接觸過16.04,18.04,19.04,19.10. ubuntu是深度學習領域非常流行的一個Linux發行版,好處很多,比如容易上手。但是,我個人認為,最好遠離ubuntu,這個系統太容易崩潰了。也許有讀者會說為什么我就沒有遇到崩潰的事情呢?筆者不置可否,但是為了穩妥起見,如果您希望在一番辛苦配置之后的一年甚至兩年后還想使用這套環境,請避免使用ubuntu。
- archlinux系列: 筆者接觸過原生的archlinux和manjaro發行版。該系列的系統非常先鋒,犀利。安裝任何東西都非常容易,往往一行 pacman -S xxx 搞定。但是滾動更新犯了穩定的大忌,滾掛導致系統崩潰的用戶不在少數,筆者也是其中之一。因此建議讀者也避免選用。
- deepin系列:這是國內發布的一個發行版,雖是Linux,使用起來和windows其實差不多,尤其是自帶Wine使得很多windows軟件可以直接安裝使用。但鑒於此系列的系統有不少莫名其妙的bug(個人體驗),不推薦選用它搭建我們的深度學習平台。
- centos系列:這是筆者接觸過的最穩定的版本。這套系統脫胎於RedHat——企業級系統,主打穩定性。當然批評centos的用戶不在少數,但是我們的目的就是搭好一套環境,然后不再折騰操作系統方面的事情。centos正合適。注意,不要選用最新的centos8,會出現一些不兼容現象,比如臭名昭著的libappindicator丟失問題。筆者建議選擇centos7-1908就可以了,這是centos7最后一個版本,足夠新了。
4.為什么非要使用Linux並且安裝在真實機器上
- windows是最容易用的系統,但是對於需要運行深度學習等任務的人來說卻不是這樣。首先,很多深度學習框架都優先支持Linux;其次,優秀的並行計算框架,比如Ray目前仍只支持Linux;再次,如果讀者需要在運行tensorflow等框架的同時,還要和sparkmlib等組件交互,使用linux系統是最省精力的選擇。
- 虛擬機不是個好的選擇。如果只是利用CPU訓練神經網絡,虛擬機是個好選擇。如果讀者已經有一塊非常不錯的顯卡,虛擬機就是個壞的選擇。
5.筆者的機器配置
- CPU:I7-9700K
- 顯卡:RTX2070 SUPER 8G
- 內存:32G
- 主硬盤:500G SSD
- 次硬盤:4T 機械硬盤
- 電源:650W
- 操作系統:centos7-1908
- 客戶機:一台安裝Win10操作系統的筆記本電腦
6.安裝的大致流程
- 安裝系統
注意,筆者安裝的是無桌面客戶端的版本,然后遠程登陸去操作的。這樣的好處是,可以把機器當作專門的學習平台,省去了一大堆不必要的配置(比如安裝搜狗輸入法、網易雲音樂... 😀);而且一塊好顯卡和Steam相遇注定要荒廢學業 😀。
- 安裝NVIDA顯卡驅動
- 安裝CUDA
- 安裝CuDNN
- 安裝Anaconda
- 安裝深度學習框架,以 TensorFlow2.0 為例
- 配置遠程訪問
=====================================================
下面筆者就根據自己的實際操作情況,來介紹如何從零搭建一台深度學習機器。
二. 安裝系統
1.制作啟動盤(在windows操作上完成下列步驟)
- 從清華源上下載CentOS-7-x86_64-Minimal-1908
- 從deepin社區下載bootmaker工具 (非常好用的U盤啟動器制作工作)
- 運行bootmaker,插入一只容量4G以上的U盤,根據bootmaker的界面選擇下載好的操作系統,然后選擇這只U盤,注意勾選格式化選項,然后制作啟動盤
- 將下載的iso鏡像文件復制一份到啟動盤
- 修改U盤的名稱,比如修改為CENTOS這類好記的名稱
2.安裝系統
- 插入U盤到需要安裝系統的機器上
- 開機后進入boot界面,選擇從U盤啟動
- 不出意外,應該能看到下面界面
- 用上下鍵把高亮光標移動到第一項,按 e 鍵,把下面紅色區域刪除,然后輸入前面命名的CENTOS,格式為
LABEL=CENTOS quiet
- 按組合鍵 ctrl + x 開始安裝
- 接下來就是選擇系統語言,筆者選擇了英文,讀者酌情選擇
- 后面就是一些常規配置,根據讀者自己的需要選擇即可。如果不熟悉Linux分區操作的,可以選擇自動划分,一般根目錄有50G足夠。
- 囿於篇幅,操作系統的安裝就介紹到這里。系統安裝完成后,讀者可以配置一下軟件源,目的是為了安裝新軟件的時候能使用國內的倉庫(速度快)。具體操作請搜索,關鍵詞為:centos7更換阿里源
- 另外,centos還需要配置一下打開終端的快捷鍵,搜索關鍵詞:centos7 添加終端快捷鍵
三. 安裝NVIDA組件
1.安裝CUDA
-
CUDA又叫cuda-toolkit,是NVIDA公司專門開發的一套接口,方便利用GPU做高速計算。主流的深度學習框架都面向CUDA做了兼容。
-
CUDA的版本適配非常重要。目前TensorFlow2.0在CUDA上最穩妥的選擇是10.0,如果選擇10.1以上,有機率不識別GPU
-
從CUDA倉庫下載CUDA10.0,按照下圖選擇
-
取得下載路徑后使用 wget 命令下載,然后在存放文件的路徑下依次運行下述三行命令
sudo rpm -i cuda-repo-rhel7-10-0-local-10.0.130-410.48-1.0-1.x86_64.rpm
sudo yum clean all
sudo yum install cuda
sudo vim ~/.bashrc
然后在bashrc文件里添加下面配置export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
2.安裝CuDNN
- CuDNN是深度神經網絡庫,和CUDA搭配使用,專門用於深度學習任務
- 從CuDNN倉庫下載適配CUDA版本的安裝包,注意認准CUDA10.0版本號(下載CuDNN前需要注冊,推薦使用微信注冊)
- 在存放CuDNN包的路徑下運行下列命令
tar xzvf cudnn-10.0-linux-x64-v7.6.5.32.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/lib* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/lib*
sudo ldconfig
- 推薦一篇NVIDA官方寫的文檔,詳細介紹了CuDNN的安裝:DEEP LEARNING SDK DOCUMENT
3.安裝NVIDA顯卡驅動
- 顯卡驅動有一個安裝原則:裝最新的驅動。
- 讀者可以去NVIDA官網根據自己的顯卡型號搜索合適的驅動,注意notebook是指筆記本,不是給台式機用的。
- 點擊搜索后會跳轉到一個下載頁面,右鍵復制這個下載路徑
- 在cenots的終端輸入 wget 下載路徑,就可以直接把驅動下到本地硬盤上
- 輸入 echo -e "blacklist nouveau\noptions nouveau modeset=0" > /usr/lib/modprobe.d/blacklist.conf
- 輸入
modprobe -r nouveau
后重啟一次機器 - 輸入
lsmod | grep nouveau
如果沒有輸入任何內容,說明成功禁止了nouveau - 安裝這個驅動,輸入
./NVIDIA-Linux-x86_64-440.59.run
(讀者根據自己下載的驅動名修改;根據提示安裝) - 重啟機器后輸入
nvidia-smi
,如果看到下面畫面,說明已經成功安裝
四. 安裝深度學習框架 TensorFlow
1.關於Anaconda
- Anaconda是python領域比較流行的包管理器,類似的有virtualenv等。Anaconda的特色是,會自動幫助安裝需要的依賴項;並且使用方便,文檔詳盡。
- 沒必要安裝完整版的Anaconda,安裝Miniconda即可,因為我們會在虛擬環境中搭建需要的各種深度學習環境。例如在A環境圍繞TensorFlow搭建,在B環境圍繞Pytorch搭建,兩套環境互相不會污染。如果讀者將兩個框架安裝在一個環境里,會有嚴重的沖突。
2.安裝Anaconda
- 從清華源倉庫下載Miniconda
- 使用
sh
命令直接安裝,使用默認選項即可
3.創建虛擬環境並激活
conda create --name tensorflow
(也可使用其他名稱,如 tf)- 激活環境
conda activate tensorflow
4.安裝 TensorFlow2.0
conda install tensorflow-gpu==2.0.0
- 請嚴格輸入這條命令,conda會下載安裝所需的全部依賴,其中包括cudatoolkit-10.0.130和cudnn-7.6.5,雖然前面安裝了這兩個包,但是不沖突,可以默認執行;如果在訓練神經網絡時發現沖突,可以回頭再刪除這兩個包
5.補充兩條常用的conda命令
- conda deactivate 退出當前環境
- conda info --env 查看本機上安裝的環境
五. 配置遠程訪問
1.安裝PUTTY遠程客戶端
- XShell雖然好用,但它是收費軟件。Putty基本可滿足使用需要
- 按照下圖進行配置
2.安裝 WinSCP
- WinSCP是一款免費的傳輸軟件,方便客戶機和終端機之前互傳文件
- 配置過程簡單直白,文件支持拖拽,這里不再贅述。
3.安裝jupyter notebook並配置遠程訪問
conda install jupyter notebook
jupyter notebook --generate-config
生成一份默認配置文件- 輸入python,進入ipython交互環境,如下圖所示輸入代碼
- 注意,中間兩步輸入密碼時不會顯示任何字符;記得保存打印結果的字符串 'sha...'
- 開始配置jupyter notebook
- 打開jupyter的配置文件,路徑一般為 /home/用戶名/.jupyter/jupyter_notebook_config.py
- 修改 c.NotebookApp.ip,填充機器的IP地址 (使用 ip addr 命令查看本機的IP地址)
- 修改 c.NotebookApp.password, 把保存的密碼填充進去,注意格式為 c.NotebookApp.password = u'sha...'
- 修改 c.NotebookApp.open_browser , 這項默認是True,遠程登陸時要修改為 False
- 將 c.NotebookApp.port =8888 反注釋 (可以自己另指定一個端口)
4.開放端口
- 推薦使用 iptables 工具,首先要關閉 firewall 服務
- systemctl stop firewalld.service
- systemctl disable firewalld.service
- systemctl mask firewalld.service
- 安裝 iptables 防火牆
- sudo yum install iptables-services -y
- 啟動 iptables
- systemctl enable iptables
- systemctl start iptables
- 編輯防火牆文件
- sudo vim /etc/sysconfig/iptables
- 添加端口(添加下述配置)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
- 重啟 iptables 使新端口生效
- systemctl restart iptables.service
- 設置防火牆開機啟動
- systemctl enable iptables.service
5.將Jupyter Notebook作為服務
作為服務,可以享受開機自啟動的便利,不需要再繁瑣的輸入命令行去啟動jupyter notebook.
- 隨便在哪里創建一個名為
jupyter.service
的文件 - 往文件里寫入以下內容
[Unit]
Description=Jupyter Notebook
[Service]
Type=simple
PIDFile=/run/jupyter.pid
ExecStart=/bin/bash -c ". /root/anaconda3/bin/activate;jupyter-notebook --notebook-dir=/home/documents --allow-root"
User=root
Group=root
WorkingDirectory=/home/documents
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
注意1,
ExecStart
這里的jupyter地址是通過which jupyter-notebook
獲取的,例如我的jupyter地址是/root/anaconda3/bin/jupyter-notebook
,就修改為/root/anaconda3/bin/activate;jupyter-notebook
,等於是加了一個 activate 啟動命令
注意2,如果是用root啟動,不要忘了加上--allow-root
注意3,notebook-dir 和 WorkingDirectory 要保持一致,可以自己指定路徑
- 然后把這個文件拷貝到系統指定路徑
cp jupyter.service /etc/systemd/system
systemctl enable jupyter.service
systemctl start jupyter.service
systemctl status jupyter.service
看到這個狀態,說明系統已經啟動Jupyter服務了。
=====================================================
六. 驗收
- 激活tensorflow環境
- conda activate tensorflow
- 開啟jupyter notebook (可以添加禁止掛起和后台執行命令)
- nohup jupyter notebook &
- 在遠程客戶機(讀者的另外一台電腦,比如筆記本)瀏覽器輸入 192.168.1.100:8888 (實際IP地址根據讀者機器的地址修改),輸入前面設置的密碼后即可連接成功
- 驗證是否成功安裝了tensoflow,以及成功識別GPU設備
七. 福利(救命稻草 😀)
如果在使用 tensorflow 過程中出現Error : Failed to get convolution algorithm,這是因為顯卡內存被耗盡了(按照本文檔安裝可以排除cuda版本沖突的可能)。可以在代碼的最開始輸入下面兩行配置
- physical_device = tf.config.experimental.list_physical_devices("GPU")
- tf.config.experimental.set_memory_growth(physical_device[0], True)
=====================================================
至此,我們就完成了從零開始搭建一套深度學習主機的全部工作。希望這篇教程可以幫助讀者順利地搭建好自己的深度學習平台。
如果有任何紕漏差錯,歡迎評論互動。
