软件演进和生物进化一样,没人可以预测下一步走向哪里,我们只知道,它需要人类的脑力和贪婪去喂养 — David 9
谁也没有想到30年前Guido写的Python因为通俗易用、丰富的联网支持,变为现在数据科学家最喜爱的工具语言之一。甚至小小的代数计算库Numpy会涌现如此多的扩展库和矛盾。
有人认为,长颈鹿之所以进化时如此过度关注脖子长度(其实适当高度就足够了),只是因为母长颈鹿认为雄长颈鹿脖子越长越有性魅力(种内竞争)。
软件进化也类似,人类社区中那些勤劳的开发者努力让Numpy支持各种场景(多核分布式、GPU利用、稀疏处理和Autograd ),解决各种矛盾(ndarray不兼容,numpy插件系统不到位)。但是,他们的汗水都是基于Python这个“种族”进化的,种内竞争激烈不一定能保证软件的发展方向好 。。。
扯远了。。今天还是想盘点高阶Numpy扩展库与API ,毕竟许多人不满足于基础的numpy代数计算。比如下面这些场景(重写库):
- CuPy: 实现Numpy有的API ,保证所有计算可以在CUDA GPU上加速
- Sparse: 对于稀疏的ndarray(许多元素是0的情况), 重写实现Numpy的API(更高效)
- Dask array: 对于多核或者多机器的工作站,为了可以分布式或者多核,又重写Numpy API ,所以有了这个库
最简单的例子大概是这样的:
import numpy as np x = np.random.random((2,3)) # 在一个cpu上跑 y = x.T.dot(np.log(x) + 1) z = y - y.mean(axis=0) print(z[:5]) import cupy as cp x = cp.random.random((2,3)) # 在GPU上跑 y = x.T.dot(cp.log(x) + 1) z = y - y.mean() print(z[:5].get()) import dask.array as da x = da.random.random((2,3)) # 在许多cpu上跑 y = x.T.dot(da.log(x) + 1) z = y - y.mean(axis=0) print(z[:5].compute())
默默妈卖批,这帮人就不知道合作一下合成一个库吗?
也许人类合作是开销最大的吧,有些人为了自己的应用还扩展了Numpy的API:
- XArray : 可以把numpy当pandas用的库,为数据加上行列标签等
- Autograd and Tangent: 自动求导功能,类似pytorch的ndarray自动求导功能,你所要做的只是定义函数
- TensorLy :对 ndarray的高阶因子分解
- Dask array :并行化ndarray,刚才说过,(Dask库不但重写了numpy,还扩展了numpy)
- Opt Einsum 更高效地在 ndarray上进行爱因斯坦求和约定的计算
这些numpy的重写库和扩展库在文章 Beyond Numpy Arrays in Python提到了,这些库一旦混用起来会有问题:重写库的ndarray不再和原生的numpy对象一样,而且那些扩展库和重写库也不一定兼容:
>>> numpy.sin is cupy.sin False
最傻瓜的方式是我们在代码里自己写判断:
def f(x): if isinstance(x, numpy.ndarray): return np.sin(x) elif isinstance(x, cupy.ndarray): return cupy.sin(x) elif ...
是哪个扩展库的类型,就用哪个扩展库的实现,以免冲突。
对于扩展库,会有一些人在项目里写兼容代码:
- xarray/core/duck_array_ops.py
- tensorly/backend
- autograd/numpy/numpy_vspaces.py
- tangent/template.py
- dask/array/core.py#L59-L62
- opt_einsum/backends.py
但是这毕竟不是完全之策,不可能把所有的numpy重写库都支持(就像写一个app
项目不能把所有ios,android,windows系统都支持个遍)。
Beyond Numpy Arrays in Python这篇文章作者提出了一些建议,感兴趣可以继续研究,这些建议还没有真正被社区采纳和实践。
参考文献:
本文采用署名 – 非商业性使用 – 禁止演绎 3.0 中国大陆许可协议进行许可。著作权属于“David 9的博客”原创,如需转载,请联系微信: david9ml,或邮箱:yanchao727@gmail.com
或直接扫二维码:
David 9
Latest posts by David 9 (see all)
- 修订特征已经变得切实可行, “特征矫正工程”是否会成为潮流? - 27 3 月, 2024
- 量子计算系列#2 : 量子机器学习与量子深度学习补充资料,QML,QeML,QaML - 29 2 月, 2024
- “现象意识”#2:用白盒的视角研究意识和大脑,会是什么景象?微意识,主体感,超心智,意识中层理论 - 16 2 月, 2024