不少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就能用了。