自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用WebAssembly提高模型部署的速度和可移植性

開發(fā) 前端
在本文中,我闡明了如何確保使用標(biāo)準(zhǔn)ML庫(例如PyTorch,Scikit-learn和Tensorflow)訓(xùn)練的模型可以有效地部署在各種邊緣設(shè)備上。

 使用WebAssembly提高模型部署的速度和可移植性

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

在本文中,我闡明了如何確保使用標(biāo)準(zhǔn)ML庫(例如PyTorch,Scikit-learn和Tensorflow)訓(xùn)練的模型可以有效地部署在各種邊緣設(shè)備上。 為了使事情變得切實,我們將研究簡單的邏輯回歸模型的訓(xùn)練和部署。 但是,我們在這里討論的大多數(shù)內(nèi)容都直接轉(zhuǎn)移到更復(fù)雜的模型上。

模型訓(xùn)練

為了說明模型訓(xùn)練與部署之間的區(qū)別,讓我們首先模擬一些數(shù)據(jù)。 下面的代碼根據(jù)以下簡單模型生成1000個觀測值:圖片發(fā)布

使用WebAssembly提高模型部署的速度和可移植性
 
  1. import numpy as np 
  2. np.random.seed(66)  # Set seed for replication# Simulate Data Generating Process 
  3. n = 1000  # 1000 observations 
  4. x1 = np.random.uniform(-2,2,n)  # x_1 & x_2 between -2 and 2 
  5. x2 = np.random.uniform(-2,2,n) 
  6. 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: 
  7. data = np.column_stack((x1,x2,y)) 
  8. print(data[:10]) 

生成數(shù)據(jù)后,我們可以專注于擬合模型。 我們只需使用sklearn的LogisticRegression()函數(shù)即可:

  1. from sklearn.linear_model import LogisticRegression 
  2. mod = LogisticRegression().fit(data[:,[0,1]], np.ravel(data[:,[2]])) 

仔細(xì)看看

在這一點上,梳理并簡要考慮引擎蓋下正在發(fā)生的事情非常有用。與許多其他有趣的ML模型一樣,對邏輯回歸模型進(jìn)行迭代訓(xùn)練。為了訓(xùn)練模型,sklearn(或提供類似功能的任何其他軟件包)將必須實現(xiàn)以下幾個功能:

1. 某種評分函數(shù),指示模型的擬合度。這可能是誤差函數(shù)或最大似然函數(shù)。

2. 該函數(shù)可將擬合模型的參數(shù)從一次迭代更新到下一次迭代。

訓(xùn)練過程將有效地重復(fù)使用這兩個功能:最初,模型的參數(shù)是隨機(jī)實例化的。接下來,檢查模型的分?jǐn)?shù)。如果認(rèn)為分?jǐn)?shù)不夠(通常是因為與以前的迭代相比,分?jǐn)?shù)有所提高),則將更新模型參數(shù)并重復(fù)該過程。

即使對于這個簡單的模型,sklearn仍需要遍歷數(shù)據(jù)集。以下代碼給出了迭代次數(shù):

  1. # Print the number of iterations 
  2. print(f'The number of iterations is: {mod.n_iter_}.' 

因此,要訓(xùn)練模型,我們需要訪問數(shù)據(jù),還有幾個工具的函數(shù),并且需要多次迭代/遍歷數(shù)據(jù)集。 總的來說,該訓(xùn)練過程對計算的要求很高,這說明了為什么對于復(fù)雜的模型,我們求助于并行計算以及GPU或NPU加速,以在合理的時間內(nèi)執(zhí)行。 幸運的是,當(dāng)訓(xùn)練模型時,所需的相當(dāng)復(fù)雜的邏輯已被我們使用的各種ML庫抽象化了。

生成預(yù)測

將其與從已經(jīng)擬合的模型中生成預(yù)測進(jìn)行比較(通常稱為推理,但由于統(tǒng)計中使用的后者不同,因此我發(fā)現(xiàn)這個術(shù)語令人困惑,因此我堅持使用預(yù)測)。 到模型擬合時,在這種情況下,我們實際上需要生成預(yù)測的全部就是邏輯回歸函數(shù)(與上面示例中用于生成數(shù)據(jù)的數(shù)學(xué)函數(shù)相同)以及擬合模型的三個參數(shù)。 這些很容易檢索:

  1. b = np.concatenate((mod.intercept_, mod.coef_.flatten())) 
  2. print(b) 

參數(shù)最終相對接近我們用于數(shù)據(jù)生成的值:[0.84576563 1.39541631 -0.47393112]。

此外,在大多數(shù)部署情況下,我們通常最終僅使用單個輸入來評估模型:在這種情況下,長度為2的數(shù)字向量。 如果我們要部署模型,則不需要擬合函數(shù),不需要數(shù)據(jù),也不需要迭代。 要生成預(yù)測,我們只需要簡單有效地實現(xiàn)所涉及的數(shù)學(xué)函數(shù)即可。

邊緣設(shè)備中部署模型

"所以呢?"你可能會問。當(dāng)現(xiàn)代模型訓(xùn)練工具抽象出所有這些細(xì)節(jié)時,為什么還要關(guān)心訓(xùn)練和預(yù)測中涉及的細(xì)節(jié)呢?好吧,因為當(dāng)您希望有效地部署模型時(例如,當(dāng)您需要模型在小型設(shè)備上快速運行時),您可以更好地利用設(shè)備的差異。

為了便于討論,請對比以下兩種模型部署方法(即,將經(jīng)過訓(xùn)練的模型投入生產(chǎn),以便可以使用其預(yù)測):

將sklearn作為REST服務(wù)部署在Docker容器上:這種方法很簡單并且經(jīng)常使用:我們啟動一個包含python和用于訓(xùn)練的工具的docker鏡像:對于上面的示例邏輯回歸模型sklearn。接下來,我們創(chuàng)建一個REST API服務(wù),該服務(wù)使用擬合模型的mod.predict()函數(shù)來生成結(jié)果。

Scailable WebAssembly部署:除了上述方法以外,還可以將擬合模型轉(zhuǎn)換為WebAssembly(使用與Scailable提供的服務(wù)類似的服務(wù)),并部署.WASM二進(jìn)制文件,其中僅包含在最小的WebAssembly運行時中進(jìn)行預(yù)測所需的邏輯。 自動生成的二進(jìn)制文件將僅包含必要的邏輯函數(shù)和估計的參數(shù)。二進(jìn)制文件可能部署在服務(wù)器上因此也類似地通過REST調(diào)用使用,但是,它可以兼容可用的運行時,它也幾乎可以在任何邊緣設(shè)備上運行。

顯然,第一個部署過程接近數(shù)據(jù)科學(xué)家的"我們所知道的"。直接使用我們慣用的工具是非常方便的,并且在許多方面它都有效:我們可以使用對REST端點的調(diào)用來生成預(yù)測。第二種解決方案與我們的標(biāo)準(zhǔn)實踐相距甚遠(yuǎn),并且對于模型訓(xùn)練毫無用處(即,沒有"WebAssembly軟件包來訓(xùn)練模型……")。但是,我們?nèi)匀徽J(rèn)為應(yīng)該首選:第二種設(shè)置利用了訓(xùn)練和預(yù)測之間的差異,從而在幾個方面使模型部署更好:

內(nèi)存占用:上面兩個選項中的第一個選項將需要至少75Mb的容器(要使容器變小需要大量的工程設(shè)計,使容器的大小接近1Gb更為常見)。在這種情況下,存儲的模型本身很?。?#12316;2Kb),因此容器占部署內(nèi)存占用的最大塊(請注意,例如大型神經(jīng)網(wǎng)絡(luò)可能不正確)。相反,WebAssembly運行時可以降至64Kb以下。 WebAssembly二進(jìn)制本身本身大于存儲的sklearn模型(〜50kb),但是現(xiàn)在它包含生成預(yù)測所必需的全部。因此,雖然第一個部署選項至少占用75Mb,但第二個部署選項占用不到0.1Mb。

速度:與高效的WebAssembly部署相比,消耗一個在Docker容器中運行的REST端點并不能在執(zhí)行時間上取得優(yōu)勢,因為Docker容器啟動了所有訓(xùn)練所需的東西。下面是一些針對不同模型的速度比較,但是,不必說,利用訓(xùn)練和預(yù)測之間的差異,并且僅僅將預(yù)測的基本需求投入生產(chǎn),就可以通過一個數(shù)量級提高速度,從而生成這些預(yù)測。

因此,內(nèi)存占用更小,執(zhí)行速度更快。有幾個原因;其中一個原因是,我們可能希望有效地部署模型,而不會在每次做出預(yù)測時浪費能源。但是,一個小的內(nèi)存占用和快速的執(zhí)行也是很吸引人的,因為這正是我們在將模型投入生產(chǎn)的邊緣所需要的:好運部署你的Docker容器(例如,)在ESP32 MCU板上。使用WebAssembly,這是小菜一碟。

綜上所述,你一定對WebAssembly十分感興趣,那么看看這個代碼吧,它包含了本文的所有內(nèi)容

https://github.com/scailable/sclbl-tutorials/tree/master/sclbl-train-vs-deploy

責(zé)任編輯:張燕妮 來源: 今日頭條
相關(guān)推薦

2011-06-14 14:18:08

可移植性測試

2011-07-22 17:41:02

java

2021-11-19 11:53:42

云計算混合云Kubernetes

2011-07-11 17:33:25

JAVA可移植性

2023-10-13 09:00:00

云計算架構(gòu)

2012-09-07 09:51:07

云互操作性云可移植性云計算服務(wù)

2013-12-09 09:24:46

2012-12-14 09:35:03

私有云應(yīng)用程序可移植性OpenStack

2013-05-28 10:33:06

虛擬化虛擬機(jī)移植

2016-08-02 09:45:59

云計算

2024-12-18 14:13:07

2012-09-24 09:31:28

應(yīng)用移植性云計算云平臺應(yīng)用程序

2013-10-31 10:22:21

開源云Linux容器Docker

2009-07-17 13:42:36

Windows CE應(yīng)WinCE可移植性

2009-08-17 10:17:01

C# Windows

2024-03-01 09:09:56

云計算架構(gòu)應(yīng)用

2012-11-16 15:34:35

Cloud FoundVMware PaaS平臺即服務(wù)

2009-03-26 09:25:14

J2MEJCPJSR

2013-04-02 09:25:20

PaaS 應(yīng)用可移植性PaaS提供商平臺即服務(wù)

2018-09-06 14:45:49

數(shù)據(jù)云轉(zhuǎn)型云計算
點贊
收藏

51CTO技術(shù)棧公眾號