在智利北部安第斯山脉高达2700米的塞隆·帕切翁山巅,美国的“大型综合巡天望远镜”(LSST)正在紧锣密鼓地施工着。到2022年,也就是LSST正式投入使用的时候,它将把30亿像素的相机对准太空,每晚完成30千兆的拍摄任务,这会是人类研究宇宙暗物质的一大基础.
而为了处理望远镜每天自动生成的TB级数据,天文学家们开始转向数据科学,把数据科学家们熟悉且常用的一种工具——Jupyter notebook,纳入天文学研究。
Jupyter是一个免费的、开源的、交互式的网络工具,它是一个计算笔记本,允许研究人员把软件代码、计算输出、注释性文本和多媒体资源集中在一个文档中。就历史来看,计算笔记本已经在世上存在了几十年,但是直到几年前,以Jupyter为代表的notebook才开始被技术人员广泛使用,并大受欢迎。
当然,Jupyter的流行离不开用户和开发者社区的共同努力。经过架构的重新设计和其他优化,现在它已经支持几十种编程语言——这也反映在名称变化上(Jupyter notebook原名IPython Notebook)。根据公司联合创始人Fernando Pérez的说法,现在的名字Jupyter是数据科学常用的3种语言的组合:Julia(Ju)、Python(Py)和R。
上个月,代码托管平台GitHub发布了一份分析,指出当前公开的Jupyter notebook数量大约在250万份,而在2015年,这个数字只有不到20万份。Pérez认为这里面有应用程序、网络软件经过不断升级迭代,性能超越竞品的原因,但更多应该归功于Python在科研领域的大面积应用和数据科学的成熟——尤其是当人们进行科学研究和数据分析时,发现远程数据过于庞大,超出了笔记本电脑的访问上限,如LSST。
在很多情况下,把计算机接入数据比把数据输入计算机要容易得多。Jupyter是基于云的,只要你告诉我你的数据在哪里,我就马上能在那儿给你台计算机。——Fernando Pérez
对于数据科学家来说,Jupyter已经成为事实上的标配。而在见识了这种工具之后,华盛顿大学的天文学家、负责协调LSST数据管理团队的马里奥·尤里奇也表示:“我从未见过这么快的迁移,真的是太棒了!”
类比来看,计算笔记本实际上就是用于科学计算的实验室笔记本,只不过上面写的既不是用凝胶电泳分离DNA,也不是实验室指南,而是嵌入代码、数据和文本来记录“实验者”的计算方法。公司联合创始人Brian Granger把它称为“计算叙事”——一个允许研究人员用分析、假设和猜想来补充代码和数据的文件。
这种工具能帮数据科学家极大地推进数据探索。notebook是交互式的,用户可以在这种环境中运行代码、查看发生的情况,然后重复这种发生在数据和研究人员之间的循环和迭代。这是人和数据对话的一种途径,它允许用户记录这些对话,建立起与主题、理论,数据和结果之间更强大的联系。当然,Jupyter不是承载对话的唯一平台——它的前身IPython Notebook是一种交互式Python解释器,也可以充当对话平台。
此外,研究人员还可以用notebook为他们的软件创建教程或交互式手册,这也是哈佛大学系统神经科学家Mackenzie Mathis所做的尝试。她和她的团队曾为神经科学研究开发了一个代码库,这允许他们把notebook作为手稿和教具用于教学。而根据Barba——一名从2013年起就在每门课程中都用notebook教学的教授——的体验,她认为IPython Notebook是用于教授科学和工程计算的杀手级应用程序,使她的学生能从中高效汲取课程知识。
提到编程,编程语言最能挑动技术人员神经。Jupyter notebook有两个组件。用户在前端网页中的矩形单元格输入编程代码或文本,然后,浏览器会将该代码传递给后端“内核”,由后端运行代码并返回结果。根据Pérez的统计,现在Jupyter内核的数量已经达到100多个,支持上百种编程语言。这是个极大的优势,因为通常情况下,每个notebook只能运行一个内核和一种语言,即便存在变通的方法,也只局限在Python、Julia、R和Fortran这4种之间。
重要的是,Jupyter的内核不需要驻留在用户的计算机上。未来,当LSST的天文学家用Jupyter notebook分析数据时,他们的代码会在伊利诺伊州运行,由超级计算机提供普通台式机无法比拟的庞大算力。notebook也可以在云中运行,例如谷歌的Colaboratory项目就为Jupyter提供了一个以谷歌为主题的前端,它允许用户进行协作、利用Google Cloud的代码,并将文档保存在Google Drive上。
今年1月,Jupyter推出下一代产品JupyterLab,可作为独立软件包或作为免费的Anaconda科学计算环境的一部分。
Jason Grout是彭博社的软件工程师,也是JupyterLab团队的成员之一。在他眼里,JupyterLab是Jupyter notebook的“下一代Web界面” ——它扩展了原先notebook的概念,把文本编辑器、浏览器、数据文件查看器、文本编辑器、命令控制台及其他自定义的内容以标签的形式排列在工作区中。一般Jupyter notebook会为每个notebook分配了各自的内核,而JupyterLab则是创建了一个允许共享这些组件的计算环境。这意味着用户可以在一个窗口中查看notebook,在另一个窗口中编辑所需的数据文件,并在第三个窗口中记录所有运行的命令 ——所有这些都在一个Web浏览器界面中进行。
用户还可以自定义JupyterLab以适应他们的工作流。它建立在可扩展系统之上,能提供新的主题、文件编辑器和查看器,甚至可以显示基因组比对或地理空间数据等内容。为了方便用户自定义扩展,Pérez还自制了一个教学视频,演示了如何创建了一个能显示3D大脑成像数据的组件。
这是一个完全[神经科学]领域的特定工具,显然,Jupyter团队不需要编写这些东西,但我们提供了正确的标准,然后社区可以在24小时内学会怎么做并自己写一个。
此外,依靠另两个工具,Jupyter的可用性也得到了大大加强。其中一个是JupyterHub,这项服务允许机构向大量用户提供Jupyter notebook。比如加州大学伯克利分校就用这种方法确保所有学生在所有课程下都拥有相同的计算环境。“我们不可能为800名学生一一提供IT支持,帮助他们在安装失败时debug,这是不可行的。”
另一个是Binder,一种允许用户在浏览器中使用GitHub上的Jupyter notebook、无需安装软件或任何编程库的开源服务。
尽管Jupyter notebook通过简化代码促进代码复现,但作为使用者,掌握 notebook的正确用法还是很重要的。
今年早些时候,艾伦人工智能研究所的研究工程师Joel Grus在Jupyter开发者大会上发表了题为“I don’t like notebooks”的演讲。他指出,当 notebook没有按预期运行时,程序员们往往会感到手足无措,但出现这个问题的原因很可能是他们没有按顺序去运行代码块。Jupyter notebook的简便从某种程度上来说是助纣为虐,它难以逻辑地组织代码,将其分解为可重用的模块并进行开发测试,以确保代码正常工作。所以被惯坏的用户写出来的代码也越来越混乱不清。
Grus承认,虽然这些都不是难以解决的问题,但 notebook在执行代码时确实应该注意遵守规则,比如 把分析代码移动到可以从 notebook中调用的外部文件、在notebook顶部定义关键变量以及 定期重新启动内核并从头开始运行notebook。就像一名网友在Twitter上的打趣:“要么重新跑一遍,要么假装什么都没发生。”
这也是Barba每次用notebook给学生上课时会提醒的一点:“从第一天起,我就对学生们说,你们可以用非线性的方式使用notebook,这能方便你们进行探索,但强大功能背后是要打下更扎实的基础。”
为了解决这个问题,一个可能有用的工具是Verdant,这是个能捕捉用户历史行为的插件。“作者构建了一个扩展,它允许用户在里面部署灵活的工作流,同时捕获用户运行的特定代码、运行顺序和具体数据。”
谷歌软件工程师兼Colaboratory团队成员Jake VanderPlas表示,Jupyter notebook就像锤子,它们很可能被误用,也不适合所有领域,但对于数据探索和通信来说,notebook确实是个好工具。天文学界似乎非常认同这个观点:“6年前,我们的计算机里完全不存在什么Jupyter notebook,但现在,每个人都爱它。”
原文地址:www.nature.com/articles/d41586-018-07196-1