- 幾何計(jì)算。通過(guò) MNN 自研的“硬核”技術(shù),將多后端算子實(shí)現(xiàn)這項(xiàng)枯燥但必要的工作成本大幅降低。正是基于這項(xiàng)技術(shù),MNN 重寫(xiě)了目前所有的硬件后端。引入幾何計(jì)算之后 GPU 后端算子的覆蓋率大幅增加,在GPU 后端性能普遍獲得約?20%?提升,并新支持了?TensorRT 和 CUDA 后端。
- 基于?Transformer 結(jié)構(gòu)的 ASR 模型的支持。為了應(yīng)對(duì)這類大量涉及?Control Flow、Dynamic Shape和Zero Shape等特性的模型結(jié)構(gòu),MNN?在框架層面進(jìn)行了大幅度重構(gòu)從而對(duì)其進(jìn)行支持和完善。
關(guān)于 MNN 的強(qiáng)大,能說(shuō)的還有很多,但我們不想再一次通過(guò)秀肌肉來(lái)證明 MNN 的領(lǐng)先獨(dú)到。相反,我們希望通過(guò)這篇文章來(lái)說(shuō)明更重要的一件事:來(lái)自開(kāi)發(fā)者的聲音,我們聽(tīng)見(jiàn)了。
在 MNN 開(kāi)源的這一年多里,隨著 MNN 被越來(lái)越多的開(kāi)發(fā)者、企業(yè)所了解并使用,我們與社區(qū)之間的交流也愈加緊密頻繁。在這之中,有一類的呼聲經(jīng)常被提起:
- “MNN 很強(qiáng)了,就是希望 iOS / Android Demo 更多一點(diǎn)。Python 還是有點(diǎn)不熟悉”
- “教教我們這些小白怎么上手唄。MNN 能干些啥呀~”
- “五子棋牛逼,支持五神!老板我也想搞端智能!”
沒(méi)錯(cuò),很多人對(duì)機(jī)器學(xué)習(xí)的陌生來(lái)自于未知,而正是因?yàn)檫@個(gè)未知讓大家想象不到能用 MNN 實(shí)現(xiàn)什么。
所以我們?cè)谙?,如果用一門(mén)更熟悉的語(yǔ)言,帶大家走入端智能的大門(mén),為自己的職業(yè)生涯開(kāi)辟一道新的口子,這樣是不是對(duì)大家更有幫助?
今天,對(duì)著廣大的移動(dòng)開(kāi)發(fā)者,我們要大聲的宣布:MNN for Swift 正式來(lái)啦!伴隨著這個(gè)項(xiàng)目一同發(fā)布的,還有系列實(shí)踐性教程 -《MNN x Swift 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》。
通過(guò)這兩個(gè)項(xiàng)目,希望能給各位帶來(lái)清晰的端智能學(xué)習(xí)路徑。
能從課程中收獲什么
相信大家都對(duì)網(wǎng)上質(zhì)量參差不齊、沒(méi)有實(shí)際干貨的課程感到深惡痛絕。所以在設(shè)計(jì)系列教程的時(shí)候,我們首要考慮的兩個(gè)要素就是:
- 免費(fèi)
- 硬核技術(shù)和動(dòng)手實(shí)踐結(jié)合
基于此,我們會(huì)以每?jī)芍芤淮蔚姆绞竭M(jìn)行 5 次的系列課程教學(xué),結(jié)合 MNN 工作臺(tái) AI For Everyone 的低實(shí)踐門(mén)檻,帶來(lái)值得期待的知識(shí)分享。
??系列直播預(yù)告
插段廣告,如果你還不知道 MNN 工作臺(tái)是什么,那就趕快前往 MNN 官網(wǎng) www.mnn.zone 去下載吧。MNN 工作臺(tái)是淘系技術(shù)部 – 端智能團(tuán)隊(duì)在今年 10 月份對(duì)外公測(cè)的一站式端側(cè) AI 平臺(tái)。它是集低門(mén)檻預(yù)訓(xùn)練模版、開(kāi)箱即用算法集、多端一鍵部署于一體的機(jī)器學(xué)習(xí)工具箱,通過(guò) MNN 工作臺(tái),每個(gè)人都可以在幾分鐘內(nèi)完成模型訓(xùn)練并部署到手機(jī)上運(yùn)行看到應(yīng)用效果。
整體的課程大綱如下:
- Introduce to MNN For Swift
-
- 介紹移動(dòng)端機(jī)器學(xué)習(xí)現(xiàn)狀
- MNN For Swift 整體概覽
- MNN For Swift 實(shí)現(xiàn)原理
-
- C++ 至 C 到 Swift 開(kāi)發(fā)流程的最佳實(shí)踐
- MNN For Swift API 設(shè)計(jì)思路
- MNN For Swift 進(jìn)階 – 玩轉(zhuǎn) Swift 自定義操作符
- 玩轉(zhuǎn) MNN 工作臺(tái) For Swit (一)- 模型預(yù)測(cè)
-
- MNN For Swift 推理 API 使用介紹
- 手把手玩轉(zhuǎn) MNIST 手寫(xiě)數(shù)字預(yù)測(cè)
- 高級(jí)進(jìn)階 – 從 MNN 工作臺(tái)獲取更多高級(jí)模型
- 玩轉(zhuǎn) MNN 工作臺(tái) For Swift(二)- 模型訓(xùn)練
-
- MNN For Swift 訓(xùn)練 API 使用介紹
- 用 MNN Swift 構(gòu)建 MINST 數(shù)字識(shí)別模型
- 高級(jí)進(jìn)階 – 通過(guò) MNN 工作臺(tái)訓(xùn)練更多模型
- MNN For Swift 應(yīng)用實(shí)戰(zhàn)
-
- OCR – 光學(xué)字符識(shí)別簡(jiǎn)介
- MNN 工作臺(tái) OCR 開(kāi)箱即用模型簡(jiǎn)介
- 使用 MNN For Swift 部署 OCR 模型
- 完整應(yīng)用案例展示
怎么樣?看完大綱后是不是對(duì)使用 MNN For Swift 進(jìn)行機(jī)器學(xué)習(xí)充滿了好奇?那就敬請(qǐng)期待我們后續(xù)的課程吧!
當(dāng)然有人會(huì)問(wèn):“付出那么多,你們想從這個(gè)課程中收獲什么?”
很簡(jiǎn)單,我們希望通過(guò)這個(gè)課程讓大家了解端智能是什么、如何把端智能和自身的日常工作進(jìn)行結(jié)合。對(duì)那些積極參與《MNN x Swift》系列課程的朋友,如果您對(duì) MNN 和 Swift 有什么獨(dú)到的見(jiàn)解或者建議,也會(huì)邀請(qǐng)您參與到我們的直播中,共同打造 MNN For Swift 的社區(qū)生態(tài)!
只有更多人一起來(lái)玩端智能,這個(gè)新興的領(lǐng)域才能受到更多的關(guān)注、獲得更長(zhǎng)足的發(fā)展。
Why Swift
最后我們還想來(lái)談?wù)劄槭裁?MNN 會(huì)選擇在這個(gè)時(shí)間點(diǎn)支持 Swift。
一直以來(lái),因?yàn)槠鋸?qiáng)大的社區(qū)活力和易用的特性,Python 始終把控著機(jī)器學(xué)習(xí)社區(qū)語(yǔ)言的頭把交椅(雖然 Julia 也發(fā)展的很迅猛)。Tensorflow、PyTorch 以及最新推出的 MNN 工作臺(tái)等主流的機(jī)器學(xué)習(xí)框架或工具更是和 Python 這門(mén)語(yǔ)言緊緊的交織在一起。
但是將 Python 搬到移動(dòng)端上卻不是一件非常容易的事,引用 Tensorflow 對(duì)于移動(dòng)端應(yīng)用 Python 的觀點(diǎn)來(lái)看:
- 部署麻煩,運(yùn)行時(shí)依賴太多。
- 沒(méi)有編譯期類型檢查。這導(dǎo)致很多錯(cuò)誤要到運(yùn)行時(shí)才能發(fā)現(xiàn),在移動(dòng)端,這些不可忽視的錯(cuò)誤常常導(dǎo)致嚴(yán)重的應(yīng)用崩潰等重大用戶體驗(yàn)問(wèn)題。
- 性能太差,并發(fā)困難。而機(jī)器學(xué)習(xí)模型對(duì)算力的貪婪需求,迫切需要靠并發(fā)緩解。
而自 2014 年 WWDC 正式發(fā)布之后,Swift 已經(jīng)逐漸成為了蘋(píng)果開(kāi)發(fā)者生態(tài)中的主流開(kāi)發(fā)語(yǔ)言。作為一門(mén)比 Objective-C 更加現(xiàn)代化、更加安全的編程語(yǔ)言,Swift 已經(jīng)獲得了國(guó)內(nèi)外廣大開(kāi)發(fā)者的喜愛(ài)。同時(shí),應(yīng)用 Swift 可以讓我們“免費(fèi)”享受到蘋(píng)果工程師持續(xù)不斷的性能、穩(wěn)定性優(yōu)化成果。
更重要的一點(diǎn)是,當(dāng)我們基于 Swift 實(shí)踐了部分機(jī)器學(xué)習(xí)開(kāi)發(fā)工作后,我們驚訝的發(fā)現(xiàn),Swift 竟然在機(jī)器學(xué)習(xí)領(lǐng)域有著與 Python 相媲美的表達(dá)特性。
用如下一段 Python 和 Swift 的 MNN 編程片段進(jìn)行簡(jiǎn)單對(duì)比:
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()
毫不夸張的說(shuō),如果不加以提示,可能根本不會(huì)感受到二者的異同,可見(jiàn)二者在語(yǔ)法表達(dá)上十分接近。
除了同樣充分的表達(dá)性以外,Swift 在移動(dòng)開(kāi)發(fā)領(lǐng)域天然的優(yōu)勢(shì)(蘋(píng)果大力支持)以及語(yǔ)言自身的安全特性都讓 Swift 比起 Python 而言更適合移動(dòng)端機(jī)器學(xué)習(xí)。
這也是我們?yōu)槭裁聪露Q心要開(kāi)展 MNN For Swift 的重要原因。
在內(nèi)部項(xiàng)目中,我們已經(jīng)用 MNN For Swift 與 SwiftUI 完成了機(jī)器學(xué)習(xí)應(yīng)用的編寫(xiě),91% 的代碼均為 Swift。由此可見(jiàn) Swift 在移動(dòng)端機(jī)器學(xué)習(xí)領(lǐng)域是能讓開(kāi)發(fā)者快速上手,降低開(kāi)發(fā)者的開(kāi)發(fā)門(mén)檻的一門(mén)優(yōu)秀語(yǔ)言。所以不要猶豫,趕緊把 MNN For Swift 學(xué)起來(lái)。
結(jié)語(yǔ)
紙上得來(lái)終覺(jué)淺,絕知此事要躬行。不要再為自己每天還在糊 UI、畫(huà) Label 、組裝 TableView 而感到焦慮。通過(guò)《MNN x Swift 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》,我們希望讓大家感受到深度學(xué)習(xí)不止是從事算法專業(yè)人員的“獨(dú)門(mén)武器”、也不是大廠宣傳秀肌肉的利器,而是讓所有愛(ài)好技術(shù)的人都能參與實(shí)踐的自我提升手段。
也希望借助 MNN For Swift 項(xiàng)目及系列課程,讓大家感受到 MNN 積極擁抱社區(qū)、響應(yīng)開(kāi)發(fā)者呼聲的熱情與決心,給開(kāi)發(fā)者們緩解一絲冬季的焦慮。
— 完 —