一、PaddleServing部署
PaddleServing是基於飛槳框架(PaddlePaddle)的分佈式在線服務開發框架,提供了一整套從模型到部署的解決方案。PaddleServing提供了一個統一的部署框架,在支持多種推理引擎和運行時的同時,還可以對模型進行優化和線上部署。因此,PaddleServing在實際應用中具有較高的價值。
在使用PaddleServing進行部署時,我們只需要完成以下三個步驟:
- 模型導出:在使用PaddleServing之前,需要先在PaddlePaddle中完成模型的訓練和導出。
- 模型部署:使用PaddleServing提供的部署框架部署模型。
- 部署測試:測試部署效果,可以使用Python API或者HTTP API。
通過這三個步驟,就可以實現高效快速地將PaddlePaddle訓練好的模型部署到PaddleServing上。
# 導出模型
from paddle_serving_client import *
fetch_names = ["fc_1.tmp_2"]
feed_names = ["image"]
data = [{"image": np.ones(shape=(1, 3, 224, 224), dtype="float32")}]
client = Client()
client.load_client_config("serving_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9393"])
result = client.predict(feed=data, fetch=fetch_names, batch=True)
print(result)
二、PaddleServing部署的模型閾值
在使用PaddleServing進行部署時,我們還可以設置模型的閾值即可控制模型推理的選擇。
在代碼實現方面,可以通過在配置文件中添加閾值項,如下所示:
# 定義模型閾值
thresholds {
item {
key: "car"
value: 0.9
}
item {
key: "bus"
value: 0.8
}
}
設置模型閾值之後,就可以在推理時控制推理結果的選擇,具體代碼如下:
# 測試模型閾值
from paddle_serving_client import *
fetch_names = ["fc_1.tmp_2", "label"]
feed_names = ["image"]
data = [{"image": np.ones(shape=(1, 3, 224, 224), dtype="float32")}]
client = Client()
client.load_client_config("serving_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9393"])
result = client.predict(feed=data, fetch=fetch_names, batch=True)
print(result)
三、PaddleServing線程數
在PaddleServing中,線程數是一個影響推理速度的重要參數。一般情況下,線程數越多,可以並行處理的請求就越多,推理速度也就越快。
在代碼實現方面,可以通過修改配置文件中的服務線程數項進行設置,如下所示:
# 定義服務線程數
general_model_config {
model_filename: "serving_server/models/mymodel"
params_filename: "serving_server/params/mymodel"
...
min_subgraph_size: 10
...
max_concurrency: 300
}
使用PaddleServing進行部署時,也可以通過以下代碼設置線程數:
# 測試線程數
from paddle_serving_client import *
fetch_names = ["fc_1.tmp_2"]
feed_names = ["image"]
data = [{"image": np.ones(shape=(1, 3, 224, 224), dtype="float32")}]
client = Client()
client.load_client_config("serving_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9393"])
client.set_prediction_timeout(5000)
handle = client.predict_async(feed=data, fetch=fetch_names)
result = handle.get_result()
print(result)
四、PaddleServing速度慢
在使用PaddleServing進行推理時,有些用戶可能會發現推理速度較慢。這時,我們可以從以下幾個方面來優化:
- 使用多線程:在PaddleServing的部署過程中,可以設置線程數,增加並行處理的請求數量。
- 使用優化後的模型:在使用PaddlePaddle訓練模型時,選擇合適的優化策略,可以顯著提高模型的速度。
- 使用更高效的推理引擎:在PaddleServing中,可以使用多個推理引擎,如GRPC等,可以選擇最適合自己的推理引擎來進行推理。
五、PaddleServing部署模型
在使用PaddleServing進行部署時,我們需要將模型進行優化,以便於更好地適應線上部署的環境。這些優化包括:
- 減少模型大小:我們可以通過量化、剪枝等方法,將模型大小降低到最小。
- 提高模型推理速度:我們可以通過使用MKLDNN加速庫、TensorRT等加速工具,提高模型的推理速度。
- 適應不同的硬件平台:我們可以根據自己的需求選擇不同的硬件加速器,如GPU、FPGA、ASIC等。
在PaddleServing中,我們可以使用以下命令對模型進行部署和優化:
python tools/export_model.py \
--model ${MODEL} \
--preprocess ${PREPROCESS} \
--output_dir ${OUTPUT_DIR} \
--version ${VERSION} \
--port ${PORT} \
--server ${SERVER} \
--gpu_id ${GPU_ID} \
--opset_version 11 \
--quantized True \
--optimized_model True
六、PaddleServing和inference
PaddleServing和Paddle Inference是兩個不同的模塊,PaddleServing主要用於在線部署,而Paddle Inference則主要用於離線推理。
在使用Paddle Inference時,用戶只需要使用Python API就可以完成模型的加載和推理,而使用PaddleServing時,不能直接使用Python API進行部署,需要使用PaddleServing專用的部署框架進行部署。
在實際應用中,選擇合適的模塊進行推理可以提高推理速度和效果。
七、PaddleServing pipeline性能
在使用PaddleServing進行推理時,我們可以使用Pipeline來提高模型的性能。Pipeline是PaddleServing中用於處理大規模數據時的一種部署方式,可以將數據分批處理,從而提高處理性能。
在使用PaddleServing進行部署時,可以通過以下代碼實現Pipeline:
# 測試Pipeline性能
from paddle_serving_client import *
from paddle_serving_client.utils.multi_thread_utils import MultiThreadRunner
import numpy as np
fetch_names = ["fc_1.tmp_2"]
feed_names = ["image"]
data = [{"image": np.ones(shape=(1, 3, 224, 224), dtype="float32")}]
client = Client()
client.load_client_config("serving_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9393"])
multithread_tester = MultiThreadRunner()
multithread_tester.run(client, data, concurrency=10)
八、PaddleServing gRPC
在PaddleServing中,可以使用gRPC作為推理引擎,提高模型的推理速度和效率。
在代碼實現方面,我們需要進行以下操作:
- 在配置文件中添加gRPC服務及其相關參數。
- 在代碼中調用gRPC服務。
# 測試gRPC服務
from paddle_serving.client import PaddleServingClient
import numpy as np
fetch = ["fc_1.tmp_2"]
feed = {"image": np.ones(shape=(1, 3, 224, 224), dtype="float32")}
client = PaddleServingClient()
client.load_client_config("serving_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9393"])
result = client.predict(feed=feed, fetch=fetch)
print(result)
總結
通過對PaddleServing的多個方面進行闡述,我們可以看出PaddleServing作為在線服務開發框架,具有很高的價值和實用性。在實際應用中,我們可以通過優化模型、調整線程數和使用gRPC等多種方式來提高模型的推理速度和效率。
原創文章,作者:XUKAN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/316416.html