Jason Pan

.ipynb 是什么文件格式?

潘忠显 / 2024-05-09


今天来介绍一下 Jupyter Notebook 文档(.ipynb) ,它被广泛应用于数据科学、机器学习和深度学习、教育和研究等领域

这种笔记本形式可以将可执行代码运行结果与图像HTML等内容合入 1 个文档中,支持本地或者在线运行 Python 等代码,这样可以让我们轻松地将笔记本共享给其他人,甚至允许他们修改笔记本。

笔记本还可以直接导出 PDF、HTML、Markdown 等格式的文件,以更丰富的形式分享。

一、背景

在上周分享的 GitHub 每周热点中,有个项目 meta-llama/llama-recipes 介绍如何在各种用例中快速地使用模型。这个项目的语言主要是 “Jupyter Notebook”。

llama-recipes-language

最近也开始接触机器学习,学习 Tensorflow 的过程中,发现 Google 提供的教程,除了普通网页静态版本外,还提供了可运行代码的交互式版本。这里的文件形式也 Jupyter Notebook,其扩展名为 .ipynb。这种可以直接运行代码并显示结果、甚至可以让用户修改代码运行的教程,可以形象、直接、快速地让用户理解,作者想传达的内容。

google-tensorflow-beginner-doc

看完此文,希望你能清晰地理解。当我们提到 Jupyter Notebook 时,他有两方面含义

接下来,我也会主要围绕着下这两点来介绍。

二、直观体验

首先,我们来通过上手使用,来直观的感受一下 Jupyter Notebook 的格式和编辑器。

2.1 安装 Jupyter Notebook

根据安装文档,直接通过 pip 安装,然后直接运行:

pip install notebook

# 创建一个目录并cd进去运行:
jupyter notebook

运行上边指令之后,会启动本地的 HTTP 服务(自动分配一个端口),弹出浏览器并访问到当前目录下的文件。

同其他基于 Web 的编辑器一样,可以直接创建文件,然后进行编辑。我这里新建一个文件,然后进行简单地编辑:

first-notebook

2.2 IDE 编辑

JetBrain系列的 IDE 和 VS Code 都能支持 .ipynb 的预览和编辑。

我这里直接在 PyCharm 中打开 上边的 Notebook 文件,可以点击运行按钮,刷新代码的输出:

截屏2024-05-09 15.37.25

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 中有一些语言、内核等信息:

jupyter-notebook-metadata

cells 是列表,所以其中这些 cell 是有序的。

3.2 单元格类型

以上边直观感受小节中的图为例,上边显示了三种基本的 cell 类型:

【关于 code cell outputs】当我们点运行等按钮之后,对应的 Code cell 运行之后,会更新输出结果。这是这些输出是存储下来的,这样是有好处的:我们在打开一个文档的时候,之前运行结果是可以直接显示出来的;另外,通过命令行或者 Jupyter Notebook 可以将 .ipynb 格式的文件直接转换成 HTML/PDF 等格式的静态文件,将输出附在代码之后就很有必要。

first-notebook-commented

四、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 也有多个含义:

ipy_kernel_and_terminal

4.3 工作原理

Jupyter Notebook 使用多个开源库构建,包括 IPython、ZeroMQ、Tornado、jQuery、Bootstrap 和 MathJax。

其架构相对比较简单,跟我们的直观理解也比较一致:Notebook 其实是启动了一个 HTTP 服务,用户通过浏览器进行交互;编辑文件,就会将可视化的内容,转换成 Notebook 格式的文件;运行代码,就会通过 ZeroMQ 消息队列,跟 kernel 进行通信(Python 语言使用的是上边介绍的 IPython)。

notebook_components

可以参考 Jupyter 官网 Architecture 文档介绍。

4.4 在线服务

我们前边运行应用,都是启动的本地 HTTP 服务,监听地址 127.0.0.1,也就是不能对外提供服务的。

很多云厂商都有提供自己的 Notebook 的网站,如果有需要,我们自己也可以搭建这样的对外服务。

以下是 2015 年 UC 伯克利的为大约 220 位学生安装的一个 JupterHub(一个多用户服务器,用于管理和代理单用户 IPython/Jupyter Notebook 服务器的多个实例)的架构图,其中使用到了:

jupyter-hub-uc-berkeley

通过上边的架构图,我们也能看出部署在线服务需要额外考虑的内容包括:

4.5 导出其他格式

Jupyter 中的 nbconvert 工具 可以将笔记本文件转换为其他格式,例如 HTML、LaTeX 或 reStructuredText。Jupyter Notebook 中有集成这个功能,File 中有相关选项:

nbcovert-in-app

这个转换器的具体转换经过一系列步骤:Preprocessor 运行笔记本中的代码并更新输出;导出器将笔记本转换为另一种文件格式;后处理器处理导出生成的文件。

nbcovert-workflow

上边提到的在线服务的 nbviewer 网站就是从提供的 URL 获取笔记本,利用 nbconvert 将其转换为 HTML,然后将该 HTML 提供给 HTTP 服务供你访问。

参考