[譯] 如何在遠端伺服器上執行 Jupyter Notebooks

Patrick同志發表於2019-04-16

[譯] 如何在遠端伺服器上執行 Jupyter Notebooks

Jupyter Notebook 是許多資料科學家工具庫中的主要工具。Jupyter Notebook 作為一種工具,可以讓人們通過互動的方式,更容易地進行資料分析、建立模型原型、進行試驗等等,從而提高生產率,縮短「寫程式碼 —— 看結果」這個迴圈反饋的時間。

很多情況下在筆記本或工作站上執行 Jupyter Notebook 已經足夠了。但如果是在對大型資料集操作,或處理資料要消耗大量運算力,或建立的學習模型相當複雜,就需要比膝上型電腦更強大的計算力。可能你在規模較大的圖上執行 圖卷積網路(Graph Convolutional Networks, GCNN),或在大量文字語料中運用帶遞迴神經網路的機器翻譯演算法,就需要更多 CPU 核心、RAM、或多個 GPU。幸運的是,你需要的這些資源,可能在遠端伺服器上都有!

如果你的伺服器支援圖形使用者介面(Graphical User Interface, GUI),那麼你可以直接使用 遠端桌面軟體 直接訪問伺服器,就跟平時在筆記本上使用 Jupyter Notebook 一樣。

然而很多伺服器並沒有 GUI。這樣的話,可以先在你膝上型電腦上寫好 Python 指令碼,然後使用小部分的資料進行試驗,證明指令碼可以正確執行,最後再複製到遠端伺服器上用命令列執行。甚至可以先在 Notebook 上試驗,再使用 jupyter nbconvert --to script your_notebook.ipynb 命令,將 Notebook 內容匯出到指令碼。這樣雖然可以讓程式碼在遠端伺服器上執行,可惜的是,你再也不能使用 Jupyter Notebook 來互動式地進行諸如對模型進行試驗或對結果視覺化了。

本文將向你展示,如何在遠端伺服器上執行 Jupyter Notebook,如何膝上型電腦上訪問,以及如何用兩條 bash 命令,讓整個過程更簡單。

啟動遠端 Notebook 伺服器

使用 Secure Shell Protocol (SSH)在遠端伺服器上啟動 Jupyter Notebook 伺服器。 SSH 可以給遠端伺服器傳送命令,基本語法如下:

ssh username:password@remote_server_ip command
複製程式碼

具體命令要根據你情況來定。就我而言,由於跟其他人共享同一個遠端伺服器,因此沒有在共享環境中安裝 Jupyter。第一步是進入到我自己的工程目錄,啟動虛擬環境,再啟動 Notebook 伺服器。具體而言,就是在遠端伺服器上執行以下三個 bash 命令:

cd project_folder
. virtual_environment/bin/activate
jupyter notebook --no-browser --port=8889
複製程式碼

我使用 jupyter notebook 命令來啟動 Jupyter Notebook,該命令帶有 --no-browser 標識,因而沒有啟動瀏覽器,因為遠端伺服器如果沒有 GUI 的話,並不能顯示瀏覽器。我還使用 --port=8889 把預設埠 8888 改為 8889,這是我個人的偏好,這樣本地和遠端的兩個 Notebook 用的就是不同的埠,就更容易檢視程式碼究竟是在哪執行了。

要在遠端伺服器上執行命令,先執行以下組合程式碼。

nohup ssh -f username:password@remote_server_ip "cd project_folder; . virtual_environment/bin/activate; jupyter notebook --no-browser --port=8889"
複製程式碼

注意,我用 ; 將一行程式碼的三個命令分開,而沒有用行分隔符。執行這段程式碼後,Jupyter Notebook 會在 8889 埠啟動,並在後臺執行。最後我加了給 ssh 命令加了 -f 把程式推進後臺,還加了 nohup 命令,靜默了程式的所有輸出,這樣就能繼續使用終端視窗了。這裡 有更多關於 nohup 命令的資訊。

訪問你的 Notebook

鍵入以下 URL 就能訪問 Notebook 了

remote_server_ip:8889
複製程式碼

需要你記住 IP 地址,或把網頁加入書籤也可。不過使用 轉發埠 命令,就能跟在本地 Notebook 一樣簡單地訪問遠端 Notebook 了,命令如下:

nohup ssh -N -f -L localhost:8889:localhost:8889 username:password@remote_server_ip
複製程式碼

-N 是在告訴 ssh 沒有遠端命令要執行,此刻不用執行任何遠端命令。跟前面一樣,-fssh 進行推入後臺。最後的 -L 則明確了埠轉發的配置,語法是 local_server:local_port:remote_server:remote_port。該配置使所有本地(比如你的膝上型電腦)給 8889 埠的請求,全都發給遠端伺服器的 8889 埠,遠端伺服器的地址是 username:password@remote_server_ip。跟上文一樣,nohup 命令靜默了輸出。

上面命令的主要作用就是,在你自己瀏覽器上也能訪問遠端 Jupyter Notebook 了,地址是

localhost:8889
複製程式碼

這就彷彿在本地執行 Notebook 一樣。

終止遠端 Notebook 伺服器

原則上可以讓 Notebook 服務在遠端伺服器上一直執行(除非重啟或崩潰),但也可能要終止服務,比如要升級 jupyter。有兩種方式終止:一是通過瀏覽器,二是通過命令列。

通過瀏覽器視窗

新版本的 Jupyter Notebook 中,能在瀏覽視窗右上方找到退出按鈕,如下圖所示。單擊後,就得使用之前的啟動命令重啟伺服器了。

The Quit Button

通過命令列

你要是不能把 Jupyter 升級到有退出按鈕的較新版本,或你更喜歡用終端,也可以通過命令列終止伺服器:

jupyter notebook stop 8889
複製程式碼

其中 8889 是埠號。要在遠端伺服器執行這段程式碼,先使用以下命令:

ssh username:password@remote_server_ip "`jupyter notebook stop 8889"`
複製程式碼

不幸的是,這個命令有 bug,但我依然將這個寫在這,期待以後或許可行。不過還有變通做法,就是直接使用以下命令,將 jupyter 程式終止。

ssh username:password@remote_server_ip "pkill -u username jupyter`"`
複製程式碼

其中 -u username 表示只終止由 username 啟動的 jupyter 程式。這樣做的缺點是,你正在執行的所有 Notebook 服務都將被終止。當然也可以登陸遠端伺服器,啟動 Notebook 服務,把終端視窗開著,手動管理伺服器。還能使用常用的 CTRL+C 鍵盤命令關閉 Notebook 伺服器。

工作流程梳理

記住所有命令很累贅。幸虧我們能給每個命令起別名,以簡化流程。將下列程式碼加入 ~/.bashrc 檔案:

alias port_forward='nohup ssh -N -f -L localhost:8889:localhost:8889 username:password@remote_server_ip'
alias remote_notebook_start='nohup ssh -f username:password@remote_server_ip "cd rne; . virtual_environment/bin/activate; jupyter notebook --no-browser --port=8889"; port_forward'
alias remote_notebook_stop='ssh username:password@remote_server_ip "pkill -u username jupyter"'
複製程式碼

在終端輸入 source .bashrc 載入這些命令。這樣就能在終端上用 remote_notebook_startremote_notebook_stop 命令,分別啟動(同時設定埠轉發)和關閉遠端 Notebook 伺服器了。

總結

本文展示瞭如何使用 bash 命令來啟動,訪問和終止遠端伺服器上的 Jupyter Notebook,還展示瞭如何建立 bash 別名使上述流程更容易。

希望這些命令能夠提到你在資料科學上的工作效率,並幾乎無縫地讓你從 Jupyter Notebook 和遠端伺服器上可用的計算資源中同時獲益。


如果你喜歡剛才讀的文章,歡迎在 Twitter 上關注我,我會在那兒分享論文、視訊和文章,而且都是和實踐、理論、資料科學倫理和我感興趣的機器學習相關,上面還有我自己的帖子。

有專業需求,在 LinkedIn 上聯絡我,或直接在 Twitter 上發訊息。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章