一句代碼發布你的TensorFlow模型,簡明TensorFlow Serving上手教程

2021-02-20 專知

【導讀】深度學習框架TensorFlow不僅在學術界得到了普及,在工業界也有非常廣泛的應用。日常我們接觸到的TensorFlow的用法大多為基於Python的實驗用法,並不能直接用於工業界的線上產品。本文介紹一種簡單的發布TensorFlow模型的方法。

在工業產品中使用TensorFlow模型的方法

在工業產品中TensorFlow大概有下面幾種使用方法:

用TensorFlow的C++/Java/Nodejs API直接使用保存的TensorFlow模型:類似Caffe,適合做桌面軟體。

直接將使用TensorFlow的Python代碼放到Flask等Web程序中,提供Restful接口:實現和調試方便,但效率不太高,不大適合高負荷場景,且沒有版本管理、模型熱更新等功能。

將TensorFlow模型託管到TensorFlow Serving中,提供RPC或Restful服務:實現方便,高效,自帶版本管理、模型熱更新等,很適合大規模線上業務。

本文介紹的是方法3,如何用最簡單的方法將TensorFlow發布到TensorFlow Serving中。

一句代碼保存TensorFlow模型

# coding=utf-8
import tensorflow as tf

# 模型版本號
model_version = 1
# 定義模型
x = tf.placeholder(tf.float32, shape=[None, 4], name="x")
y = tf.layers.dense(x, 10, activation=tf.nn.softmax)

with tf.Session() as sess:
   # 初始化變量
   sess.run(tf.global_variables_initializer())
   # 模型訓練過程,省略
   # .
   
   # 保存訓練好的模型到"model/版本號"中
   tf.saved_model.simple_save(
       session=sess,
       export_dir="model/{}".format(model_version),
       inputs={"x": x},
       outputs={"y": y}
   )

代碼中除了最後一句,其它部分都是常規的TensorFlow代碼,模型定義、進入Session、模型訓練等。代碼的最後用tf.saved_model.simple_save將模型保存為SavedModel。注意,這裡將模型保存在了"model/版本號"文件夾中,而不是直接保存在了"model"文件夾中,這是因為TensorFlow Serving要求在模型目錄下加一層版本目錄,來進行版本維護、熱更新等:

安裝TensorFlow Serving


方法一:用apt-get安裝

對於Ubuntu或Debian(Bash on Windows10也可以),可以使用apt-get安裝Tensorflow Serving。先用下面的命令添加軟體源:

echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list && \
curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -

添加成功後可直接用apt-get進行安裝:

apt-get update && apt-get install tensorflow-model-server


方法二:用Docker安裝

TensorFlow Serving官方提供了Docker容器,可以一鍵安裝:

docker pull tensorflow/serving

將模型發布到TensorFlow Serving中

下面的方法基於在本機使用apt-get安裝TensorFlow Serving的方法。對於Docker用戶,需要將模型掛載或複製到Docker中,按照Docker中的路徑來執行下面的教程。

用下面這行命令,就可以啟動TensorFlow Serving,並將剛才保存的模型發布到TensorFlow Serving中。注意,這裡的模型所在路徑是剛才"model"目錄的路徑,而不是"model/版本號"目錄的路徑,因為TensorFlow Serving認為用戶的模型所在路徑中包含了多個版本的模型。

tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=模型名 --model_base_path=模型所在路徑

客戶端可以用GRPC和Restful兩種方式來調用TensorFlow Serving,這裡我們介紹基於Restful的方法,可以看到,命令中指定的Restful服務埠為8501,我們可以用curl命令來查看服務的狀態:

curl http://localhost:8501/v1/models/model

執行結果:

{
"model_version_status": [
 {
  "version": "1",
  "state": "AVAILABLE",
  "status": {
   "error_code": "OK",
   "error_message": ""
  }
 }
]
}

下面我們用curl向TensorFlow Serving發送一個輸入x=[1.1, 1.2, 0.8, 1.3],來獲取預測的輸出信息y:

curl -d '{"instances": [[1.1,1.2,0.8,1.3]]}' -X POST http://localhost:8501/v1/models/模型名:predict

伺服器返回的結果如下:

{
   "predictions": [[0.0649088, 0.0974758, 0.0456831, 0.297224, 0.152209, 0.0177431, 0.104193, 0.0450511, 0.13074, 0.044771]]
}

我們的模型成功地輸出了y=[0.0649088, 0.0974758, 0.0456831, 0.297224, 0.152209, 0.0177431, 0.104193, 0.0450511, 0.13074, 0.044771]

這裡我們使用的是curl命令,在實際工程中,使用requests(Python)、OkHttp(Java)等Http請求庫可以用類似的方法方便地請求TensorFlow Serving來獲取模型的預測結果。

版本維護和模型熱更新

剛才我們將模型保存在了"model/1"中,其中1是模型的版本號。如果我們的算法工程師研發出了更好的模型,此時我們並不需要將TensorFlow Serving重啟,只需要將新模型發布在"model/新版本號"中,如"model/2"。TensorFlow Serving就會自動發布新版本的模型,客戶端也可以請求新版本對應的API了。

PC登錄www.zhuanzhi.ai或者點擊閱讀原文,可以獲取更多AI知識資料!

加入專知主題群(請備註主題類型:AI、NLP、CV、 KG等)可以其他同行一起交流~ 請加專知小助手微信(掃一掃如下二維碼添加),

 AI 項目技術 & 商務合作:bd@zhuanzhi.ai, 或掃描上面二維碼聯繫!

請關注專知公眾號,獲取人工智慧的專業知識!

點擊「閱讀原文」,使用專知

相關焦點

  • tensorflow(6)利用tensorflow/serving實現模型部署及預測
    在文章tensorflow(5)將ckpt轉化為pb文件並利用tensorflow/serving實現模型部署及預測中,筆者以一個簡單的例子,來介紹如何在tensorflow中將ckpt轉化為pb文件,並利用tensorflow/serving來實現模型部署及預測。本文將會介紹如何使用tensorflow/serving來實現單模型部署、多模型部署、模型版本控制以及模型預測。
  • 教程 | 從零開始:TensorFlow機器學習模型快速部署指南
    如果你已使用 TensorFlow 或 Caffe 等深度學習框架訓練好了 ML 模型,該模型可以作為 demo。如果你更喜歡輕量級的解決方案,請閱讀本文。更典型的 ML 用例通常基於數百個圖像,這種情況我推薦大家對現有模型進行微調。例如,https://www.tensorflow.org/tutorials/image_retraining 頁面上有如何微調 ImageNet 模型對花樣本數據集(3647 張圖像,5 個類別)進行分類的教程。
  • tensorflow(8)將h5文件轉化為pb文件並利用tensorflow/serving實現模型部署
    在文章Keras入門(七)使用Flask+Keras-bert構建模型預測服務,我們也介紹了如何使用Flask和example.h5文件來實現模型預測的HTTP服務。  本文將會介紹如何將h5文件轉化為pb文件並利用tensorflow/serving實現模型部署。
  • 容器化運行機器學習 TensorFlow Serving
    docker pull tensorflow/serving:latestdocker pull tensorflow/serving:latest-gpu按需選擇CPU或GPU版本(GPU版本的鏡像大愈百倍)。如果需要指定版本,可以看其tags。
  • TensorFlow 2.0 部署:TensorFlow Serving
    使用以下命令即可:tensorflow_model_server \ --rest_api_port=埠號(如8501) \ --model_name=模型名 \ --model_base_path="SavedModel格式模型的文件夾絕對地址(不含版本號)"註解TensorFlow
  • 利用 NVIDIA TensorRT 優化 TensorFlow Serving 的性能
    $ docker pull tensorflow/serving:latest-gpu$ docker run --rm --runtime=nvidia -p 8501:8501 --name tfserving_resnet \   -v /tmp/resnet:/models/resnet -e MODEL_NAME=resnet -t tensorflow
  • Kubeflow實戰系列:利用TensorFlow Serving進行模型預測
    2018-06-19 06:50:19.185785: I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use
  • 【他山之石】Tensorflow模型保存方式大匯總
    為此,我們特別搜集整理了一些實用的代碼連結,數據集,軟體,編程技巧等,開闢「他山之石」專欄,助你乘風破浪,一路奮勇向前,敬請關注。地址:https://www.zhihu.com/people/kumonoueGraphDef是Tensorflow中序列化的圖結構。在tensorflow中,計算圖被保存為Protobuf格式(pb)。
  • 前端入門機器學習 Tensorflow.js 簡明教程
    除了提供統一風格的術語和API,TensorFlow的不同擴展版本之間還可以通過遷移學習來實現模型的復用(許多知名的深度學習模型都可以找到python版本的原始碼),或者在預訓練模型的基礎上來定製自己的深度神經網絡,為了能夠讓開發者儘快熟悉相關知識,TensorFlow官方網站還提供了一系列有關JavaScript版本的教程、使用指南以及開箱即用的預訓練模型,它們都可以幫助你更好地了解深度學習的相關知識
  • TensorFlow Servering C/S通信約束
    下面主要結合gRPC的示例代碼進行分析。客戶端同服務端進行通信交互的核心是幾個標識,我們分別介紹下。1. 模型標識指定要使用哪一個模型。參考mnist_client.py模型標識在Serving的模型保存輸出代碼中並沒有顯示的聲明。
  • 基於tensorRT實現TensorFlow模型的高效推理
    此外,為方便TF(TensorFlow)模型的發布,Google發布了用於生產環境的TensorFlow Serving系統,該系統基於saved_model.pb模型文件發布。3.1 ckpt文件  訓練過程中會生成如下所示文件。
  • TensorFlow圖像分類教程
    本系列文章直接切入關鍵的部分,只需要對命令行和Python有最基本的了解,就可以在家快速地創建一些令你激動不已的項目。本文不會深入探討TensorFlow的工作原理,如果你想了解更多,我會提供大量額外的參考資料。本系列所有的庫和工具都是免費開源的軟體。本教程旨在把一個事先被放到訓練過的類別裡的圖片,通過運行一個命令以識別該圖像具體屬於哪個類別。
  • TensorFlow 2.0入門
    要列出可用的數據集,請執行以下python代碼:https://github.com/tensorflow/datasets/blob/master/docs/add_dataset.mdimport tensorflow_datasets as tfdsprint(tfds.list_builders())在下載任何數據集之前
  • TensorFlow 初探
    當然萬一發現找不到想要的底層數據操作,也可以自己寫一點c++代碼來豐富底層的操作。真正的可移植性Tensorflow 可以在CPU和GPU上運行,比如說可以運行在臺式機、伺服器、手機行動裝置等等。想要在沒有特殊硬體的前提下,在你的筆記本上跑一下機器學習的新想法?Tensorflow也可以辦到。準備將你的訓練模型在多個CPU上規模化運算,又不想修改代碼?Tensorflow也可以辦到。
  • 【官方教程】TensorFlow在圖像識別中的應用
    一系列的模型不斷展現了性能的提升,每次都刷新了業界的最好成績:QuocNet, AlexNet, Inception(GoogLeNet), BN-Inception-v2。谷歌的以及其它的研究員已經發表了論文解釋這些模型,但是那些結果仍然很難被重現。我們正在準備發布代碼,在最新的模型Inception-v3 上運行圖像識別任務。
  • Tensorflow 免費中文視頻教程,開原始碼,免費書籍.
    Free-TensorflowTensorflow 免費中文視頻教程,開原始碼,免費書籍.
  • TensorFlow Lite 助力產品落地
    在 TensorFlow Lite 中引入前沿研究模型的同時,我們還希望您能夠為自己的用例與需求輕鬆自定義這些模型。我們很高興地發布 TensorFlow Lite Model Maker,這款工具簡單易用。通過遷移學習,您可在您的數據集上應用前沿的機器學習模型。此工具將複雜的機器學習概念封裝在直觀的 API 中,無需機器學習專業知識,您也可以開啟機器學習之旅。
  • 谷歌第一個TensorFlow中文教程發布!深度解析TensorFlow Lite
    buffers 屬性則是數據存儲區域,主要存儲的是模型的權重信息。一開始,終端設備會通過 mmap 以內存映射的形式將模型文件載入客戶端內存中,其中包含了所有的 Tensor,Operator 和 Buffer 等信息。出於數據使用的需要,TensorFlow Lite 會同時創建 Buffer 的只讀區域和分配可寫 Buffer 區域。由於解析器中包含了集體執行計算的代碼,這一部分被稱為 Kernel。
  • 【乾貨】TensorFlow實戰——圖像分類神經網絡模型
    docker run -v /path/to/local:/notebooks/local --rm -it --name tensorflow tensorflow/tensorflow:nightly /bin/bash 下面是該命令的詳細解釋。
  • 教程 | Tensorflow keras 極簡神經網絡構建與使用
    keras極簡神經網絡構建教程Keras介紹Keras (κέρας) 在希臘語中意為號角,它來自古希臘和拉丁文學中的一個文學形象。發布於2015年,是一套高級API框架,其默認的backend是tensorflow,但是可以支持CNTK、Theano、MXNet作為backend運行。其特點是語法簡單,容易上手,提供了大量的實驗數據接口與預訓練網絡接口,最初是谷歌的一位工程師開發的,非常適合快速開發。