TFServe簡介:簡單易用的HTTP伺服器,用於tensorflow 模型推理

TFServe簡介:簡單易用的HTTP服務器,用於tensorflow 模型推理

機器學習中最有趣(也很有趣)的部分是利用你花時間訓練的模型。雖然有很多關於如何訓練模型的資源,但我們經常發現很難弄清楚如何部署使用訓練模型進行推理的系統(即進行預測)。TFServe是一個框架,旨在通過HTTP服務器以簡單方便的方式為tensorflow模型提供服務。

TFServe是一個建立在apistar之上的微框架。要安裝它,只需運行:

$ pip install tfserve

如何使用TFServe?

讓我們從這個常見的場景開始。在ImageNet上谷歌為圖像分類訓練了一個Tensorflow Inception CNN 模型。您希望構建一個使用此模型進行推理的HTTP服務。

從描述中可以看出,這個模型接收224x224的RGB圖像,並返回最可能的類(來自ImageNet中可用的1000個類)。下載模型,得到一frozen_graph.pb(或類似)文件。

現在怎麼辦呢?這就是tfserve發揮作用的地方:

你需要5個部分:

  • 模型文件:它可以是.pb包含ckpt文件的 文件或模型目錄。
  • 輸入張量名稱:圖的輸入張量的名稱。
  • 輸出張量名稱:圖的輸出張量的名稱。
  • encode:python函數,接收請求正文數據並輸出dict映射輸入張量名稱以輸入numpy值。
  • decode:python函數,它接收dict映射輸出張量名稱以輸出numpy值並返回HTTP響應。

輸入和輸出張量名稱

您可能知道,每個tensorflow graph張量都由唯一名稱標識。創建圖時會聲明此名稱。您需要指定tfserve輸入張量的名稱。輸出張量也是如此。

但我從一些Tensorflow回購下載了這個模型,我不知道輸入/輸出張量名稱!

只需使用 tfserve.helper.estimate_io_tensors函數來了解可能的i / o張量供您選擇。

例如,

> import tfserve import helper
> helper.estimate_io_tensors("frozen_model.pb")
Possible INPUT tensors:
import/img:0

Possible OUTPUT tensors:
pred/out:0
pred/softmax_out:0

編碼函數

實現接收HTTP請求正文數據的函數,並將dict映射輸入張量名稱輸出到輸入numpy值。

在圖像分類示例之後,該encode函數將接收HTTP請求正文中提供的二進制數據,並應將dict映射“ import/img:0” 輸出到224x224歸一化的RGB numpy圖像,Python代碼如下:

def encode(request_data):
with tempfile.NamedTemporaryFile(mode="wb", suffix=".jpg") as f:
f.write(request_data)
img = PIL.Image.open(f.name).resize((224, 224))
img = np.asarray(img) / 255.

return {"import/img:0": img}

解碼函數

實現一個函數,該函數接收dict映射輸出張量名稱以輸出numpy值並返回HTTP響應。

在圖像分類示例之後,該decode函數將接收到具有類概率的1000大小數組的dict映射pred/softmax_out:0。我希望返回一個JSON對象,如:

{
class: "german shepard",
prob: 0.98,
}

其中包含有關最可能的類的信息。

然後,decode函數將是,Python代碼如下:

def decode(outputs):
p = outputs["pred/softmax_out:0"]
index = np.argmax(p)
return {
"class": index_to_class_name(index),
"prob": float(p[index])
}

運行服務器

您現在可以運行提供上述所有5個部分的服務器(模型路徑,輸入張量,輸出張量encode和decode函數),python示例如下:

from tfserve import TFServeApp
app = TFServeApp("frozen_graph.pb", ["import/img:0"],
["pred/softmax_out:0"], encode, decode)
app.run('127.0.0.1', 5000, debug=True)

如何發送一個實際的圖像到模型?

服務器將在127.0.0.1:5000啟動並運行。為了運行模型,您應該將POST請求發送到/並將二進制映像作為請求體。您應該在decode函數中實現JSON響應。

TFServe簡介:簡單易用的HTTP服務器,用於tensorflow 模型推理

您可以在請求正文中提供任何類型的數據。您只需要在encode函數中正確處理它,以便為圖形的輸入張量提供信息。

此外,您可以在HTTP響應中返回任何類型的數據(除了JSON對象,它可能包含帶有分段信息的二進制圖像)。您只需要在decode函數中構建響應。

結論

使用tfserve,運行tensorflow訓練模型非常簡單容易。只需提供模型路徑,輸入/輸出張量名稱,將encode請求數據轉換為輸入張量的decode函數以及將輸出張量轉換為響應的函數。tfserve將處理其餘的事情。


分享到:


相關文章: