专栏首页机器之心华为深度学习框架MindSpore正式开源:自动微分不止计算图

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

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

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

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

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

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

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

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

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

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

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

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

自动微分:不止计算图

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

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

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

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

将 Python 代码解析为计算图。

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

  • 基于静态计算图的转换:将网络在编译时转换为静态数据流图,然后将链式法则应用于数据流图,并实现自动微分。
  • 基于动态计算图的转换:以操作符重载的方式记录网络在前向执行时操作轨迹,然后将链式法则应用于动态生成的数据流图,并实现自动微分。
  • 基于源码转换:该技术源以函数式编程框架为基础,以即时编译(JIT)的方式在中间表达(编译过程中程序的表达形式)上做自动微分变换,支持复杂控制流场景、高阶函数和闭包。

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

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

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

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

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

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

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

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

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

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

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

除了自动微分与自动并行,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% 以上。

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

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

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

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

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

本文分享自微信公众号 - 机器之心(almosthuman2014),作者:Synced

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NLP小白入门篇:莫愁前路,一文读懂语料预处理

    机器能跟人类交流吗?能像人类一样理解文本吗?这是大家对人工智能最初的想象。如今,NLP 技术可以充当人类和机器之间沟通的桥梁。环顾周围的生活,我们随时可以享受到...

    机器之心
  • 教程 | 摄影爱好者玩编程:利用Python和OpenCV打造专业级长时曝光摄影图

    选自pyimagesearch 机器之心编译 参与:乾树、蒋思源 在本文中,我们将学习如何使用 OpenCV 和图像处理技术来模拟长时曝光图像。为了模拟长时曝...

    机器之心
  • 自动微分到底是什么?这里有一份自我简述

    自动微分现在已经是深度学习框架的标配,我们写的任何模型都需要靠自动微分机制分配模型损失信息,从而更新模型。在广阔的科学世界中,自动微分也是必不可少的。说到底,大...

    机器之心
  • SLua-Lua调用自定义C#类

    在Lua中通过Resources.load加载一个图片只能得到testure2D,而我们使用UGUI想改变Image的图片的时候需要的是Sprite图片,这时我...

    祝你万事顺利
  • @马斯克:只凭一个摄像头,3D目标检测成绩也能媲美激光雷达

    靠一个摄像头拍下的图像做3D目标检测,究竟有多难?目前最先进系统的成绩也不及用激光雷达做出来的1/10。

    量子位
  • @马斯克:只凭一个摄像头,3D目标检测成绩也能媲美激光雷达

    靠一个摄像头拍下的图像做3D目标检测,究竟有多难?目前最先进系统的成绩也不及用激光雷达做出来的1/10。

    量子位
  • geotrellis使用(六)Scala并发(并行)编程

          本文主要讲解Scala的并发(并行)编程,那么为什么题目概称geotrellis使用(六)呢,主要因为本系列讲解如何使用Geotrellis,具体前...

    魏守峰
  • 软件系统数据字典

    表设计时达到的目标:使配置的数据(字典名称,字典值),不因数据的改变,影响数据的存储(这样就需要设计字典名称的code、字典 值的code,来表示它们的唯一标识...

    李郑
  • 史上最全PostgreSQL体系结构

    墨墨导读:本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来讨论PostgreSQL的结构。

    数据和云
  • k8s源码分析-----kubelet(4)imageManager

    第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

    月牙寂道长

扫码关注云+社区

领取腾讯云代金券