索尼昨天宣布开源了自己的神经网络库 NNabla,其中包含用于深度学习系统的 Python API 与用于嵌入式设备的 C++ API。彭博社也表示索尼正在加入谷歌、Facebook 和亚马逊等巨头的人工智能开发竞争。
神经网络是深度学习模型的核心,后者自 2012 年在图像识别领域获得突破性进展以来获得了人们的广泛关注。现在,深度学习已经在很多领域中获得应用,它不仅仅是一种图像识别的算法,也是一种用于建模的黑箱系统。
用于处理深度学习模型的架构各有不同:从小到大,从前馈到循环,从非监督到监督……对于深度学习技术的研究发展也有很快速度,新的架构、组件或神经网络每天都在出现。目前装备 GPU 的高性能深度学习计算机或集群,对于运行深度学习的移动设备、物联网设备的要求也在催生技术的发展。
索尼从 2010 年起就加入了深度学习的研究行列。这次开源的深度学习核心库已是其研究成果的第三代了,它包含以下特性:
- CUDA 兼容性。
- 它拥有 Python API,因此最大化了设计神经网络模型的灵活性,并且还能支持快速的原型设计和测试。
- 同时支持静态和动态计算图(computation graphs)。静态计算图在速度和内存上有更高的效率,而动态计算图在设计模型上更加灵活。
- 有各种内置的神经网络模块,如函数、算子和优化器等。该神经网络库的模块软件架构允许开发者添加新的模块,因此开发者可以基于新的研究思路实现更快的原型设计、产品或服务部署。
- 它由轻便、轻量的 C++11 核所编写,并能在多个平台上运行。该框架已经在 Linux (Ubuntu 16.04) 和 Windows (8, 10) 上进行了测试。
- 极高的速度和内存效率。计算图引擎允许安全的原位计算(in-place computation)和内存分享,这将极大地将少内存的占用。因此该框架的设计仅采用少量的计算负载就能执行前向和后向传播。
- 为各种计算方案而设计的解耦合实现(Decoupled implementation)接口允许为每一个计算方案提供插件式的开发方案。开发者可以更关注函数算子实际计算的特定实现,而不用管计算图引擎与其内存优化等。
索尼官方将很快发出更具体更详细的神经网络库使用方法。
索尼表示他们的神经网络库提供了最基本的深度学习开发研究和部署的函数。他们希望该软件库能推动人工智能的发展,并且不论是在先进研究领域还是前沿应用部署上都能提供强有力的助力。
- 项目地址:https://github.com/sony/nnabla
- 说明文档:https://nnabla.readthedocs.io/
- 项目官网:https://nnabla.org/
下面是该神经网络库的 Github 项目介绍:
NNabla 是一个深度学习框架,计划在研究,开发与生产领域当中使用。索尼的目标是让它可以在任何地方运行,就像个人笔记本电脑、高性能计算集群、嵌入式装置和生产服务器一样。因此索尼希望通过提供高效便捷的机器学习库而将算法嵌入到边缘设备中。
安装
安装 NNabla 很简单:
pip install nnabla
这是 CPU 版本的 NNabla,GPU-加速器可以通过安装 CUDA 工具包来添加:pip install nnabla-ext-cuda
特征
简单,灵活并且有表现力
基于 NNabla C++11 内核的 Python API 给你提供了灵活性和高产出效率。例如,一个带有分类损失的两层神经网络可以仅通过以下 5 行代码被定义(超参数由<>括出)。
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
x = nn.Variable(<input_shape>) t = nn.Variable(<target_shape>) h = F.tanh(PF.affine(x, <hidden_size>, name='affine1')) y = PF.affine(h, <target_size>, name='affine2') loss = F.mean(F.softmax_cross_entropy(y, t))
训练可以通过以下步骤来完成:
import nnabla.solvers as S
# Create a solver (parameter updater)
solver = S.Adam(<solver_params>) solver.set_parameters(nn.get_parameters())
# Training iteration
for n in range(<num_training_iterations>):
# Setting data from any data source x.d = <set data> t.d = <set label> # Initialize gradients solver.zero_grad()
# Forward and backward execution loss.forward() loss.backward()
# Update parameters by computed gradients solver.update()
动态计算图使网络结构的执行时间变得灵活。NNabla 可以使用静态和动态图的模型,在两种情况下都使用相同的 API。
x.d = <set data>
t.d = <set label>
drop_depth = np.random.rand(<num_stochastic_layers>) < <layer_drop_ratio>
with nn.auto_forward(): h = F.relu(PF.convolution(x, <hidden_size>, (3, 3), pad=(1, 1), name='conv0'))
for i in range(<num_stochastic_layers>):
if drop_depth[i]:
continue # Stochastically drop a layer h2 = F.relu(PF.convolution(x, <hidden_size>, (3, 3), pad=(1, 1), name='conv%d' % (i + 1))) h = F.add2(h, h2) y = PF.affine(h, <target_size>, name='classification') loss = F.mean(F.softmax_cross_entropy(y, t))
# Backward computation (can also be done in dynamically executed graph)
loss.backward()
便携式和多平台
- Python API 能够在 Linux 和 Windows 上使用。
- 大多数函数库的代码都是使用 C++11 写的,所以可以部署到嵌入设备中。
可扩展性
- 可以像神经网络运算符和优化器那样添加新的模块。
- 该软件库允许开发者添加特定的实现(如在 FPGA 上的实现等)。例如我们提供 CUDA 后端作为扩展,这将可以利用 GPU 加速计算来加速算法。
高效性
- 在单块 CUDA GPU 上速度极快
- 内存优化引擎
- 支持多 GPU(即将可用)
文档
- https://nnabla.readthedocs.org
安装
- https://nnabla.readthedocs.io/en/latest/python/installation.html
入门指南
- 在 tutorial 页面中可以找到很多 Jupyter notebook 教程。我们建议由 by_examples.ipynb 开始在 NNabla 学习第一个案例,python_api.ipynb 文档介绍了 NNabla API。
- 我们同样在 examples 中提供了一些其他复杂的案例。