• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

开源Polynote:一个受IDE启发的多语言notebook

Python admin 来源:netflix 4周前 (11-15) 111次浏览 0个评论 扫描二维码

我们很高兴宣布Polynote的开源发布:一个新的多语言笔记本,具有一流的 Scala 支持,Apache Spark集成,包括 Scala,Python 和 SQL 在内的多语言互操作性,按需输入自动完成功能等等。

Polynote 为数据科学家和机器学习研究人员提供了一个笔记本环境,使他们可以自由地将我们基于 JVM 的 ML 平台(大量使用 Scala)与 Python 生态系统的流行机器学习和可视化库无缝集成。它已经在 Netflix 的个性化和推荐团队中得到了广泛采用,并且现已与我们的其他研究平台集成在一起。

在 Netflix,我们一直对与开源社区共享充满信心,并相信 Polynote 在满足 Netflix 之外的类似需求方面具有巨大的潜力。

功能概述

重现性

编辑改进

能见度

多种语言

依赖性和配置管理

数据可视化

重新定义 Scala 使用体验

例如,虽然 Python 开发人员习惯于在使用具有相对较少数量依赖关系的程序包管理器构建的环境中工作,但 Scala 开发人员通常在基于项目的环境中使用构建工具来管理数百个(通常)冲突的依赖关系。借助 Spark,开发人员可以在集群计算环境中工作,无论使用哪个节点,都必须确保他们的分布式代码在一致的环境中运行。最后,我们发现用户对笔记本电脑中的代码编辑体验也感到沮丧,尤其是习惯于使用 IntelliJ IDEA 或 Eclipse。

一些问题是笔记本电脑体验所特有的。记事本执行是在特定环境中的特定时间点运行的特定代码段的记录。将代码,数据和执行结果组合到一个文档中,使 notebook 功能强大,但也难以复制。的确,科学计算界已经记录了一些 notebook 的可复制性问题以及可复制笔记本的一些最佳实践

最后,ML 空间可能特有的另一个问题是需要多语言支持。机器学习研究人员通常使用多种编程语言工作-例如,研究人员可能使用 Scala 和 Spark 生成训练数据(清理,二次采样等),而实际的训练可能是使用流行的 Python ML 库(例如tensorflowscikit-learn)完成的

接下来,我们将更深入地了解 Polynote 的功能。

通过设计可复制

我们认为,虽然 REPL 总体上不错,但它们根本不适合 notebook。为了了解 REPL 和 notebook,让我们看一下典型 notebook 环境的设计。

notebook 是单元格的有序集合,每个单元格可以保存代码或文本。每个单元格的内容可以独立修改和执行。单元格可以重新排列,插入和删除。它们还可以取决于 notebook 中其他单元的输出。

将此与 REPL 环境进行对比。在 REPL 会话中,用户一次将一个表达式输入提示。一旦评估,表达式及其评估结果是不变的。评估结果将附加到下一个表达式可用的全局状态。

不幸的是,这两个模型之间的脱节意味着在使用 REPL 会话评估单元代码的典型笔记本环境中,当用户与 notebook 交互时会导致隐藏状态的产生。单元可以以任何顺序执行,从而使此全局隐藏状态发生变化,进而影响其他单元的执行。通常,notebook 无法从顶部可靠地重新运行,这使得它们很难复制和与他人共享。隐藏状态还使用户难以推理笔记本中发生的事情。

在其他笔记本中,隐藏状态表示删除其单元格后变量仍然可用。

在 Polynote notebook 中,没有隐藏状态。删除的单元格的变量不再可用。

从头开始编写 Polynote 的代码解释可以使我们摆脱这种全局的可变状态。通过跟踪每个单元格中定义的变量,Polynote 会基于在其上方运行的单元格为给定单元格构建输入状态。使单元格的位置在其执行语义中很重要,可以强制执行最小意外原则,从而允许用户从上至下阅读 notebook。通过使顺序运行 notebook 更有可能工作来确保可重复性。

编辑人性化

让我们面对现实吧-对于曾经使用过 IDE 的人来说,在 notebook 中编写大量的代码就像回到几十年前。我们已经看到用户更喜欢在 IDE 中编写代码,然后将其粘贴到 notebook 中以便运行。提供成熟的现代 IDE 的所有功能并不是我们的目标,但代码编辑方面的一些增强功能对改善可用性大有帮助。

Polynote 中的代码编辑与Monaco 编辑器集成在一起以实现交互式自动完成。

Polynote 突出显示了代码中的错误,以帮助用户快速找出问题所在。

Polynote 为文本单元提供了一个富文本编辑器。

富文本编辑器允许用户轻松插入 LaTeX 方程。

能见度

如前所述,可见性是 Polynote 的指导原则之一。我们希望可以轻松地在任何给定时间查看内核的功能,而无需深入研究日志。为此,Polynote 提供了各种 UI 处理方法,可让用户知道发生了什么。

这是代码执行过程中 Polynote 的快照。

一次浏览此 UI 即可为用户提供大量信息。首先,从笔记本视图和任务列表都可以清楚地看到单元 1 当前正在运行。我们还可以看到,单元 2 到 4 按此顺序排队运行。

我们还可以看到当前正在运行的确切语句以蓝色突出显示-定义了值 sumOfRandomNumbers 的行。最后,由于评估该语句会启动 Spark 作业,因此我们还可以在任务列表中看到作业级和阶段级的 Spark 进度信息。

这是该执行过程的动画,因此我们可以看到 Polynote 如何使跟踪内核状态变得容易。

执行 Polynote 笔记本

符号表提供了对 notebook 内部状态的了解。选择一个单元格后,符号表会在黑线上方显示当前单元格执行所产生的任何值,并在该线下方显示该单元格可用的任何值(来自先前的单元格)。在动画的结尾,我们显示符号表在依次单击每个单元格时更新。

最后,内核状态区域提供有关内核执行状态的信息。在下面,我们以内核的状态从空闲和连接状态(绿色)变为繁忙(黄色)的状态变化的特写视图。其他状态包括灰色的断开连接,红色的死机或未启动。

内核状态从绿色(空闲和已连接)更改为黄色(忙)

多种语言

您可能已经在前面显示的屏幕快照中注意到,每个单元格的工具栏中都有一个语言下拉列表。这是因为 Polynote 支持真正的多语种笔记本,其中每个单元格都可以用不同的语言编写!

运行单元格时,内核将可用的类型化输入值提供给单元格的语言解释器。反过来,解释器将结果输入的输出值提供回内核。这使 Polynote notebook 中的单元可以在相同的上下文中运行,并使用相同的共享状态,而与它们定义的语言无关,因此用户可以为手头的工作选择最佳工具。

这是一个使用 python 库 scikit-learn 来计算使用 Scala 生成的数据集的等渗回归的示例。该代码改编自 scikit-learn 网站上的等渗回归示例

一个多语言示例,显示了 Scala 中的数据生成和 Python 中的数据分析

如该示例所示,Polynote 使用户可以在同一笔记本中流畅地从一种语言切换到另一种语言。

依赖和配置管理

为了更好地促进可重复性,Polynote 将配置和相关性信息直接存储在笔记本本身中,而不是依赖于外部文件或群集/服务器级别的配置。我们发现直接在 notebook 代码中管理依赖项比较麻烦,并且可能会使用户感到困惑。而是,Polynote 提供了一个用户友好的“配置”部分,用户可以在其中为每个笔记本设置依赖性。

Polynote 的配置 UI,提供用户友好的笔记本级配置和依赖项管理

通过这种配置,Polynote 可以为 notebook 构造一个环境。它在本地获取依赖关系(使用Coursierpip从存储库获取依赖关系),并将 Scala 依赖关系加载到隔离的 ClassLoader 中,以减少与 Spark 库发生类冲突的机会。Python 依赖项被加载到隔离的virtualenv 中。在 Spark 模式下使用 Polynote 时,它将为使用提供的配置的笔记本计算机创建 Spark Session。Python 和 Scala 依赖关系会自动添加到 Spark Session。

数据可视化

笔记本电脑最重要的用例之一是能够浏览和可视化数据。Polynote 与两个最受欢迎的开源可视化库VegaMatplotlib 集成

尽管 matplotlib 集成在 notebook 中是非常标准的,但是 Polynote 还具有对数据浏览的本机支持-包括数据模式视图,表检查器,图构造器和 Vega 支持。

我们将使用KaggleWine Reviews 数据集,通过使用上述工具的简单数据示例,进行一些数据分析和探索。首先,这是一个简单的示例,仅将数据加载到 Spark 中,查看 Schema,对其进行绘制并将其保存在笔记本中。

使用图构造器进行数据探索的示例

让我们专注于我们在这里看到的一些内容。

快速检查器的视图,显示了 DataFrame 的架构。蓝色箭头指向表格视图(左)和图视图(右)的快速访问按钮

如果单元格的最后一条语句是表达式,则会将其分配给单元格的 Out 变量。Polynote 将以其数据类型确定的方式显示结果的表示形式。如果是类似表格的数据类型,例如 DataFrame 或 case 类的集合,Polynote 会显示快速检查器,使用户可以一目了然地看到架构和类型信息。

快速检查器还提供了两个用于调出完整数据检查器的按钮-左侧的按钮调出表格视图,而右侧的按钮调出绘图构造器。该动画还显示了绘图构造器,以及用户如何拖放度量和尺寸以创建不同的绘图。

我们还将展示如何将绘图作为自己的单元格保存到 notebook 中。由于 Polynote 本身支持 Vega 规格,因此保存图仅需插入具有生成规格的新 Vega 单元。与任何其他语言一样,Vega 规范可以利用多语言支持来引用以前单元格中的值。在这种情况下,我们使用 Out 值(一个 DataFrame)并对其执行附加聚合。这样就可以进行有效的绘图,而不必将数百万个数据点带给客户端。Polynote 的 Vega 规范语言提供了一个 API,用于聚集和修改类似表格的数据流。

由图构造器生成的 Vega 单元,显示其规格

Vega 单元不需要使用 plot 构造函数进行创作-可以将任何 Vega 规范放入 Vega 单元中并直接绘制,如下所示。

Vega 的堆积面积图示例显示在 Polynote 中

除了单元格结果值,还可以单击一下来检查符号表中的任何变量。

在符号表中检查变量

未来

我们在这里描述了 Polynote 的一些关键功能。我们很荣幸通过开放源代码广泛共享 Polynote,我们很高兴听到您的反馈。立即访问我们的网站直接访问代码,开始尝试一下,让我们知道您的想法!看一下我们当前未解决的问题,看看我们正在计划什么,当然,始终欢迎 PR!Polynote 仍处于起步阶段,因此您可能会遇到一些粗糙的边缘。它也是一个强大的工具,可以执行任意代码(“功能强大,责任重大”),因此请在环境中使用时意识到这一点。

前方还有许多激动人心的工作。我们对 Polynote 的潜力非常乐观,我们希望向社区学习,就像我们希望他们将从 Polynote 中获得价值一样。如果您有兴趣从事 Polynote 或其他机器学习研究,工程和基础设施问题,请访问Netflix Research 网站以及一些最新的职位

致谢

Netflix 的许多同事在 Polynote 开发的早期阶段就为我们提供了帮助。我们要对 Aish Fenton,Hua Jiang,Kedar Sadekar,Devesh Parekh,Christopher Alvino 和许多其他早期采用 Polynote 的人提供深思熟虑的反馈表示由衷的感谢。


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明开源 Polynote:一个受 IDE 启发的多语言 notebook
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!