日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用Docker部署TensorFlow Serving服务

發(fā)布時(shí)間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Docker部署TensorFlow Serving服务 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 安裝 Docker
    • 2. 使用 Docker 部署
    • 3. 請(qǐng)求服務(wù)
      • 3.1 手寫數(shù)字例子
      • 3.2 貓狗分類例子

參考:
https://tf.wiki/zh_hans/deployment/serving.html#
https://tensorflow.google.cn/tfx/serving/docker

1. 安裝 Docker

以下均為 centos7 環(huán)境
參考文章:docker安裝等操作

2. 使用 Docker 部署

  • 拉鏡像 docker pull tensorflow/serving
  • 模型路徑,版本號(hào)1,2,默認(rèn)加載最大數(shù)字的

  • bash 輸入命令,注意路徑,mymodel跟請(qǐng)求的代碼保持一致
docker run -p 8501:8501 --mount type=bind,source=/home/dnn/project/tf2,target=/models/mymodel -e MODEL_NAME=mymodel -t tensorflow/serving

  • 手寫數(shù)字識(shí)別 模型代碼+導(dǎo)出模型
# 手寫數(shù)字 tf 實(shí)現(xiàn) import numpy as np import tensorflow as tfclass MNistLoader():def __init__(self):data = tf.keras.datasets.mnist# 加載數(shù)據(jù)(self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()# 擴(kuò)展維度,灰度圖1通道 [batch_size, 28, 28, chanels=1]self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)self.train_label = self.train_label.astype(np.int32)self.test_label = self.test_label.astype(np.int32)# 樣本個(gè)數(shù)self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]def get_batch(self, batch_size):# 從訓(xùn)練集里隨機(jī)取出 batch_size 個(gè)樣本idx = np.random.randint(0, self.num_train_data, batch_size)return self.train_data[idx, :], self.train_label[idx]# 自定義多層感知機(jī)模型 class MLPmodel(tf.keras.Model):def __init__(self):super().__init__()# 除第一維以外的維度展平self.flatten = tf.keras.layers.Flatten()self.dense1 = tf.keras.layers.Dense(units=100, activation='relu')self.dense2 = tf.keras.layers.Dense(units=10)@tf.function # 計(jì)算圖模式,導(dǎo)出需要def call(self, input):x = self.flatten(input)x = self.dense1(x)x = self.dense2(x)output = tf.nn.softmax(x)return outputnum_epochs = 5 batch_size = 50 learning_rate = 1e-4mymodel = MLPmodel()data_loader = MNistLoader()mymodel.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=[tf.keras.metrics.sparse_categorical_accuracy] ) mymodel.fit(data_loader.train_data, data_loader.train_label,batch_size=batch_size,epochs=num_epochs)# 導(dǎo)出模型 tf.saved_model.save(mymodel, "./2") # 載入模型 mymodel = tf.saved_model.load('./2')res = mymodel.call(data_loader.test_data) print(res)

3. 請(qǐng)求服務(wù)

3.1 手寫數(shù)字例子

import numpy as np import tensorflow as tf import json import requests import matplotlib.pyplot as pltclass MNistLoader():def __init__(self):data = tf.keras.datasets.mnist# 加載數(shù)據(jù)(self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()# 擴(kuò)展維度,灰度圖1通道 [batch_size, 28, 28, chanels=1]self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)self.train_label = self.train_label.astype(np.int32)self.test_label = self.test_label.astype(np.int32)# 樣本個(gè)數(shù)self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]def get_batch(self, batch_size):# 從訓(xùn)練集里隨機(jī)取出 batch_size 個(gè)樣本idx = np.random.randint(0, self.num_train_data, batch_size)return self.train_data[idx, :], self.train_label[idx]size = 6 dataloader = MNistLoader()data = json.dumps({'instances': dataloader.test_data[0:size].tolist() })headers = {'content-type': 'application/json'}json_response = requests.post(url='http://localhost:8501/v1/models/mymodel:predict',data=data, headers=headers )pred = np.array(json.loads(json_response.text)['predictions']) print("預(yù)測(cè)結(jié)果:", np.argmax(pred, axis=-1))# 打印圖片 plt.subplots(1, size) idx = 1 for img in dataloader.test_data[0:size]:plt.subplot(1, size, idx)plt.imshow(img)idx += 1 plt.show()

輸出:

預(yù)測(cè)結(jié)果: [7 2 1 0 4 1]

跟圖片顯示一致

3.2 貓狗分類例子

模型代碼

訓(xùn)練完后,導(dǎo)出模型

tf.saved_model.save(model, './3') import numpy as np import tensorflow as tf import json import requests import matplotlib.pyplot as plttest_pic = ["./dogs-vs-cats/test/1.jpg","./dogs-vs-cats/test/7.jpg"]# 狗1, 貓0 test_data = np.array([_decode_and_resize(f).numpy() for f in test_pic])data = json.dumps({'instances': test_data.tolist() })headers = {'content-type': 'application/json'}json_response = requests.post(url='http://localhost:8501/v1/models/mymodel:predict',data=data, headers=headers ) pred = np.array(json.loads(json_response.text)['predictions']) print("預(yù)測(cè)結(jié)果:", np.argmax(pred, axis=-1))for img in test_data:plt.imshow(img)plt.show()

輸出:

預(yù)測(cè)結(jié)果: [1 0] # 狗,貓

總結(jié)

以上是生活随笔為你收集整理的用Docker部署TensorFlow Serving服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。