NDArray

NDArray 是一个用 Swift 编写的多维数组库,旨在成为 Swift 新兴数据科学生态系统中 numpy 的等价物。这个项目还处于非常早期的阶段,前方还有一段漫长但令人兴奋的道路!

目标

  1. 拥有一个高效的多维数组接口,包含常见的索引、切片、广播等功能。
  2. 使 NDArray 及其操作具有可微性,以便与 Swift for TensorFlow 一起使用。
  3. 创建针对包含数值类型的 NDArray 的线性代数运算的专门实现,使用 BLAS、LAPACK、Accelerate 或 MLIR,具体取决于环境。

教程

教程 最后更新
基本 API 2019 年 8 月 13 日

安装

你可以使用 SwiftPM 安装它

.package(url: "https://github.com/cgarciae/NDArray", from: "0.0.20")

它可能适用于其他兼容的包管理器。此软件包仅在 Swift 5.1 中经过测试,不保证与早期版本的兼容性。

示例

NDArray 是一种泛型容器类型,就像 Array 一样,不同之处在于它是多维的。 如果它的元素符合某些协议,那么可以使用某些方法和运算符,例如+-*等,来有效地执行整个集合的计算。

import NDArray

let a = NDArray<Int>([
    [1, 2, 3],
    [4, 5, 6],
])
let b = NDArray<Int>([
    [7, 8, 9],
    [10, 11, 12],
])

print((a + b) * a)
/*
NDArray<Int>[2, 3]([
    [8, 20, 36],
    [56, 80, 108],
])
*/

在这里,我们看到 (a + b) * a 的结果也是一个形状为 [2, 3]Int 类型的 NDArray。 要将像 +* 这样的运算符与包含您的自定义类型的 NDArray 一起使用,您只需使它们符合适当的协议。例如

import NDArray

struct Point: AdditiveArithmetic {
    let x: Float
    let y: Float
    ...
}

let a = NDArray<Point>([Point(x: 1, y: 2), Point(x: 2, y: 3)])
let b = NDArray<Point>([Point(x: 4, y: 5), Point(x: 6, y: 7)])

print(a + b)
/*
NDArray<Point>[2]([Point(x: 5.0, y: 7.0), Point(x: 8.0, y: 10.0)])
*/

您也可以对数据应用通用转换,之前的代码可以写成:

elementwise(a, b, apply: +)
// or
elementwise(a, b) { $0 + $1 }

对于大量计算,您可以使用并行版本

elementwiseInParallel(a, b) {
    // code
    return c
}

将来,NDArray 应该能够根据数据的类型和大小来估计最佳策略(串行/并行)。

目标讨论

除了基本API之外,NDArray的自动微分和线性代数优化功能应该是可选的,因此所有用户都可以访问该库,而无需考虑其环境,即,即使iOS开发人员无法访问TensorFlow的编译器或Lineal Algebra基础结构,也应该能够使用它。

基本 API

第一个目标是使用纯 Swift 定义库的基本 API,无需额外的优化或可微性。 iOS/OSX 开发人员应该能够使用基本 API,而无需进行额外的设置。 如果可能,保持 NDArray 的 API 与 Swift for TensorFlow 的 Tensor API 紧密协调,以促进知识重用和免费文档也非常重要。

自动微分

第二个目标是必须具备的,Swift for TensorFlow 的编译器具有自动微分功能,可以说是 ML 的未来,我们应该使用它。

线性代数优化

第三个目标是您对任何 HPC 数字库的期望,该策略将通过使用 BLAS、LAPACK、Accelerate 或 MLIR 来专门针对数字类型的功能/操作,以加速计算。 另一方面,如果成功与 MLIR 集成,BLAS 和 LAPACK 可能不是必需的,并且 NDArray 可以轻松成为性能最高的数字库之一。

路线图

0.1: 基本 API
0.2: 可微编程

实际上可以在任何时候开始,尽管在实现各种操作(例如 dot)或归约(例如 summean)之前,它不会那么有用。

0.3: 线性代数优化

元信息

Cristian Garcia – cgarcia.e88@gmail.com

在 MIT 许可证下分发。 有关更多信息,请参见 LICENSE。