不少deep learning教程都推薦在jupyter notebook運行python代碼,方便及時交互。但只在本地運行沒有GPU環境,雖然google colab是個好辦法,但發現保存模型後在雲端找不到模型文件,且須要合理上網才能訪問。因而想給實驗室的服務器配置jupyter notebook,供本機遠程訪問。踩了很多坑,碼一下教程以供參考。html
服務器環境是Ubuntu 16.04.5 LTS 。本機windows10。分配給個人帳號沒有root權限,自用的python環境是用conda建了一個虛擬環境。node
服務器已經裝了Anaconda而且自帶Jupyter notebook。惟一須要配置的就是如何安全運行notebook server以便可以遠程訪問它。主要參考官方文檔Running a notebook server。python
先查看服務器是否已有notebook配置文件,linux下的路徑通常是「/home/USERNAME/.jupyter/jupyter_notebook_config.py」。若是沒有進行過配置,默認是沒有這個文件的,須要本身生成:linux
$ jupyter notebook --generate-config
這行代碼會在當前路徑下生成一個.jupyter
文件夾,而且文件夾中含有配置文件jupyter_notebook_config.py
。json
若是是notebook5.3以上的版本,此時能夠直接運行jupyter notebook
命令,會以一個帶有token的地址訪問notebook,打開後會讓你填寫token和設置新的password,以後就都以設置的密碼登陸。windows
notebook5.0以上的版本,須要運行一行命令 jupyter notebook password
,會讓你填寫密碼和確認密碼,而且生成含有密碼的hash的jupyter_notebook_config.json
在配置文件夾下。瀏覽器
$ jupyter notebook password Enter password: **** Verify password: **** [NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json
爲了安全起見,使用密碼的同時最好也使用SSL,這樣就不會直接發送未加密的密碼hash。安全
用openssl生成自簽名證書(365天有效期):服務器
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
給notebook配置·certfile:ssh
$ jupyter notebook --certfile=mycert.pem --keyfile mykey.key
編輯 .jupyter
文件夾下的 jupyter_notebook_config.py
,按照註釋說明加入如下這幾行代碼,填入以前生成的mycert.pem
和mykey.key
的路徑,以及jupyter_notebook_config.json
文件中的密碼hash串。
# Set options for certfile, ip, password, and toggle off # browser auto-opening c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem' c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/mykey.key' # Set ip to '*' to bind on all interfaces (ips) for the public server c.NotebookApp.ip = '*' c.NotebookApp.password = u'sha1:bcd259ccf...<your hashed password here>' c.NotebookApp.open_browser = False # It is a good idea to set a known, fixed port for server access c.NotebookApp.port = 9999
這時候在本機瀏覽器鍵入https://xx.xx.xx.xx:9999
(服務器ip)就能夠訪問了。
因爲notebook的默認python環境是服務器的base,但我須要用本身的虛擬環境下的python解釋器。因而須要給notebook設置新的kernel。
進入個人虛擬環境下運行python
,查看Python解釋器所在位置:
>>>import sys >>>sys.executable
同時在Jupyter notebook運行這兩行代碼,看到的果真是base的路徑。
回到base環境運行以下代碼,找到Jupyter的內核所在位置。
$jupyter kernelspec list
Jupyter是經過kernels
文件夾下的子文件夾來管理kernel的,這時候能看到只有一個python3
文件夾。因此若是要建新的kernel,須要新建一個自命名的文件夾,而後把python3
文件夾下的kernel.json
複製過來,修改參數值(須要root權限)。
編輯新的kernel.json
文件,將python路徑改成本身虛擬環境中的python,display_name
取一個不是python3的以做區分。
{ "argv": [ "/home/lcy/.conda/envs/lcyVenv/bin/python", "-m", "ipykernel_launcher", "-f", "{connection_file}" ], "display_name": "lcyPy", "language": "python" }
此時打開Jupyter notebook看到了剛剛自定義的新kernel,但新建一個lcyPy文件卻發現提示沒法鏈接到kernel。
查到的解決方案是在虛擬環境下安裝ipython kernel,代碼以下:
$source activate lcyVenv $conda install notebook ipykernel $ipython kernel install --user
而後回到base下開啓jupyter notebook就能用了。