序言
Owl是一款用于科学和工程计算的软件系统。该库主要使用OCaml语言进行开发。作为一种非常独特的函数式编程语言,OCaml为我们提供了出色的运行时效率、灵活的模块系统、静态类型检查、智能垃圾收集器和强大的类型推断。Owl无疑直接继承了这些优秀的特性。使用Owl,您可以在一个漂亮而经过充分测试的函数式语言中编写简洁、类型安全的数值应用程序,而无需牺牲性能,显著加快开发生命周期,降低从原型到生产使用的成本。
简要历史
Owl起源于一个研究项目,该项目于2016年7月研究了用于大规模分布式计算的同步并行机器的设计。我选择使用OCaml语言开发该系统,原因是其表达力和卓越的运行时效率。另一个明显的原因是我当时在OCamlLabs担任博士后研究员。
尽管OCaml是一种设计非常良好的语言,但当时OCaml生态系统中用于数值计算的库非常有限,工具链也是分散的。为了测试各种分析应用程序,我不得不亲自编写许多数值函数,从非常低级的代数和随机数生成器到高级的算法微分和深度神经网络。这些代码片段开始积累,并最终比分布式引擎本身还要庞大。因此,我决定将这些函数拿出来,封装成一个独立的库 - Owl。
Owl的架构在开始阶段经历了至少十几次迭代,其中一些架构变化相当激进。我故意避免查看SciPy、Julia、Matlab的架构,以最小化它们对Owl架构的影响,我真的不想要又是一个xyz...。当架构稳定下来后,我开始实现不同的数值函数。那是2017年充满挑战但充实的一年,我日以继夜地工作,添加了6000多个函数(超过150,000行代码)。经过一年的密集开发,Owl已经能够执行许多复杂的数值任务,例如查看我们的Google Inception V3演示,用于图像分类。我甚至在牛津举办了一个教程,演示OCaml中的数据科学。
尽管OCaml是一种小众语言,Owl一直在吸引越来越多的用户。我非常感谢这些对这个年轻而雄心勃勃的软件的耐心 。社区一直支持并在这些年提供有用的反馈。我希望Owl能帮助人们学习函数式编程并解决现实世界的问题。
还原主义 vs. 整体主义
如果您来自Python世界并熟悉其用于数值计算的生态系统,您可能会将Owl视为NumPy、SciPy、Pandas等许多库的混合体。您可能会好奇为什么我将这么多东西打包在一起。随着您对OCaml的了解越来越深入,我几乎可以肯定您会开始思考为什么Owl的设计似乎违反了极简主义,这是许多OCaml库采用的一种流行的设计原则。
首先,我必须指出,在一个系统中包含许多功能不一定意味着单片式设计。Owl的功能在各个模块中得到很好地定义,每个模块都非常独立,并遵循极简主义设计原则。
其次,我想辩论一下这些功能应该共同设计和实现。这正是我们在过去两十年努力构建现代数值系统时学到的。当前的共同设计选择避免了大量冗余代码和重复努力,并使优化变得更加容易。NumPy、SciPy、Pandas等软件花费了很多年的时间来很好地定义其功能边界。最终,NumPy变成了数据表示(即N维数组),SciPy在此表示之上构建了高级分析功能,Pandas演变成了表格操作和分析功能的组合,PyTorch在异构设备之间架起了这些功能的桥梁。然而,如果您深入查看实现代码,仍然存在相当多的重叠。
回到OCaml世界,由于语言的严格静态类型,共同设计变得更加重要。特别是如果每个小型数值库将其数据表示封装到抽象类型中,那么当您尝试构建一个大型而复杂的应用程序时,它们将无法很好地协同工作。这进一步表明,在生态系统中拥有大量小型库将无法有效提高程序员的生产力。Owl的目标是通过一致的整体主义设计来解决这个问题,重点放在科学计算上。
不同的设计原则选择还揭示了系统编程和数值编程之间的差异。系统编程建立在各种复杂和异构的硬件之上,通过提供(相对较小的)API来抽象出真实世界的复杂性(回想一下Unix操作系统中有多少系统调用)。另一方面,数值计算建立在少量抽象数字类型之上(例如实数和复数),然后为各个领域的各种高级数值操作派生出丰富的集合(回想一下数值库中有多少API)。因此,在系统编程中偏爱还原主义,而在数值编程中则偏爱整体主义。
主要特性
Owl在其坚实的n维数组实现的基础上实现了许多高级数值函数。与其他数值库相比,Owl在许多方面都非常独特,例如算法微分和分布式计算已作为核心系统的组成部分纳入,以最大程度地提高开发人员的生产力。Owl虽然年轻,但发展迅速,目前的特性包括:
- N维数组(稠密和稀疏)
- 各种数字类型:
float32
,float64
,complex32
,complex64
,int16
,int32
等。 - 线性代数和对CBLAS和LAPACKE的完整接口
- 算法微分(或自动微分)
- 用于深度学习应用的神经网络模块
- 动态计算图
- 并行和分布式计算引擎
- 高级数学和统计函数(例如,假设检验,MCMC等)
- Zoo系统用于高效脚本和代码共享
- JavaScript和unikernel后端
- 与其他框架(如TensorFlow和PyTorch)的集成
- GPU和其他加速器框架
Owl系统发展迅速,OCaml的数值生态系统也在蓬勃发展,因此您的反馈对我调整未来的方向和重点非常重要。如果您发现缺少一些重要功能,请随时在问题跟踪器上提交问题。
联系我
如果您想讨论关于本书、代码或任何其他相关主题,可以通过以下方式联系我。
学生项目:如果您是计算机实验室的学生,并且想要进行一些具有挑战性的开发和设计,请参阅这些第二部分项目。
如果您对更多研究性的主题感兴趣,我提供第三部分项目,请查看:Owl子项目页面,并通过电子邮件直接与我联系。
期待收到您的来信!