网站建设模板图片,网站开发实现前后端分离,wordpress设置阅读全文,网站301了不知道在哪做的昇思MindSpore介绍
昇思MindSpore是一个全场景深度学习框架#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中#xff0c;易开发表现为API友好、调试难度低#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率#xff1b;全场景则指框架…昇思MindSpore介绍
昇思MindSpore是一个全场景深度学习框架旨在实现易开发、高效执行、全场景统一部署三大目标。 其中易开发表现为API友好、调试难度低高效执行包括计算效率、数据预处理效率和分布式训练效率全场景则指框架同时支持云、边缘以及端侧场景。 昇思MindSpore总体架构如下图所示
ModelZoo模型库ModelZoo提供可用的深度学习算法网络也欢迎更多开发者贡献新的网络(ModelZoo地址)。MindSpore Extend扩展库昇思MindSpore的领域扩展库支持拓展新领域场景如GNN/深度概率编程/强化学习等期待更多开发者来一起贡献和构建。MindSpore Science科学计算MindScience是基于昇思MindSpore融合架构打造的科学计算行业套件包含了业界领先的数据集、基础模型、预置高精度模型和前后处理工具加速了科学行业应用开发。MindExpression全场景统一API基于Python的前端表达与编程接口支持两个融合函数/OOP编程范式融合、AI数值计算表达融合以及两个统一动静表达统一、单机分布式表达统一。第三方前端支持第三方多语言前端表达未来计划陆续提供C/C等第三方前端的对接工作引入更多的第三方生态。MindSpore Data数据处理层提供高效的数据处理、常用数据集加载等功能和编程接口支持用户灵活地定义处理注册和pipeline并行优化。MindCompilerAI编译器图层的核心编译器主要基于端云统一的MindIR实现三大功能包括硬件无关的优化类型推导、自动微分、表达式化简等、硬件相关优化自动并行、内存优化、图算融合、流水线执行等、部署推理相关的优化量化、剪枝等。MindRT全场景运行时昇思MindSpore的运行时系统包含云侧主机侧运行时系统、端侧以及更小IoT的轻量化运行时系统。MindSpore Insight可视化调试调优工具昇思MindSpore的可视化调试调优工具能够可视化地查看训练过程、优化模型性能、调试精度问题、解释推理结果了解更多)。MindSpore Armour安全增强库面向企业级运用时安全与隐私保护相关增强功能如对抗鲁棒性、模型安全测试、差分隐私训练、隐私泄露风险评估、数据漂移检测等技术了解更多。
执行流程
有了对昇思MindSpore总体架构的了解后我们可以看看各个模块之间的整体配合关系具体如图所示 昇思MindSpore作为全场景AI框架所支持的有端手机与IOT设备、边基站与路由设备、云服务器场景的不同系列硬件包括昇腾系列产品、英伟达NVIDIA系列产品、Arm系列的高通骁龙、华为麒麟的芯片等系列产品。 左边蓝色方框的是MindSpore主体框架主要提供神经网络在训练、验证过程中相关的基础API功能另外还会默认提供自动微分、自动并行等功能。 蓝色方框往下是MindSpore Data模块可以利用该模块进行数据预处理包括数据采样、数据迭代、数据格式转换等不同的数据操作。在训练的过程会遇到很多调试调优的问题因此有MindSpore Insight模块对loss曲线、算子执行情况、权重参数变量等调试调优相关的数据进行可视化方便用户在训练过程中进行调试调优。 AI安全最简单的场景就是从攻防的视角来看例如攻击者在训练阶段掺入恶意数据影响AI模型推理能力于是MindSpore推出了MindSpore Armour模块为MindSpore提供AI安全机制。 蓝色方框往上的内容跟算法开发相关的用户更加贴近包括存放大量的AI算法模型库ModelZoo提供面向不同领域的开发工具套件MindSpore DevKit另外还有高阶拓展库MindSpore Extend这里面值得一提的就是MindSpore Extend中的科学计算套件MindSciencesMindSpore首次探索将科学计算与深度学习结合将数值计算与深度学习相结合通过深度学习来支持电磁仿真、药物分子仿真等等。 神经网络模型训练完后可以导出模型或者加载存放在MindSpore Hub中已经训练好的模型。接着有MindIR提供端云统一的IR格式通过统一IR定义了网络的逻辑结构和算子的属性将MindIR格式的模型文件 与硬件平台解耦实现一次训练多次部署。因此如图所示通过IR把模型导出到不同的模块执行推理。
设计理念 支持全场景统一部署 昇思MindSpore源于全产业的最佳实践向数据科学家和算法工程师提供了统一的模型训练、推理和导出等接口支持端、边、云等不同场景下的灵活部署推动深度学习和科学计算等领域繁荣发展。 提供Python编程范式简化AI编程 昇思MindSpore提供了Python编程范式用户使用Python原生控制逻辑即可构建复杂的神经网络模型AI编程变得简单。 提供动态图和静态图统一的编码方式 目前主流的深度学习框架的执行模式有两种分别为静态图模式和动态图模式。静态图模式拥有较高的训练性能但难以调试。动态图模式相较于静态图模式虽然易于调试但难以高效执行。 昇思MindSpore提供了动态图和静态图统一的编码方式大大增加了静态图和动态图的可兼容性用户无需开发多套代码仅变更一行代码便可切换动态图/静态图模式用户可拥有更轻松的开发调试及性能体验。例如 设置set_context(modePYNATIVE_MODE)可切换成动态图模式。 设置set_context(modeGRAPH_MODE)可切换成静态图模式。 采用AI和科学计算融合编程使用户聚焦于模型算法的数学原生表达 在友好支持AI模型训练推理编程的基础上扩展支持灵活自动微分编程能力支持对函数、控制流表达情况下的微分求导和各种如正向微分、高阶微分等高级微分能力的支持用户可基于此实现科学计算常用的微分函数编程表达从而支持AI和科学计算融合编程开发。 分布式训练原生 随着神经网络模型和数据集的规模不断增大分布式并行训练成为了神经网络训练的常见做法但分布式并行训练的策略选择和编写十分复杂这严重制约着深度学习模型的训练效率阻碍深度学习的发展。MindSpore统一了单机和分布式训练的编码方式开发者无需编写复杂的分布式策略在单机代码中添加少量代码即可实现分布式训练提高神经网络训练效率大大降低了AI开发门槛使用户能够快速实现想要的模型。 例如设置set_auto_parallel_context(parallel_modeParallelMode.AUTO_PARALLEL)便可自动建立代价模型为用户选择一种较优的并行模式。
层次结构
昇思MindSpore向用户提供了3个不同层次的API支撑用户进行AI应用算法/模型开发从高到低分别为High-Level Python API、Medium-Level Python API以及Low-Level Python API。高阶API提供了更好的封装性低阶API提供更好的灵活性中阶API兼顾灵活及封装满足不同领域和层次的开发者需求。 High-Level Python API 第一层为高阶API其在中阶API的基础上又提供了训练推理的管理、混合精度训练、调试调优等高级接口方便用户控制整网的执行流程和实现神经网络的训练推理及调优。例如用户使用Model接口指定要训练的神经网络模型和相关的训练设置对神经网络模型进行训练。 Medium-Level Python API 第二层为中阶API其封装了低阶API提供网络层、优化器、损失函数等模块用户可通过中阶API灵活构建神经网络和控制执行流程快速实现模型算法逻辑。例如用户可调用Cell接口构建神经网络模型和计算逻辑通过使用Loss模块和Optimizer接口为神经网络模型添加损失函数和优化方式利用Dataset模块对数据进行处理以供模型的训练和推导使用。 Low-Level Python API 第三层为低阶API主要包括张量定义、基础算子、自动微分等模块用户可使用低阶API轻松实现张量定义和求导计算。例如用户可通过Tensor接口自定义张量使用grad接口计算函数在指定处的导数。
华为昇腾AI全栈介绍
昇腾计算是基于昇腾系列处理器构建的全栈AI计算基础设施及应用包括昇腾Ascend系列芯片、Atlas系列硬件、CANN芯片使能、MindSpore AI框架、ModelArts、MindX应用使能等。 华为Atlas人工智能计算解决方案是基于昇腾系列AI处理器通过模块、板卡、小站、服务器、集群等丰富的产品形态打造面向“端、边、云”的全场景AI基础设施方案涵盖数据中心解决方案、智能边缘解决方案覆盖深度学习领域推理和训练全流程。
昇腾AI全栈如下图所示 下面简单介绍每个模块的作用
昇腾应用使能华为各大产品线基于MindSpore提供的AI平台或服务能力MindSpore支持端、边、云独立的和协同的统一训练和推理框架CANN昇腾芯片使能、驱动层了解更多。计算资源昇腾系列化IP、芯片和服务器
快速入门
引入MindSpore库
import mindspore
from mindspore import nn
from mindspore.dataset import vision, transforms
from mindspore.dataset import MnistDataset处理数据集 MindSpore提供基于Pipeline的数据引擎通过数据集Dataset和数据变换Transforms实现高效的数据预处理。在本教程中我们使用Mnist数据集自动下载完成后使用mindspore.dataset提供的数据变换进行预处理。
# Download data from open datasets
from download import downloadurl https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/ \notebook/datasets/MNIST_Data.zip
path download(url, ./, kindzip, replaceTrue)获得数据集对象
train_dataset MnistDataset(MNIST_Data/train)
test_dataset MnistDataset(MNIST_Data/test)打印数据集中包含的数据列名用于dataset的预处理。
print(train_dataset.get_col_names())运行结果
[image, label]MindSpore的dataset使用数据处理流水线Data Processing Pipeline需指定map、batch、shuffle等操作。这里我们使用map对图像数据及标签进行变换处理然后将处理好的数据集打包为大小为64的batch。
def datapipe(dataset, batch_size):image_transforms [vision.Rescale(1.0 / 255.0, 0),vision.Normalize(mean(0.1307,), std(0.3081,)),vision.HWC2CHW()]label_transform transforms.TypeCast(mindspore.int32)dataset dataset.map(image_transforms, image)dataset dataset.map(label_transform, label)dataset dataset.batch(batch_size)return dataset# Map vision transforms and batch dataset
train_dataset datapipe(train_dataset, 64)
test_dataset datapipe(test_dataset, 64)可使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问查看数据和标签的shape和datatype。 API文档地址 create_tuple_iterator create_dict_iterator
for image, label in test_dataset.create_tuple_iterator():print(fShape of image [N, C, H, W]: {image.shape} {image.dtype})print(fShape of label: {label.shape} {label.dtype})break运行结果
Shape of image [N, C, H, W]: (64, 1, 28, 28) Float32
Shape of label: (64,) Int32for data in test_dataset.create_dict_iterator():print(fShape of image [N, C, H, W]: {data[image].shape} {data[image].dtype})print(fShape of label: {data[label].shape} {data[label].dtype})break运行结果
Shape of image [N, C, H, W]: (64, 1, 28, 28) Float32
Shape of label: (64,) Int32参考文档 数据集 Dataset 数据变换 Transforms
网络构建
mindspore.nn类是构建所有网络的基类也是网络的基本单元。当用户需要自定义网络时可以继承nn.Cell类并重写__init__方法和construct方法。__init__包含所有网络层的定义construct中包含数据Tensor的变换过程。
# Define model
class Network(nn.Cell):def __init__(self):super().__init__()self.flatten nn.Flatten()self.dense_relu_sequential nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))def construct(self, x):x self.flatten(x)logits self.dense_relu_sequential(x)return logitsmodel Network()
print(model)模型训练
在模型训练中一个完整的训练过程step需要实现以下三步
正向计算模型预测结果logits并与正确标签label求预测损失loss。反向传播利用自动微分机制自动求模型参数parameters对于loss的梯度gradients。参数优化将梯度更新到参数上。
MindSpore使用函数式自动微分机制因此针对上述步骤需要实现
定义正向计算函数。使用value_and_grad通过函数变换获得梯度计算函数。定义训练函数使用set_train设置为训练模式执行正向计算、反向传播和参数优化。
# Instantiate loss function and optimizer
loss_fn nn.CrossEntropyLoss()
optimizer nn.SGD(model.trainable_params(), 1e-2)# 1. Define forward function
def forward_fn(data, label):logits model(data)loss loss_fn(logits, label)return loss, logits# 2. Get gradient function
grad_fn mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_auxTrue)# 3. Define function of one-step training
def train_step(data, label):(loss, _), grads grad_fn(data, label)optimizer(grads)return lossdef train(model, dataset):size dataset.get_dataset_size()model.set_train()for batch, (data, label) in enumerate(dataset.create_tuple_iterator()):loss train_step(data, label)if batch % 100 0:loss, current loss.asnumpy(), batchprint(floss: {loss:7f} [{current:3d}/{size:3d}])除训练外我们定义测试函数用来评估模型的性能。
def test(model, dataset, loss_fn):num_batches dataset.get_dataset_size()model.set_train(False)total, test_loss, correct 0, 0, 0for data, label in dataset.create_tuple_iterator():pred model(data)total len(data)test_loss loss_fn(pred, label).asnumpy()correct (pred.argmax(1) label).asnumpy().sum()test_loss / num_batchescorrect / totalprint(fTest: \n Accuracy: {(100*correct):0.1f}%, Avg loss: {test_loss:8f} \n)训练过程需多次迭代数据集一次完整的迭代称为一轮epoch。在每一轮遍历训练集进行训练结束后使用测试集进行预测。打印每一轮的loss值和预测准确率Accuracy可以看到loss在不断下降Accuracy在不断提高。
epochs 3
for t in range(epochs):print(fEpoch {t1}\n-------------------------------)train(model, train_dataset)test(model, test_dataset, loss_fn)
print(Done!)参考文档: 模型训练
加载模型¶
加载保存的权重分为两步
重新实例化模型对象构造模型。加载模型参数并将其加载至模型上。
# Instantiate a random initialized model
model Network()
# Load checkpoint and load parameter to model
param_dict mindspore.load_checkpoint(model.ckpt)
param_not_load, _ mindspore.load_param_into_net(model, param_dict)
print(param_not_load)param_not_load是未被加载的参数列表为空时代表所有参数均加载成功。
加载后的模型可以直接用于预测推理。
model.set_train(False)
for data, label in test_dataset:pred model(data)predicted pred.argmax(1)print(fPredicted: {predicted[:10]}, Actual: {label[:10]})break参考文档 保存与加载
附录
显示名字和学习时间代码
import time
print(time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(time.time())),JeffDing)心得
通过第一天的学习对于MindSpore框架的一些基础知识和MindSpore的架构有了一些了解通过一个简单的demo对于MindSpore的数据集处理、网络构建、模型训练以及模型推理的一些基础代码有了一些了解这些对于后面学好MindSpore相关会有所帮助。