余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

免费 |《MNN For Swift》移动端机器学习实战课程

xiyangw 2022-12-03 11:38 14 浏览 0 评论

自 2019 年 4 月在 Github 开源以来,淘系技术部-端智能团队自研的 MNN 推理引擎,因为其高性能、易用性以及优秀兼容性受到不少开发者的支持和喜爱。我们也把这份支持化作不断前进的动力,仅最近半年就推出了包括但不限于如下的诸多亮眼特性:

  • 几何计算。通过 MNN 自研的“硬核”技术,将多后端算子实现这项枯燥但必要的工作成本大幅降低。正是基于这项技术,MNN 重写了目前所有的硬件后端。引入几何计算之后 GPU 后端算子的覆盖率大幅增加,在GPU 后端性能普遍获得约 20% 提升,并新支持了 TensorRT 和 CUDA 后端。
  • 基于 Transformer 结构的 ASR 模型的支持。为了应对这类大量涉及 Control Flow、Dynamic Shape和Zero Shape等特性的模型结构,MNN 在框架层面进行了大幅度重构从而对其进行支持和完善。

关于 MNN 的强大,能说的还有很多,但我们不想再一次通过秀肌肉来证明 MNN 的领先独到。相反,我们希望通过这篇文章来说明更重要的一件事:来自开发者的声音,我们听见了。


在 MNN 开源的这一年多里,随着 MNN 被越来越多的开发者、企业所了解并使用,我们与社区之间的交流也愈加紧密频繁。在这之中,有一类的呼声经常被提起:

  • “MNN 很强了,就是希望 iOS / Android Demo 更多一点。Python 还是有点不熟悉”
  • “教教我们这些小白怎么上手呗。MNN 能干些啥呀~”
  • “五子棋牛逼,支持五神!老板我也想搞端智能!”

没错,很多人对机器学习的陌生来自于未知,而正是因为这个未知让大家想象不到能用 MNN 实现什么。


所以我们在想,如果用一门更熟悉的语言,带大家走入端智能的大门,为自己的职业生涯开辟一道新的口子,这样是不是对大家更有帮助?


今天,对着广大的移动开发者,我们要大声的宣布:MNN for Swift 正式来啦!伴随着这个项目一同发布的,还有系列实践性教程 -《MNN x Swift 机器学习实战》。


通过这两个项目,希望能给各位带来清晰的端智能学习路径。

能从课程中收获什么


相信大家都对网上质量参差不齐、没有实际干货的课程感到深恶痛绝。所以在设计系列教程的时候,我们首要考虑的两个要素就是:

  • 免费
  • 硬核技术和动手实践结合

基于此,我们会以每两周一次的方式进行 5 次的系列课程教学,结合 MNN 工作台 AI For Everyone 的低实践门槛,带来值得期待的知识分享。


? 系列直播预告

插段广告,如果你还不知道 MNN 工作台是什么,那就赶快前往 MNN 官网 www.mnn.zone 去下载吧。MNN 工作台是淘系技术部 - 端智能团队在今年 10 月份对外公测的一站式端侧 AI 平台。它是集低门槛预训练模版、开箱即用算法集、多端一键部署于一体的机器学习工具箱,通过 MNN 工作台,每个人都可以在几分钟内完成模型训练并部署到手机上运行看到应用效果。

整体的课程大纲如下:

  • Introduce to MNN For Swift
    • 介绍移动端机器学习现状
    • MNN For Swift 整体概览
  • MNN For Swift 实现原理
    • C++ 至 C 到 Swift 开发流程的最佳实践
    • MNN For Swift API 设计思路
    • MNN For Swift 进阶 - 玩转 Swift 自定义操作符
  • 玩转 MNN 工作台 For Swit (一)- 模型预测
    • MNN For Swift 推理 API 使用介绍
    • 手把手玩转 MNIST 手写数字预测
    • 高级进阶 - 从 MNN 工作台获取更多高级模型
  • 玩转 MNN 工作台 For Swift(二)- 模型训练
    • MNN For Swift 训练 API 使用介绍
    • 用 MNN Swift 构建 MINST 数字识别模型
    • 高级进阶 - 通过 MNN 工作台训练更多模型
  • MNN For Swift 应用实战
    • OCR - 光学字符识别简介
    • MNN 工作台 OCR 开箱即用模型简介
    • 使用 MNN For Swift 部署 OCR 模型
    • 完整应用案例展示


怎么样?看完大纲后是不是对使用 MNN For Swift 进行机器学习充满了好奇?那就敬请期待我们后续的课程吧!


当然有人会问:“付出那么多,你们想从这个课程中收获什么?”


很简单,我们希望通过这个课程让大家了解端智能是什么、如何把端智能和自身的日常工作进行结合。对那些积极参与《MNN x Swift》系列课程的朋友,如果您对 MNN 和 Swift 有什么独到的见解或者建议,也会邀请您参与到我们的直播中,共同打造 MNN For Swift 的社区生态!


只有更多人一起来玩端智能,这个新兴的领域才能受到更多的关注、获得更长足的发展。

Why Swift


最后我们还想来谈谈为什么 MNN 会选择在这个时间点支持 Swift。


一直以来,因为其强大的社区活力和易用的特性,Python 始终把控着机器学习社区语言的头把交椅(虽然 Julia 也发展的很迅猛)。Tensorflow、PyTorch 以及最新推出的 MNN 工作台等主流的机器学习框架或工具更是和 Python 这门语言紧紧的交织在一起。


但是将 Python 搬到移动端上却不是一件非常容易的事,引用 Tensorflow 对于移动端应用 Python 的观点来看:

  • 部署麻烦,运行时依赖太多。
  • 没有编译期类型检查。这导致很多错误要到运行时才能发现,在移动端,这些不可忽视的错误常常导致严重的应用崩溃等重大用户体验问题。
  • 性能太差,并发困难。而机器学习模型对算力的贪婪需求,迫切需要靠并发缓解。


而自 2014 年 WWDC 正式发布之后,Swift 已经逐渐成为了苹果开发者生态中的主流开发语言。作为一门比 Objective-C 更加现代化、更加安全的编程语言,Swift 已经获得了国内外广大开发者的喜爱。同时,应用 Swift 可以让我们“免费”享受到苹果工程师持续不断的性能、稳定性优化成果。


更重要的一点是,当我们基于 Swift 实践了部分机器学习开发工作后,我们惊讶的发现,Swift 竟然在机器学习领域有着与 Python 相媲美的表达特性。


用如下一段 Python 和 Swift 的 MNN 编程片段进行简单对比:

Python 代码:

# F = MNN.expr
input_data = F.placeholder([1, 3, image_height, image_width], F.NCHW, F.float)
input_data.write(image_data)
input_data = F.convert(input_data, F.NC4HW4)
outputs = ocr_det_net.forward([input_data])[0]
outputs = F.convert(outputs, F.NCHW)
data = outputs.read()


同样的代码在 Swift 中:

var input_data = Expr.placeholder(shape: [1, 3, image_height, image_width],
                                  dataFormat: .NCHW,
                                  dtype: Float.self)
input_data.write(data: image_data)
input_data = Expr.convert(input: input_data, format: .NC4HW4)
var output = ocr_det_net.onForward(inputs: [input_data])[0]
output = Expr.convert(input: output, format: .NCHW)
let data = output.read()

毫不夸张的说,如果不加以提示,可能根本不会感受到二者的异同,可见二者在语法表达上十分接近。

除了同样充分的表达性以外,Swift 在移动开发领域天然的优势(苹果大力支持)以及语言自身的安全特性都让 Swift 比起 Python 而言更适合移动端机器学习。


这也是我们为什么下定决心要开展 MNN For Swift 的重要原因。


在内部项目中,我们已经用 MNN For Swift 与 SwiftUI 完成了机器学习应用的编写,91% 的代码均为 Swift。由此可见 Swift 在移动端机器学习领域是能让开发者快速上手,降低开发者的开发门槛的一门优秀语言。所以不要犹豫,赶紧把 MNN For Swift 学起来。

结语



纸上得来终觉浅,绝知此事要躬行。不要再为自己每天还在糊 UI、画 Label 、组装 TableView 而感到焦虑。通过《MNN x Swift 机器学习实战》,我们希望让大家感受到深度学习不止是从事算法专业人员的“独门武器”、也不是大厂宣传秀肌肉的利器,而是让所有爱好技术的人都能参与实践的自我提升手段。


也希望借助 MNN For Swift 项目及系列课程,让大家感受到 MNN 积极拥抱社区、响应开发者呼声的热情与决心,给开发者们缓解一丝冬季的焦虑。

— 完 —

相关推荐

spring利用spring.handlers解析自定义配置(spring validation 自定义)

一、问题我们在spring的xml配置文件里经常定义各种各样的配置(tx、bean、mvc、bean等等)。以及集成第三方框架时,也会看到一些spring之外的配置,例如dubbo的配置、securi...

「Spring源码分析」AOP源码解析(上篇)(spring源码深度解析(第2版))

前言前面写了六篇文章详细地分析了SpringBean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析。为了探究AOP实现原理,首先定义几个类,一个Dao接口:1&nbs...

Spring 解析注册BeanDefinition这一篇就Over
Spring 解析注册BeanDefinition这一篇就Over

一、简介:学习过Spring框架的人一定都会听过Spring的IoC(控制反转)、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC、...

2023-03-20 14:53 xiyangw

域、模块、空间、闭包,你真的懂了吗?(模块控制域与作用域的关系)

Javascript有一个特性叫做域。尽管对于初学者来说理解域是有难度的,但我会尽力用最简单的方式让你理解域。理解域能让你的代码更优秀,减少错误,及有助于你做出更强大的模式设计。什么是域域是在运行时,...

这一次搞懂Spring自定义标签以及注解解析原理
这一次搞懂Spring自定义标签以及注解解析原理

前言在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如...

2023-03-20 14:53 xiyangw

前端基础进阶(七)-前端工程师最容易出错的问题-this关键字
前端基础进阶(七)-前端工程师最容易出错的问题-this关键字

我们在学习JavaScript的时候,因为对一些概念不是很清楚,但是又会通过一些简洁的方式把它给记下来,那么这样自己记下来的概念和真正的概念产生了很强的偏差.当...

2023-03-20 14:52 xiyangw

深入K8s:守护进程DaemonSet及其源码分析(k8s 进程)
深入K8s:守护进程DaemonSet及其源码分析(k8s 进程)

建议学习:膜拜!阿里内部都在强推的K8S(kubernetes)学习指南,不能再详细了最近也一直在加班,处理项目中的事情,发现问题越多越是感觉自己的能力不足,...

2023-03-20 14:52 xiyangw

Spring 是如何解析 bean 标签的?(spring beans标签)
Spring 是如何解析 bean 标签的?(spring beans标签)

前情回顾上回「SpringIoC容器初始化(2)」说到了Spring如何解析我们定义的<bean>标签,代码跟进了一层又一层,跋山涉水,...

2023-03-20 14:52 xiyangw

快速了解JavaScript文本框操作(javascript文本框代码)
快速了解JavaScript文本框操作(javascript文本框代码)

HTML中使用<input>元素表示单行输入框和<textarea>元素表示多行文本框。HTML中使用的<input&...

2023-03-20 14:51 xiyangw

荐读|30道JavaOOP面试题,可以和面试官扯皮了
荐读|30道JavaOOP面试题,可以和面试官扯皮了

面试是我们每个人都要经历的事情,大部分人且不止一次,今天给大家准备了30道JavaOOP面试题,希望能够帮助到对Java感兴趣的同学,让大家在找工作的时候能够...

2023-03-20 14:51 xiyangw

源码系列——mybatis源码刨析总结,下(mybatis源码分析)
源码系列——mybatis源码刨析总结,下(mybatis源码分析)

接上文简答题一.1.Mybatis动态sql是做什么的?1.动态sql就是根据条件标签动态的拼接sql,包括判空,循环,拼接等2.哪些动态sql?动态sql大...

2023-03-20 14:50 xiyangw

Java面试题(第二弹)(java面试题及答案整理)
Java面试题(第二弹)(java面试题及答案整理)

1.抽象类和接口的区别?接口可以被多重implements,抽象类只能被单一extends接口只有定义,抽象类可以有定义和实现接口的字段定义默认为:public...

2023-03-20 14:50 xiyangw

mybatis3 源码深度解析-动态 sql 实现原理(sql数据库基础知识)
mybatis3 源码深度解析-动态 sql 实现原理(sql数据库基础知识)

大纲动态sql使用示例SqlSource和BoundSql以及实现类LanguageDriver以及实现类SqlNode以及实现类动态sql解...

2023-03-20 14:50 xiyangw

第43节 Text、Comment及CDATASection(第43节 Text、Comment及CDATASection)
第43节 Text、Comment及CDATASection(第43节 Text、Comment及CDATASection)

本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。文本节点用Text类型表示,包含的是可以按字面解释...

2023-03-20 14:49 xiyangw

Qt读写三种文件(qt读取文件数据并赋值给变量)

第一种INI配置文件.ini文件是InitializationFile的缩写,即初始化文件。除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要...

取消回复欢迎 发表评论: