手把手教你用Google云平臺搭建自己的深度學(xué)習(xí)工作站
時間:2023-07-29 20:12:01 | 來源:網(wǎng)站運(yùn)營
時間:2023-07-29 20:12:01 來源:網(wǎng)站運(yùn)營
手把手教你用Google云平臺搭建自己的深度學(xué)習(xí)工作站:Hello,大家好,最近開通了自己的專欄,一直以來被各種任務(wù)纏身,始終沒有養(yǎng)成記錄自己學(xué)習(xí)的點滴的習(xí)慣。最近忙于申請實習(xí)拿到了兩個還不錯的offer,但無奈一些原因沒能去,于是打算接下來做一些別的事情,輸出一些質(zhì)量高的博文就是其中一項。
自己也算是入行計算機(jī)挺久了,一路走來有許多的感慨,包括個人的選擇成長規(guī)劃等等,過段時間也會進(jìn)行一下總結(jié)分享給大家,希望大家能少走彎路。
第一篇博文專注于利用較少的資金建立一個可以用于深度學(xué)習(xí)調(diào)試的小工作站,從整體上來看谷歌云(Google Cloud Platform,GCP)在這價格、穩(wěn)定性等方面有很大的優(yōu)勢,但是好像并沒有多少介紹這方面的文章,作為新手來講熟悉這些配置可能要花上一兩天,這篇博文目的就是讓新手在半小時內(nèi)配置一個可用的深度學(xué)習(xí)環(huán)境,涉及配置的各種細(xì)節(jié)以及開發(fā)過程的各個方面,歡迎大家一起交流討論。
原材料準(zhǔn)備:
- 支持VISA雙幣支付的信用卡一張
- 科學(xué)上網(wǎng)工具
- PuTTY或其他終端工具
- FileZilla或其他支持SFTP的客戶端
1.注冊首先你需要有一個Google賬戶,然后登陸
https://cloud.google.com/點擊免費(fèi)試用進(jìn)行注冊,填寫基本信息和相關(guān)協(xié)議,賬戶類型選擇個人,地址注意與信用卡賬單地址一致,注冊完成后信用卡賬戶會被預(yù)扣1美元,過會就會返還回來的。
2.創(chuàng)建項目GCP對資源進(jìn)行層次化的管理,方便結(jié)合Cloud Identity and Access Management (IAM)進(jìn)行權(quán)限控制和統(tǒng)一配置,大到公司部門,小到具體某個虛擬機(jī)。對于個人用戶來說,我們通常只需按照項目來組織我們的資源,項目可以說是我們創(chuàng)建、管理和監(jiān)控資源、進(jìn)行權(quán)限管理以及賬單管理的基本單位了,新建賬戶默認(rèn)包含一個初始項目,你也可以在控制臺創(chuàng)建自己的新項目(個人用戶默認(rèn)最多10個項目),假設(shè)現(xiàn)在你已經(jīng)配置好了自己的項目。
GCP有很多產(chǎn)品,包括大數(shù)據(jù)平臺,存儲和數(shù)據(jù)庫服務(wù),AI相關(guān)的API等,來幫助企業(yè)更快地創(chuàng)建優(yōu)質(zhì)的應(yīng)用,但這些與本文無關(guān),本文集中介紹如何利用Compute Engine Virtual Machines (VMs)來創(chuàng)建一個較為廉價的可供日常學(xué)習(xí)使用的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)平臺,合理利用這些資源可以讓你盡可能少地為高昂的顯卡資源自掏腰包。在正式開始之前有以下幾點需要說明一下:
- 快捷入口:控制臺左側(cè)的Tab提供了GCP產(chǎn)品的一些快捷入口,本文主要涉及計算(Compute Engine)、網(wǎng)絡(luò)(VPC網(wǎng)絡(luò))、產(chǎn)品(結(jié)算、IAM和管理)和存儲(存儲),可以先將這些入口釘一下固定在最上面方便一會直接點進(jìn)去。
- 預(yù)算:作為窮學(xué)生一枚本人比較關(guān)心錢的問題,雖然有Google贈送的300美元的現(xiàn)金券,我還是一開始就為整個項目(或者以整個計算賬號為單位)制定了預(yù)算,超出時會自動提醒。費(fèi)用是每天更新一次,結(jié)算周期是半個月,Google會在你花超過100美元或者距上次繳費(fèi)超過一個月后自動扣款,費(fèi)用詳情可以在結(jié)算/交易里查詢。
- 配額:由于每個賬號所擁有的資源都有一定的配額,并且GCP默認(rèn)的GPU配額是0,因此我們需要進(jìn)行配額調(diào)整的申請。具體在IAM和管理/配額里面操作,見圖,點擊指標(biāo)下拉框搜索NVIDIA就會看到K80、P100等型號的GPU,把其他資源都反選掉,只保留GPU相關(guān)的服務(wù)。然后在下面列表里勾選你要選用的GPU型號(注意區(qū)域要和待會要創(chuàng)建的VMs所在區(qū)域一致),型號根據(jù)自己情況進(jìn)行選擇,本人選了K80(12GB內(nèi)存可以滿足我的日常使用),然后選擇最上面的修改配額,在右側(cè)彈窗里輸入個人電話,目標(biāo)調(diào)整數(shù)量以及申請理由,提交即可,我大概等了不到10分鐘就調(diào)整好了。
3.創(chuàng)建虛擬機(jī)創(chuàng)建VMs相關(guān)的操作都在Compute Engine菜單下,為了節(jié)省費(fèi)用同時不至于太影響訓(xùn)練速度,我只設(shè)置了30GB的永久固態(tài)硬盤,然后又創(chuàng)建了120GB的永久機(jī)械硬盤掛載到實例上。如果你只希望用固態(tài)硬盤當(dāng)做啟動盤和數(shù)據(jù)盤,可以忽略創(chuàng)建磁盤這一步。
Compute Engine/磁盤:點擊最上面創(chuàng)建磁盤,輸入名稱,選擇與VMs一致的地區(qū),類型設(shè)置為標(biāo)準(zhǔn)永久性磁盤,土豪可以選擇SSD永久性磁盤,由于初次使用沒有映像或者快照,因此來源類型選無(空白磁盤),待會我們在VMs里面進(jìn)行格式化和分區(qū)操作。大小根據(jù)自己需求,建議可以稍大一些,一方面性能會好一些,另一方面各種數(shù)據(jù)集通常都要來回?fù)v騰,因此最好要比預(yù)期數(shù)據(jù)量大一倍。
Compute Engine/VM實例:點創(chuàng)建,輸入名稱,這個名稱會作為計算機(jī)名,選擇與GPU和磁盤一致的區(qū)域,機(jī)器類型勾選自定義,我選的是4vCPU、8GB內(nèi)存、1個K80 GPU,詳單見圖。啟動磁盤選更改進(jìn)行配置,選擇Ubuntu 16.04 LTS操作系統(tǒng)鏡像,如果我們之前對自己創(chuàng)建的虛擬機(jī)備份過映像這里可以直接選上,啟動磁盤類型建議選擇SSD大小自己配置,如果你之前有刪除實例后剩下的啟動磁盤想直接用可以在現(xiàn)有磁盤下面勾選,前提是里面要有操作系統(tǒng)。
防火墻一欄勾上允許HTTP流量和HTTPS流量。下方磁盤那個Tab可以設(shè)置是否在刪除實例時也把啟動盤刪除,這里我們在額外磁盤下面選擇添加一項把之前創(chuàng)建的數(shù)據(jù)磁盤掛上來。管理Tab里面可以設(shè)置啟動腳本,方便每次開機(jī)時進(jìn)行系統(tǒng)更新、外部磁盤掛載等操作,這里我先沒有設(shè)置,因為后面可以在弄好機(jī)器后在更改元數(shù)據(jù)里面重新設(shè)置。此外如果你不需要長時間訓(xùn)練模型那么可以開啟搶占式VM,缺點就是隨時都可能被終止(大約10%~20%的概率,實際由對應(yīng)區(qū)域用量決定),即使由于整個區(qū)域用量較小沒有被停掉24小時之后也會被終止,如果剛開啟虛擬機(jī)10分鐘之內(nèi)被搶占是不收費(fèi)的,需要注意的是搶占式VM的資源總量是有限的,也就是說并不是什么時候想用什么時候就有。
SSH密鑰那個Tab里面我們需要配置一下以便使用其它終端工具對VM進(jìn)行操作,GCP也自帶基于瀏覽器的一種終端,感覺也不錯,但是比較慢。終端工具根據(jù)自己習(xí)慣選擇,這里以PuTTY為例進(jìn)行配置。PuTTY帶有一個密鑰生成工具PuTTYgen,打開界面如下:
點擊generate然后在空白區(qū)域來回晃幾下鼠標(biāo)就會生成一個ssh-rsa密鑰,comment改成自己的用戶名,VM會自動創(chuàng)建對應(yīng)的賬戶,然后復(fù)制Public key(就是以ssh-rsa開頭的最長的那個)粘貼到GCP剛才那個Tab里面,點創(chuàng)建等幾分鐘即可。接下來我們需要把剛才生成的密鑰保存在同一個目錄,保存private key的時候會提示設(shè)置密碼。保存完畢后需要打開PuTTY新建一個session,這會VM實例應(yīng)該也創(chuàng)建完畢,把外部ip地址填進(jìn)來,然后在Connection->SSH->Auth屬性頁最下面把保存的private key加載進(jìn)來,最后打開連接,安全提示選是然后就可以連接到虛擬機(jī)了。
如果你想直接用在線的SSH的話,直接在Compute Engine/VM實例里面點SSH,可以通過這個工具上傳下載一些簡單的文件之類的。
數(shù)據(jù)磁盤本身是空白磁盤,雖然被接進(jìn)來了,但必須進(jìn)行格式化分區(qū)之后才可以掛載。以下命令幫你查看數(shù)據(jù)磁盤是不是真的連接進(jìn)來了,并查看對應(yīng)的設(shè)備號,我這里是sdb。
sudo fdisk –l
接下來我們需要對空白磁盤進(jìn)行分區(qū),同樣是使用fdisk命令進(jìn)入一個交互式的環(huán)境,這個環(huán)境下所有的操作都不會立刻寫進(jìn)分區(qū)表,除非顯式地通過w保存操作:
sudo fdisk /dev/sdb
根據(jù)相應(yīng)的快捷鍵提示可以很容易完成分區(qū),我的整個磁盤只有一個分區(qū),如果你的磁盤很大也可以分多個區(qū),n新建分區(qū),d刪除分區(qū),w保存分區(qū)表,q不保存直接退出。
如果你也是只分了一個區(qū),那么你應(yīng)該會得到一個名為sdb1的新設(shè)備,下面命令完成格式化,你也可以換成ntfs格式,這里使用linux格式:
sudo mkfs.ext4 /dev/sdb1
接下來我們在/media目錄下新建一個掛載點(我這里名稱為disk),把剛才格式化好的設(shè)備掛載進(jìn)來:
sudo mkdir /media/disksudo mount /dev/sdb1 /media/disk
如果你不想每次開機(jī)都手動掛載這個設(shè)備的話,可以設(shè)置上面說到的那個啟動腳本,啟動腳本的設(shè)置需要在關(guān)機(jī)狀態(tài)下進(jìn)行,待會你重啟時記得設(shè)置:仍然是在Compute Engine/VM實例下面,點擊VM的名稱進(jìn)入VM詳情頁面,點擊最上面修改,往下拉找到自定義元數(shù)據(jù),鍵設(shè)為startup-script,值設(shè)置為下面的腳本內(nèi)容,然后點保存重啟虛擬機(jī)。
#! /bin/bashmount /dev/sdb1 /media/disk
同樣的方法也可以設(shè)置shutdown-script,可以在關(guān)機(jī)或被搶占時保存模型或給自己發(fā)個郵件提醒之類的。
以上步驟完成后,我們還需要設(shè)置一下防火墻:
網(wǎng)絡(luò)/VPC網(wǎng)絡(luò)/防火墻規(guī)則:然后點擊最上面創(chuàng)建防火墻規(guī)則,名稱default-dev之類,目標(biāo)選網(wǎng)絡(luò)中的所有實例,來源 IP 地址范圍填0.0.0.0/0,協(xié)議和端口填tcp:6000-6010;tcp:8888(這個根據(jù)日常開發(fā)用到的端口自己決定),其他保持默認(rèn)。
4.環(huán)境配置現(xiàn)在你已經(jīng)有了一臺至少4核8G內(nèi)存附帶一張K80顯卡的機(jī)器了,接下來就是跟普通機(jī)器一樣配置環(huán)境了。如果你已經(jīng)很熟悉深度學(xué)習(xí)之類的環(huán)境配置,可以直接跳過這一部分。
我通常先會按照自己的使用習(xí)慣配置一下tmux、git和vim,裝一些插件之類的。下面的命令可以幫你把一些大概率會用到的包提前裝上,以免后續(xù)安裝過程卡殼:
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev valgrind cmake unrar gfortran python3-pip python3-dev python3-wheel swig git git-core htop
建議日常的機(jī)器學(xué)習(xí)之類的調(diào)試訓(xùn)練都在虛擬環(huán)境下進(jìn)行,虛擬環(huán)境配置可以參考下面命令:
sudo apt-get install python-pip python-setuptoolssudo pip install --upgrade pipsudo pip install virtualenvcurl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
設(shè)置虛擬環(huán)境對應(yīng)的環(huán)境變量
sudo vim ~/.bash_profile
在文件最后加上下面這些內(nèi)容:
export PATH="/home/yourname/.pyenv/bin:$PATH"eval "$(pyenv init -)"eval "$(pyenv virtualenv-init -)"
生效更改然后安裝python 3.5.2:
source ~/.bash_profilepyenv install 3.5.2
注意把默認(rèn)的python設(shè)置為系統(tǒng)對應(yīng)的python版本
# 查看可用的python版本,注意默認(rèn)版本pyenv versions# 把默認(rèn)版本設(shè)為系統(tǒng)自帶的python版本pyenv global system
在當(dāng)前目錄下創(chuàng)建一個名為pyenv35的虛擬環(huán)境
virtualenv -p .pyenv/versions/3.5.2/bin/python3.5 pyenv35
激活剛創(chuàng)建的虛擬環(huán)境
source pyenv35/bin/activate
安裝常用機(jī)器學(xué)習(xí)包(這個根據(jù)自己的需求來)
pyenv35/bin/pip3.5 install numpy scipy matplotlib pandas seaborn sklearn lightgbm xgboost tqdm
安裝CUDA運(yùn)行時環(huán)境
首先確認(rèn)一下系統(tǒng)應(yīng)該至少沒有安裝除nvidia-common之外的任何nvidia的包:
dpkg -l | grep -i nvidia
否則使用以下命令刪除多余的包及配置文件:
sudo apt-get remove --purge name_of_ packagesudo apt-get autoremove
然后我們需要下載CUDA的安裝包和cuDNN:
sudo wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.debsudo wget http://developer.download.nvidia.com/compute/redist/cudnn/v6.0/cudnn-8.0-linux-x64-v6.0.tgzsudo wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/patches/2/cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64-deb
接下來安裝驅(qū)動和運(yùn)行時:
sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.debsudo dpkg -i cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64.debsudo apt-get update
查看可用的CUDA運(yùn)行時版本:
sudo apt-cache policy cuda
安裝CUDA8.0
sudo apt-get install cuda=8.0.61-1
添加源并更新到最新驅(qū)動:
sudo add-apt-repository ppa:graphics-drivers/ppa
這里記得需要敲回車鍵確認(rèn)添加源
sudo apt-get updatesudo apt-get upgradesudo reboot
安裝cuDNN
tar -xvf cudnn-8.0-linux-x64-v6.0.tgzsudo cp cuda/include/cudnn.h /usr/local/cuda/includesudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
設(shè)置環(huán)境變量:
sudo vim ~/.bashrc
在文件最后添加下面內(nèi)容:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"export CUDA_HOME=/usr/local/cudaexport PATH="$CUDA_HOME/bin:$PATH"
生效更改
source ~/.bashrc
最后敲nvidia-smi確認(rèn)驅(qū)動安裝成功
5.安裝深度學(xué)習(xí)工具包安裝bazel、tensorflow-gpu、PyTorch、MxNet
sudo apt-get install openjdk-8-jdkecho "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.listcurl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -sudo apt-get update && sudo apt-get install bazel
先進(jìn)入虛擬環(huán)境,然后執(zhí)行以下命令安裝:
pyenv35/bin/pip3.5 install opencv-python tensorflow-gpu http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp35-cp35m-linux_x86_64.whl torchvision mxnet-cu80==1.0.0
配置遠(yuǎn)程jupyter notebook
仍然是在虛擬環(huán)境下,安裝notebook:
pyenv35/bin/pip3.5 install jupyter notebook
進(jìn)入python交互式環(huán)境,生成hash密碼:
from notebook.auth import passwdpasswd()
輸入密碼并記下形如'sha1:daa96*06c24059c807b08'的字串。
在bash里輸入下面的命令生成notebook配置文件
jupyter notebook --generate-config
編輯配置文件,設(shè)置密碼和權(quán)限等:
sudo vim .jupyter/jupyter_notebook_config.py
設(shè)置以下幾項并保存:
c.NotebookApp.ip = '*'c.NotebookApp.password = u'sha1:daa96*06c24059c807b08'c.NotebookApp.open_browser = Falsec.NotebookApp.port = 8888
執(zhí)行jupyter notebook打開notebook,然后在本地瀏覽器打開
http://yourip:8888/,如果正常的話,輸入密碼就可以使用了。如果有問題可以確認(rèn)一下防火墻。
現(xiàn)在是時候去網(wǎng)上找一些測試代碼來確認(rèn)安裝過程的正確性了。
6.文件共享本想按照往常一樣安裝samba將虛擬機(jī)的磁盤映射到windows系統(tǒng)網(wǎng)絡(luò)驅(qū)動器來傳文件,但是搞了半天老是連不通,有知道解決方案的知友歡迎留言。因此目前只能采用FileZilla通過SFTP給VMs傳文件的方式。操作如下:
打開FileZilla->文件->站點管理器->新站點:主機(jī)填VM的外部ip,協(xié)議選擇SFTP,登錄類型選擇密碼文件,然后把之前用PuTTY生成的私鑰加載進(jìn)來,高級選項卡里面可以設(shè)置本地目錄和遠(yuǎn)程目錄。最后點連接就行了,如果有問題的話可以檢查一下遠(yuǎn)程目錄的權(quán)限,我試了一下傳輸速度還挺快。
還有一點,日常的開發(fā)工作除了用notebook遠(yuǎn)程連接外,還可以在SublimeText下面使用SFTP的插件,配置過程跟上面文件傳輸?shù)呐渲妙愃啤?br>
好了現(xiàn)在就應(yīng)該都大功告成了,最后別忘了為配置好的系統(tǒng)制作映像,以便將來重新安裝:
Compute Engine->映像->創(chuàng)建映像。
最近會抽空更新幾篇機(jī)器學(xué)習(xí)相關(guān)的文章,歡迎大家關(guān)注,也歡迎大家討論交流、指出問題。
關(guān)鍵詞:深度,學(xué)習(xí),工作,把手,平臺