上海服裝品牌網(wǎng)站建設(shè)seo課程培訓班費用
文章目錄
- 前言
- 一、數(shù)據(jù)集
- 二、訓練 Scikit-learn 模型
- 三、基于MLSever構(gòu)建Scikit-learn服務
- 四、測試模型
- 五、訓練 XGBoost 模型
- 六、服務多個模型
- 七、測試多個模型的準確性
- 總結(jié)
- 參考
前言
在過去我們訓練模型,往往通過編寫flask代碼或者容器化我們的模型并在docker中運行。這篇文章中,我們將分享如何基于mlserver來搭建Web服務。mlserver是基于 python的推理服務器,可以通過簡單的代碼實現(xiàn)python web服務,但是它的真正優(yōu)點在于它是一個為生產(chǎn)環(huán)境設(shè)計的高性能服務器。
一、數(shù)據(jù)集
本博客通過使用幾個圖像模型作為示例,介紹如何使用 MLServer,我們要使用的數(shù)據(jù)集是Fashion MNIST 數(shù)據(jù)集。它包含 70,000 張灰度 28x28 像素的服裝圖像,分為 10 個不同的類別(上衣、連衣裙、外套、褲子等)。
二、訓練 Scikit-learn 模型
首先,我們使用scikit-learn框架訓練支持向量機 (SVM) 模型。然后我們將模型保存到一個名為Fashion-MNIST.joblib文件中。
import pandas as pd
from sklearn import svm
import time
import joblib#Load Training Data
train = 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 Model
start = time.time()
classifier.fit(X_train.values, y_train.values)
end = time.time()
exec_time = end-start
print(f'Execution time: {exec_time} seconds')#Save Model
joblib.dump(classifier, "Fashion-MNIST.joblib")
注意:SVM 算法不是特別適合大型數(shù)據(jù)集,因為它具有二次性質(zhì)。根據(jù)使用的硬件,本示例中的模型將需要幾分鐘時間進行訓練。
三、基于MLSever構(gòu)建Scikit-learn服務
好的,所以我們現(xiàn)在有一個保存的模型文件Fashion-MNIST.joblib。讓我們來看看我們?nèi)绾问褂?MLServer 來提供服務…
首先,我們需要安裝 MLServer。
pip install mlserver
額外的運行時是可選的,但在服務模型時讓生活變得非常輕松,我們也會安裝 Scikit-Learn 和 XGBoost 的
pip install mlserver-sklearn mlserver-xgboost
你可以在此處找到有關(guān)所有推理運行時的詳細信息,完成后,我們需要做的就是添加兩個配置文件:
- settings.json- 這包含服務器本身的配置。
- model-settings.json- 顧名思義,此文件包含我們要運行的模型的配置。對于我們的settings.json文件,只需定義一個參數(shù)就足夠了:
{"debug": "true"
}
該model-settings.json文件需要更多信息,因為它需要了解我們嘗試服務的模型:
{"name": "fashion-sklearn","implementation": "mlserver_sklearn.SKLearnModel","parameters": {"uri": "./Fashion_MNIST.joblib","version": "v1"}
}
name參數(shù)為 MLServer 提供了一個唯一標識符,這在為多個模型提供服務時特別有用(我們稍后會談到)。定義implementation要使用的預建服務器(如果有),它與用于訓練模型的機器學習框架緊密耦合。在我們的例子中,我們使用 scikit-learn 訓練了模型,因此我們將使用 MLServer 的 scikit-learn 實現(xiàn)。對于模型,parameters我們只需要提供模型文件的位置以及版本號。
就是這樣,兩個小配置文件,我們準備好使用以下命令為我們的模型提供服務:
mlserver start .
我們現(xiàn)在已經(jīng)在本地服務器上運行了我們的模型。它現(xiàn)在已準備好接受通過 HTTP 和 gRPC(分別為默認端口8080和8081)的請求。
四、測試模型
現(xiàn)在我們的模型已經(jīng)啟動并運行了。讓我們發(fā)送一些請求以查看它的運行情況。
要對我們的模型進行預測,我們需要向以下 URL 發(fā)送 POST 請求:
http://localhost:8080/v2/models/<MODEL_NAME>/versions//infer
這意味著要訪問我們之前訓練的 scikit-learn 模型,我們需要用fashion-sklearn替換MODEL_NAME,用 v1替換VERSION。
下面的代碼顯示了如何導入測試數(shù)據(jù),向模型服務器發(fā)出請求,然后將結(jié)果與實際標簽進行比較:
import pandas as pd
import requests#Import test data, grab the first row and corresponding label
test = 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 parameters
inference_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 response
response = requests.post(endpoint, json=inference_request)
print(response.text)
print(y_test.values)
運行test.py上面的代碼時,我們從 MLServer 得到以下響應:
{"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]}]
}
你會注意到 MLServer 已生成一個請求 ID,并自動添加了有關(guān)用于滿足我們請求的模型和版本的元數(shù)據(jù)。一旦我們的模型投入生產(chǎn),捕獲這種元數(shù)據(jù)就非常重要;它允許我們記錄每個請求以用于審計和故障排除目的。
你可能還會注意到 MLServer已返回一個數(shù)組outputs。在我們的請求中,我們只發(fā)送了一行數(shù)據(jù),但MLServer也處理批量請求并將它們一起返回。你甚至可以使用一種稱為自適應批處理的技術(shù)來優(yōu)化在生產(chǎn)環(huán)境中處理多個請求的方式。
在我們上面的示例中,可以找到模型的預測,其中outputs[0].data顯示模型已將此樣本標記為類別0(值 0 對應于類別t-shirt/top)。該樣本的真實標簽也是,0所以模型得到了正確的預測!
五、訓練 XGBoost 模型
現(xiàn)在我們已經(jīng)了解了如何使用 MLServer 創(chuàng)建和提供單個模型,讓我們來看看我們?nèi)绾翁幚碓诓煌蚣苤杏柧毜亩鄠€模型。
我們將使用相同的 Fashion MNIST 數(shù)據(jù)集,但這次我們將訓練XGBoost模型。
import pandas as pd
import xgboost as xgb
import time#Load Training Data
train = 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 Model
params = {'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-start
print(f'Execution time: {exec_time} seconds')#Save Model
bstmodel.save_model('Fashion_MNIST.json')
上面用于訓練 XGBoost 模型的代碼與我們之前用于訓練 scikit-learn 模型的代碼類似,但這次我們的模型以 XGBoost 兼容格式保存為Fashion_MNIST.json。
六、服務多個模型
MLServer 的一個很酷的事情是它支持多模型服務。這意味著您不必為要部署的每個 ML 模型創(chuàng)建或運行新服務器。使用我們上面構(gòu)建的模型,我們將使用此功能同時為它們提供服務。
當 MLServer 啟動時,它將在目錄(和任何子目錄)中搜索model-settings.json文件。如果您有多個model-settings.json文件,那么它會自動為所有文件提供服務。
settings.json注意:您仍然只需要根目錄中的一個(服務器配置)文件
這是我的目錄結(jié)構(gòu)的細分以供參考:
.
├── 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.py
請注意,有兩個model-settings.json文件 - 一個用于 scikit-learn 模型,一個用于 XGBoost 模型。
我們現(xiàn)在可以運行mlserver start .,它將開始處理兩個模型的請求。
[mlserver] INFO - Loaded model 'fashion-sklearn' succesfully.
[mlserver] INFO - Loaded model 'fashion-xgboost' succesfully.
七、測試多個模型的準確性
現(xiàn)在這兩個模型都在 MLServer 上啟動并運行,我們可以使用測試集中的樣本來驗證我們每個模型的準確性。
以下代碼向每個模型發(fā)送一個批處理請求(包含完整的測試集),然后將收到的預測與真實標簽進行比較。在整個測試集上執(zhí)行此操作可以衡量每個模型的準確性。
import pandas as pd
import requests
import json#Import the test data and split the data from the labels
test = pd.read_csv('./data/fashion-mnist_test.csv', header=0)
y_test = test['label']
X_test = test.drop(['label'],axis=1)#Build the inference request
inference_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 accuracy
def infer(model_name, version):endpoint = f"http://localhost:8080/v2/models/{model_name}/versions/{version}/infer"response = requests.post(endpoint, json=inference_request)#calculate accuracycorrect = 0for i, prediction in enumerate(json.loads(response.text)['outputs'][0]['data']):if y_test[i] == prediction:correct += 1accuracy = correct / len(y_test)print(f'Model Accuracy for {model_name}: {accuracy}')infer("fashion-xgboost", "v1")
infer("fashion-sklearn", "v1")
結(jié)果表明,XGBoost 模型略優(yōu)于 SVM scikit-learn 模型:
Model Accuracy for fashion-xgboost: 0.8953
Model Accuracy for fashion-sklearn: 0.864
總結(jié)
希望現(xiàn)在你已經(jīng)了解使用MLServer為模型提供服務是多么容易。
參考
https://dev.to/ukcloudman/serving-python-machine-learning-models-with-ease-37kh