新聞中心
在最近幾個(gè)月中,我們已經(jīng)幫助許多公司在各種環(huán)境中部署其AI / ML模型。 我們?yōu)獒t(yī)療行業(yè)的模型部署做出了貢獻(xiàn),在過去的幾個(gè)月中,我們已經(jīng)幫助多家公司將經(jīng)過訓(xùn)練的模型轉(zhuǎn)移到不同類型的IoT設(shè)備上。 特別是在IoT設(shè)備情況下,要求通常很嚴(yán)格:計(jì)算周期數(shù)和可用內(nèi)存通常都受到限制。

川匯網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
在本文中,我闡明了如何確保使用標(biāo)準(zhǔn)ML庫(例如PyTorch,Scikit-learn和Tensorflow)訓(xùn)練的模型可以有效地部署在各種邊緣設(shè)備上。 為了使事情變得切實(shí),我們將研究簡單的邏輯回歸模型的訓(xùn)練和部署。 但是,我們?cè)谶@里討論的大多數(shù)內(nèi)容都直接轉(zhuǎn)移到更復(fù)雜的模型上。
模型訓(xùn)練
為了說明模型訓(xùn)練與部署之間的區(qū)別,讓我們首先模擬一些數(shù)據(jù)。 下面的代碼根據(jù)以下簡單模型生成1000個(gè)觀測(cè)值:圖片發(fā)布
- import numpy as np
- np.random.seed(66) # Set seed for replication# Simulate Data Generating Process
- n = 1000 # 1000 observations
- x1 = np.random.uniform(-2,2,n) # x_1 & x_2 between -2 and 2
- x2 = np.random.uniform(-2,2,n)
- p = 1 / (1 + np.exp( -1*(.75 + 1.5*x1 - .5*x2) )) # Implement DGPy = np.random.binomial(1, p, n) # Draw outcomes# Create dataset and print first few lines:
- data = np.column_stack((x1,x2,y))
- print(data[:10])
生成數(shù)據(jù)后,我們可以專注于擬合模型。 我們只需使用sklearn的LogisticRegression()函數(shù)即可:
- from sklearn.linear_model import LogisticRegression
- mod = LogisticRegression().fit(data[:,[0,1]], np.ravel(data[:,[2]]))
仔細(xì)看看
在這一點(diǎn)上,梳理并簡要考慮引擎蓋下正在發(fā)生的事情非常有用。與許多其他有趣的ML模型一樣,對(duì)邏輯回歸模型進(jìn)行迭代訓(xùn)練。為了訓(xùn)練模型,sklearn(或提供類似功能的任何其他軟件包)將必須實(shí)現(xiàn)以下幾個(gè)功能:
1. 某種評(píng)分函數(shù),指示模型的擬合度。這可能是誤差函數(shù)或最大似然函數(shù)。
2. 該函數(shù)可將擬合模型的參數(shù)從一次迭代更新到下一次迭代。
訓(xùn)練過程將有效地重復(fù)使用這兩個(gè)功能:最初,模型的參數(shù)是隨機(jī)實(shí)例化的。接下來,檢查模型的分?jǐn)?shù)。如果認(rèn)為分?jǐn)?shù)不夠(通常是因?yàn)榕c以前的迭代相比,分?jǐn)?shù)有所提高),則將更新模型參數(shù)并重復(fù)該過程。
即使對(duì)于這個(gè)簡單的模型,sklearn仍需要遍歷數(shù)據(jù)集。以下代碼給出了迭代次數(shù):
- # Print the number of iterations
- print(f'The number of iterations is: {mod.n_iter_}.'
因此,要訓(xùn)練模型,我們需要訪問數(shù)據(jù),還有幾個(gè)工具的函數(shù),并且需要多次迭代/遍歷數(shù)據(jù)集。 總的來說,該訓(xùn)練過程對(duì)計(jì)算的要求很高,這說明了為什么對(duì)于復(fù)雜的模型,我們求助于并行計(jì)算以及GPU或NPU加速,以在合理的時(shí)間內(nèi)執(zhí)行。 幸運(yùn)的是,當(dāng)訓(xùn)練模型時(shí),所需的相當(dāng)復(fù)雜的邏輯已被我們使用的各種ML庫抽象化了。
生成預(yù)測(cè)
將其與從已經(jīng)擬合的模型中生成預(yù)測(cè)進(jìn)行比較(通常稱為推理,但由于統(tǒng)計(jì)中使用的后者不同,因此我發(fā)現(xiàn)這個(gè)術(shù)語令人困惑,因此我堅(jiān)持使用預(yù)測(cè))。 到模型擬合時(shí),在這種情況下,我們實(shí)際上需要生成預(yù)測(cè)的全部就是邏輯回歸函數(shù)(與上面示例中用于生成數(shù)據(jù)的數(shù)學(xué)函數(shù)相同)以及擬合模型的三個(gè)參數(shù)。 這些很容易檢索:
- b = np.concatenate((mod.intercept_, mod.coef_.flatten()))
- print(b)
參數(shù)最終相對(duì)接近我們用于數(shù)據(jù)生成的值:[0.84576563 1.39541631 -0.47393112]。
此外,在大多數(shù)部署情況下,我們通常最終僅使用單個(gè)輸入來評(píng)估模型:在這種情況下,長度為2的數(shù)字向量。 如果我們要部署模型,則不需要擬合函數(shù),不需要數(shù)據(jù),也不需要迭代。 要生成預(yù)測(cè),我們只需要簡單有效地實(shí)現(xiàn)所涉及的數(shù)學(xué)函數(shù)即可。
邊緣設(shè)備中部署模型
"所以呢?"你可能會(huì)問。當(dāng)現(xiàn)代模型訓(xùn)練工具抽象出所有這些細(xì)節(jié)時(shí),為什么還要關(guān)心訓(xùn)練和預(yù)測(cè)中涉及的細(xì)節(jié)呢?好吧,因?yàn)楫?dāng)您希望有效地部署模型時(shí)(例如,當(dāng)您需要模型在小型設(shè)備上快速運(yùn)行時(shí)),您可以更好地利用設(shè)備的差異。
為了便于討論,請(qǐng)對(duì)比以下兩種模型部署方法(即,將經(jīng)過訓(xùn)練的模型投入生產(chǎn),以便可以使用其預(yù)測(cè)):
將sklearn作為REST服務(wù)部署在Docker容器上:這種方法很簡單并且經(jīng)常使用:我們啟動(dòng)一個(gè)包含python和用于訓(xùn)練的工具的docker鏡像:對(duì)于上面的示例邏輯回歸模型sklearn。接下來,我們創(chuàng)建一個(gè)REST API服務(wù),該服務(wù)使用擬合模型的mod.predict()函數(shù)來生成結(jié)果。
Scailable WebAssembly部署:除了上述方法以外,還可以將擬合模型轉(zhuǎn)換為WebAssembly(使用與Scailable提供的服務(wù)類似的服務(wù)),并部署.WASM二進(jìn)制文件,其中僅包含在最小的WebAssembly運(yùn)行時(shí)中進(jìn)行預(yù)測(cè)所需的邏輯。 自動(dòng)生成的二進(jìn)制文件將僅包含必要的邏輯函數(shù)和估計(jì)的參數(shù)。二進(jìn)制文件可能部署在服務(wù)器上因此也類似地通過REST調(diào)用使用,但是,它可以兼容可用的運(yùn)行時(shí),它也幾乎可以在任何邊緣設(shè)備上運(yùn)行。
顯然,第一個(gè)部署過程接近數(shù)據(jù)科學(xué)家的"我們所知道的"。直接使用我們慣用的工具是非常方便的,并且在許多方面它都有效:我們可以使用對(duì)REST端點(diǎn)的調(diào)用來生成預(yù)測(cè)。第二種解決方案與我們的標(biāo)準(zhǔn)實(shí)踐相距甚遠(yuǎn),并且對(duì)于模型訓(xùn)練毫無用處(即,沒有"WebAssembly軟件包來訓(xùn)練模型……")。但是,我們?nèi)匀徽J(rèn)為應(yīng)該首選:第二種設(shè)置利用了訓(xùn)練和預(yù)測(cè)之間的差異,從而在幾個(gè)方面使模型部署更好:
內(nèi)存占用:上面兩個(gè)選項(xiàng)中的第一個(gè)選項(xiàng)將需要至少75Mb的容器(要使容器變小需要大量的工程設(shè)計(jì),使容器的大小接近1Gb更為常見)。在這種情況下,存儲(chǔ)的模型本身很?。?2Kb),因此容器占部署內(nèi)存占用的最大塊(請(qǐng)注意,例如大型神經(jīng)網(wǎng)絡(luò)可能不正確)。相反,WebAssembly運(yùn)行時(shí)可以降至64Kb以下。 WebAssembly二進(jìn)制本身本身大于存儲(chǔ)的sklearn模型(?50kb),但是現(xiàn)在它包含生成預(yù)測(cè)所必需的全部。因此,雖然第一個(gè)部署選項(xiàng)至少占用75Mb,但第二個(gè)部署選項(xiàng)占用不到0.1Mb。
速度:與高效的WebAssembly部署相比,消耗一個(gè)在Docker容器中運(yùn)行的REST端點(diǎn)并不能在執(zhí)行時(shí)間上取得優(yōu)勢(shì),因?yàn)镈ocker容器啟動(dòng)了所有訓(xùn)練所需的東西。下面是一些針對(duì)不同模型的速度比較,但是,不必說,利用訓(xùn)練和預(yù)測(cè)之間的差異,并且僅僅將預(yù)測(cè)的基本需求投入生產(chǎn),就可以通過一個(gè)數(shù)量級(jí)提高速度,從而生成這些預(yù)測(cè)。
因此,內(nèi)存占用更小,執(zhí)行速度更快。有幾個(gè)原因;其中一個(gè)原因是,我們可能希望有效地部署模型,而不會(huì)在每次做出預(yù)測(cè)時(shí)浪費(fèi)能源。但是,一個(gè)小的內(nèi)存占用和快速的執(zhí)行也是很吸引人的,因?yàn)檫@正是我們?cè)趯⒛P屯度肷a(chǎn)的邊緣所需要的:好運(yùn)部署你的Docker容器(例如,)在ESP32 MCU板上。使用WebAssembly,這是小菜一碟。
綜上所述,你一定對(duì)WebAssembly十分感興趣,那么看看這個(gè)代碼吧,它包含了本文的所有內(nèi)容
https://github.com/scailable/sclbl-tutorials/tree/master/sclbl-train-vs-deploy
當(dāng)前題目:使用WebAssembly提高模型部署的速度和可移植性
當(dāng)前路徑:http://m.fisionsoft.com.cn/article/coododc.html


咨詢
建站咨詢
