- 原文地址:Running Jupyter Notebooks on Remote Servers
- 原文作者:Tobias Skovgaard Jepsen
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:Daltan
- 校對者:TloveYing,xionglong58
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
沒有遠端命令要執行,此刻不用執行任何遠端命令。跟前面一樣,-f
將 ssh
進行推入後臺。最後的 -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 中,能在瀏覽視窗右上方找到退出按鈕,如下圖所示。單擊後,就得使用之前的啟動命令重啟伺服器了。
通過命令列
你要是不能把 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_start
和 remote_notebook_stop
命令,分別啟動(同時設定埠轉發)和關閉遠端 Notebook 伺服器了。
總結
本文展示瞭如何使用 bash 命令來啟動,訪問和終止遠端伺服器上的 Jupyter Notebook,還展示瞭如何建立 bash 別名使上述流程更容易。
希望這些命令能夠提到你在資料科學上的工作效率,並幾乎無縫地讓你從 Jupyter Notebook 和遠端伺服器上可用的計算資源中同時獲益。
如果你喜歡剛才讀的文章,歡迎在 Twitter 上關注我,我會在那兒分享論文、視訊和文章,而且都是和實踐、理論、資料科學倫理和我感興趣的機器學習相關,上面還有我自己的帖子。
有專業需求,在 LinkedIn 上聯絡我,或直接在 Twitter 上發訊息。
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。