這篇文章主要講解了“怎么使用WebAssembly提高模型部署的速度和可移植性”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么使用WebAssembly提高模型部署的速度和可移植性”吧!
成都創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站制作、成都做網(wǎng)站與策劃設(shè)計(jì),臨安網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:臨安等地區(qū)。臨安做網(wǎng)站價(jià)格咨詢(xún):18982081108
為了說(shuō)明模型訓(xùn)練與部署之間的區(qū)別,讓我們首先模擬一些數(shù)據(jù)。 下面的代碼根據(jù)以下簡(jiǎn)單模型生成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ù)后,我們可以專(zhuān)注于擬合模型。 我們只需使用sklearn的LogisticRegression()函數(shù)即可:
from sklearn.linear_model import LogisticRegression mod = LogisticRegression().fit(data[:,[0,1]], np.ravel(data[:,[2]]))
仔細(xì)看看
在這一點(diǎn)上,梳理并簡(jiǎn)要考慮引擎蓋下正在發(fā)生的事情非常有用。與許多其他有趣的ML模型一樣,對(duì)邏輯回歸模型進(jìn)行迭代訓(xùn)練。為了訓(xùn)練模型,sklearn(或提供類(lèi)似功能的任何其他軟件包)將必須實(shí)現(xiàn)以下幾個(gè)功能:
1. 某種評(píng)分函數(shù),指示模型的擬合度。這可能是誤差函數(shù)或最大似然函數(shù)。
2. 該函數(shù)可將擬合模型的參數(shù)從一次迭代更新到下一次迭代。
訓(xùn)練過(guò)程將有效地重復(fù)使用這兩個(gè)功能:最初,模型的參數(shù)是隨機(jī)實(shí)例化的。接下來(lái),檢查模型的分?jǐn)?shù)。如果認(rèn)為分?jǐn)?shù)不夠(通常是因?yàn)榕c以前的迭代相比,分?jǐn)?shù)有所提高),則將更新模型參數(shù)并重復(fù)該過(guò)程。
即使對(duì)于這個(gè)簡(jiǎn)單的模型,sklearn仍需要遍歷數(shù)據(jù)集。以下代碼給出了迭代次數(shù):
# Print the number of iterations print(f'The number of iterations is: {mod.n_iter_}.'
因此,要訓(xùn)練模型,我們需要訪問(wèn)數(shù)據(jù),還有幾個(gè)工具的函數(shù),并且需要多次迭代/遍歷數(shù)據(jù)集。 總的來(lái)說(shuō),該訓(xùn)練過(guò)程對(duì)計(jì)算的要求很高,這說(shuō)明了為什么對(duì)于復(fù)雜的模型,我們求助于并行計(jì)算以及GPU或NPU加速,以在合理的時(shí)間內(nèi)執(zhí)行。 幸運(yùn)的是,當(dāng)訓(xùn)練模型時(shí),所需的相當(dāng)復(fù)雜的邏輯已被我們使用的各種ML庫(kù)抽象化了。
將其與從已經(jīng)擬合的模型中生成預(yù)測(cè)進(jìn)行比較(通常稱(chēng)為推理,但由于統(tǒng)計(jì)中使用的后者不同,因此我發(fā)現(xiàn)這個(gè)術(shù)語(yǔ)令人困惑,因此我堅(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è)輸入來(lái)評(píng)估模型:在這種情況下,長(zhǎng)度為2的數(shù)字向量。 如果我們要部署模型,則不需要擬合函數(shù),不需要數(shù)據(jù),也不需要迭代。 要生成預(yù)測(cè),我們只需要簡(jiǎn)單有效地實(shí)現(xiàn)所涉及的數(shù)學(xué)函數(shù)即可。
"所以呢?"你可能會(huì)問(wèn)。當(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)過(guò)訓(xùn)練的模型投入生產(chǎn),以便可以使用其預(yù)測(cè)):
將sklearn作為REST服務(wù)部署在Docker容器上:這種方法很簡(jiǎn)單并且經(jīng)常使用:我們啟動(dòng)一個(gè)包含python和用于訓(xùn)練的工具的docker鏡像:對(duì)于上面的示例邏輯回歸模型sklearn。接下來(lái),我們創(chuàng)建一個(gè)REST API服務(wù),該服務(wù)使用擬合模型的mod.predict()函數(shù)來(lái)生成結(jié)果。
Scailable WebAssembly部署:除了上述方法以外,還可以將擬合模型轉(zhuǎn)換為WebAssembly(使用與Scailable提供的服務(wù)類(lèi)似的服務(wù)),并部署.WASM二進(jìn)制文件,其中僅包含在最小的WebAssembly運(yùn)行時(shí)中進(jìn)行預(yù)測(cè)所需的邏輯。 自動(dòng)生成的二進(jìn)制文件將僅包含必要的邏輯函數(shù)和估計(jì)的參數(shù)。二進(jìn)制文件可能部署在 內(nèi)存占用:上面兩個(gè)選項(xiàng)中的第一個(gè)選項(xiàng)將需要至少75Mb的容器(要使容器變小需要大量的工程設(shè)計(jì),使容器的大小接近1Gb更為常見(jiàn))。在這種情況下,存儲(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ì)不同模型的速度比較,但是,不必說(shuō),利用訓(xùn)練和預(yù)測(cè)之間的差異,并且僅僅將預(yù)測(cè)的基本需求投入生產(chǎn),就可以通過(guò)一個(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,這是小菜一碟。 感謝各位的閱讀,以上就是“怎么使用WebAssembly提高模型部署的速度和可移植性”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么使用WebAssembly提高模型部署的速度和可移植性這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享標(biāo)題:怎么使用WebAssembly提高模型部署的速度和可移植性
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/jdsddh.html