沒有GPU搞什么深度學習,用嘴么庶艾。
在服務(wù)器上運行代碼的時候一定一定一定要給別的用戶留出一定的使用空間
終于從紙上談兵到實際編碼操作袁余,切忌自己獨占系統(tǒng)資源。本篇小記重點講:
- 怎么遠程調(diào)試代碼
- 怎么遠程運行代碼
- 深度學習的設(shè)置
零咱揍、關(guān)于遠程服務(wù)器的一些小訣竅
1. 關(guān)于怎么選擇GPU和限制顯存問題颖榜。
Tensorflow默認是占盡全部顯存的,即使你的代碼網(wǎng)絡(luò)結(jié)構(gòu)不占用很大的現(xiàn)存的時候煤裙,tf也會默認全部申請是為了在程序運行的過程中直接取用不用再申請操作顯存掩完,所有有的時候回看到明明是一個很小的代碼卻占盡了GPU顯存,但是GPU得計算力卻還不到30%硼砰,尤其是在多個CPU的時候且蓬,每塊GPU的顯存都申請滿了,而只有一顆GPU在跑程序题翰。所以我們有必要手動的修改下自己的代碼恶阴,只需要在關(guān)鍵的地方添上幾句代碼,就會限制顯存使用豹障,同時還能指定跑程序的GPU冯事。如果參數(shù)選擇的正確的話對程序的運行速度是沒有限制的。
CUDA_VISIBLE_DEVICES=0 python nn.py
將Tensoeflow的命令行參數(shù)寫在python之前血公,指明你要使用的GPU昵仅,0
代表第一塊GPU,0累魔,1
代表使用設(shè)備號是0和1的兩塊GPU摔笤。
使用tf.flags 傳遞參數(shù)
在session中使用限制顯存的參數(shù)
tf.app.flags.DEFINE_float('mr',0.5,'allocate GPU memory rate')
FLAGS=tf.app.flags.FLAGS
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=FLAGS.mr)
session = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
上面的GPUOptions就限制了你的顯存的使用率。并且我們使用tf.flags可以直接運行python程序的時候通過命令行參數(shù)來指定這個分配現(xiàn)存的大小薛夜。
# 使用第一塊GPU籍茧,并且只使用第一塊GPU20%的顯存做計算。
CUDA_VISIBLE_DEVICES=0 python nn.py --mr=0.2
2. 后臺運行
只需要在運行命令行之后添加一個&
符號便可以將當前的進程掛到后臺梯澜。但是一定要記得如果不再使用當前進程的話寞冯,用Ctrl+c
是殺不掉的渴析,一定要使用kill
命令殺線程。
在掛后臺的時候吮龄,會返給命令行一個PID俭茧,就是進程的ID號,最好記下來這個ID號漓帚,因為你手動殺進程的時候需要使用這個ID號母债,一定不能記錯了,否則殺了別人的進程是小事尝抖,把系統(tǒng)搞奔潰了可就麻煩了毡们。
# -s 9 代表著強制殺掉進程,百殺百中
sudo kill -s 9 PID
有時候忘記了進程號昧辽,我們需要查找當前活躍的進程衙熔,然后找到這個進程號。
ps -ef | grep "python"
這里是兩個shell命令通過管道進行了結(jié)合搅荞,第一個ps能夠列出當前系統(tǒng)所有活躍的進程红氯,然后通過grep 關(guān)鍵字查找就能找到帶有關(guān)鍵字的進程。找到PID(PID是輸出的第二列那個數(shù)字)再殺掉咕痛。
# 查看當前使用的登錄終端ID痢甘,
他的輸出也可以當做前面的grep的關(guān)鍵字來進行線程的查詢,
但是要記住使用同一個窗口茉贡。
tty
最好的方法是通過你運行的終端的命令來進行關(guān)鍵詞查找塞栅,這樣最準確。
3. 使用ssh-keygen 完成免密碼登錄
4. 監(jiān)視服務(wù)器運行狀態(tài)的小命令
htop #監(jiān)視內(nèi)存块仆,線程构蹬,CPU運行狀態(tài)
watch -n 0.2 nvidia-smi #監(jiān)視GPU,每隔0.2s 刷新
一悔据、 遠程調(diào)試代碼
必備條件:
- Pycharm pro(一定要是pro版本庄敛,負責不支持以下操作)
- Shell (有興趣的同學可以去設(shè)置zsh和iterm2)
- conda (主要是為了服務(wù)器用戶隔離)
步驟:
Pycharm pro中有許多很牛逼很帥的高級功能,現(xiàn)在我們需要用到的是【development】功能來實現(xiàn)遠程的python腳本的修改調(diào)試科汗。此功能在【tools】->【development】中藻烤。
下面就是使用類ssh的功能來遠程連接主機了,請確定你已經(jīng)在遠程服務(wù)器上面添加了自己的賬戶头滔。
name
則是整個配置的名稱怖亭,隨便你命名。
Type
選擇SFTP坤检。
host
直接填寫遠程服務(wù)器的IP地址(例如:xxx.xxx.xxx.xxx)兴猩。
Root path
則是你遠程服務(wù)器上面的代碼存放位置,我一般就是在我的用戶目錄下直接建立code早歇,這樣比較方便倾芝。
User name
和Password
則是你遠程服務(wù)上的用戶名和密碼讨勤。
localPath
就是你本地的項目上的代碼位置,如果你是用Pycharm pro直接open的項目的話晨另,name這個地方是自動填充自己的項目位置的潭千。Development Path on sever '***'
則是你在服務(wù)上要上傳代碼的位置。上傳完成之后會在服務(wù)器的Root path下新建一個文件夾借尿,就是這個名稱刨晴。Web path
這個不用管。
之后需要設(shè)置Pycharm路翻,讓他在遠程服務(wù)器上能夠建立文件夾狈癞,這樣即使我們首次上傳也不會出現(xiàn)遠程服務(wù)器沒有文件夾的問題。
還是在之前【development】那里茂契,這次我們選擇的是下面的【options】選項亿驾。將第五個checkbox create empty directories
勾選上就可以了。
下面就可以上傳本地的項目到遠程的服務(wù)器上面了账嚎。不過在此之前請確定你遠程的服務(wù)器上有你的用戶,并且你的用戶目錄有write
權(quán)限儡蔓,關(guān)于用戶權(quán)限你可以用ls -l
查看目錄下的文件郭蕉,第一列就列出了用戶權(quán)限。請自行百度喂江,如果你自己的用戶在你用戶目錄下沒有write
的權(quán)限的話召锈,那么即使連接上了遠程服務(wù)器也不能成功上傳,原因就是你沒有建立文件夾和文件的權(quán)限获询≌撬辏可以使用下面的命令修復。
ls -l
顯示
-rwxr-xr-x 1 root root 6444 09-22 15:33 shmwrite
-rw-r--r-- 1 root root 1443 09-22 15:33 shmwrite.c
drwxr-xr-x 2 root root 4096 09-22 17:19 test
第一個字符代表文件類型吉嚣。d代表目錄,-代表非目錄梢薪。
接下來每三個字符為一組權(quán)限,分為三組尝哆,依次代表所有者權(quán)限秉撇,同組用戶權(quán)限,其它用戶權(quán)限.每組權(quán)限的三個字符依次代表是否可讀秋泄,是否可寫琐馆,是否可執(zhí)行
r 表示擁有讀的權(quán)限
w 表示擁有寫的權(quán)限
x 表示擁有可執(zhí)行的權(quán)限
- 表示沒有該權(quán)限
修改權(quán)限
可用chmod命令來修改文件權(quán)限。
sudo chmod -R XXX floderName
sudo chmod XXX fileName
sudo chown user:group fileName
前兩條命令表示改變文件屬性(文件三種屬性恒序,read-可讀瘦麸,write-可寫,x-可執(zhí)行)歧胁。按照二進制來計算沒組權(quán)限的屬性就OK了滋饲,具體的請自行學習查詢厉碟,這里不展開了。
然后我們在Pycharm pro中的項目上了赌,鼠標右鍵菜單下部會出現(xiàn)upload to name
選項墨榄,選擇以后就能完成文件的上傳了。
二袄秩、設(shè)置遠程調(diào)試解析器
遠程服務(wù)器上一般安裝有conda和virtualenv虛擬軟件,大家一定一定一定要花點時間來學習conda的虛擬環(huán)境逢并,一定一定一定不要和別人公用虛擬環(huán)境之剧,一般自己的虛擬環(huán)境自己維護,用自己的用戶名做前綴防止別人給你修改砍聊。這對服務(wù)器的維護和軟件的運行都是很有益處的背稼。
假設(shè)你已經(jīng)在服務(wù)器上建立好了自己的python虛擬環(huán)境,那么下一步就是設(shè)置Pycharm的解釋器了玻蝌。我們只需要將解釋器的位置設(shè)置為遠程地址就行蟹肘。
首先查看你遠程服務(wù)器上的虛擬環(huán)境中的python解釋器的位置。找到anaconda的安裝位置俯树,一般安裝的人是為一個用戶安裝的也就是root用戶帘腹,此時你需要找到root用戶下的conda的位置。然后在env文件下找到你的虛擬環(huán)境目錄许饿,然后在/bin目錄下查找python2.7阳欲。
稍后Pycharm會從遠程的服務(wù)器上pull下服務(wù)器的conda環(huán)境到本機。完成之后就能debug遠程服務(wù)器的代碼了陋率。
我們可以從調(diào)試窗口第一行的啟動命令看出球化,此時候用的是遠程的解釋器。這樣再也不用擔心自己的筆記本運行不了了瓦糟,還得一遍一遍的修改上傳再啟動筒愚。