100天搞定機器學習:模型訓練好了,然後呢?
100天搞定機器學習:模型訓練好了,然後呢?
大家好,我是老胡。
許久沒有更新100天搞定機器學習系列了,最近在看一個開源框架,其中有用到 gRPC ,它可以用於機器學習模型的部署,也可用於深度學習框架的開發,本文就當是《100天搞定機器學習》的番外篇吧。
gRPC(Remote Procedure Call)
gRPC 由 Google 開發,是一款語言中立、平臺中立、開源的 RPC 框架。
RPC(Remote Procedure Call)即:遠端過程呼叫,它是一種透過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。使用的時候,客戶端呼叫server端提供的介面就像是呼叫本地的函式一樣。
比如:有兩臺伺服器A,B,一個應用部署在A伺服器上,想要呼叫B伺服器上應用提供的函式/方法,由於不在一個記憶體空間,不能直接呼叫,需要透過網路來表達呼叫的語義和傳達呼叫的資料。
RPC更像是一種思想或機制,其實現方式有很多,除了gRPC ,還有阿里巴巴的 Dubbo、Facebook 的 Thrift、Twitter 的 Finagle 等。
gRPC 基於以下理念:定義一個服務,指定其能夠被遠端呼叫的方法(包含引數和返回型別)。在服務端實現這個介面,並執行一個 gRPC 伺服器來處理客戶端呼叫。在客戶端擁有一個存根能夠像服務端一樣的方法。你可以很容易地用 c++ 建立一個 gRPC 服務端,用 Go、Python、Ruby 來建立客戶端。
上圖中的 Protocbuf 是gRPC的資料序列化工具,使用 Protobuf 將資料序列化成二進位制的資料流,即可讓用不同語言(proto3支援C++, Java, Python, Go, Ruby, Objective-C, C#)編寫並在不同平臺上執行的應用程式交換資料。ps:Protocbuf 也是 Google 開源的。
Protocol Buffer 官方提供了編譯工具來對 proto 檔案進行編譯並生成語言相關的程式碼檔案,可以極大地減少編碼的工作量。對於序列化協議來說,使用方只需要關注業務物件本身,即 idl 定義,序列化和反序列化的程式碼只需要透過工具生成即可。
gRPC 例項詳解——機器學習模型部署
開始例項之前,需要安裝 gRPC 及相關工具
pip install -U grpcio
pip install -U grpcio-tools
pip install -U protobuf
gRPC的使用通常包括如下幾個步驟:
- 透過protobuf來定義介面和資料型別
- 編寫gRPC server端程式碼
- 編寫gRPC client端程式碼
下面我們就以Iris資料集為例,用 gRPC server端部署一個隨機森林分類器,client 端發起請求預測鳶尾花型別。
0、訓練一個隨機森林分類模型,把訓練好的模型儲存為pkl檔案。
# train_model.py
from sklearn import datasets
from sklearn.pipeline import Pipeline
import joblib
from sklearn.ensemble import RandomForestClassifier
def main():
clf = RandomForestClassifier()
p = Pipeline([('clf', clf)])
p.fit(X, y)
filename_p = 'IrisClassifier.pkl'
joblib.dump(p, filename_p)
print('Model saved!')
if __name__ == "__main__":
iris = datasets.load_iris()
X, y = iris.data, iris.target
main()
1、透過protobuf定義介面和資料型別
新建一個iris_demo.proto檔案
syntax = "proto3";
package iris;
message IrisPredictRequest {// 定義引數1
float sepal_length = 1;//引數欄位1
float sepal_width = 2;//引數欄位2
float petal_length = 3;//引數欄位3
float petal_width = 4;//引數欄位4
}
message IrisPredictResponse {// 定義引數1
int32 species = 1;
}
service IrisPredictor{// 定義服務
rpc predict_iris_species(IrisPredictRequest) returns (IrisPredictResponse){}
}
proto檔案格式一般三部分組成,
- 頭部的syntax 註明版本號為 “proto3”,必須寫,沒理由。
- 中間的 message 定義了predict_iris_species方法的引數IrisPredictRequest和IrisPredictResponse,還有引數欄位的型別。
- 尾部的 service 定義一個服務IrisPredictor,其中包括 1 個predict_iris_species的RPC方法。這裡可以定義多個RPC方法,在 message 中定義對應的引數即可。
2、使用gRPC protobuf生成Python的庫函式
python -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. ./iris_demo.proto
其中:
-I指定了原始檔的路徑
–python_out, 指定 xxx_pb2.py的輸出路徑,如果使用其它語言請使用對應語言的option
–grpc_python_out 指定xxx_pb2_grpc.py檔案的輸出路徑
–*.proto是要編譯的proto檔案。
執行成功後,會自動生成iris_demo_pb2.py(裡面有訊息序列化類)和iris_demo_pb2_grpc.py(包含了伺服器 Stub 類和客戶端 Stub 類,以及待實現的服務 RPC 介面)。我們無需關心這兩個py檔案的細節,只需要直到在服務端和客戶端怎麼呼叫即可。
本例中,我們會用到的方法如下:
xxx_pb2.py
├── xxx_pb2.IrisPredictRequest 用於傳入特徵資料
├── xxx_pb2.IrisPredictResponse 用於預測
xxxx_pb2_grpc.py
├── xxx_pb2_grpc.IrisPredictorServicer 伺服器 Stub 類
├── xxx_pb2_grpc.IrisPredictorStub 客戶端 Stub 類
3、寫一個伺服器
這裡的重點是定義 IrisPredictor 類的 predict_iris_species 方法,然後用 iris_demo_pb2_grpc.py 中的 add_IrisPredictorServicer_to_server 方法將 IrisPredictor 新增到 server。serve 函式里定義了 gRPC 的執行方式,使用 4 個 worker 的執行緒池。
# iris_prediction_server.py
import grpc
from concurrent import futures
import time
import joblib
import iris_demo_pb2
import iris_demo_pb2_grpc
import predict_iris
from sklearn.ensemble import RandomForestClassifier
class IrisPredictor(iris_demo_pb2_grpc.IrisPredictorServicer):
@classmethod
def get_trained_model(cls):
cls._model = joblib.load('IrisClassifier.pkl')
return cls._model
def predict_iris_species(self, request, context):
model = self.__class__.get_trained_model()
sepal_length = request.sepal_length
sepal_width = request.sepal_width
petal_length = request.petal_length
petal_width = request.petal_width
result = model.predict(
[[sepal_length, sepal_width, petal_length, petal_width]])
response = iris_demo_pb2.IrisPredictResponse(species=result[0])
return response # not sure
def run():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
iris_demo_pb2_grpc.add_IrisPredictorServicer_to_server(
IrisPredictor(), server)
server.add_insecure_port('[::]:50055')
server.start()
print("grpc server start...")
print("Listening on port 50055")
server.wait_for_termination()
if __name__ == '__main__':
run()
4、寫一個客戶端
客戶端的邏輯更加簡單,連上gRPC服務,然後發起呼叫。
# iris_prediction_client.py
import grpc
import iris_demo_pb2
import iris_demo_pb2_grpc
def run():
channel = grpc.insecure_channel('localhost:50055')
stub = iris_demo_pb2_grpc.IrisPredictorStub(channel)
request = iris_demo_pb2.IrisPredictRequest(
sepal_length=6.7,
sepal_width=3.0,
petal_length=5.2,
petal_width=2.3)
response = stub.predict_iris_species(request)
print('The prediction is :', response.species)
if __name__ == '__main__':
run()
5、呼叫 RPC
先開啟服務端
$ python iris_prediction_server.py
另起一個terminal執行客戶端程式碼,呼叫gRPC服務,結果如下:
$ python iris_prediction_client.py
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2797847/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 機器學習之邏輯迴歸:模型訓練機器學習邏輯迴歸模型
- 瀏覽器中的機器學習:使用預訓練模型瀏覽器機器學習模型
- 機器學習的訓練集機器學習
- 機器學習-訓練模型的儲存與恢復(sklearn)機器學習模型
- 如何對SAP Leonardo上的機器學習模型進行重新訓練機器學習模型
- 如何用Python和機器學習訓練中文文字情感分類模型?Python機器學習模型
- Workshop:產品經理小姐姐手把手教你訓練機器學習模型機器學習模型
- Arduino和低功耗微控制器機器學習 - 喚醒詞檢測模型訓練UI機器學習模型
- 飛槳圖學習大模型訓練框架大模型框架
- 【Meetup預告】OpenMLDB+OneFlow:連結特徵工程到模型訓練,加速機器學習模型開發特徵工程模型機器學習
- TiDB v5.1 體驗: 我用 TiDB 訓練了一個機器學習模型TiDB機器學習模型
- 機器學習之訓練神經網路:最佳做法機器學習神經網路
- pytorch使用交叉熵訓練模型學習筆記PyTorch熵模型筆記
- NLP與深度學習(五)BERT預訓練模型深度學習模型
- 初創公司如何訓練大型深度學習模型深度學習模型
- 【JSConf EU 2018】用 JavaScript 來在客戶端上訓練和執行機器學習模型JSJavaScript客戶端機器學習模型
- 機器學習模型機器學習模型
- 試用阿里雲GPU伺服器進行深度學習模型訓練阿里GPU伺服器深度學習模型
- 訓練機器學習的資料集大小很重要 - svpino機器學習
- 在Mac上訓練機器學習模型,蘋果WWDC釋出全新Create ML、Core ML 2Mac機器學習模型蘋果
- 機器學習實踐:TensorFlow最後一個epoch訓練損失函式顯著增大機器學習函式
- 一步一步教你線上免費訓練機器學習模型(啟用GPU和TPU)機器學習模型GPU
- ENVI深度學習隨機引數訓練方法深度學習隨機
- 如何管理機器學習模型機器學習模型
- 欺騙機器學習模型機器學習模型
- 機器學習導圖系列(5):機器學習模型及神經網路模型機器學習模型神經網路
- 100天搞定機器學習:PyYAML基礎教程機器學習YAML
- 機器學習模型部署--打通前後端任督二脈機器學習模型後端
- 新型大語言模型的預訓練與後訓練正規化,阿里Qwen模型阿里
- 機器學習——決策樹模型機器學習模型
- 機器學習之模型選擇機器學習模型
- 機器學習之模型診斷機器學習模型
- 機器學習之模型評估機器學習模型
- 【機器學習】--隱語義模型機器學習模型
- 用 Java 訓練深度學習模型,原來可以這麼簡單!Java深度學習模型
- 基於Theano的深度學習框架keras及配合SVM訓練模型深度學習框架Keras模型
- 使用AutoDL伺服器進行模型訓練伺服器模型
- 新型大語言模型的預訓練與後訓練正規化,谷歌的Gemma 2語言模型模型谷歌Gemma