作為長期從事數(shù)據(jù)科學相關(guān)工作的人,,作者很喜歡便捷的工作環(huán)境,,并為此探索出來一些小技巧,。通過這些技巧,可以將日常一些重復性或者枯燥的簡單工作變得「自動化」,,使計算機的工作環(huán)境更加友好,。
過去幾年里,我一直從事數(shù)據(jù)科學/研究項目,,本科就做了一些與這個行業(yè)相關(guān)的工作,,現(xiàn)在是研究生在讀,也在做這方面的研究,。作為一個喜歡便捷環(huán)境的人,,我總是喜歡改進我的工作方式,將日常的枯燥過程變得「自動化」,。在這篇文章中,,我將描述如何使環(huán)境更便于使用。
我使用的設(shè)置包含以下組件:
個人電腦(Linux 發(fā)行版)
網(wǎng)關(guān)
遠程服務(wù)器
由于我研究的項目計算量巨大,,筆記本電腦無法負擔,。因此,我需要這些機器輔助我,。出于安全原因,,遠程服務(wù)器無法直接訪問,這意味著它們只能由網(wǎng)關(guān)機器訪問,。
連接服務(wù)器的基本方法是首先將 ssh 連接到網(wǎng)關(guān),,然后將 ssh 連接到服務(wù)器,每次連接時都需要輸入用戶名和密碼,。輸入一遍又一遍是相當麻煩的?,F(xiàn)在我將介紹如何使用單個命令輕松連接到兩個服務(wù)器。
充分利用 SSH
關(guān)于 SSH
SSH(Secure Shell)是一種安全協(xié)議,,允許用戶控制他們連接的服務(wù)器,。使用 ssh 連接到遠程服務(wù)器的常用方法是使用以下命令:ssh user@host,然后獲得一個密碼提示符,。在這篇文章中,,我不會詳細介紹 ssh 的工作原理,只是利用 ssh 基本的使用知識,。
無需密碼即可連接
首先創(chuàng)建一個認證密鑰,,并將公共密鑰傳輸?shù)轿覀兿脒B接的服務(wù)器。我們從設(shè)置第一個連接開始——從筆記本電腦到網(wǎng)關(guān),。
我們將使用一個名為 ssh-copy 的小軟件,。它為我們完成所有工作,我們需要做的就是在終端中鍵入以下命令:
ssh-keygen -t rsa # create an SSH key, if needed.
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
Linux 用戶應該已經(jīng)安裝了這個軟件,。
Mac 用戶需要通過命令 brew install ssh-copy-id 安裝 ssh-copy 工具,。
ssh-copy-id 命令將 SSH 密鑰復制到服務(wù)器,如果需要,,創(chuàng)建相應的 ssh 文件夾,,最后將公鑰作為授權(quán)密鑰添加到服務(wù)器的.ssh / authorized_keys 文件中。
如果由于某種原因這不起作用,,只需復制粘貼以下命令,,這基本就是 ssh-copy 的作用:
打開終端并運行以下步驟:
生成一對認證密鑰。系統(tǒng)將要求你輸入任意密碼,。ssh-keygen -t rsa
在遠程計算機上創(chuàng)建一個 .ssh 文件夾(如果已存在則無需創(chuàng)建)ssh user@host mkdir -p .ssh
將之前生成的公鑰添加到遠程計算機(這應該是最后一次輸入密碼),。cat .ssh/id_rsa.pub | ssh user@host 'cat >> .ssh/authorized_keys'
OK!從現(xiàn)在開始,,你無需密碼即可輕松訪問服務(wù)器,。
ssh user@host
要從網(wǎng)關(guān)連接服務(wù)器,遵循相同的步驟(如果尚未配置),。
方便的 SSH
現(xiàn)在要做的是進階版,。與每次 ssh 都使用完整主機名+用戶名不同,我們可以使它更方便——無論是網(wǎng)關(guān)或代理機器,。
在本地計算機的~/.ssh/config 文件下插入以下內(nèi)容:
Host gate
HostName [gateway.name]
User [user]
Host work1
HostName [machine.name]
user [user]
ProxyCommand ssh gate nc %h %p
還有一個有用的配置參數(shù)名為「IdentityFile」,,它在處理多個公鑰/私鑰對時非常有用。假設(shè)你除了個人賬戶外,,有一個 github 的工作帳戶,。那你就需要另一個公鑰-私鑰對,但你還是需要一個方便的接口,。以下是在配置文件中進行設(shè)置的示例:
Host company-github
User git
HostName company.github.com
IdentityFile ~/.ssh/github.comp.key
每個 ssh 連接將使用匹配的密鑰進行連接,。
為了使每個服務(wù)器輕松連接,,我們可以以類似的方式添加所有遠程服務(wù)器。
現(xiàn)在,,只需要簡單的命令 ssh gate 或 ssh work1,,就可以直接連接到網(wǎng)關(guān)或 work1 服務(wù)器,無需任何密碼或其它連接,。
隧道(Tunneling)
現(xiàn)在我們可以方便地訪問遠程服務(wù)器,,然后可以使用隧道來實現(xiàn)對計算機中服務(wù)器資源的無縫訪問。這樣,,我們可以在遠程機器(具有大量內(nèi)存)上運行 Jupyter notebook,,并在瀏覽器上與它進行交互。它可以實現(xiàn)如下功能:
關(guān)閉計算機,,并保持 notebook 在服務(wù)器上運行,。
從另一臺計算機也可以打開和訪問同一 notebook。
保持模型可在遠程服務(wù)器上加載,。即加載一次即可永久訪問(或直到管理員重啟),。
例如,如果我們想在端口 9100 上打開服務(wù)器 work1 上的 notebook,,可以使用以下命令打開到端口 9200 上的計算機的隧道:
*ssh* *-N* *-f* *-L* *localhost*:9200:localhost:9100 *work1*
有趣的隧道
現(xiàn)在你已經(jīng)了解如何設(shè)置隧道,,你可以一直使用這個技巧(至少我一直這樣做)。現(xiàn)在以 Jupyter notebook 和 Tensorboard 為例做一個演示,。Tensorboard 服務(wù)器不會消耗很多資源,,但 notebooks 有時會。由于不同的項目使用的機器不同(為平衡負載),,因此會使用不同的隧道,,所以我有時不記得哪個端口用于什么應用,更不用說在哪個服務(wù)器上了,。
最終,,我們轉(zhuǎn)向自己的機器,唯一控制的變量是端口號,,而這些數(shù)字很快會被遺忘,。我最近找到了一部分解決方案。我沒有在 localhost:xxxx 上打開應用程序,,而是生成了新的域名,,這些域名只轉(zhuǎn)發(fā)到 localhost 主機。這雖然沒有解決端口問題,,但現(xiàn)在每個應用程序都有自己的名稱,,沒有混淆,在使用一兩次后,,現(xiàn)代瀏覽器就會記住端口,,所以你只需記住你為每個程序起的名稱即可,。
要進行域轉(zhuǎn)發(fā),請執(zhí)行以下操作:
使用 sudo [vim|nano|...] /etc/hosts 打開/etc/hosts 文件
你應該在某處(可能在頂部)發(fā)現(xiàn)這一行:127.0.0.1 localhost
復制該行,,使用你為應用程序取的名字替換 localhost 的名稱(例如,,tensorboard)。
現(xiàn)在你可以在 tensorboard:8100 上找到 tensorboard 應用,。
但端口問題仍然沒有解決,歡迎提出建議,。
更多便捷技巧
保持 SSH 打開
如果你已經(jīng)使用隧道一段時間,,你可能發(fā)現(xiàn)如果閑置幾分鐘后,隧道往往在不工作時都會斷開連接,。如果你同時在處理好幾件事,,而沒有一直使用隧道,那這個重復連接的工作真的很煩人,。通過在 ssh 配置文件中添加一行簡單語句,,這個問題就可以很容易解決。這樣,,每隔 x 秒,,一個'喚醒(sign-of-life)'信號會被發(fā)送到服務(wù)器上。在本地計算機上,,編輯 /etc/ssh/ssh_config 文件(帶有 sudo)并在 Host *行后輸入以下行:
ServerAliveInterval 120
這適用于所有 ssh 連接,。如果不想所有的 ssh 都保持連接,則可以通過給~/.ssh/config 配置文件添加相同的行來僅連接特定的 ssh,。配置如下:
Host gate
HostName gateway.name
User user
IdentityFile ~/.ssh/gateway
ServerAliveInterval 120
Autossh
現(xiàn)在,,隧道在不工作時也不會關(guān)閉,事情看起來很順利,。但當你準備睡覺(人總要休息?。r,你就會暫停/休眠你的電腦(不是關(guān)機),。第二天,,你想重新開始工作,你在本地計算機上準備打開隧道時發(fā)現(xiàn),,...... 連接已關(guān)閉,,你需要重新打開它。這也讓人心累不是嗎,?幸運的是,,這也有解決方案!
關(guān)于 autossh:http://www.harding.motd.ca/autossh/
這個絕妙的程序?qū)⒈WC你的 ssh 連接一直開啟,,除非關(guān)閉計算機,。只要沒有關(guān)機,,ssh 就一直是連接著的。例如,,你可以將計算機置于休眠狀態(tài),,斷開 Wifi 等連接,但一旦重新聯(lián)機,,此程序?qū)⒅匦聻槟氵B接 ssh,。
通過運行以下行來安裝 autossh:
sudo apt-*get* install autossh
現(xiàn)在運行以下命令:
*autossh* *-M* 20000 *-N* *-f* *-L* *localhost*:9201:localhost:9100 *work1*
這與我們之前看到的命令非常相似,除了命令名稱(duh)和 -M 20000 標志(這是顯示器所在的端口),。
IntelliJ 集成
在 Pycharm 專業(yè)版中,,有一個很好的功能,即可以連接遠程服務(wù)器并直接在上面工作,。你可以在自己的計算機上編寫代碼,,在遠程服務(wù)器上運行代碼,或者在遠程服務(wù)器上完全同步整個存儲庫,。
interlliJ 界面會不時變化,,但主題不變。我將介紹特定版本 - V. 2018.1.4 的步驟,。
進入 Pycharm 的設(shè)置界面
構(gòu)建,,執(zhí)行,部署 - >部署
單擊綠色+,,創(chuàng)建新的部署設(shè)置
輸入相關(guān)信息(名稱,、主機、端口(通常為 22),、根路徑和用戶名)
現(xiàn)在右鍵點擊項目文件夾,,在部署鍵下,你可以上傳,、下載項目或使其與遠程位置同步(可以設(shè)置快捷鍵),。
使用遠程解釋器:
進入項目設(shè)置欄
在項目解釋器標記下(在項目解釋器選項附近,有一個小齒輪按鈕),。單擊它,,然后點擊「添加」。
在左側(cè)菜單中,,單擊 SSH 解釋器
單擊「現(xiàn)有服務(wù)器配置」選項,,使用我們之前創(chuàng)建的部署配置。
選擇遠程解釋器(例如 anaconda / python)
... 全部完成,!