我們可能會(huì)在本地主機(jī)建立項(xiàng)目和編輯代碼,不過一些深度學(xué)習(xí)任務(wù)需要用到 GPU 硬件支持欲侮,這時(shí)我們需要把代碼在 SSH 遠(yuǎn)程服務(wù)器下運(yùn)行和調(diào)試威蕉。這種情況下韧涨,調(diào)試代碼虑粥,設(shè)置斷點(diǎn)和監(jiān)視變量值,就需要用到遠(yuǎn)程調(diào)試第晰。
遠(yuǎn)程調(diào)試是 PyCharm Professional 才支持的功能茁瘦,Pycharm Community Edtion 并不支持腹躁。在這個(gè)頁面下載 Pycharm Professional纺非。Professional 可以用有效的學(xué)生/教師身份申請于在校期間使用赘方。
在 Pycharm 界面窄陡,如果找不到某些菜單的位置跳夭,雙擊 shift 可以直接進(jìn)行全局搜索币叹。
配置遠(yuǎn)程服務(wù)器
為了令PyCharm能夠連接遠(yuǎn)程服務(wù)器颈抚,需要完成配置:1. 服務(wù)器地址贩汉、端口號(hào)匹舞、用戶名及密碼策菜;2. 服務(wù)器配置根文件夾和訪問它的URL地址;3. 項(xiàng)目的根文件夾翠霍、從項(xiàng)目根文件夾拷貝到服務(wù)器上的目標(biāo)文件夾零如、目標(biāo)文件夾的URL地址锄弱,這三者之間的映射關(guān)系会宪。[Official Guide]
1)建立連接
首先掸鹅,在本地打開項(xiàng)目巍沙,配置該項(xiàng)目對應(yīng)的遠(yuǎn)程服務(wù)器榔幸。在主菜單選擇 Tools -> Deployment -> Configuration 以打開 Deployment 菜單削咆。菜單左邊會(huì)顯示已保存的一些配置(如果之前沒有配置過則沒有)态辛,點(diǎn)擊左上角的 + 以新建一份配置。
先選擇文件傳輸協(xié)議(現(xiàn)在連服務(wù)器一般用的都是 SSH 協(xié)議编矾,所以選擇 SFTP窄俏,以下流程也是基于 SFTP 協(xié)議的凹蜈,使用其它協(xié)議還請參照上面給出的官方指引仰坦,而且目前只有 SSH 服務(wù)器可以實(shí)現(xiàn)遠(yuǎn)程調(diào)試功能)悄晃。選擇協(xié)議后彈出 Create new sever 對話框妈橄,為你的服務(wù)器起一個(gè)名字(不需要和用戶名相同)鼻种,OK 確認(rèn)叉钥。如果取消勾選 visible for only this project沼侣,則其之后他項(xiàng)目也可以直接使用這份配置。
在 SSH configuration 欄輸入連接參數(shù)轧膘,格式為“用戶名:密碼@地址:端口號(hào)”。最新的 PyCahrm 版本沒有 SSH configuration 欄蟆淀,而是把 Host熔任、Port疑苔、User Name兵迅、Password 這四項(xiàng)分開逐個(gè)填寫恍箭。之后點(diǎn)擊 Test Connection 測試連接,如果成功連接勉抓,會(huì)彈出 “Successfully connected to {address}”。沒成功的話隐圾,看看是不是連接參數(shù)哪里寫錯(cuò)了掰茶,用 MobaXterm 之類的其它軟件測試一下連接盐碱。[Official Guide]
Root path 為當(dāng)前用戶可見的最底層根目錄。如果想訪問任何地方暖混,填入“/”拣播。點(diǎn)擊后面的 Auto detect 會(huì)自動(dòng)切換到你選擇的用戶的根目錄。
2)建立本地文件到服務(wù)器的映射
如果你想建立多個(gè)映射關(guān)系剂跟,可以通過 Add new mapping 實(shí)現(xiàn)。[Official Guide]
建立完映射關(guān)系后辽剧,可以設(shè)置文件同步。這會(huì)使 PyCharm 在能連接上服務(wù)器時(shí),自動(dòng)同步你的代碼等文件到服務(wù)器端诀紊。設(shè)置文件同步的方法如下:
選擇 Tools ->?Deployment -> Automatic Upload为居,并在彈出的選框中選擇剛才設(shè)置的服務(wù)器配置蒙畴。之后再打開 Tools -> Deployment,會(huì)看到 Automatic Upload 前面打了個(gè)勾干跛,并且后面標(biāo)注有(Always)楼入,再次點(diǎn)擊便可取消扬舒。實(shí)際上,Always 代表,不論是 Pycharm 自動(dòng)保存還是用戶用 Ctrl + S 手動(dòng)保存,都同時(shí)將文件同步到服務(wù)器端瞄勾,如果想切換成 On explicit save action(只在用戶手動(dòng)保存的時(shí)候同步)弥激,參考[Official Guide]进陡。
Pycharm 只能靜默地同步文件內(nèi)容,不能靜默地新建文件秆撮,所以在設(shè)置好這些之后四濒,會(huì)發(fā)現(xiàn)服務(wù)器上的映射文件夾還是空的。需要先手動(dòng)上傳一次职辨,在 PyCharm 左側(cè)的瀏覽欄中盗蟆,右鍵點(diǎn)擊文件或文件夾并選擇 Upload to {sever name} 以將其內(nèi)容上傳至服務(wù)器對應(yīng)的文件夾。之后每當(dāng)編輯本地項(xiàng)目里的文件內(nèi)容時(shí)舒裤,服務(wù)器上該文件的內(nèi)容會(huì)自動(dòng)同步喳资。
如果之后新建了文件或者文件夾,發(fā)現(xiàn) PyCharm 沒有自動(dòng)同步腾供,也這樣手動(dòng)同步就好仆邓。目前看來可能直接在 PyCharm 的界面里新建的文件會(huì)同步,通過 windows 的文件管理系統(tǒng)復(fù)制過去的不會(huì)同步伴鳖。
如果項(xiàng)目文件夾下有些文件不想同步节值,再次打開 Tools -> Deployment -> Configuration,在上方選擇 Excluded Paths榜聂,可以設(shè)置不想同步的文件或文件夾搞疗。可以通過正則表達(dá)式指定這些文件/文件夾须肆,以“;”為分隔符匿乃,“*”指代任意數(shù)量的字符,“豌汇?”指代一個(gè)字符幢炸。不過只要一開始不上傳到服務(wù)器,這些文件也不會(huì)被同步拒贱。
另外宛徊,可以在 Pycharm 主界面右側(cè)找到 Remote Host 標(biāo)簽(或Tool -> Deployment -> Browse Remote Host)佛嬉,點(diǎn)擊以展開。默認(rèn)的服務(wù)器可能是<None>闸天,點(diǎn)擊右邊小箭頭選擇服務(wù)器配置以連接剛才設(shè)置的服務(wù)器巷燥,然后就可以在這里瀏覽服務(wù)器上的文件了。
這次配置好号枕,之后就不用重復(fù)配置了。新的項(xiàng)目連接到相同的服務(wù)器時(shí)陨享,只要在 Tools -> Deployment -> Configuration 里選擇已有的服務(wù)器設(shè)置葱淳,改一下映射路徑即可。
配置遠(yuǎn)程 Python 解釋器
盡管代碼在本地主機(jī)上抛姑,我們需要使用服務(wù)器上的 Python 解釋器來執(zhí)行它赞厕。[Official Guide]
選擇 File -> Settings -> Project:{project name} -> Project Interpreter,以顯示本地項(xiàng)目當(dāng)前應(yīng)用的解釋器定硝,如果未選擇皿桑,則為<No Interpreter>。點(diǎn)擊右邊的設(shè)置鍵(齒輪)選擇 Add 以打開 Add Python Interpreter 窗口蔬啡,選擇 SSH Interpreter 并選擇 Existing sever configuration诲侮,選擇剛才設(shè)好的服務(wù)器設(shè)置。
點(diǎn)擊 Next 進(jìn)入下個(gè)界面箱蟆,現(xiàn)在選擇遠(yuǎn)程 Python 解釋器沟绪,在 Interpreter 欄內(nèi)輸入解釋器的路徑】詹拢可以勾選 Execute code using this interpreter with root privileges via sudo绽慈,這將會(huì)讓代碼以root權(quán)限執(zhí)行,如果勾選了辈毯,之后會(huì)有一個(gè)對話框讓你輸入 root 密碼坝疼。在下面的 Sync folders 選擇本地項(xiàng)目文件同步的文件夾。
選擇同步文件夾這一步之前已經(jīng)為 Deployment 設(shè)置過了谆沃,這次是為 Debugger 選擇钝凶,應(yīng)選擇和之前相同的路徑。
點(diǎn)擊 Finish管毙,可以看到現(xiàn)在這個(gè)項(xiàng)目的解釋器已經(jīng)被設(shè)為了 SSH 遠(yuǎn)程解釋器腿椎。正常的話, PyCharm 會(huì)識(shí)別出這個(gè)環(huán)境下的所有包夭咬,并將它們列出來啃炸。
如果新的項(xiàng)目需要用到這個(gè)解釋器,只要在 File -> Settings -> Project: {project name} -> Interpreter 中選擇已有的解釋器卓舵,并更改映射文件夾路徑即可南用。
好耶
現(xiàn)在,項(xiàng)目內(nèi)的代碼已經(jīng)可以在遠(yuǎn)程服務(wù)器上調(diào)試了」妫可以試著打幾個(gè)斷點(diǎn)肿嘲,調(diào)試一下,監(jiān)視以下變量筑公,這些都是可以做到的雳窟。Pycharm的遠(yuǎn)程調(diào)試配置就完成了。
注意事項(xiàng)
遠(yuǎn)程調(diào)試過程中發(fā)現(xiàn)的一些小問題匣屡,每次發(fā)現(xiàn)就慢慢補(bǔ)充吧封救。
1. cv2.imshow()報(bào)錯(cuò)
由于是遠(yuǎn)程運(yùn)行,cv2.imshow() 無法正常工作捣作。報(bào)錯(cuò):qt.qpa.xcb: could not connect to display. qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "{path-to-environment}/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 目前未解決誉结,只能先不用 imshow 了,想看圖的話就 imwrite 保存下來再看吧券躁。
2. 調(diào)試時(shí)加載不出變量值
如果用到 pytorch惩坑,代碼在調(diào)試時(shí)或許會(huì)加載不出一些帶 tensor 的變量的值,顯示 Timeout waiting for response on 113也拜、Loading timeout 或者 Failed collecting data 之類的以舒。雖然不清楚發(fā)生這個(gè)問題的原理,但是按下面的做應(yīng)該可以解決:在 File -> Settings -> Build, Excution, Deployment -> Debugger -> Python Debugger 里勾選 Gevent Compatible搪泳。我用這個(gè)方法能夠解決上述問題稀轨,具體參考?stackoverflow 上的這個(gè)問題的回答。
另外岸军,勾選 Gevent Compatible 可能會(huì)導(dǎo)致一些其它問題奋刽,所以確保你是僅對這個(gè)項(xiàng)目勾選了。如果之后項(xiàng)目改用本地解釋器艰赞,可能需要取消勾選?Gevent Compatible佣谐,否則可能會(huì)發(fā)生其他文件里的斷點(diǎn)失效的問題。
3. matpoltlib.pyplot 創(chuàng)建 figure 報(bào)錯(cuò)
這個(gè)報(bào)錯(cuò)應(yīng)該是 tkinter.TclError: couldn't connect to display方妖。發(fā)生這種錯(cuò)誤不是因?yàn)檫h(yuǎn)程調(diào)試狭魂,而是因?yàn)橐话惴?wù)器沒有窗口化顯示的需求,所以沒有 xming 圖形化顯示模塊党觅。matplotlib 默認(rèn)使用該模塊雌澄。
解決方法,在程序首部插入以下代碼杯瞻,以切換圖形化顯示模塊:
```
import matplotlib
matplotlib.use("Agg")
```