.ipynb 文件格式详解:Jupyter Notebook 的前世今生
.ipynb 文件格式详解:Jupyter Notebook 的前世今生
Jupyter Notebook是一种广泛应用于数据科学、机器学习和深度学习、教育和研究等领域的笔记本文件格式。它允许用户在一个文档中混合编写可执行代码、运行结果与图像、HTML等内容,并支持本地或在线运行多种编程语言的代码。本文将详细介绍Jupyter Notebook的背景、使用方法、文件格式以及其作为Web应用的工作原理。
一、背景
在上周分享的GitHub每周热点中,有个项目meta-llama/llama-recipes介绍如何在各种用例中快速地使用模型。这个项目的语言主要是“Jupyter Notebook”。最近也开始接触机器学习,学习Tensorflow的过程中,发现Google提供的教程,除了普通网页静态版本外,还提供了可运行代码的交互式版本。这里的文件形式也是Jupyter Notebook,其扩展名为.ipynb。这种可以直接运行代码并显示结果、甚至可以让用户修改代码运行的教程,可以形象、直接、快速地让用户理解,作者想传达的内容。
看完此文,希望你能清晰地理解。当我们提到Jupyter Notebook时,它有两方面含义:
- 一个应用程序:基于Web的用于编辑代码和文本的应用程序
- 一种文件格式:交互式会话的输入和输出,以及代码附带但不用于执行的附加文本
接下来,我也会主要围绕着下这两点来介绍。
二、直观体验
首先,我们来通过上手使用,来直观的感受一下Jupyter Notebook的格式和编辑器。
2.1 安装 Jupyter Notebook
根据安装文档,直接通过pip安装,然后直接运行:
pip install notebook
# 创建一个目录并cd进去运行:
jupyter notebook
运行上边指令之后,会启动本地的HTTP服务(自动分配一个端口),弹出浏览器并访问到当前目录下的文件。同其他基于Web的编辑器一样,可以直接创建文件,然后进行编辑。我这里新建一个文件,然后进行简单地编辑:
2.2 IDE 编辑
JetBrain系列的IDE和VS Code都能支持.ipynb的预览和编辑。我这里直接在PyCharm中打开上边的Notebook文件,可以点击运行按钮,刷新代码的输出:
2.3 在线方式
有几种方式,可以让你在线使用Notebook:
主要云计算提供商已采用Jupyter Notebook或衍生工具作为云用户的前端界面。包括Amazon SageMaker Notebooks、Google的Colaboratory、Microsoft的Azure Notebook。
三、文件格式
Jupyter Notebook文件格式是一个内部保存JSON对象的文本类型,具体的格式定义在这个JSON Schema,相关的编辑器/阅读器也是通过上边这个Schema来校验.ipynb文件是否合法。
3.1 顶级结构
在这个JSON的最顶层,Jupyter Notebook包含以下几个键:
- metadata(字典):一些元数据信息,包括内核版本等
- nbformat, nbformat_minor(整数):格式的主次版本
- cells(列表):对应着下边视图中的一块文本、代码、输出、错误等基本结构
可以看到metadata中有一些语言、内核等信息:
cells是列表,所以其中这些cell是有序的。
3.2 单元格类型
以上边直观感受小节中的图为例,上边显示了三种基本的cell类型:
- Markdown cell:以Markdown格式写的文档
- Code cell:放代码的单元格
- Code cell outputs:这里outputs指的是一个单元格类型,比如这里Python代码的运行结果是一张图片,那么单元格的具体类型是display_data。还有其他的一些输出类型,比如错误、流输出等,具体可以参考这里。
【关于code cell outputs】当我们点运行等按钮之后,对应的Code cell运行之后,会更新输出结果。这是这些输出是存储下来的,这样是有好处的:我们在打开一个文档的时候,之前运行结果是可以直接显示出来的;另外,通过命令行或者Jupyter Notebook可以将.ipynb格式的文件直接转换成HTML/PDF等格式的静态文件,将输出附在代码之后就很有必要。
四、Web App
前边提到了Jupyter Notebook通常可以指两个概念,上一节我们介绍了它作为文件格式包含的内容。本节我们介绍一下Jupyter Notebook应用程序的功能和原理。
Jupyter Notebook应用程序是一个基于Web的交互式计算环境,用于创建笔记本文档,包含输入/输出单元格的有序列表,其中可以包含代码、Markdown、数学、绘图和富媒体。
我们前边安装、运行并进入的Web服务就是这个应用程序。
4.1 简史
Jupyter Notebook以前称为IPython Notebook,第一个版本于2011年发布。2014年,Pérez宣布了一个IPython的衍生项目,名为Project Jupyter。IPython继续作为Python shell和Jupyter内核存在,而IPython Notebook和其他与语言无关的部分则转移到Jupyter项目下。Jupyter项目的名称参考了Jupyter支持的三种核心编程语言,即Julia、Python和R语言。
JupyterLab是Jupyter项目的更新用户界面,提供灵活的用户界面和比经典笔记本UI更多的功能。第一个版本于2018年2月发布。
GitHub于2022年11月宣布将在在线编码平台Codespace中提供JupyterLab。GitHub上开源的Notebook项目,有各种主题,从基础编程到高级统计,甚至量子力学、引力波观测等。
4.2 IPython
上边有提到了IPython作为Notebook的内核。那么IPython是什么?
提到IPython也有多个含义:
- 增强版的Python shell,即下图中的Terminal IPython:可以直接命令行调用ipython指令。它提供了许多Python标准shell无法提供的功能,像交互式编程(语法高亮、自动缩进、自动补全)、魔法命令、集成调试工具、并行计算等功能。
- Jupyter项目的Python内核,即下图中的IPython Kernel。比如Notebook就需要依赖IPython内核。
4.3 工作原理
Jupyter Notebook使用多个开源库构建,包括IPython、ZeroMQ、Tornado、jQuery、Bootstrap和MathJax。
其架构相对比较简单,跟我们的直观理解也比较一致:Notebook其实是启动了一个HTTP服务,用户通过浏览器进行交互;编辑文件,就会将可视化的内容,转换成Notebook格式的文件;运行代码,就会通过ZeroMQ消息队列,跟kernel进行通信(Python语言使用的是上边介绍的IPython)。
可以参考Jupyter官网Architecture文档介绍。
4.4 在线服务
我们前边运行应用,都是启动的本地HTTP服务,监听地址127.0.0.1,也就是不能对外提供服务的。
很多云厂商都有提供自己的Notebook的网站,如果有需要,我们自己也可以搭建这样的对外服务。
以下是2015年UC伯克利的为大约220位学生安装的一个JupterHub(一个多用户服务器,用于管理和代理单用户IPython/Jupyter Notebook服务器的多个实例)的架构图,其中使用到了:
- Docker Spawner
- Multiple compute nodes
- GitHub Authentication
- NFS backed for student data, assignments, notebooks, etc.
通过上边的架构图,我们也能看出部署在线服务需要额外考虑的内容包括:
- 用户鉴权
- 安全、环境隔离
- 数据持久化
- 容灾
- 高并发处理
4.5 导出其他格式
Jupyter中的nbconvert工具可以将笔记本文件转换为其他格式,例如HTML、LaTeX或reStructuredText。Jupyter Notebook中有集成这个功能,File中有相关选项:
这个转换器的具体转换经过一系列步骤:Preprocessor运行笔记本中的代码并更新输出;导出器将笔记本转换为另一种文件格式;后处理器处理导出生成的文件。
上边提到的在线服务的nbviewer网站就是从提供的URL获取笔记本,利用nbconvert将其转换为HTML,然后将该HTML提供给HTTP服务供你访问。