史上最簡潔使用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
- 史上最簡單的 SpringCloud 教程 | 終章SpringGCCloud
- 史上最簡單的 Spring MVC 教程(一)SpringMVC
- Flutter GetX使用---簡潔的魅力!Flutter
- Git命令簡潔使用指南Git
- 史上最簡單的推薦系統設計
- 史上最簡單的Windows系統密碼解救Windows密碼
- 史上最詳細的JavaScript事件使用指南JavaScript事件
- RxAndroid使用初探;簡潔、優雅、高效Android
- Angular 從0到1 (一)史上最簡單的Angular教程Angular
- Angular 從 0 到 1 (七)史上最簡單的 Angular 教程Angular
- Angular 從 0 到 1 (六)史上最簡單的 Angular 教程Angular
- Angular 從 0 到 1 (五)史上最簡單的 Angular 教程Angular
- Angular 從 0 到 1 (四)史上最簡單的 Angular 教程Angular
- Angular 從 0 到 1 (三)史上最簡單的 Angular 教程Angular
- Angular 從 0 到 1 (二)史上最簡單的 Angular 教程Angular
- Angular 從0到1 (八):史上最簡單的 Angular 教程Angular
- Angular 從 0 到 1 (九):史上最簡單的 Angular 教程Angular
- 最簡潔的python條件判斷語句寫法Python
- python最簡潔的條件判斷語句寫法Python
- 簡潔Java之道Java
- PHP 簡潔之道PHP
- 理解Python asyncio原理和簡潔使用方式Python
- CSS簡潔筆記CSS筆記
- 使用TS+Sequelize實現更簡潔的CRUD
- 使用 Laravel Eloquent 構造器讓模型更簡潔Laravel模型
- 史上最簡單的人臉識別專案登上GitHub趨勢榜Github
- 史上最簡單的 《三角形判定》 面試題答案面試題
- 史上最簡單的排序演算法?看起來卻滿是bug排序演算法
- Centos7安裝mysql5.7.27 史上最全最簡單的教程CentOSMySql
- 史上最簡單的Spring Security教程(三十六):RememberMeAuthenticationFilter詳解SpringREMFilter
- 曝史上最簡邀請函 魅族PRO 6將4.13釋出
- EasyAdmin - 市面上最簡潔優雅的後臺管理系統
- 最簡潔的PHP程式設計師學習路線及建議PHP程式設計師
- 史上最牛逼程式猿-《棋魂》
- 最精簡使用mORMot (二)ORM