史上最簡潔使用Tensorflow_model_server
最簡潔使用Tensorflow_model_server
Tensorflow_model_server的目的是:
統一管理一個模型伺服器,利於讓他人使用這個模型,而且可以動態更新模型,模型也會常住在記憶體裡面,加快結果輸出,減少模型載入時間。
事先準備操作:
Tensorflow_model_server 安裝:
參考:https://www.tensorflow.org/serving/setup
這裡會有一個坑: 直接
pip intall tensorflow-model-server
的時候它會顯示已經安裝完,但是實際上還是沒有找到這個庫,處理方法是,先把原來的tensorflow-model-server
給uninstall 再按安裝庫上面安裝即可。
啟動 tensorflow_model_server
:
tensorflow_model_server
--port=埠號
8000
--model_name=模型名稱
例:256
--model_base_path=絕對路徑
例: /notebooks/animieGan/TwinGAN/export
正常情況下:
異常情況:
它回報找不到模型,檢查下路徑是否是絕對路徑
這樣就啟動完了 tensorflow_model_server
編寫客戶端:
引入頭文檔案:
如果沒找到,就通過pip安裝:
import numpy as np
import scipy.misc
import tensorflow as tf
from grpc.beta import implementations
from tensorflow_serving.apis import predict_pb2 # pip install tensorflow-serving-api
from tensorflow_serving.apis import prediction_service_pb2
from PIL import Image
import sys
tf.app.flags.DEFINE_string('server', '10.11.32.51:8000',
'twingan_server host:port')
tf.flags.DEFINE_integer('gpu', -1,
'GPU ID (negative value indicates CPU)')
FLAGS = tf.app.flags.FLAGS
output_dir = './'
def main(_):
image_hw = 256
raw_image = Image.open('./78ae254bdcc94ffc5e8a921923a8d266.jpg')
image_resized = raw_image.resize((image_hw, image_hw), Image.BICUBIC)
input_image = np.expand_dims(image_resized / np.float32(255.0), 0)
#input_image = np.reshape(int_image, 927696).astype(np.float32)
host, port = FLAGS.server.split(':')
print('GPU: {}'.format(FLAGS.gpu))
channel = implementations.insecure_channel(host, int(port))
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = "256"
request.model_spec.signature_name = "serving_default"
request.inputs['inputs'].CopyFrom(tf.contrib.util.make_tensor_proto(input_image))
result_future = stub.Predict.future(request, 15.0) # 5 seconds
exception = result_future.exception()
if exception:
print(exception)
else:
result_future.add_done_callback(doneJob(result_future))
return 'hello wrod'
def doneJob(result_future):
print("finish")
sys.stdout.write('.')
sys.stdout.flush()
# TODO: do post-processing using another function.
response_images = np.reshape(np.array(result_future.result().outputs['outputs'].float_val),[dim.size for dim in result_future.result().outputs['outputs'].tensor_shape.dim]) * 255.0
scipy.misc.imsave('outfile2.jpg', response_images[0])
if __name__ == '__main__':
tf.app.run()
核心是:
- 1.構造一個
request = predict_pb2.PredictRequest()
- 2.填充這個
request
的必要引數 比如image,資料 - 3.通過
prediction_service_pb2
來處理 2中的request
- 4.接受流,生成
respone
看doneJob
- 5.通過
tf.app.run()
啟動程式
測試模型與啟動程式碼:
模型地址
https://drive.google.com/file/d/1C1tadCQjzsiW2GBeL8BbgfyKXKsoQCjJ/view
啟動程式碼python model_server.py --twingan_server=10.11.32.51:8000 --image_hw=256 --gpu=1
相關文章
- 【系統之音】Activity啟動流程——史上最全最簡潔易懂版
- ES6新特性總結之let和const--史上最全最簡潔
- 簡潔地使用 vim
- Git命令簡潔使用指南Git
- Flutter GetX使用---簡潔的魅力!Flutter
- 史上最簡單的推薦系統設計
- RxAndroid使用初探;簡潔、優雅、高效Android
- 最簡潔的python條件判斷語句寫法Python
- 理解Python asyncio原理和簡潔使用方式Python
- 史上最簡單的Spring Security教程(三十六):RememberMeAuthenticationFilter詳解SpringREMFilter
- 史上最“卷”雙11
- 簡潔Java之道Java
- iRingg:史上最簡單、好用的 macOS 鈴聲製作軟體Mac
- EasyAdmin - 市面上最簡潔優雅的後臺管理系統
- 史上最簡單的人臉識別專案登上GitHub趨勢榜Github
- Centos7安裝mysql5.7.27 史上最全最簡單的教程CentOSMySql
- 史上最簡單的 SpringCloud 教程 | 第四篇: 斷路器(Hystrix)SpringGCCloud
- 最新最全的史上最簡單的IDEA破解教程(破解到2100年)Idea
- 史上最簡單的排序演算法?看起來卻滿是bug排序演算法
- 名片識別,史上最簡單的整合攻略來啦!附有SDK包
- 使用TS+Sequelize實現更簡潔的CRUD
- 使用 Laravel Eloquent 構造器讓模型更簡潔Laravel模型
- 2020年春天故事之巧遇史上最奇葩SAP使用者
- 最精簡使用mORMot (二)ORM
- 史上最簡單的 SpringCloud 教程 | 第五篇: 路由閘道器 (zuul)SpringGCCloud路由Zuul
- 史上最簡單的 《三角形判定》 面試題答案面試題
- 使用AsyncAPI規範簡潔實現CQRS事件溯源案例API事件
- 最簡潔內網穿透教程一鍵穿透 3389 遠端桌面-純乾貨內網穿透
- JRebel 破解最簡單的使用
- JavaScript程式碼簡潔之道JavaScript
- yum安裝簡潔版
- JavaScript 程式碼簡潔之道JavaScript
- Pandas之:Pandas簡潔教程
- 史上最簡單MySQL教程詳解(基礎篇)之多表聯合查詢MySql
- 史上最清晰易懂的babel配置解析Babel
- 史上最通俗分散式鎖解讀分散式
- 史上最強Tableau Server 安裝教程Server
- Lombok - 使用註解讓你的JavaBean變得更加簡潔LombokJavaBean