導(dǎo)讀
你是否會(huì)遇到這樣的場(chǎng)景,當(dāng)你訓(xùn)練了一個(gè)新模型,有時(shí)你不想費(fèi)心編寫 Flask Code(Python的web 框架)或者將模型容器化并在 Docker 中運(yùn)行它,就想通過 API 立即使用這個(gè)模型?
如果你有這個(gè)需求,你肯定想了解MLServer。它是一個(gè)基于Python的推理服務(wù)器,最近推出了GA(Genetic Algorithms 遺傳算法)的版本,這是一款專為生產(chǎn)環(huán)境設(shè)計(jì)的高性能服務(wù)器。
使用它可以確保在本地構(gòu)建模型,與投入生產(chǎn)環(huán)境的模型保持一致。
本文以幾個(gè)圖像模型為例,向您介紹如何使用 MLServer。
數(shù)據(jù)集
我們要使用的數(shù)據(jù)集是Fashion MNIST。它包含 70,000 張灰度 28×28 像素的服裝圖像,涵蓋 10 個(gè)不同類別(如上衣、連衣裙、外套、褲子等)。
如果您想重現(xiàn)本文中的代碼,請(qǐng)確保下載文件并將它們解壓縮到名為 data. 因?yàn)槲募浅4螅?span id="k0kkkk0" class="candidate-entity-word" data-gid="3231109">GitHub 存儲(chǔ)庫(kù)中省略了它們。
1.訓(xùn)練 Scikit-learn 模型
首先,我們將使用scikit-learn框架訓(xùn)練一個(gè)支持向量機(jī)(SVM) 模型。然后我們將模型保存到一個(gè)名為Fashion-MNIST.joblib 的文件中。
import pandas as pdfrom sklearn import SVMimport timeimport joblib#Load Training Datatrain = pd.read_csv('../../data/fashion-mnist_train.csv', header=0)y_train = train['label']X_train = train.drop(['label'], axis=1)classifier = svm.SVC(kernel="poly", degree=4, gamma=0.1)#Train Modelstart = time.time()classifier.fit(X_train.values, y_train.values)end = time.time()exec_time = end-startprint(f'Execution time: {exec_time} seconds')#Save Modeljoblib.dump(classifier, "Fashion-MNIST.joblib")1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.
注意:SVM 算法不是特別適合大型數(shù)據(jù)集,因?yàn)樗哂卸涡再|(zhì)。根據(jù)您的硬件,此示例中的模型將需要幾分鐘的時(shí)間來訓(xùn)練。
2.服務(wù)于 Scikit-learn 模型
通過上面的步驟我們的到一個(gè)模型文件Fashion-MNIST.joblib。接下來看看如何使用 MLServer 來提供服務(wù)。
首先,通過如下命令安裝 MLServer:pip install mlserver。
雖然額外的運(yùn)行時(shí)組件是可選的,但在服務(wù)模型時(shí)更加順暢,我們也會(huì)安裝 Scikit-Learn 和 XGBoost 的擴(kuò)展。。
完成pip install mlserver-sklearn mlserver-xgboost操作后,就需要添加如下兩個(gè)配置文件:
(1)settings.json- 這包含服務(wù)器本身的配置。
(2)model-settings.json- 顧名思義,此文件包含要運(yùn)行的模型配置。
對(duì)于settings.json文件,只定義一個(gè)參數(shù)就足夠了:
{ "debug": "true"}1.2.3.
該model-settings.json文件需要更多信息,因?yàn)樗枰私夥?wù)模型信息:
{ "name": "fashion-sklearn", "implementation": "mlserver_sklearn.SKLearnModel", "parameters": { "uri": "./Fashion_MNIST.joblib", "version": "v1" }}1.2.3.4.5.6.7.8.
name 參數(shù)為 MLServer 提供了唯一標(biāo)識(shí)符,在多模型服務(wù)場(chǎng)景下特別有用(稍后會(huì)談到)。定義要使用的implementation從而預(yù)構(gòu)建服務(wù)器(如果有)。它與用于訓(xùn)練模型的機(jī)器學(xué)習(xí)框架高度耦合。在我們的案例中使用 scikit-learn來訓(xùn)練模型,因此將使用 scikit-learn 實(shí)現(xiàn) MLServer。Parameters配置需要提供模型文件的位置以及版本號(hào)。
通過上面的配置,就可以使用以下命令為我們的模型提供服務(wù):mlserver start .
就這么簡(jiǎn)單,現(xiàn)在已經(jīng)讓模型在本地服務(wù)器上運(yùn)行起來了。此時(shí),它已經(jīng)可以接受類似 HTTP 和 gRPC(默認(rèn)端口為8080和8081)的請(qǐng)求了。
3.測(cè)試模型
模型已經(jīng)啟動(dòng)并正常運(yùn)行了,讓我們發(fā)送一些請(qǐng)求測(cè)試它的運(yùn)行情況。
我們會(huì)通過如下URL 發(fā)送一個(gè) POST 請(qǐng)求:
http://localhost:8080/v2/models/<MODEL_NAME>/versions/<VERSION>/infer
這個(gè)URL意味著訪問之前訓(xùn)練的 scikit-learn 模型,這里只需要將MODEL_NAME用fashion-sklearn的模型名稱進(jìn)行替換,同時(shí)將VERSION用v1進(jìn)行替換。
下面的代碼展示如何導(dǎo)入測(cè)試數(shù)據(jù),向模型服務(wù)器發(fā)出請(qǐng)求,然后將結(jié)果與實(shí)際標(biāo)簽進(jìn)行比較:
import pandas as pdimport requests#Import test data, grab the first row and corresponding labeltest = pd.read_csv('../../data/fashion-mnist_test.csv', header=0)y_test = test['label'][0:1]X_test = test.drop(['label'],axis=1)[0:1]#Prediction request parametersinference_request = { "inputs": [ { "name": "predict", "shape": X_test.shape, "datatype": "FP64", "data": X_test.values.tolist() } ]}endpoint = "http://localhost:8080/v2/models/fashion-sklearn/versions/v1/infer"#Make request and print responseresponse = requests.post(endpoint, json=inference_request)print(response.text)print(y_test.values)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.
運(yùn)行上面的test.py之后,會(huì)從 MLServer 得到以下響應(yīng):
"model_name": "fashion-sklearn", "model_version": "v1", "id": "31c3fa70-2e56-49b1-bcec-294452dbe73c", "parameters": null, "outputs": [ { "name": "predict", "shape": [ 1 ], "datatype": "INT64", "parameters": null, "data": [ 0 ] } ]}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.
從響應(yīng)中可以得知, MLServer 已經(jīng)生成了一個(gè)請(qǐng)求 ID,并自動(dòng)添加用于服務(wù)請(qǐng)求的模型和版本的元數(shù)據(jù)。一旦模型投入生產(chǎn),收集類似的元數(shù)據(jù)就顯得非常重要。它允許我們記錄每個(gè)請(qǐng)求從而方便進(jìn)行審計(jì)和故障排除。
您可能還注意到 MLServer 返回一個(gè)數(shù)組outputs。雖然在請(qǐng)求中只發(fā)送了一行數(shù)據(jù),但 MLServer處理批量請(qǐng)求,并一起返回。我們甚至可以通過一種稱為自適應(yīng)批處理的技術(shù)來優(yōu)化在生產(chǎn)環(huán)境中處理多個(gè)請(qǐng)求的方式。
在上面的示例中,也可以找到模型的預(yù)測(cè)的結(jié)果。outputs[0].data表明模型已將該樣本標(biāo)記為類別0(數(shù)值 0 對(duì)應(yīng)于類別t-shirt/top)。該樣本的真實(shí)標(biāo)簽0也是如此,因此模型得到了正確的預(yù)測(cè)。
4.訓(xùn)練 XGBoost 模型
通過上面的例子我們了解了如何使用 MLServer 創(chuàng)建單個(gè)模型,接下來讓我們看看如何處理在不同框架中訓(xùn)練的多個(gè)模型。
依舊使用 Fashion MNIST 數(shù)據(jù)集,但這次將訓(xùn)練XGBoost模型。
import pandas as pdimport xgboost as xgbimport time#Load Training Datatrain = pd.read_csv('../../data/fashion-mnist_train.csv', header=0)y_train = train['label']X_train = train.drop(['label'], axis=1)dtrain = xgb.DMatrix(X_train.values, label=y_train.values)#Train Modelparams = { 'max_depth': 5, 'eta': 0.3, 'verbosity': 1, 'objective': 'multi:softmax', 'num_class' : 10}num_round = 50start = time.time()bstmodel = xgb.train(params, dtrain, num_round, evals=[(dtrain, 'label')], verbose_eval=10)end = time.time()exec_time = end-startprint(f'Execution time: {exec_time} seconds')#Save Modelbstmodel.save_model('Fashion_MNIST.json')1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.
上面用于訓(xùn)練 XGBoost 模型的代碼與之前用于訓(xùn)練 scikit-learn 模型的代碼類似,但是這一次,我們的模型為了兼容 XGBoost 的格式將其保存為Fashion_MNIST.json 文件.
5.服務(wù)多個(gè)模型
MLServer 的一大優(yōu)點(diǎn)是支持多模型服務(wù)。這意味著不必為部署的每個(gè) ML 模型創(chuàng)建或運(yùn)行新服務(wù)器。使用上面構(gòu)建的模型,將使用此功能同時(shí)為它們提供服務(wù)。
當(dāng) MLServer 啟動(dòng)時(shí),它將在目錄(和任何子目錄)中搜索model-settings.json文件。如果您有多個(gè)model-settings.json文件,那么它將自動(dòng)為所有文件提供服務(wù)。
注意:您仍然只需要指定根目錄中的 (服務(wù)器配置)文件settings.json
這是目錄結(jié)構(gòu)的細(xì)分以供參考:
.├── data│ ├── fashion-mnist_test.csv│ └── fashion-mnist_train.csv├── models│ ├── sklearn│ │ ├── Fashion_MNIST.joblib│ │ ├── model-settings.json│ │ ├── test.py│ │ └── train.py│ └── xgboost│ ├── Fashion_MNIST.json│ ├── model-settings.json│ ├── test.py│ └── train.py├── README.md├── settings.json└── test_models.py1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.
請(qǐng)注意,有兩個(gè)model-settings.json文件 – 一個(gè)用于 scikit-learn 模型,一個(gè)用于 XGBoost 模型。
現(xiàn)在可以運(yùn)行mlserver start .,它將開始處理兩個(gè)模型的請(qǐng)求。
[mlserver] INFO - Loaded model 'fashion-sklearn' succesfully.[mlserver] INFO - Loaded model 'fashion-xgboost' succesfully.1.2.
6.測(cè)試多個(gè)模型的準(zhǔn)確性
現(xiàn)在兩個(gè)模型都在 MLServer 上運(yùn)行,我們可以使用測(cè)試集中的樣本來驗(yàn)證每個(gè)模型的準(zhǔn)確性。
以下代碼向每個(gè)模型發(fā)送一個(gè)批處理請(qǐng)求(包含完整的測(cè)試集),然后將預(yù)測(cè)值與真實(shí)標(biāo)簽進(jìn)行比較。在整個(gè)測(cè)試集上執(zhí)行此操作,為我們提供了衡量每個(gè)模型準(zhǔn)確性的方法,并將最終結(jié)果打印出來。
import pandas as pdimport requestsimport json#Import the test data and split the data from the labelstest = pd.read_csv('./data/fashion-mnist_test.csv', header=0)y_test = test['label']X_test = test.drop(['label'],axis=1)#Build the inference requestinference_request = { "inputs": [ { "name": "predict", "shape": X_test.shape, "datatype": "FP64", "data": X_test.values.tolist() } ]}#Send the prediction request to the relevant model, compare responses to training labels and calculate accuracydef infer(model_name, version): endpoint = f"http://localhost:8080/v2/models/{model_name}/versions/{version}/infer" response = requests.post(endpoint, json=inference_request) #calculate accuracy correct = 0 for i, prediction in enumerate(json.loads(response.text)['outputs'][0]['data']): if y_test[i] == prediction: correct = 1 accuracy = correct / len(y_test) print(f'Model Accuracy for {model_name}: {accuracy}')infer("fashion-xgboost", "v1")infer("fashion-sklearn", "v1")1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.
結(jié)果表明,XGBoost 模型略微優(yōu)于 SVM scikit-learn 模型:
Model Accuracy for fashion-xgboost: 0.8953Model Accuracy for fashion-sklearn: 0.8641.2.
總結(jié)
希望通過上面的描述,您已經(jīng)了解使用MLServer服務(wù)模型大致過程。如果需要了解更多信息,您需要閱讀相關(guān)文檔并查看不同框架的示例。
對(duì)于MLFlow用戶而言,可以使用 MLServer 直接在 MLFlow 中提供模型,如果您是Kubernetes用戶,您應(yīng)該了解Seldon Core ,它是一個(gè)將模型部署到Kubernetes?的開源工具(它在后臺(tái)使用 MLServer) 。
譯者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。曾任惠普技術(shù)專家。樂于分享,撰寫了很多熱門技術(shù)文章,閱讀量超過60萬(wàn)?!斗植际郊軜?gòu)原理與實(shí)踐》作者。
參考鏈接:https://dzone.com/articles/How-to-Utilize-Python-Machine-Learning-Models
來源:51CTO技術(shù)棧
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。