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

3,194次阅读
没有评论

共计 5161 个字符,预计需要花费 13 分钟才能阅读完成。

我们很高兴宣布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:一个受IDE启发的多语言notebook
开源Polynote:一个受IDE启发的多语言notebook

在其他笔记本中,隐藏状态表示删除其单元格后变量仍然可用。
开源Polynote:一个受IDE启发的多语言notebook
开源Polynote:一个受IDE启发的多语言notebook

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

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

编辑人性化

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

Polynote中的代码编辑与Monaco编辑器集成在一起以实现交互式自动完成。
开源Polynote:一个受IDE启发的多语言notebook
开源Polynote:一个受IDE启发的多语言notebook

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

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

Polynote为文本单元提供了一个富文本编辑器。
开源Polynote:一个受IDE启发的多语言notebook
开源Polynote:一个受IDE启发的多语言notebook

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

能见度

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

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

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

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

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

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

执行Polynote笔记本

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

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

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

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

多种语言

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

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

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

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

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

依赖和配置管理

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

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

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

数据可视化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在符号表中检查变量

未来

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

致谢

正文完
 
admin
版权声明:本站原创文章,由 admin 2019-11-15发表,共计5161字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)