賈浩楠 金磊 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
“煉丹俠”們苦當前深度學習框架久矣。
本來,AI框架的初衷是簡化、加速和優化開發流程。但是輪子這么多,有從學界走出的Caffe、有谷歌力推的TensorFlow、Facebook押注的Pytorch….真正用起來省心省力的卻不多。
Caffe不支持分布式,不夠靈活,文檔不夠用,安裝也比較復雜。
而TensorFlow中的循環和分支寫起來的復雜和痛苦,用過的人都有體會…
框架越發展,瓶頸越明顯。
這時,卻有一個“框架工具套件”站出來說:
一分鐘內上手AI應用開發、一小時掌握AI模型與數據集的自由切換。
TinyMS,就是它,MindSpore社區新開源的深度學習框架開發工具套件,在技術文檔中,官方明確地說出了前面的話。
那么,TinyMS到底是什么?真能在一分鐘內實現一個AI應用嗎?
TinyMS是什么?
高端的AI開發方法,往往只需要最簡單的工具套件。
TinyMS,代表了小(Tiny)、靈(Modular)、簡(Simple),當然名字還有另外一個很好理解的角度,那就是“微型”MindSpore。
這是專門為去年同期才開源的AI計算框架MindSpore定制的高級API開發套件,目的是讓新手用戶能夠更加輕松地上手深度學習,有效地減少用戶在構建、訓練、驗證和推理一個模型過程中的操作次數。
TinyMS工具包主要用PyThon語言編寫,對于開發者來說,TinyMS“一站式”服務包括了AI應用開發前期必要的數據準備,中期的模型架構、訓練、編譯工具,以及后端AI模型應用服務。
當然,TinyMS仍然貼心地推出了完整在線課程教學,以AI應用中常見的深度神經網絡ResNet50等等為例,一步步教你如何使用TinyMS實現自己的AI應用。在線課程將以網劇更新的新穎形式,在MindSpore官方B站進行不斷更新,等不及的開發者已經可以開始“追劇”了!
嗶哩嗶哩【保姆級教程】EP01-最適合小白的深度學習入門課程來了!小程序
課程的最后還設置了一個挑戰賽,針對小白和高手分別設計了不同難度的比賽,任務是復現TinyMS的模型。每個比賽都會設一個一等獎和三個二等獎,對于參賽人員來說,只要跑通網絡就有機會獲得價值三千元的獎品;如果調參的精度是Top1,即可獲得價值一萬元的獎品。感興趣的開發者可聯系小助手微信:“mindspore0328”報名參賽。
我們接著來看看TinyMS的構成和主要功能模塊。
從任務流程上看,TinyMS的基本架構分為五個部分:數據處理、模型構建、訓練、驗證、部署。
其中數據處理模塊提供常用數據集下載、解壓、加載等操作,同時,為了讓模型有更好的表現,一般還針對原始數據進行數據預處理(增強)操作。
而在模型構建中,除了網絡主體的構建,還包括Loss損失函數、Optimizer優化器等定義。
模型構建好后,就進入了訓練的流程,TinyMS在訓練中提供回調函數的定義。即回調操作可以在訓練的各個階段執行,可能是在epoch之間,在處理一個batch之后,甚至在滿足某個條件的情況下完全由用戶做主。
這樣一來,用戶可以利用許多創造性的方法來改進訓練和性能,節省計算資源,并獲知供有關神經網絡內部發生的事情的結論。
TinyMS中的精度驗證模塊,負責模型精度驗證的流程,其中評價指標metrics可由用戶自己定義。
最后,就是模型部署,serving模塊可以通過搭建服務器,來提供AI模型應用服務,為新手提供快速推理的體驗。
到底好不好用?我們一試便知。
一分鐘實現AI應用?試試看!
俗話說“光說不練假把式”,實踐才能檢驗TinyMS的真本事。
Now!上手體驗一下!
老規矩,在安裝之前,先來介紹一下環境需求:
操作系統:Ubuntu 18.04 或 Windows 10。
Python版本:3.7.5。
安裝也是非常的方便,只要“pip一下”就好:
pip install tinyms==0.1.0
此處溫馨提示:若是下載速度太慢,可以試試下面的鏡像哦:
mkdir -pv /root/.pip
&& echo "[global]" >/root/.pip/pip.conf
&& echo "trusted-host=mirrors.aliyun.com" >>/root/.pip/pip.conf
&& echo "index-url=http://mirrors.aliyun.com/pypi/simple/" >>/root/.pip/pip.conf
要是想檢驗一下安裝是否成功,可以跑一下這個小demo:
import tinyms as ts
from tinyms.primitives import tensor_add
x = ts.ones([2, 3])
y = ts.ones([2, 3])
print(tensor_add(x, y))
若出現如下結果,則證明安裝成功。
[[2. 2. 2.]
[2. 2. 2.]]
接下來,是時候展示TinyMS真正的實力了——只要1分鐘,就可以實現圖形分類應用(LeNet5模型)。
先要做工作,是導入模塊(TinyMS中的主要功能模塊):
import json
import tinyms.optimizers as opt
from PIL import Image
from tinyms import context
from tinyms.data import MnistDataset, download_dataset
from tinyms.vision import mnist_transform, ImageViewer
from tinyms.model import Model, lenet5
from tinyms.serving import start_server, predict, list_servables, shutdown, server_started
from tinyms.metrics import Accuracy
from tinyms.losses import SoftmaxCrossEntropyWithLogits
from tinyms.callbacks import ModelCheckpoint, CheckpointConfig, LossMonitor
接下來是構建模型,但聽到這個環節不要打怵,并沒有你印象中的那么多代碼,現在只需要短短2行。
因為TinyMS封裝了MindSpore LeNet5模型中的init和construct函數,所以代碼量大幅減少:
# 構建網絡
net = lenet5(class_num=10)
model = Model(net)
構建完模型后,就是下載數據集 (TinyMS自帶數據集):
# 下載數據集
mnist_path = "/root/mnist"
if not os.path.exists(mnist_path):
download_dataset("mnist", "/root")
print("************Download complete*************")
else:
print("************Dataset already exists.**************")
有了模型,有了數據,當然就需要開始“操練”了。
在訓練模型的過程當中,剛才下載的數據集,會被分為訓練集和驗證集。訓練完成后會進行驗證并輸出 Accuracy 指標:
# 創建mnist路徑
ckpt_folder = "
/etc/tinyms/serving/lenet5"
ckpt_path = "
/etc/tinyms/serving/lenet5/lenet5.ckpt"
if not os.path.exists(ckpt_folder):
!mkdir -p
/etc/tinyms/serving/lenet5
else:
print("lenet5 ckpt folder already exists")
# 設置環境參數
device_target = "CPU"
context.set_context(mode=context.GRAPH_MODE, device_target=device_target)
dataset_sink_mode = False
# 創建數據集
train_dataset = MnistDataset(os.path.join(mnist_path, "train"), shuffle=True)
train_dataset = mnist_transform.apply_ds(train_dataset)
eval_dataset = MnistDataset(os.path.join(mnist_path, "test"), shuffle=True)
eval_dataset = mnist_transform.apply_ds(eval_dataset)
# 設置訓練參數
lr = 0.01
momentum = 0.9
epoch_size = 1
batch_size = 32
# 定義loss函數
net_loss =
SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")
# 定義optimizer
net_opt = opt.Momentum(net.trainable_params(), lr, momentum)
net_metrics={"Accuracy": Accuracy()}
model.compile(loss_fn=net_loss, optimizer=net_opt, metrics=net_metrics)
print("************************Start training*************************")
ckpoint_cb = ModelCheckpoint(prefix="checkpoint_lenet", config=CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10))
model.train(epoch_size, train_dataset, callbacks=[ckpoint_cb, LossMonitor()],dataset_sink_mode=dataset_sink_mode)
print("************************Finished training*************************")
model.save_checkpoint(ckpt_path)
model.load_checkpoint(ckpt_path)
print("************************Start evaluation*************************")
acc = model.eval(eval_dataset, dataset_sink_mode=dataset_sink_mode)
print("============== Accuracy:{} ==============".format(acc))
為了后續推理過程的需要,在訓練模型后,需要定義一個lenet5 servable json文件。
該文件定義了servable名稱,模型名稱,模型格式和分類數量:
servable_json = [{"name": "lenet5",
"description": "This servable hosts a lenet5 model predicting numbers",
"model": {
"name": "lenet5",
"format": "ckpt",
"class_num": 10}}]
os.chdir("/etc/tinyms/serving")
json_data = json.dumps(servable_json, indent=4)
with open("servable.json", "w") as json_file:
json_file.write(json_data)
準備工作就緒,現在就要讓“機器”運作起來(啟動服務器):
start_server()
然后在命令行終端,用“scp”或者“wget”來獲取一張圖片作為輸入(一張0~9之間的數字圖片)。
使用list_servables函數檢查當前后端的serving模型:
list_servables()
如果輸出的description字段顯示這是一個lenet5的模型,那就可以順利進入下一步——發送推理請求。
# 設置圖片路徑和輸出策略(可以在TOP1和TOP5中選擇)
image_path = "/root/7.png"
strategy = "TOP1_CLASS"
# predict(image_path, servable_name, dataset="mnist", strategy="TOP1_CLASS")
# predict方法的四個參數分別是圖片路徑、servable名稱,數據集名稱(默認MNIST)和輸出策略(默認輸出TOP1,可以選擇TOP5)
if server_started() is True:
img_viewer = ImageViewer(Image.open(image_path), image_path)
img_viewer.show()
print(predict(image_path,"lenet5", "mnist", strategy))
else:
print("Server not started")
如果最后你能看到這樣的輸出:
TOP1: 7, score: 0.99934917688369750977
恭喜你,一次成功的推理,就這么簡單、順利地完成了!
Keras、fastai還不夠用嗎?
現在有眾多為深度學習框架量身定做的API,那么,TinyMS存在的獨特意義是什么?
原因之一是,原生框架的API并不能滿足所有用戶/開發者的需求,所以需要框架擁有更加簡單有效的高階API、低運行開銷、模塊化開發以及敏捷部署。
之前有針對TF推出的Keras,它確實好上手,但是“大而全”的Keras層層封裝,不夠靈活快速。
還有基于Pytorch的Fastai,深度學習庫項目較輕便,目錄清晰易理解,可以說是“小而美”。但在預置數據集和推理模塊上存在短板。
TinyMS在高階API方面理念與Fastai相近,不同點在于TinyMS提供了常用的MindSpore預置數據集,方便開發者簡化對數據集的調用,而且提供了Fastai尚未提供的快速部署推理模塊等。
此外,對比Keras,TinyMS在高階API方面會更為簡單抽象,較keras來說復雜度更低,比如提供了只需一行代碼即可完成數據集的預處理,而且在設計中重點考慮到了Keras尚未提供單獨好用的工具庫,以及尚未提供的快速部署推理模塊等。
其二,對于全場景AI計算框架MindSpore來說,高階和中階Python API已經實現了Keras的大部分功能,所以即使要做一套API,也不需要類似Keras再額外封裝一層。
因此TinyMS的重點不是基于底層框架的特點或不足進行進一步優化,而是著重提升開發者對MindSpore的使用體驗,尤其是面向全場景的開發和部署。
比如,TinyMS主要語言是PyThon,簡單易用,且所有功能都是易于擴展的模塊化設計,能夠覆蓋多種業務場景。
開源深度學習開發工具包,包括了數據集處理工具、模型架構、訓練、編譯工具,以及后端AI模型應用服務,為新手提供快速推理的體驗。
由此就能看出TinyMS面向的主要用戶群體為深度學習初學者、其他研究領需要使用深度學習的科研人員、以及深度學習相關業務應用開發的企業人員。
直白的說TinyMS就是深度發揮MindSpore優勢,以實際開發需求為導向,極致簡化AI上手的復雜度。
TinyMS是一個新生的開源項目,站在Keras、fastai等巨人的肩膀上,雖然在設計理念上有所創新,但依然需要社區開發者一起持續協作,才能達到更好地服務學術界、產業界和開發者的深度和廣度。
TinyMS開源社區中除了TinyMS項目外,還有如下一些項目和活動:
Specification項目:主要用來協作制定面向模型訓練腳本的格式規范。由于TinyMS提供了較為高階的API抽象,因此誕生了ModelZoo腳本規范性和標準化的需求,便于高階封裝的持續迭代;
tinyms-ai.github.io:開源實現的簡單官方網站搭建,基于Github Page;
RustedAI Team:目前只有組織成員可見,RustedAI是TinyMS旨在推動利用Rust語言編寫更多的低運行時開銷的深度學習組件;
社區活動:不定期組織TinyMS模型拉力賽,以及多種多樣的Meetup活動。
開源“開源運營”
作為TinyMS的作者,MindSpore社區運營團隊除了為開發者帶來這一新的開發項目外,還與開放原子開源基金會合作,即將推出0xCommOps這一新穎的開源項目,準備將本來最沒有開放需求的開源社區運營也開源出來。分享MindSpore社區運營團隊這一年創新的全維度運營的理念,同時也號召更多的社區運營愛好者一起分享其所特有的經驗和教訓。
總之,在深度學習框架這件事上,又有一個實力玩家積極入場服務開發者。
試一試TinyMS,歡迎把體驗感想告訴我們~