mxnet-model-server部署的坑總結
本文主要給自己備忘用的,語無倫次,見諒!
首先,官網MXNet Model Server,點選learn more,找到advanced installation,選擇原始碼安裝。有人問為啥原始碼安裝??因為要採坑啊!!!print走起,否則不知道怎麼死的。。。。
修改原始碼要頻繁用到:
pip install -e . pip install -U -e .
安裝好後,按樣例
mxnet-model-server --models xxx=yyy.model zzzz.py
其中,xxx是後面client要POST的網址名的一部分,yyy.model是本地model的檔名字,zzzz.py是data(本處為圖片)的預先和後處理,這個zzz可不是瞎編的要繼承mms\model_service裡的類,最好直接改example裡的sdd的。sdd的程式碼如下:
def _preprocess(self, data):
"""
Input image buffer from data is read into NDArray. Then, resized to
expected shape. Swaps axes to convert image from BGR format to RGB.
Returns the preprocessed NDArray as a list for next step, Inference.
"""
# Read input
input_image = image.read(data[0])
# Save original input image shape.
# This is required for preparing the bounding box of the detected object relative to
# original input
self.input_height = input_image.shape[0]
self.input_width = input_image.shape[1]
# Transform input image - resize, BGR to RGB.
# Reuse MXNetVisionService _preprocess to achieve above transformations.
return super(SSDService, self)._preprocess(data)
因為最後一句return過載了MXNetVisionService.py裡的_preprocess(data),而改_preprocess(data)裡含有img.resize。所以,此處對輸入的圖片不要再resize了。。。。
最重要的坑是:這裡沒去RGB均值,我參考MXNetVisionService,編了一個,如下:
self.input_height = input_image.shape[0]
self.input_width = input_image.shape[1]
img_list = []
for idx, img in enumerate(data):
input_shape = self.signature['inputs'][idx]['data_shape']
# We are assuming input shape is NCHW
[h, w] = input_shape[2:]
img_arr = image.read(img)
img_arr = image.resize(img_arr, w, h)
img_arr = image.transform_shape(img_arr).astype('float32')
bias=mx.nd.array([123.0, 117.0, 104.0]).reshape((3,1,1))
img_arr[0,:,:,:]-=bias
img_list.append(img_arr)
return img_list
記住最後return的不是super(SSDService, self)._preprocess(data)了。切記,切記!!!!
官網也沒說部署後怎麼用GPU執行!!!我自己摸索出來的,獻給各位:
在__init__裡,輸入引數gpu=0就是用0號GPU,以此類推!!!