在Linux服務器上運行Jupyter notebook server教程
很多deep learning教程都推薦在jupyter notebook運行python代碼,方便及時交互。但只在本地運行沒有GPU環境,雖然google colab是個好辦法,但發現保存模型后在雲端找不到模型文件,且需要合理上網才能訪問。於是想給實驗室的服務器配置jupyter notebook,供本機遠程訪問。踩了不少坑,碼一下教程以供參考。
服務器環境是Ubuntu 16.04.5 LTS 。本機windows10。分配給我的賬號沒有root權限,自用的python環境是用conda建了一個虛擬環境。
服務器已經裝了Anaconda並且自帶Jupyter notebook。唯一需要配置的就是如何安全運行notebook server以便能夠遠程訪問它。主要參考官方文檔Running a notebook server。
配置Jupyter Notebook Server
生成notebook配置文件
先查看服務器是否已有notebook配置文件,linux下的路徑一般是“/home/USERNAME/.jupyter/jupyter_notebook_config.py”。如果沒有進行過配置,默認是沒有這個文件的,需要自己生成:
$ jupyter notebook --generate-config
這行代碼會在當前路徑下生成一個.jupyter
文件夾,並且文件夾中含有配置文件jupyter_notebook_config.py
。
配置密碼
如果是notebook5.3以上的版本,此時可以直接運行jupyter notebook
命令,會以一個帶有token的地址訪問notebook,打開后會讓你填寫token和設置新的password,之后就都以設置的密碼登錄。
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
配置ssh
為了安全起見,使用密碼的同時最好也使用SSL,這樣就不會直接發送未加密的密碼hash。
用openssl生成自簽名證書(365天有效期):
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
給notebook配置·certfile:
$ 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指定新的kernel
由於notebook的默認python環境是服務器的base,但我需要用自己的虛擬環境下的python解釋器。於是需要給notebook設置新的kernel。
查看當前的python解釋器路徑
進入我的虛擬環境下運行python
,查看Python解釋器所在位置:
>>>import sys
>>>sys.executable
同時在Jupyter notebook運行這兩行代碼,看到的果然是base的路徑。
新建notebook kernel
回到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就能用了。