通過服務器進行深度學習


通過服務器進行深度學習

服務器配置

  • ubuntu16.04服務器版
  • anaconda
  • cuda
  • tensorflow
    :::info

安裝

win10安裝教程linux安裝教程TensorFlow官網指導相關軟件版本的對照表,頁面底端如果不使用GPU的話,只需要cmd中一行pip install tensorflow就行了。不過需要注意的是,tensorflow的默認安裝版本是1.31,而1.31對應的python版本最高是3.6,如果你的python版本過低或過高,在導入TensorFlow包時都會出錯。
:::

  • frp:內網穿透
    :::info
    如果服務器處於局域網內,那么當終端離開局域網后是無法連接服務器的,這時我們就要借助內網穿透。內網穿透可以將內網中服務器的局域網ip和端口映射到外網ip和端口。具體實現時,你需要一台雲服務器,然后在上面通過開源的frp搭建一個反向代理。
    :::

連接服務器

終端配置

以下都是通過ssh協議中的口令登錄方式完成連接。

linux/mac

linux/mac系統集成了ssh工具,所以可以在shell中直連服務器。

win10

如果是windows系統,那么我們需要一個ssh工具來完成ssh連接。xshell或者putty都可以勝任。

免密登陸

ssh同時還提供了公鑰登錄的方式。這點在上面的背景知識中已經介紹了。
具體的做法就是將你的公鑰存儲在服務器的ssh信任列表中中。

  1. 生成秘鑰
# -P表示需要密碼,-P ‘’表示空密碼
ssh-keygen -t rsa -P ''
之后系統會提示輸入生成的密鑰文件的文件名,可以輸入任意名稱,比如id_rsa
  1. 找到自己的公鑰,沒有的話通過ssh-keygen 生成。然后通過 scp 命令傳輸公鑰到服務器中。

  1. 在服務器中將剛剛的公鑰添加到ssh信任列表。然后即可免密登陸了。
cat id_rsa.pub >> ~/.ssh/authorized_keys

:::info
如果還是無法免密登陸,可能是服務器端的 .sshauthorized_keys 的權限不匹配。

  • 一般修改.ssh文件夾的權限就夠了

chmod 700 /home/skyler/.ssh

  • 如無必要不作修改

chmod 600 /home/skyler/.ssh/authorized_keys
:::

文件傳輸與同步

傳文件

Linux scp命令

linux間的文件/文件夾的傳輸可以通過scp命令完成。該命令基於ssh,所以,如果你的終端和服務器都是linux系統,並且終端已經通過ssh登錄了服務器,那么,就可以通過該命令進行文件傳輸了。

用法:

  1. 從本地復制文件到遠程到遠程
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個指定了文件名;
    :::
  1. 從本地復制文件夾到遠程
scp -r local_folder remote_username@remote_ip:remote_folder 
或者 
scp -r local_folder remote_ip:remote_folder 

:::tips

  • 第1個指定了用戶名,命令執行后需要再輸入密碼;
  • 第2個沒有指定用戶名,命令執行后需要輸入用戶名和密碼;
    :::
  1. 從遠程復制到本地

從遠程復制到本地,只要將從本地復制到遠程的命令的后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進行遠程調參,只需以下幾步:

  1. 指定jupyter notebook的虛擬環境

默認情況下jupyter notebook是運行在系統的默認環境下的,如果要讓它運行在通過conda建立的環境中,我們可以進入那個環境安裝nb_conda這個庫: conda install nb_conda

  1. 服務器端生成jupyter notebook的密碼(可以略去這一步)
$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json
  1. 服務器端打開jupyter notebook
jupyter notebook --no-browser --port=8889
  1. 本地開啟端口轉發
  • linux:

在本地通過ssh隧道來將服務器端的8889端口號映射到本地的某個端口(如1234)

ssh -L 1234:localhost:8888 dlnlp@102.10.60.23
  • windows

通過putty建立端口轉發,效果與上面的shell語句效果是一樣的。
image.png

  1. 在終端瀏覽器中打開 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

image.png

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

image.png

上方文字部分的紅框為總的CPU占用百分率,下方的表格是每個進程的CPU占用率,在表格第一行可以看到紅框中占用率超過了150%,這是因為服務器是多核CPU,而該進程使用了多核。

查看顯卡使用情況: nvidia-smi

image.png

表格中會顯示顯卡的一些信息,第一行是版本信息,第二行是標題欄,第三行就是具體的顯卡信息了,如果有多個顯卡,會有多行,每一行的信息值對應標題欄對應位置的信息。

  • 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號卡可用。

  1. 針對單個程序:
  • 在shell中追加:CUDA_VISIBLE_DEVICES=1,5 python main.py
  • 在代碼中追加:import os; os.environ['CUDA_VISIBLE_DEVICES=1,5']
  1. 針對各個虛擬環境:
  • 修改~/.virtualenv/YOUR_VENV/bin/postactivate, 在末尾添加行export CUDA_VISIBLE_DEVICES="1,5"即可.
  1. 針對所有用戶:
  • 同上修改~/.bashrc即可.
    :::info
    如果你准備使用CPU,則可以通過CUDA_VISIBLE_DEVICES=''隱藏所有GPU,TensorFlow將默認使用CPU進行計算。
    :::

多任務管理

screen

Linux 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完成串行調參的需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM