tensorflow serving的兩種調(diào)用方式

客戶端調(diào)用的兩種方式

gRPC

參考文獻(xiàn)
如何使用tensorflow-serving部署模型-segmentation
英文版

以語義分割為例荧嵌,調(diào)用代碼還是比較簡單的口糕,核心是三個(gè)變量托呕,圖像充甚、高度乞巧、寬度涨椒,要以tensor的形式傳入:

# define the image url to be sent to the model for 

predictionimage_url = "https://www.publicdomainpictures.net/pictures/60000/nahled/bird-1382034603Euc.jpg"

response = requests.get(image_url)
image = np.array(Image.open(StringIO(response.content)))
height = image.shape[0]
width = image.shape[1]
print("Image shape:", image.shape)


# create the RPC stub  
#***IP和端口***
channel = implementations.insecure_channel(host, int(port))
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)

# create the request object and set the name and signature_name params
request = predict_pb2.PredictRequest()
request.model_spec.name = 'deeplab'
request.model_spec.signature_name = 'predict_images'

# fill in the request object with the necessary data
request.inputs['images'].CopyFrom(
  tf.contrib.util.make_tensor_proto(image.astype(dtype=np.float32), shape=[1, height, width, 3]))

request.inputs['height'].CopyFrom(tf.contrib.util.make_tensor_proto(height, shape=[1]))
request.inputs['width'].CopyFrom(tf.contrib.util.make_tensor_proto(width, shape=[1]))


# sync requests
result_future = stub.Predict(request, 30.)
# For async requests
#result_future = stub.Predict.future(request, 10.)
# result_future = result_future.result()

restful

參考文獻(xiàn)
使用docker部署tensorflow-serving

文獻(xiàn)中客戶端調(diào)用的完整的源碼在這里

restful代碼非常簡單,我覺得這種方式好:

  SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict'

 # Download the image
  dl_request = requests.get(IMAGE_URL, stream=True)
  dl_request.raise_for_status()

  # Compose a JSON Predict request (send JPEG image in base64).
  jpeg_bytes = base64.b64encode(dl_request.content).decode('utf-8')
  predict_request = '{"instances" : [{"b64": "%s"}]}' % jpeg_bytes
  response = requests.post(SERVER_URL, data=predict_request)
  response.raise_for_status()
  prediction = response.json()['predictions'][0]
  print(prediction['classes'])  
#這里不太好的地方是绽媒,輸出的分類是一個(gè)編號(數(shù)字)蚕冬,不是具體的label如cat/dog這種,可讀性較差是辕,而且不知道去哪里找這個(gè)標(biāo)簽

restful還有其他一些比較有用的api囤热,如

  1. 查看模型狀態(tài)
  model_metadata = requests.get('http://localhost:8501/v1/models/resnet', stream=True)
  model_metadata.raise_for_status()
  print(model_metadata.json())
#輸出
#{'model_version_status': [{'version': '1538687457', 'state': 'AVAILABLE', 'status': {'error_code': 'OK', 'error_message': ''}}]}
  1. 查看模型metadata
#注意跟上面相比,多了個(gè)metadata
 model_metadata = requests.get('http://localhost:8501/v1/models/resnet/metadata', stream=True)
  model_metadata.raise_for_status()
  print(json.dumps(model_metadata.json()))

metadata示例

{
    "model_spec": {
        "name": "resnet",
        "signature_name": "",
        "version": "1538687457"
    },
    "metadata": {
        "signature_def": {
            "signature_def": {
                "serving_default": {
                    "inputs": {
                        "image_bytes": {
                            "dtype": "DT_STRING",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "input_tensor:0"
                        }
                    },
                    "outputs": {
                        "probabilities": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "1001",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "softmax_tensor:0"
                        },
                        "classes": {
                            "dtype": "DT_INT64",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "ArgMax:0"
                        }
                    },
                    "method_name": "tensorflow/serving/predict"
                },
                "predict": {
                    "inputs": {
                        "image_bytes": {
                            "dtype": "DT_STRING",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "input_tensor:0"
                        }
                    },
                    "outputs": {
                        "probabilities": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "1001",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "softmax_tensor:0"
                        },
                        "classes": {
                            "dtype": "DT_INT64",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "ArgMax:0"
                        }
                    },
                    "method_name": "tensorflow/serving/predict"
                }
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获三,一起剝皮案震驚了整個(gè)濱河市旁蔼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疙教,老刑警劉巖棺聊,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贞谓,居然都是意外死亡限佩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門裸弦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祟同,“玉大人,你說我怎么就攤上這事理疙≡纬牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵窖贤,是天一觀的道長砖顷。 經(jīng)常有香客問我,道長赃梧,這世上最難降的妖魔是什么滤蝠? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮槽奕,結(jié)果婚禮上几睛,老公的妹妹穿的比我還像新娘。我一直安慰自己粤攒,他們只是感情好所森,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布囱持。 她就那樣靜靜地躺著,像睡著了一般焕济。 火紅的嫁衣襯著肌膚如雪纷妆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天晴弃,我揣著相機(jī)與錄音掩幢,去河邊找鬼。 笑死上鞠,一個(gè)胖子當(dāng)著我的面吹牛际邻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芍阎,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼世曾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谴咸?” 一聲冷哼從身側(cè)響起轮听,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岭佳,沒想到半個(gè)月后血巍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珊随,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年述寡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玫恳。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辨赐,死狀恐怖优俘,靈堂內(nèi)的尸體忽然破棺而出京办,到底是詐尸還是另有隱情,我是刑警寧澤帆焕,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布惭婿,位于F島的核電站,受9級特大地震影響叶雹,放射性物質(zhì)發(fā)生泄漏财饥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一折晦、第九天 我趴在偏房一處隱蔽的房頂上張望钥星。 院中可真熱鬧,春花似錦满着、人聲如沸谦炒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宁改。三九已至缕探,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間还蹲,已是汗流浹背爹耗。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谜喊,地道東北人潭兽。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像斗遏,于是被迫代替她去往敵國和親讼溺。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348