17

华为深度学习框架MindSpore正式开源:自动微分不止计算图

 4 years ago
source link: https://www.jiqizhixin.com/articles/2020-03-28
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

千呼万唤始出来——3 月 28 日,华为的全栈全场景 AI 计算框架 MindSpore 终于正式开源了。

今年的华为开发者大会 HDC 2020 上,除了昇腾、鲲鹏等自研芯片硬件平台之外,最令人期待的就是深度学习框架 MindSpore 的开源了。今天上午,华为MindSpore 首席科学家陈雷在活动中宣布这款产品正式开源,我们终于可以在开放平台上一睹它的真面目。

作为一款「全场景 AI 框架」,MindSpore 是华为人工智能解决方案的重要组成部分,与TensorFlow、PyTorch、PaddlePaddle 等流行深度学习框架对标,旨在大幅度降低 AI 应用开发门槛,让人工智能无处不在。

MindSpore 是一款支持端、边、云独立/协同的统一训练和推理框架。华为希望通过这款完整的软件堆栈,实现一次性算子开发、一致的开发和调试体验,以此帮助开发者实现一次开发,应用在所有设备上平滑迁移的能力。

原生支持 AI 芯片,全场景一致的开发体验——除了这些我们早已知晓的强大之处外,今天华为还着重展示了 MindSpore 的三大创新能力:新编程范式,执行模式和协作方式。

Mzi2uev.png!web

今天发布的 MindSpore 首个开源版本为 0.1.0-alpha 版,主要由自动微分、自动并行、数据处理等功能构成。华为表示,MindSpore 具备开发算法即代码、运行高效、部署态灵活的特点,其核心分为三层:从下往上分别是后端运行时、计算图引擎及前端表示层。

MindSpore 开源社区:https://www.mindspore.cn/

MindSpore 代码:https://gitee.com/mindspore

从整体上来说,MindSpore 搭建神经网络会以「单元」为中心,其中单元是张量和运算操作的集合。从输入张量开始,MindSpore 会提供各种算子以构造一个「单元」,最后模型封装这个单元就可以用来训练、推理了。

Z3IbqyY.png!web

MindSpore 的整体结构,从后端的硬件支持到前端 API,中间会涉及多种优化与特性。例如不采用计算图的自动微分、自动并行与优化计算过程等等。

MindSpore 最大的特点在于,其采用了业界最新的 Source-to-Source 自动微分,它能利用编译器及编程语言的底层技术,进一步优化以支持更好的微分表达。

自动微分:不止计算图

自动微分是深度学习框架的灵魂,有了它我们写模型就只需要关注前向传播,将所有复杂的求导、反传过程都留给框架。一般而言,自动微分指一种自动求某个函数其导数的方法。在机器学习中,这些导数可以更新权重。在更广泛的自然科学中,这些导数也能用于各种后续计算。

QzuemmA.png!web

人类擅长以解析式推导微分,计算机擅长数值微分。

一般而言,自动微分都是需要建立计算图的,有了计算图才能追踪各函数、变量的依赖情况,并进一步根据链式法则传递梯度。然而对于 MindSpore 来说,它并不依赖于计算图,而是通过一种名为「基于源码转换」的自动微分方法,它支持 if、for 等复杂的控制流结构,以及灵活的函数式编程方式。

自动微分本质上是解析变量间的依赖关系,并利用全微分法则与链式求导法则将梯度传递给不同的变量。

Q3qqAbm.jpg!web

将 Python 代码解析为计算图。

目前主流深度学习框架中主要有三种自动微分技术:

  • 基于静态计算图的转换:将网络在编译时转换为静态数据流图,然后将链式法则应用于数据流图,并实现自动微分。

  • 基于动态计算图的转换:以操作符重载的方式记录网络在前向执行时操作轨迹,然后将链式法则应用于动态生成的数据流图,并实现自动微分。

  • 基于源码转换:该技术源以函数式编程框架为基础,以即时编译(JIT)的方式在中间表达(编译过程中程序的表达形式)上做自动微分变换,支持复杂控制流场景、高阶函数和闭包。

其中 TF 早期采用的是静态计算图,PyTorch 采用的是动态计算图,静态图能利用静态编译技术对网络性能进行优化,然而搭建网络或 Debug 非常复杂。动态图的使用非常便捷,但性能上难以做到极致的优化。

MindSpore 走的是另外一条路,即基于源码转换的自动微分。它又支持对自动控制流的自动微分,所以与 PyTorch 一样构建模型非常方便。同时 MindSpore 能对神经网络做静态编译优化,因此性能也非常优秀。

基于源码转换的方法,是自动微分另一条康庄大道。

AbAFfyZ.png!web

源码转换的简要工作方式。

假设我们用 C 语言写函数,那么根据自动微分工具,函数的源代码会自动转换为另一种源代码,这种新生成的源代码包含了用于计算梯度的语句,它们可以直接编译。这样的源码到源码转换对于编译器非常友好,编译器在计算过程中也能进行优化。

MindSpore 自动微分的实现可以理解为对程序本身进行的符号微分,因为 MindSpore IR 是函数式的中间表达,它与基础代数中的复合函数有直观的对应关系,只要已知基础函数的求导公式,就能推导出由任意基础函数组成的复合函数的求导公式。MindSpore IR 中每个原语操作可以对应为基础代数中的基础函数,这些基础函数可以构建更复杂的流程控制。

自动并行训练:一切计算都交给它

如今的深度学习模型往往因为体量巨大而必须做并行化,MindSpore 能自动并行按照串行写的代码,自动实现分布式并行训练,并且保持高性能。

一般而言,并行训练可以分为模型并行与数据并行,数据并行比较好理解,每一个样本可以独立地完成前向传播,最后再汇总传播结果。相比之下,模型并行就比较复杂了,需要我们以「并行思维」这样的逻辑手动编写所有需要并行的部分。

MindSpore 自动并行的目标是构建一种融合了数据并行、模型并行和混合并行的训练方式。它会自动选择一种代价最小的模型切分方式,实现自动分布式并行训练。

目前 MindSpore 采用了切分算子细粒度的并行方式,即把图中每个算子都切分到集群而完成并行运算。这期间切分方式可能非常复杂,但作为崇尚 Pythonic 的开发者,并不需要关心底层实现,只需要顶层 API 计算高效就行了。

63y2i2B.png!web

除了自动微分与自动并行,MindSpore 还有很多优秀的特性与组件,完整的数据预处理模块、高效的图计算引擎都值得我们去探索。例如在数据预处理模块中,MindSpore 需要考虑如何提升数据预处理的能力,从而使其跟得上昇腾芯片消耗数据的速度。

当然可视化工具、模型评估工具等常用模块也都配齐了,除了常见的计算图、标量曲线等可视化,MindSpore 还能实现新颖的「模型溯源」,它会把学习率、损失值、模型大小等众多超参配置都画在一起,方便开发者调参。

MindSpore 代码什么样?

用 MindSpore 写模型,代码风格还是挺有特色的。之前介绍过,MindSpore 主要概念就是张量、算子、单元和模型,它提供的同样也是 Python 编程范式,因为采用 Source-to-Source 自动微分,Python 常用的元组、列表等数据结构还能用,匿名函数 Lambda 也没问题。

张量大家都了解了,MindSpore 中的算子可以是卷积,也可以是简单的加法。它们与张量一起可以构成「单元」,单元是所有神经网络单元的基本类。单元再封装就成了模型了,MindSpore 可以直接调用模型来训练与推理,也可以使用更底层的 API 构建复杂模型。

如下所示,我们可以发现写 MindSpore 有两个比较突出的亮点。首先当然是计算图的调整,动态图与静态图可以一行代码切换。在正常情况下,MindSpore 使用的是 PyNative 动态图,然而在需要静态图的时候,设置个 context 上下文管理器就可以了。

import numpy as np
import mindspore.context as context
import mindspore.nn as nn
from mindspore import Tensor

# Initialize the network
net = Net()
x = Tensor(np.random.rand(1, 1, 4, 1024).astype(np.float32))

# Predict the network in PyNative mode, by default
out = net(x)

# Change to Graph mode to predict the network
context.set_context(mode=context.GRAPH_MODE)
out = net(x)

对于自动并行特性,我们写的串行代码,只需要多加一行就能完成自动并行,这背后的复杂并行逻辑完全不需要花费精力去理解。

如下所示,只要设置运行环境为图模式,并允许使用分布式接口 HCCL(华为集合通信库),那么在初始化后 MindSpore 就能自动优化我们写的模型,以最好的并行策略加速整个训练过程。

import os
from mindspore import context
from mindspore.communication.management import init


if __name__ == "__main__":
 context.set_context(mode=context.GRAPH_MODE, 
 device_target="Ascend", 
 enable_hccl=True, 
 device_id=int(os.environ["DEVICE_ID"]))
 init()
 ... 

华为表示,MindSpore 原生适应所有的 AI 应用场景,并能在按需协同的基础上通过实现 AI 算法即代码,显著减少模型开发时间。以典型的 Transformer 为例,MindSpore 可降低核心代码量 20%,开发门槛大大降低,效率整体提升 50% 以上。

zMb6j2z.png!web

随着框架的开源,MindSpore 相关文档和教程均已在官网上线,并欢迎开发者提供反馈意见。

至于未来的发展方向,华为表示在开源后大部分工作都将交由社区自主完成:MindSpore 社区会按照社区章程进行运作,未来新版本计划会由各个特别兴趣组 (Special Interest Group, 简称 SIG) 输出,并交技术治理委员会 (Technical Steering Committee,简称 TSC) 决策并公示。

目前,MindSpore 技术治理委员会由来自依瞳科技、Conic AI、哈尔滨工业大学、华为、工商银行、帝国理工、中科院计算所、北京大学、清华大学、中国科技大学、爱丁堡大学、University Paris-Saclay、Universität Münster、西安电子科技大学等 14 名不同机构的代表组成。

为吸引开发者,华为还将启动一系列的开发者体验活动。

随着深度学习框架等工具的全面开源,「最强 AI 处理芯片」昇腾的落地,华为的 AI 布局已经逐渐清晰起来,MindSpore 将为各行业带来哪些新变化,让我们拭目以待。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK