我被选中作为实习生,负责 SciPy 构建系统的相关工作。在这篇博文中,我将描述我在 SciPy 进行为期 10 个月的实习之旅。我的工作涵盖了多个主题,从将 SciPy 构建系统迁移到Meson,清理公共 API 命名空间,到为 SciPy 子模块添加Uarray 支持。
经验#
Meson 构建系统#
除了distutils
已弃用之外,切换到 Meson 的主要原因包括:
- 更快的构建速度
- 可靠性
- 支持交叉编译
- 更好的构建日志
- 更易于调试构建问题
有关最初切换到 Meson 的提案的更多详细信息,请参阅scipy-13615
我最初被选中负责将 SciPy 构建系统迁移到meson。我首先为scipy.misc和scipy.signal添加了 Meson 构建支持。在进行这项工作时,我们遇到了许多构建警告,我们希望修复这些警告,因为它们会不必要地增加构建日志,并且可能指向一些隐藏的错误。我修复了这些警告,其中大部分来自已弃用的 NumPy C API 调用。
- 我还开始对 Meson 构建进行基准测试,使用不同的优化级别,在此过程中,我最终发现了一些失败的基准测试并尝试修复它们。
- 我实现了dev.py接口,其工作方式类似于
runtests.py
,但使用 Meson 构建 SciPy。 - 我通过编写 Python 脚本扩展了我在 Meson 构建方面的工作,用于检查所有测试文件和.pyi 文件的安装。
- 我记录了如何使用dev.py,以及如何使用并行构建和优化级别与 Meson。
- 我添加了meson 选项,用于在 BLAS/LAPACK 库之间切换。
包括以上所有工作的 Meson 构建支持已在 2021 年圣诞节前后合并到 SciPy 的main
分支中。Meson 现在将在即将发布的 1.9.0 版本中成为默认构建系统。
创建更清晰的公共命名空间#
问题是什么?#
“基本的 API 设计原则:公共对象只能从一个命名空间访问。在两个或多个地方拥有任何函数仅仅是额外的技术债务,并且对于像在 API 上分派或另一个库实现镜像 API 这样的事情,成本会增加。”
>>> from scipy import ndimage
>>> ndimage.filters.gaussian_filter is ndimage.gaussian_filter # :(
True
SciPy 的API 参考文档定义了公共 API。但是,SciPy 仍然有一些子模块由于在名称开头缺少下划线而意外地成为某种程度上的公共模块。我花了大约几个月的时间致力于清理公共命名空间,通过仔细地向不打算公开的.py
文件中添加下划线,并在任何人尝试访问它们时添加弃用警告。
解决方案:#
>>> from scipy import ndimage
>>> ndimage.filters.gaussian_filter is ndimage.gaussian_filter
<stdin>:1: DeprecationWarning: Please use `gaussian_filter` from the `scipy.ndimage` namespace, the `scipy.ndimage.filters` namespace is deprecated.
True
添加 Uarray 支持#
“SciPy 采用了 uarray 来支持多重分派机制,其目标是:允许为在并行、分布式或 GPU 上执行的公共 API 编写后端。”
在过去的四个月左右,我一直在致力于为 SciPy 子模块添加Uarray 支持。我建议阅读 Anirudh Dagar 编写的这篇博文,其中介绍了uarray
的动机和实际用法。我选择了以下子模块来添加uarray
兼容性
同时,为了展示一个可工作的原型,我还为以下子模块在 CuPy 中添加了uarray
后端
这些拉取请求包含指向 Colab 笔记本的链接,这些笔记本展示了这些功能的实际应用。
这种后端的用法是什么样的?#
import scipy
import cupy as cp
import numpy as np
from scipy.linalg import inv, set_backend
import cupyx.scipy.linalg as _cupy_backend
x_cu, x_nu = cp.array([[1.0, 2.0], [3.0, 4.0]]), np.array([[1.0, 2.0], [3.0, 4.0]])
y_scipy = inv(x_nu)
with set_backend(_cupy_backend):
y_cupy = inv(x_cu)
其他工作#
未来工作#
- “切换到 Meson”项目即将完成。最后的一个问题是允许使用
meson-python
后端构建轮子。 - 为添加
uarray
支持而打开的 PR 仍在进行热烈的讨论,主要目标是在我们达成具体决定后尽快将它们合并。
需要记住的事情#
- 耐心:设置新项目总是需要一些时间。我们可能需要更新/修复系统库并尝试逐步解决错误。
- 学习:学习新事物是实习期间的主要关键之一。我之前完全不了解构建系统和 GPU 库。
谢谢!!#
我非常感谢Ralf Gommers给我提供这次机会并相信我。他的指导、支持和耐心在整个实习过程中发挥了重要作用。我也感谢整个 SciPy 社区帮助我进行 PR 审查并提供宝贵的反馈。此外,还要特别感谢Gagandeep Singh,他一直陪伴着这段美好的旅程。
简而言之,我会将这段经历铭记为:Ralf Gommers 提升了我的职业生涯!