.ipynb 是什么文件格式?
潘忠显 / 2024-05-09
今天来介绍一下 Jupyter Notebook 文档(.ipynb) ,它被广泛应用于数据科学、机器学习和深度学习、教育和研究等领域。
这种笔记本形式可以将可执行代码、运行结果与图像、HTML等内容合入 1 个文档中,支持本地或者在线运行 Python 等代码,这样可以让我们轻松地将笔记本共享给其他人,甚至允许他们修改笔记本。
笔记本还可以直接导出 PDF、HTML、Markdown 等格式的文件,以更丰富的形式分享。
一、背景
在上周分享的 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 Notebooks - https://jupyter.org/try-jupyter/notebooks/?path=notebooks/Intro.ipynb
- Google 的 Colaboratory - https://colab.research.google.com/notebooks/welcome.ipynb
- https://nbviewer.org/ 可以将公网上 .ipynb 文件的 URL 贴进去然后浏览。HTML 格式,只能浏览看,不能交互运行。
主要云计算提供商已采用 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 服务供你访问。
参考
- IPython in depth tutorial - https://github.com/ipython/ipython-in-depth - examples/Notebooks 目录下有比较详实的介绍,可以clone 到本地运行 jupyter notebook 进行浏览
- The Jupyter Notebook - https://jupyter-notebook.readthedocs.io/en/latest/notebook.html - 对 Notebook 的介绍
- Jupyter Architecture - https://docs.jupyter.org/en/latest/projects/architecture/content-architecture.html - Jupter项目整体的架构介绍,上层目录有更多其他内容