Arraymancer简介
Arraymancer是一个用Nim语言编写的强大的张量和深度学习库。它的主要目标是提供一个快速、人体工程学和可移植的多维数组(ndarray)库,可以用来构建科学计算生态系统。该项目受到NumPy和PyTorch的启发,针对以下用例:
- 用于数值计算的N维数组(张量)
- 机器学习算法(如scikit-learn中的最小二乘求解器、PCA和降维、分类器、回归器和聚类算法、交叉验证等)
- 深度学习
Arraymancer的多维数组组件可以独立于机器学习和深度学习组件使用。它还可以使用OpenMP、CUDA或OpenCL后端。
主要特性
Arraymancer提供了丰富的功能,包括但不限于:
- 基本数学运算扩展到张量(sin、cos等)
- 矩阵代数原语:矩阵-矩阵、矩阵-向量乘法
- 简单高效的切片操作,支持范围和步长
- 无需担心"向量化"操作
- 支持广播。与NumPy不同,它是显式的,只需使用
+.
而不是+
- 丰富的重塑操作:concat、reshape、split、chunk、permute、transpose等
- 支持最多6维的张量
- 可以读写.csv、NumPy(.npy)和HDF5文件
- OpenCL和CUDA支持的张量(目前功能不如CPU张量丰富)
- 协方差矩阵
- 特征值和特征向量分解
- 最小二乘求解器
- K-means和PCA(主成分分析)
深度学习功能
Arraymancer还提供了一系列深度学习相关的功能:
- 全连接层(也称为Dense、Affine或Linear层)
- 卷积神经网络
- 循环神经网络(如GRU)
- 自动微分
- 优化器(如SGD)
- 损失函数
以下是一个简单的两层神经网络示例:
import arraymancer, strformat
network TwoLayersNet:
layers:
fc1: Linear(D_in, H)
fc2: Linear(H, D_out)
forward x:
x.fc1.relu.fc2
let
model = ctx.init(TwoLayersNet)
optim = model.optimizer(SGD, learning_rate = 1e-4'f32)
for t in 0 ..< 500:
let
y_pred = model.forward(x)
loss = y_pred.mse_loss(y)
echo &"Epoch {t}: loss {loss.value[0]}"
loss.backprop()
optim.update()
为什么选择Arraymancer?
-
性能:Arraymancer可以达到与C语言相当的速度。
-
加速:可以利用Intel MKL/OpenBLAS甚至NNPACK进行加速计算。
-
GPU支持:可以访问CUDA和CuDNN,并通过元编程动态生成自定义CUDA内核。
-
依赖少:几乎无依赖的发布(只需要BLAS库)。
-
语法友好:Python风格的语法,支持自定义运算符如
a * b
用于张量乘法。 -
切片操作:类似NumPy的切片语法,如
t[0..4, 2..10|2]
。 -
扩展性:对于Nim还不支持的功能,可以使用Nim绑定C、C++、Objective-C或Javascript来实现。
安装和使用
Arraymancer可以通过Nim的包管理器nimble安装:
nimble install arraymancer
Arraymancer需要BLAS和LAPACK库。在不同系统上的安装方法:
- Windows:可以从OpenBLAS网站下载合并了BLAS和LAPACK的DLL
- MacOS:Apple Accelerate Framework已经包含在所有MacOS版本中
- Linux:可以通过包管理器安装libopenblas和liblapack
未来展望
Arraymancer的未来目标包括:
- 成为深度学习视频处理的首选工具
- 支持JavaScript、WebAssembly、Apple Metal、ARM设备、AMD ROCm、OpenCL等多种平台
- 作为星际争霸II AI机器人的基础
- 针对加密矿机FPGA优化,以应对GPU价格上涨问题
总的来说,Arraymancer通过Nim语言的强大功能,为科学计算和深度学习提供了一个高效、灵活且易用的解决方案。它弥合了深度学习研究和生产之间的差距,为开发人员和研究人员提供了一个强大的工具。