jupyter-notebook二次开发

背景

公司内部提供给算法人员用于模型训练的平台开发需求中提出了嵌入Jupyter Notebook模块,而Jupyter Notebook是开源的,方便后续对部分细节进行功能定制和优化,需要对其进行调研,并梳理出二次开发的环境搭建、版本编译、生产环境部署流程,此文档对以上工作内容进行总结。

jupyter-notebook简介

2.1 功能简介

Jupyter Notebook官方介绍是:

基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。

优点举例如下:
1、在网页上编辑调试python代码,以代码块的形式,可边写代码边执行输出结果;编程时具有语法高亮、缩进、tab补全的功能。如下图。另外,对代码编写说明文档时,支持Markdown语法。
在这里插入图片描述

以上编辑的代码会以‘ipynb’格式的文件自动保存到服务器当前目录下,在菜单栏的“Files”可以看到,同时点击菜单栏的“Runing”也可看到该脚本,如下图。此时该脚本正在解释器中执行,点击“关闭”后,重新打开该脚本后,代码块中的变量将会丢失,需要重新运行。
在这里插入图片描述

这些脚本保存为后缀名为.ipynb的JSON格式文件,不仅便于版本控制,也方便与他人共享。如果想要保存成python格式文件,可通过“File”->“Download as”->Python(.py)的方式,如下图所示。
在这里插入图片描述

2、在网页上进入服务器终端,操作shell命令,如下图:
在这里插入图片描述

2.2 源码获取

github地址:

https://github.com/jupyter/notebook

可在git bash里面通过git clone下载源码,或者直接在网页上下载源码zip包。
这里我们下载的是V6.0.3版本。

2.3 源码分析

后端服务采用tornado框架,用python开发;前端使用jinja2模板编写,页面加载了大量的js,需要使用npm构建。

2.3.1 Tornado介绍

Tornado和Flask、Django一样,是一款开源的python web框架,但和另外两个相比,具有一些区别和优势:

其一它是异步非阻塞服务器,是实时web服务的一个理想框架,非常适合开发长轮询、websocket和需要和每个用户建立持久连接的应用;
其二它将应用和服务器结合起来,既可以作为WSGI应用,也可以作为WSGI服务。

Tornado不仅仅是一个Web框架,它完整地实现了HTTP服务器和客户端,再此基础上提供了Web服务,它可分为四层:

Web框架:最上层,包括处理器、模板、数据库连接、认证、本地化等Web框架所需功能。即tornado.web,web模块包括Web框架大部分主要功能,包括RequestHandler和Application类。RequestHandler用于创建Web应用程序。
HTTP/HTTPS层:基于HTTP协议实现了HTTP服务器和客户端。主要包括HTTPServer和AsyncHTTPClient。tornado.httpserver是一个无阻塞HTTP服务器的实现
TCP层:实现TCP服务器负责数据传输
Event层:最底层、处理IO事件

2.3.2 代码目录结构

源码目录主要包括tornado框架固有的目录,view、service、template、static等,另外根据功能模块划分的一些目录,比如auth、base、terminal、notebook等,main.py是启动文件,notebookapp.py是初始化项目文件。具体目录结构如下:
.notebook


```bash
├── auth     --用户登录、退出、密码登录校验等
├── base     --所有handler基础类
├── bundler      
├── services
├── static           --静态文件,js和css文件
├── templates        --所有模板文件,html文件
├── view
├── notebook
├── terminal
├── tree
├── files
├── gateway
├── i18n
├── prometheus
├── kernelspecs
├── edit
├── nbconvert
├── tests
├── __init__.py
├── __main__.py               --启动文件
├── notebookapp.py             --初始化项目
├── config_manager.py           --配置文件
├── extensions.py
├── _version.py
├── jstest.py
├── log.py
├── nbextensions.py
├── serverextensions.py
├── _sysinfo.py
├── transutils.py
├── _tz.py
└── utils.py

3 开发环境搭建

windows上pycharm开发环境搭建

  1. 安装node.js和npm
  2. 换源,换源后使用cnpm安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. pycharm中打开项目工程notebook-6.0.3,配置npm run build。此步骤是编译JavaScript 和css,保证前端代码更新生效。开发调试过程中可配置成npm run build:watch,这样当前端代码改动后会自动进行编译。
    在这里插入图片描述

  2. 创建venv(如下图),安装依赖:

pip install -e .  -i  https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

  1. 运行notebook,默认端口8888,也可指定端口:
python3 -m notebook –port=8989

此时浏览器会自动打开,如下图:
在这里插入图片描述

  1. 生成安装库,执行下面命令,将在当前目录下的dist文件夹下生成库的压缩文件notebook-6.0.3.tar.gz。
Python setup.py sdist

4 生产环境部署

Tornado6.0.3要求python3.5.2以上版本。linux系统上安装好python及部分依赖的组件。
将上面生成的库的压缩文件上传到生产服务器,本地安装命令如下:

Pip install notebook-6.0.3.tar.gz

无报错安装成功后,执行服务启动命令:

jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root --no-browser

–port:绑定服务端口号
–no-browser:设置不自动打开浏览器
–allow-root :root 用户执行时需要加上

5 镜像制作

以目前各个算法框架的镜像作为基础镜像,编写Dockerfile,制作包含jupyter notebook服务的新镜像。
首先需要准备notebook安装包notebook-6.0.3.tar.gz,和配置文件jupyter_notebook_config.py。
Dockerfile如下图以tensorlow为例:
在这里插入图片描述

生成新镜像:

docker build –t 新的镜像名:tag号 .

遇到问题:

问题1:终端中输入shell命令不支持tab补全;终端中不支持上下键翻找前面输入的命令。

问题解决:终端shell默认采用的是sh,改成bash,问题解决。

问题2:notebook页面无法嵌入到训练平台页面。

问题解决:去掉响应安全策略,即去掉源码中的下面这行。
headers[“Content-Security-Policy”] = self.content_security_policy

问题3:pytroch1.1_python3镜像,启动jupyter notebook报错:ModuleNotFoundError: No
module named ‘pysqlite2’

解决:修改源码:将pysqlite2 改成pysqlite3
import pysqlite3 as sqlite3

7 参考
https://www.jianshu.com/p/3a928ade93dc

猜你喜欢

转载自blog.csdn.net/jane_xing/article/details/120183748