MindSpore基本原理

MindSpore介绍

MindSpore是一种适用于端边云场景的新型开源深度学习训练/推理框架。 MindSpore提供了友好的设计和高效的执行,旨在提升数据科学家和算法工程师的开发体验,并为Ascend AI处理器提供原生支持,以及软硬件协同优化。

同时,MindSpore作为全球AI开源社区,致力于进一步开发和丰富AI软硬件应用生态。

自动微分

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

  • 基于静态计算图的转换:编译时将网络转换为静态数据流图,将链式法则应用于数据流图,实现自动微分。
  • 基于动态计算图的转换:记录算子过载正向执行时,网络的运行轨迹,对动态生成的数据流图,应用链式法则,实现自动微分。
  • 基于源码的转换:该技术是从功能编程框架演进而来,以即时编译(Just-in-time Compilation,JIT)的形式,对中间表达式(程序在编译过程中的表达式)进行自动差分转换,支持复杂的控制流场景、高阶函数和闭包。

TensorFlow早期采用的是静态计算图,PyTorch采用的是动态计算图。静态映射可以利用静态编译技术,来优化网络性能,但是构建网络或调试网络非常复杂。动态图的使用非常方便,但很难实现性能的极限优化。

MindSpore找到了另一种方法,即基于源代码转换的自动微分。一方面,它支持自动控制流的自动微分,像PyTorch这样的模型构建非常方便。另一方面,MindSpore可以对神经网络进行静态编译优化,以获得更好的性能。

MindSpore自动微分的实现可以理解为程序本身的符号微分。MindSpore IR是一个函数中间表达式,它与基础代数中的复合函数具有直观的对应关系。复合函数的公式由任意可推导的基础函数组成。MindSpore IR中的每个原语操作都可以对应基础代数中的基本功能,从而可以建立更复杂的流控制。

自动并行

MindSpore自动并行的目的,构建数据并行、模型并行和混合并行相结合的训练方法。该方法能够自动选择开销最小的模型切分策略,实现自动分布并行训练。

目前MindSpore采用的是算子切分的细粒度并行策略,即图中的每个算子被切分为一个集群,完成并行操作。在此期间的切分策略可能非常复杂,但是作为一名Python开发者,无需关注底层实现,只要顶层API计算是有效的即可。

安装

pip方式安装

MindSpore提供跨多个后端的构建选项:

硬件平台

操作系统

状态

Ascend 910

Ubuntu-x86

 

Ubuntu-aarch64

 

EulerOS-aarch64

 

CentOS-x86

 

CentOS-aarch64

GPU CUDA 10.1

Ubuntu-x86

CPU

Ubuntu-x86

 

Ubuntu-aarch64

 

Windows-x86

使用pip命令安装,以CPU和Ubuntu-x86build版本为例:

  1. 请从MindSpore下载页面下载并安装whl包。

pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.1.0/MindSpore/cpu/ubuntu_x86/mindspore-1.1.0-cp37-cp37m-linux_x86_64.whl

  1. 执行以下命令,验证安装结果。
  1. import numpy as np
  2. import mindspore.context as context
  3. import mindspore.nn as nn
  4. from mindspore import Tensor
  5. from mindspore.ops import operations as P
  6. context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
  7. 10.

11. class Mul(nn.Cell):

  1. 12.     def __init__(self):
  2. 13.         super(Mul, self).__init__()
  3. 14.         self.mul = P.Mul()
  4. 15.
  5. 16.     def construct(self, x, y):
  6. 17.         return self.mul(x, y)
  7. 18.

19. x = Tensor(np.array([1.0, 2.0, 3.0]).astype(np.float32))

20. y = Tensor(np.array([4.0, 5.0, 6.0]).astype(np.float32))

  1. 21.

22. mul = Mul()

print(mul(x, y))

[ 4. 10. 18.]

使用pip方式,在不同的环境安装MindSpore,可参考以下文档。

源码编译方式安装

使用源码编译方式,在不同的环境安装MindSpore,可参考以下文档。

Docker镜像

MindSpore的Docker镜像托管在Docker Hub上。 目前容器化构建选项支持情况如下:

硬件平台

Docker镜像仓库

标签

说明

CPU

mindspore/mindspore-cpu

x.y.z

已经预安装MindSpore x.y.z CPU版本的生产环境。

   

devel

提供开发环境从源头构建MindSpore(CPU后端)。安装详情请参考https://www.mindspore.cn/install 。

   

runtime

提供运行时环境安装MindSpore二进制包(CPU后端)。

GPU

mindspore/mindspore-gpu

x.y.z

已经预安装MindSpore x.y.z GPU版本的生产环境。

   

devel

提供开发环境从源头构建MindSpore(GPU CUDA10.1后端)。安装详情请参考https://www.mindspore.cn/install 。

   

runtime

提供运行时环境安装MindSpore二进制包(GPU CUDA10.1后端)。

Ascend

即将推出,敬请期待。

注意: 不建议从源头构建GPU devel Docker镜像后直接安装whl包。强烈建议在GPU runtime Docker镜像中传输,并安装whl包。

  • CPU

对于CPU后端,可以直接使用以下命令获取并运行最新的稳定镜像:

docker pull mindspore/mindspore-cpu:1.1.0

docker run -it mindspore/mindspore-cpu:1.1.0 /bin/bash

  • GPU

对于GPU后端,确保nvidia-container-toolkit已经提前安装,以下是Ubuntu用户安装指南:

DISTRIBUTION=$(. /etc/os-release; echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -

curl -s -L https://nvidia.github.io/nvidia-docker/$DISTRIBUTION/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit nvidia-docker2

sudo systemctl restart docker

编辑文件 daemon.json:

$ vim /etc/docker/daemon.json

{

"runtimes": {

"nvidia": {

"path": "nvidia-container-runtime",

"runtimeArgs": []

}

}

}

再次重启docker:

sudo systemctl daemon-reload

sudo systemctl restart docker

使用以下命令获取并运行最新的稳定镜像:

docker pull mindspore/mindspore-gpu:1.1.0

docker run -it -v /dev/shm:/dev/shm --runtime=nvidia --privileged=true mindspore/mindspore-gpu:1.1.0 /bin/bash

要测试Docker是否正常工作,运行下面的Python代码并检查输出:

import numpy as np

import mindspore.context as context

from mindspore import Tensor

from mindspore.ops import functional as F

context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU")

x = Tensor(np.ones([1,3,3,4]).astype(np.float32))

y = Tensor(np.ones([1,3,3,4]).astype(np.float32))

print(F.tensor_add(x, y))

[[[ 2.  2.  2.  2.],

[ 2.  2.  2.  2.],

[ 2.  2.  2.  2.]],

[[ 2.  2.  2.  2.],

[ 2.  2.  2.  2.],

[ 2.  2.  2.  2.]],

[[ 2.  2.  2.  2.],
[ 2. 2. 2. 2.],
[ 2. 2. 2. 2.]]]

最新文章

  1. UVALive 6916---Punching Robot(卢卡斯+容斥)
  2. 项目管理、测试管理、代码bug 管理
  3. Delphi的Win32的API调用简单介绍
  4. MySQL的备份的一些策略和方法的总结
  5. Valid Sudoku leetcode
  6. CSUFT 1003 All Your Base
  7. Subsequence
  8. memcpy与memmove区别
  9. MongoDB源码分析——mongo与JavaScript交互
  10. 136 Single Number(找唯一数Medium)
  11. 【入门】安装Elasticsearch5.0 部署Head插件
  12. 剑指offer 5.栈和队列 用两个栈实现队列
  13. [Kubernetes]安装和配置kubectl
  14. 奶牛编号(Cowids) [NOIP模拟]
  15. express koa koa2 优缺点分析
  16. python + selenium 模块封装及参数化
  17. PHP中parent、this、self和static的区别
  18. 模型标准化——预测模型标记语言(PMML)
  19. JS 判断上传 文件 大小
  20. (文档)Shader.Find (在编译时,只包含那些使用中的shader或位置在"Resources"文件夹中shader)

热门文章

  1. 【Springboot】FastJson与Jackson全局序列化方式的配置和相关工具类
  2. 【JDK8】Java8 优雅的异步调用API CompletableFuture
  3. 【maven】下载阿里云上没有的依赖
  4. Nginx解决跨域问题(CORS)
  5. gitlab + php自动部署
  6. 使用Qt实现一个必应壁纸客户端
  7. Windows系统下consul的安装、启动、配置
  8. Visual Studio/VS中任务列表的妙用
  9. mysql 索引十连问| 剑指 offer - mysql
  10. [Python] 安装 & 常用命令