前言
此文寫給實驗室的學弟學妹們,以便快速配置環境少踩坑。計算資源是公共資源,學長學姐有自己的研究任務,無法像企業運維人員那樣周到的看護服務器,服務器的穩定運行有賴於每個使用者合理使用。菜,是原罪(推眼鏡)。【和你用同一個服務器的人正在跑實驗,突然掛掉了,發現是你在瞎搞,內心會很崩潰】
一、總覽
目前的部署是單服務器的形式,使用起來也很簡單,一般也就把程序放在一個服務器上跑,有在準備分佈式,是後話了。
大夥用自己的電腦就行了,window或者mac都行。本地寫代碼,遠程連接,上傳,程序在服務器上跑,本地圖形化界面還是很方便的,多媒體支持也好,你可以一邊寫代碼,一邊聽音樂,在程序提交以後看看文章或是做PPT。
二、準備工作
- 讓管理服務器的學長在特定服務器上幫你開一個賬號,目前你有了登錄所需的 “服務器IP,賬戶名,密碼”。
- windows下載並安裝遠程連接軟件,mac自帶bash和ssh之類了。
- 終端模擬軟件,XShell,支持SSH(默認端口22),輸入“服務器IP,賬戶名,密碼”,登錄以後就可以在小黑框裏敲命令了。
- 文件傳輸軟件,XFTP,ftp和sftp都支持,系統默認開的sftp,ftp看該服務器有沒有開vsftp服務。
- 也可以用MobaXterm,二合一,網址:https://mobaxterm.mobatek.net/
- MobaXterm詳細使用教程:https://zhuanlan.zhihu.com/p/61013117
- 其他相關SSH軟件裏面也有提到,咱只要會登錄能敲命令,會上傳下載文件就行,剩下不用管。
三、預備知識
同學們可能本科時候Linux用的少,不熟練是正常的,好好補充相關知識,是少搞事的關鍵,況且linux是開發繞不開的。
首先是linux基本的目錄結構:https://www.runoob.com/linux/linux-system-contents.html
同學們的東西一般在 /home/[賬戶名]/ 的目錄下,例如/home/Alice/,大家井水不犯河水
關於linux的root權限:
root說白了就是超級管理員賬戶,你幹啥都暢通無阻,但也有了搞癱服務器的機會,學長信任你把賬號給你可能就是悲劇的開始。網上有一些教程上來就拿權限,因爲人家在自己的電腦的ubuntu上搞,崩了也無所謂,省事,但服務器公共資源,底層環境壞了影響別人,root權限還是不給的好,各位同學看教程也辯證的看。
然後基本的linux命令自己學,最好知其所以然。命令太多了,不搞運維,常用的會了就行,要用的臨時查。
放一點常用的:https://blog.csdn.net/heros_never_die/article/details/106363409
特別注意粘貼該用shit+insert,ctrl+c在這是鍵盤中斷。
四、配置環境
本機windows配置IDE就夠了,遠程服務器配置python和各種框架。
方案有很多種,我各種都用過了,核心功能都差不多的,剩下的那些蘿蔔青菜各有所愛,知乎上比較一堆,聊聊核心區別。
1.本地IDE的選擇
pycharm和vscode。最有區別的地方之一是遠程模式。
- 一般的pycharm是通過文件傳輸同步的ftp/sftp,換句話說,你本地電腦有一份工程文件,服務器上也有一份,修改好了以後用快捷鍵ctrl+shift+alt+x上傳覆蓋,也可以從服務器下載覆蓋本地實現回滾。
- vscode就遠程服務器上一份工程文件夾,本地默認沒有(你也可以選擇下載備份),你界面裏的修改直接作用於服務器文件,感覺上更接近中斷模擬軟件了。有插件可以記錄你的修改,然後選擇修改生效或是回滾,有備份需求的可以使用git命令和git插件(pycharm也有)。
實際上專業版的pycharm也有遠程同步功能,不過如果用的社區版的話,就得用模式1那種,vscode目前免費。
2.服務器配置
- Docker,和虛擬機差不多,連底層一起全套打包,特別適合有用到虛擬環境的,做普通任務的不一定需要。
- Anaconda,也會創建虛擬環境,但是有些東西對底層還有一些依賴,自動處理衝突並尋找兼容性的版本,你可以創建不同版本python的環境,它可以調整CUDA版本(這對深度學習框架很重要)。
- 裸python,省去激活環境,可以直接用pip(有不少教程用這種方法),對底層的依賴更高,而你沒有root權限(於是你用不了教程裏的apt-get,yum),得想辦法手動非root安裝,還要手動調整動態鏈接庫/環境變量, 以防止不同版本打架或是不小心用到系統python。
- 系統python,不是自己的機子,沒有可能性,除非你能像那位同學一樣能讓噁心所有同學並老師害怕,然後獨自霸佔一臺機子。或者家裏有礦自己整一臺。
總的來說,找到的教程是裸python的多,因爲有不少在自己機子的ubuntu上用root玩的,還有的github也這麼寫(因爲通用),服務器上搞非root裝亂七八糟的東西也費勁,推薦使用Anaconda,真的香,學會了以後那些pip裝的換成conda指令就行了。
3.具體步驟
網上教程有不少,但是比較碎片化,或者有的不是對服務器而言的,新版本有的還是有可視化窗口發生了寫變化,下面再簡略的寫一些吧。
1.安裝Anaconda
官網搞一份或者直接問學長學姐拷。地址:https://www.anaconda.com/products/individual
教研室網有奇怪的網關,上不去建議套一下學校的VPN或者去清華的源下載。
關於版本的選擇,我們服務器是Linux的,U是Intel的所以是x86的,power是IBM的。至於python3.7和python2.7區別不大,這裏指離線包裏包含哪個版本,Ananconda是個環境管理軟件,實際上你裝的python3.7版也可以用命令下載pythob2.7。類似於那種萬能驅動,包裏自帶一些東西,接上網了還可以下載各種東西。
下載得到文件 Anaconda3-2020.02-Linux-x86_64.sh
通過你的sftp軟件傳到服務器上你的目錄下,然後進入這個目錄(通過cd命令)
(爲什麼不直接在服務器用wget命令?因爲那樣走服務器小水管下載,而自己上傳用的局域網上傳)
接着輸入 bash Ana,按Tab鍵會幫你自動補全,回車開始安裝;之後就是讓你接受協議,回車就行了;再輸個yes回車;接着問你安裝目錄,要改就改,不改就回車;接着問你要不要初始化conda,輸入yes。
以下界面就是說你裝好了(人家還給pycharm打廣告了)
接着關了這個會話重開,這時候你的目錄前面多了(base)就對頭了
原本你輸入python命令是服務器的python,一般是2.7,安裝時間還很早,有base的時候,就是自己裝的python了。
剩下的東西參考下面:
https://blog.csdn.net/xi_zhong/article/details/83422225
https://www.jianshu.com/p/e298b9d3afae
關於環境變量都保存在.bashrc文件裏,用maba xterm的,可以直接雙擊打開,像記事本那樣該,關閉的時候會問你要不要上傳。
用vim編輯的話,不要傻乎乎的複製教程裏的命令,~/的意思是相對路徑,本身就在路徑裏的話,vim .bashrc 打開文件就好了。你要按insert鍵進入編輯模式纔好編輯,改完以後按esc退出編輯模式,按下分號鍵進入命令模式,輸入wq保存,vim的具體使用自己查。
另外提一句,換清華源很重要,不然有的下的很慢。
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes 這句是設置每次安裝包的時候,顯示一下源,用來確認用的。
這句是用來創建環境的:conda create -n your_env_name python=your_python_version
例如:conda create -n myenv python=2.7
接着你要進入這個環境的話就使用 conda activate myenv
conda info 顯示conda的各種信息(這裏也會顯示你有哪些源,路徑在哪,系統版本和cuda版本)
conda info --env 顯示你已經配置了哪些環境。
conda list 顯示當前環境下已經安裝了哪些包。
conda activate env1 激活(進入)某個環境
conda install tensorflow-gpu=1.6.0 安裝xxx,可以接版本號。
(記得看清自己目前在哪個環境裏,另外能對於深度學習框架自動配置CUDA,裝新包的時候會調整其他包保持兼容)
conda search pytorch 搜索某個包,雖然在pip裏面叫torch,在anaconda裏叫pytorch
(裝torch記得裝上全家桶,比如torchvision,conda install torchvision)
2.官網下載並安裝vscode
應該沒難度,也不需要破解,地址:https://code.visualstudio.com/
2.1 設置成中文(非必要)
ctrl+shift+p 調出命令框,找到命令Configure Display Language(輸一些內容直到顯示這個選項)
然後跳出選項Install additional languages(安裝額外語言包),點一下,裝上你需要的語言。裝好後右下角會提示器重啓vscode。
2.2 裝個SSH插件
插件欄搜索SSH,點安裝,然後提示需要重新加載,點一下就會重新加載。
2.3 新建遠程連接
這時候邊欄多了遠程連接的圖標,你可以點加號添加新的連接,也可以點那個齒輪調整config文件。實際上加號連接的東西也會問你記錄在哪個config裏面。至於選那個config,第一個就行了,其他的好像也能用。加號的添加方式按照裏面的提示填就行了。ssh 用戶名@地址,地址可以使域名也可以是普通ip,實驗內都是局域網ip。
接着會提示你成功添加了一個host,你可以直接點連接,也可以點host旁邊的小按鈕在新窗口中連接,彈出窗口以後會問你服務器系統是什麼,記得點一下。接着會提示你沒有RSA授權要不要連接,yes就行,然後輸入密碼,會下載一點必要的組件。
左下角的綠條是你的連接狀態,邊上兩個提示你有幾個error幾個warning。右上角是控制終端的欄目。+號是新建終端,垃圾桶是關閉終端(注意這個install終端不要關啊),剩下的按鈕還要終端分欄和終端全屏,鼠標放上去可以自己看說明。
接着點擊打卡文件夾就能打開服務器上的項目工程了,接着可以在裏面創建python文件什麼的,ctrl+s是保存,會直接修改服務器閃上的文件。左上角還會提醒你一個文件未保存。記得按照右下角安裝python擴展。裝的是pylint,裝了這個以後就有自動補全了,以及ctrl+鼠標左鍵點擊進入函數定義等必要功能。
正確安裝的話你可以看到,本地也可以安裝一份,注意區別。一般你連接哪邊的項目就會提示你安裝哪邊插件。
之後就可以享受coding了
2.4 我不想每次都在vscode裏輸ssh密碼
在終端輸入
ssh-keygen -t rsa 建立rsa公鑰密鑰對
接着會問你創建文件在哪,可以手動輸入,也可以直接回車保存在默認的位置/home/你的的目錄/.ssh/id_rsa
接着問密碼並驗證密碼,回車兩次可以跳過。
cd .ssh 可以進入這個文件,裏面有id_rsa和id_rsa.pub兩個文件
cat ./id_rsa >> ./authorized_keys 接着輸如這句話,cat作用是把文件內容打印到終端屏幕,>>是重定向,意思就是這段不去原本的輸入,而是換個地方,目標就是後面的authorized_keys文件(不存在會建立一個),這句話的實際想過相當於把id_ras_pub的內容添加到了authorized_keys尾部,換句話說,你用sftp手動複製粘貼進去也行。最終我們產生了如下三個文件,在只有一個公鑰的情況下,實際上authorized_keys和id_rsa_pub內容一樣的。
接着我們用sftp把密鑰放到自己的windows電腦上,路徑就是之前config所在的ssh路徑。順便改一下config裏面的文件,把服務器和密鑰文件關聯起來,如下圖所示。
主要添加
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_246
現在問題來了,我連接好幾個服務器,他們的密鑰不不能都叫id_rsa吧,所以記得要改一改名字。服務器那邊不一定要改,因爲主要起作用的是authorized_keys裏的內容,不過保持統一是個好習慣。
那麼如果你還有一臺筆記本電腦,用類似的方法配置一遍,服務器始終只有一份authorized_keys公鑰,臺式和筆記本各有一份id_rsa_246。
至此,以後vscode登錄特定服務器就不需要密碼了。
4. 運行代碼的正確姿勢
根據菜單欄上的運行可知,ctrl+F5運行,有加斷點的話也可以F5調試。
當然你可以使用下方的bash終端,像普通終端一樣輸入指令運行就行了, 例如:python test.py
關於解釋器的選擇在左下角,點一下以後可以選擇不同的解釋器路徑,如果想使用anaconda的環境則使用anaconda路徑的解釋器,路徑名裏有你起的環境名,好辨認的。vscode會自動激活環境。
調通程序之類的都可以使用這些方法,但如果你的模型要跑一兩天的話,你應該掛在後臺。
直接在終端裏跑,會話消失的時候進程就結束了。換句話說,你的終端要一直開着且保持穩定,如果意外斷網了,你的訓練模型就停止了。比較穩妥的方式是使用screen和tmux。
screen -S train 建立一個名爲train的窗口,這樣即使終端會話中斷了,窗口依然存在。
conda activate py2 激活你的環境
CUDA_VISIBLE_DEVICES=1,2 python train.py 設置顯卡1和2爲可用顯卡,使用python運行train.py文件
這裏說明一下CUDA_VISIBLE_DEVICES=1,2tensorflow是默認利用所有顯卡的,所以直接運行代碼的話,很容易佔用全服務器資源,給別人添麻煩,所以記得加這條命令限制顯卡的使用。而pytorch默認是使用顯卡0的,所以也可能和別人撞車。利用顯卡跑程序之前先使用nvidia-smi看一看各個顯卡的利用情況,選用空閒的顯卡。當然限制顯卡命令也有類似的語句可以直接加在py文件裏
import os
os.environ[“CUDA_VISIBLE_DEVICES”] = “0”
但是顯卡使用情況不同時刻不同,換卡運行要到py文件裏去修改,恆定一張卡的時候這個挺方便,看情況使用。
在窗口內,先按ctrl+a再按d,可以退出窗口,窗口掛在後臺,裏面程序還在跑。
先按ctrl+a再按k,可以徹底關閉窗口,進程會關掉。
screen -ls 列出現有窗口
screen -r train 恢復名爲train的窗口。
screen -D -r train 強制恢復名爲train的窗口,有時候會用到。
更多的見上文提到的linux常用指令,或自己查詢screen和tmux的使用方法。