代码
基于ms香橙派AIpro实现垃圾回收AI识别方案一:昇思MindSpore介绍

基于ms香橙派AIpro实现垃圾回收AI识别方案一:昇思MindSpore介绍

基于ms香橙派AIpro实现垃圾回收AI识别方案一:昇思MindSpore介绍

基于ms香橙派AIpro实现垃圾回收AI识别方案一:昇思MindSpore介绍

基于ms香橙派AIpro实现垃圾回收AI识别方案二:昇思MindSpore如何使用

基于ms香橙派AIpro实现垃圾回收AI识别方案三:昇思大模型平台jupyter快速入门体验

基于ms香橙派AIpro实现垃圾回收AI识别方案四:MindSpore应用实践 - 基于MobileNetv2的垃圾分类

基于ms香橙派AIpro实现垃圾回收AI识别方案五:香橙派OrangePi AIpro实践(基于MobileNetv2的垃圾分类)

基于ms香橙派AIpro实现垃圾回收AI识别方案六:SOWT分析与总结


一、前言:

随着AI人工智能、机器学习的不断发展,开发者的编程领域也在经历着一场前所未有的变革,在这个过程中,各行各业都开始不断的发展,包括金融、‌医疗、‌教育、‌工业、‌游戏、‌法律等多个行业,‌以及智能硬件领域,‌如智能汽车、‌机器人、‌智能终端等。‌

作者也是经过了以上几个阶段的软件开发历程,从Web时代编程、到云时代分布式编程,到如今的AI时代,AI技术的发展还带动了相关行业的创新和转型,‌如人工智能和机器学习技术的不断进步和应用范围的扩大,‌推动了社会进步和技术革新。‌随着算法的改进和计算能力的提升,‌AI技术的准确性和效率也在不断增强,‌为各行各业的发展提供了新的动力和支持。

AI技术的发展为各个领域带来了许多创新和便利。那么,在实际的应用中,如何正确的来使用AI进行提高效率呢,值得大家来思考一下?今天给大家分享华为的“昇思MindSpore”, 旨在实现易开发、高效执行、全场景统一部署三大目标,降低了AI开发者的开发门槛,非常适合各种场景的学习与实践,接下来,带大家一起来实际体验一下。


二、昇思MindSpore是什么?

昇思MindSpore是一个全场景深度学习AI框架,旨在实现易开发、高效执行、全场景统一部署三大目标,其中有三大优点:

  • ①. 易开发表现为API友好、调试难度低;
  • ②. 高效执行包括计算效率、数据预处理效率和分布式训练效率;
  • ③. 全场景则指框架同时支持云、边缘以及端侧场景。

昇思MindSpore着重提升易用性并降低AI开发者的开发门槛,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。


2.1 昇思MindSpore总体架构如下图所示:

  • ①. 多领域扩展:提供大模型套件、领域套件、AI4S套件,为用户提供开箱即用的模型与功能接口,便于用户基于套件的预置模型进行研发使用与参考实现。
  • ②. 开发态友好:表达层(MindExpression)为用户提供AI模型开发、训练、推理的接口,支持用户用原生 Python语法开发和调试神经网络,其特有的动静态图统一能力使开发者可以兼顾开发效率和执行性能,同时该层在生产和部署阶段提供全场景统一的C++/Python接口。
  • ③. 运行态高效:
    • 数据处理(MindSpore Data):提供高性能的数据加载、数据预处理功能。
    • 计算图构建(MindChute):提供多种构图机制,支持基于Python AST的计算图翻译构建,也支持基于Python字节码的计算图构建能力。
    • 编译优化(MindCompiler):静态图模式的关键模块,以全场景统一中间表达(MindIR)为媒介,将前端函数整体编译成执行效率更高的底层语言,同时进行全局性能优化,包括自动微分、代数化简等硬件无关优化,以及图算融合、算子生成等硬件相关优化。
  • ④. 动态图直调:动态图模式的关键模块,基于统一的Python表达层接口,匹配Python的解释执行模式,进行逐接口的解释执行,反向执行过程中会复用统一的自动微分功能。
  • ⑤. 全场景部署和多样性硬件:运行时(MindRT)按照上层编译优化的结果对接并调用底层硬件算子,同时通过“端-边-云”统一的运行时架构,支持包括联邦学习在内的“端-边-云”AI协同。
  • ⑥. 其他:面向轻量化推理的离线转换工具与轻量化推理引擎MindSpore Lite,以及调试调优工具、MindSpore Armour等,用户可根据需要选择使用。

2.2 各个模块之间的整体配合关系:

昇思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,科学计算套件MindSciences
    • MindSpore首次探索将科学计算与深度学习结合,将数值计算与深度学习相结合,通过深度学习来支持电磁仿真、药物分子仿真等等。
  • ⑤. 神经网络模型训练完后,可以导出模型或者加载存放在MindSpore Hub中已经训练好的模型。接着有MindIR提供端云统一的IR格式,通过统一IR定义了网络的逻辑结构和算子的属性,将MindIR格式的模型文件与硬件平台解耦,实现一次训练多次部署。因此如图所示,通过IR把模型导出到不同的模块执行推理。

2.3 小结:

昇思MindSpore是一款使能从算法研究到生产部署全流程的开源AI框架。开源至今,昇思MindSpore致力于提供更好的AI开发体验,关键特性和功能一直在持续演进和优化。

  • ①. 昇思MindSpore提供了高效的分布式并行原生能力,一行代码自动并行执行,实现千亿参数大模型训练。
  • ②. 支持图算深度融合,从图算分离优化到图算联合优化,充分发挥AI芯片的算力。
  • ③. 关于动静图的处理能力,从动静态图分离到动静统一,昇思MindSpore兼顾灵活开发与高效运行。
  • ④. AI+科学计算能力则使它成为了科学研究者的得力助手,并在生物分子、电磁、流体等领域具有广泛的应用。
  • ⑤. 企业级安全可信的特性则保证了数据和模型的安全性和可靠性,从消费级AI到企业级AI,打造AI可信生态。
  • ⑥. AI框架还支持多种编程范式,包括面向对象、函数式、函数式+面向对象融合等,让开发者可以根据自己的需求选择最适合的编程方式。

三、如何快速来实践一下昇思MindSpore大模型平台?

打开官方提供的示例:<<手写数字体识别-LeNet5>>

.
├── inference # 推理可视化相关代码
│   ├── app.py # 推理核心启动文件
│   ├── config.json # 推理权重文件配置
│   └── requirements.txt # 推理可视化相关依赖文件
└── train # 训练可视化相关代码
    ├── pip-requirements.txt # 训练相关依赖文件,必须和启动文件同一级
    ├── train_customize_aim.py # 自定义Aim训练代码,支持自定义评估
    ├── train_gridsearch.py # grid search + LossMonitor 训练代码,支持标准评估
    |── train_valaccmonitor.py # ValAccMonitor训练代码,支持标准评估
    └── train.py # LossMonitor训练代码,支持标准评估

注:建议将推理可视化相关的代码放在inference文件夹下,训练相关的代码放在train文件夹下。注意该项目下不能有lfs文件,否则会调度失败。

训练与评估:

3.1 评估方式1——训练日志可视化:

# train.py,支持标准评估
...
from mindvision.engine.callback import LossMonitor
...
# 训练网络模型
model.train(10, dataset_train, callbacks=[ckpoint, LossMonitor(0.01, 1875)])
...
# train_gridsearch.py,支持标准评估
...
# 训练代码
def train(args_opt):
# grid search
batch_size_choice = [32, 64, 128]
learning_rate_choice = [0.01, 0.001, 0.0001]
momentum_choice = [0.9, 0.99]
for batch_size in batch_size_choice:
for learning_rate in learning_rate_choice:
for momentum in momentum_choice:
...
# LossMonitor or ValAccMonitor
model.train(20, dataset_train, callbacks=[ckpoint, LossMonitor(learning_rate, steps)])
...

---

### 3.2 评估方式2——自定义评估:

评估方式1的评估指标有限,你也可以自己写评估代码,跟踪你想要关注的指标。比如下例train_customize_aim.py中以自定义Callback+Aim 跟踪指标 的方式跟踪每个epoch之后训练集和测试集的acc。

```js
# train_customize_aim.py
...
from aim import Run
...
# 自定义Callback
class AimCallback(Callback):
def __init__(self, model, dataset_test, aim_run):
super(AimCallback, self).__init__()
self.aim_run = aim_run # 传入aim实例
self.model = model # 传入model,用于eval
self.dataset_test = dataset_test # 传入dataset_test, 用于eval test
def step_end(self, run_context):
"""step end"""
cb_params = run_context.original_args()
# loss
epoch_num = cb_params.cur_epoch_num
step_num = cb_params.cur_step_num
loss = cb_params.net_outputs
run1 = self.aim_run.track(float(str(loss)), name='loss', step=step_num, epoch=epoch_num,
context={"subset": "train"})
def epoch_end(self, run_context):
"""epoch end"""
cb_params = run_context.original_args()
# loss
epoch_num = cb_params.cur_epoch_num
step_num = cb_params.cur_step_num
loss = cb_params.net_outputs
train_dataset = cb_params.train_dataset
train_acc = self.model.eval(train_dataset)
test_acc = self.model.eval(self.dataset_test)
print("【Epoch:】", epoch_num, "【Step:】", step_num, "【loss:】", loss, "【train_acc:】", train_acc['accuracy'], "【test_acc:】",
test_acc['accuracy'])
self.aim_run.track(float(str(loss)), name='loss', epoch=epoch_num, context={"subset": "train"})
self.aim_run.track(float(str(train_acc['accuracy'])), name='accuracy', epoch=epoch_num,
context={"subset": "train"})
self.aim_run.track(float(str(test_acc['accuracy'])), name='accuracy', epoch=epoch_num,
context={"subset": "test"})
...
# Aim
aim_run = Run(repo=args_opt.aimrepo_url, experiment=f{args_opt.output_url}/bs{batch_size}_lr{learning_rate}_mt{momentum}")
# Log run parameters
aim_run['learning_rate'] = learning_rate
aim_run['momentum'] = momentum
aim_run['batch_size'] = batch_size
# 训练网络模型
model.train(2, dataset_train, callbacks=[ckpoint, AimCallback(model, dataset_test, aim_run)])
...

3.3 查看训练列表:

3.4 推理可视化:

选择推理页签,点击启动按钮,启动过程会比较慢,请耐心等待,一般为5分钟以内,若时间过长,请检查推理代码。

MNIST画板效果展示: