通過服務器進行深度學習
服務器配置
安裝
win10安裝教程linux安裝教程TensorFlow官網指導相關軟件版本的對照表,頁面底端如果不使用GPU的話,只需要cmd中一行pip install tensorflow就行了。不過需要注意的是,tensorflow的默認安裝版本是1.31,而1.31對應的python版本最高是3.6,如果你的python版本過低或過高,在導入TensorFlow包時都會出錯。
:::
- frp:內網穿透
:::info
如果服務器處於局域網內,那么當終端離開局域網后是無法連接服務器的,這時我們就要借助內網穿透。內網穿透可以將內網中服務器的局域網ip和端口映射到外網ip和端口。具體實現時,你需要一台雲服務器,然后在上面通過開源的frp搭建一個反向代理。
:::
連接服務器
終端配置
linux/mac
linux/mac系統集成了ssh工具,所以可以在shell中直連服務器。
win10
如果是windows系統,那么我們需要一個ssh工具來完成ssh連接。xshell或者putty都可以勝任。
免密登陸
ssh同時還提供了公鑰登錄的方式。這點在上面的背景知識中已經介紹了。
具體的做法就是將你的公鑰存儲在服務器的ssh信任列表中中。
- 生成秘鑰
# -P表示需要密碼,-P ‘’表示空密碼
ssh-keygen -t rsa -P ''
之后系統會提示輸入生成的密鑰文件的文件名,可以輸入任意名稱,比如id_rsa
- 找到自己的公鑰,沒有的話通過
ssh-keygen生成。然后通過scp命令傳輸公鑰到服務器中。

- 在服務器中將剛剛的公鑰添加到ssh信任列表。然后即可免密登陸了。
cat id_rsa.pub >> ~/.ssh/authorized_keys
:::info
如果還是無法免密登陸,可能是服務器端的 .ssh 和 authorized_keys 的權限不匹配。
- 一般修改.ssh文件夾的權限就夠了
chmod 700 /home/skyler/.ssh
- 如無必要不作修改
chmod 600 /home/skyler/.ssh/authorized_keys
:::
文件傳輸與同步
傳文件
linux間的文件/文件夾的傳輸可以通過scp命令完成。該命令基於ssh,所以,如果你的終端和服務器都是linux系統,並且終端已經通過ssh登錄了服務器,那么,就可以通過該命令進行文件傳輸了。
用法:
- 從本地復制文件到遠程到遠程
scp local_file remote_username@remote_ip:remote_folder
或者
scp local_file remote_username@remote_ip:remote_file
或者
scp local_file remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file
:::tips
- 第1,2個指定了用戶名,命令執行后需要再輸入密碼,第1個僅指定了遠程的目錄,文件名字不變,第2個指定了文件名;
- 第3,4個沒有指定用戶名,命令執行后需要輸入用戶名和密碼,第3個僅指定了遠程的目錄,文件名字不變,第4個指定了文件名;
:::
- 從本地復制文件夾到遠程
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
:::tips
- 第1個指定了用戶名,命令執行后需要再輸入密碼;
- 第2個沒有指定用戶名,命令執行后需要輸入用戶名和密碼;
:::
- 從遠程復制到本地
從遠程復制到本地,只要將從本地復制到遠程的命令的后2個參數調換順序即可
scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3
scp -r www.runoob.com:/home/root/others/ /home/space/music/
如果遠程服務器防火牆為scp命令設置了指定的端口,我們需要使用-P參數來指定傳輸端口
#scp 命令使用端口號 4588
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator
jupyter notebook
通過jupyter notebook進行遠程調參,只需以下幾步:
- 指定jupyter notebook的虛擬環境
默認情況下jupyter notebook是運行在系統的默認環境下的,如果要讓它運行在通過conda建立的環境中,我們可以進入那個環境安裝nb_conda這個庫: conda install nb_conda
- 服務器端生成jupyter notebook的密碼(可以略去這一步)
$ jupyter notebook password
Enter password: ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json
- 服務器端打開jupyter notebook
jupyter notebook --no-browser --port=8889
- linux:
在本地通過ssh隧道來將服務器端的8889端口號映射到本地的某個端口(如1234)
ssh -L 1234:localhost:8888 dlnlp@102.10.60.23
- windows
通過putty建立端口轉發,效果與上面的shell語句效果是一樣的。
- 在終端瀏覽器中打開
http://localhost:1234,然后輸入上面設置的密碼。最后,選擇下虛擬環境就可以開始愉快的debug了。
tensorboard
在服務器端指定端口打開tensorboard
tensorboard --logdir=log --port=6006
要在本地使用tensorboard,首先要在本地進行端口映射(操作同jupyter notebook)
ssh -L 16006:127.0.0.1:6006 usr@192.168.1.115
然后在本地瀏覽器中打開 localhost:16006 就可以訪問到服務器上的tensorboard了。
pycharm
服務器常用操作
查詢
查看內存使用: free -m

Mem行(單位均為M):
- total:內存總數
- used:已使用內存數
- free:空閑內存數
- shared:當前廢棄不用
- buffers:緩存內存數(Buffer)
- cached:緩存內舒數(Page)
(-/+ buffers/cache)行:
- (-buffers/cache): 真正使用的內存數,指的是第一部分的 used - buffers - cached
- (+buffers/cache): 可用的內存數,指的是第一部分的 free + buffers + cached
Swap行指交換分區。
實際上不要看free少就覺得內存不足了,buffers和cached都是可以在使用內存時拿來用的,應該以(-/+ buffers/cache)行的free和used來看。只要沒發現swap的使用,就不用太擔心,如果swap用了很多,那就要考慮增加物理內存了。
查看CPU使用: top
上方文字部分的紅框為總的CPU占用百分率,下方的表格是每個進程的CPU占用率,在表格第一行可以看到紅框中占用率超過了150%,這是因為服務器是多核CPU,而該進程使用了多核。
查看顯卡使用情況: nvidia-smi

表格中會顯示顯卡的一些信息,第一行是版本信息,第二行是標題欄,第三行就是具體的顯卡信息了,如果有多個顯卡,會有多行,每一行的信息值對應標題欄對應位置的信息。
- GPU:編號
- Fan:風扇轉速,在0到100%之間變動,這里是42%
- Name:顯卡名,這里是TITAN X
- Temp:顯卡溫度,這里是69攝氏度
- Perf:性能狀態,從P0到P12,P0性能最大,P12最小
- Persistence-M:持續模式的狀態開關,該模式耗能大,但是啟動新GPU應用時比較快,這里是off
- Pwr:能耗
- Bus-Id:涉及GPU總線的東西
- Disp.A:表示GPU的顯示是否初始化
- Memory-Usage:現存使用率,這里已經快滿了
- GPU-Util:GPU利用率
- Compute M.:計算模式
需要注意的一點是顯存占用率和GPU占用率是兩個不一樣的東西,類似於內存和CPU,兩個指標的占用率不一定是互相對應的。
在下面就是每個進程使用的GPU情況了。
常見問題處理
"Failed to create session"
通常是tf未能獲得計算硬件,從而無法創建會話。我們可以通過CUDA_VISIBLE_DEVICES來指定可用的GPU。需要注意的是,指定了可用的GPU后,其他的GPU就不再可用。
首先,可以通過 nvidia-smi 獲取當前可用的顯卡信息,比如1、5號卡可用。
- 針對單個程序:
- 在shell中追加:
CUDA_VISIBLE_DEVICES=1,5 python main.py - 在代碼中追加:
import os; os.environ['CUDA_VISIBLE_DEVICES=1,5']
- 針對各個虛擬環境:
- 修改
~/.virtualenv/YOUR_VENV/bin/postactivate, 在末尾添加行export CUDA_VISIBLE_DEVICES="1,5"即可.
- 針對所有用戶:
- 同上修改
~/.bashrc即可.
:::info
如果你准備使用CPU,則可以通過CUDA_VISIBLE_DEVICES=''隱藏所有GPU,TensorFlow將默認使用CPU進行計算。
:::
多任務管理
screen
用法:
- 新建窗口
screen -S yolo # 創建一個窗口,並且為這個窗口命名為yolo
執行完后將自動跳入名為yolo的窗口
- 斷開窗口
通過快捷鍵Ctrl+A+D斷開當前窗口連接返回會話界面,界面顯示如下:
[detached from 28113.yolo]
user@ubuntu-Super-Server:~/code$
需要注意的是,斷開連接僅是使窗口進入后台執行。
- 查看已創建的窗口
screen -S ls #可以查看已創建的所有窗口
# 結果顯示如下
user@ubuntu-Super-Server:~/code$ screen -ls
There are screens on:
28475.ssd (2017年11月27日 20時07分41秒) (Detached)
28113.yolo (2017年11月27日 19時57分26秒) (Detached)
- 重連窗口
screen -r ssd #重新連接到yolo窗口,顯示其運行過程
- 關閉窗口
$kill 28475 #終止28475.ssd窗口對應任務的運行,同時殺死該窗口
byobu
tmux
強占式執行
在.bashrc中寫入
alias python='run-one python'
該語句只允許運行一個python程序,后來的python程序在它執行完畢前是得不到執行的。
串行調參
通過python-fire這個工具,可以通過shell完成串行調參的需求。

