赞
踩
Tensorflow Serving是TFX(Tensorflow Extended)的一部分,是一个专门为生产环境下机器学习服务的API,使用TF Serving,可以在云平台通过HTTP来访问不同版本的模型。
下图展示了在实际项目生产过程中需要经历的过程,这里主要介绍服务架构。
在此之前,我们介绍了例如TFJS,TensorFlow Lite等将模型部署在手机端、网页端的方法,但是,部署在服务器端会有更好的体验,例如,不同客户端支持的模型版本可能不同,无法获得最新的体验;可以根据需求增加新硬件;可以动态分配服务经程。
一共有四种方法安装TF Serving:
下面构建一个最简单的线性模型
import os import json import tempfile import requests import numpy as np import tensorflow as tf print("\u2022 Using TensorFlow Version:", tf.__version__) xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float) ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float) model = tf.keras.Sequential([tf.keras.layers.Dense(units=1, input_shape=[1])]) model.compile(optimizer='sgd', loss='mean_squared_error') history = model.fit(xs, ys, epochs=500, verbose=0) print("Finished training the model")
为了将模型加载进TF Serving,我们首先需要将模型保存为 SavedModel 格式,这会产生一个 protobuf 文件,该文件会被放置在包含版本号的文件夹中
MODEL_DIR = tempfile.gettempdir()
version = 1
export_path = os.path.join(MODEL_DIR, str(version))
if os.path.isdir(export_path):
print('\nAlready saved a model, cleaning up\n')
!rm -r {export_path}
model.save(export_path, save_format="tf")
print('\nexport_path = {}'.format(export_path))
!ls -l {export_path}
使用命令行工具检查保存的模型
!saved_model_cli show --dir {export_path} --all
使用bash脚本运行 TF Model Server,一共三个参数,分别是:
另外,由于指向保存文件的变量是python,因此需要使用os.environ来指定环境变量。
os.environ["MODEL_DIR"] = MODEL_DIR
%%bash --bg
nohup tensorflow_model_server \
--rest_api_port=8501 \
--model_name=helloworld \
--model_base_path="${MODEL_DIR}" >server.log 2>&1
查看日志
!tail server.log
使用JSON实现,需要创建一个包含默认签名和实例的字典作为json文件,signature_name来源于!saved_model_cli show --dir {export_path} --all
xs = np.array([[9.0], [10.0]])
data = json.dumps({"signature_name": "serving_default", "instances": xs.tolist()})
print(data)
发送请求时,我们需要指定headers、数据和URL。
headers = {"content-type": "application/json"}
json_response = requests.post('http://localhost:8501/v1/models/helloworld:predict', data=data, headers=headers)
print(json_response.text)
predictions = json.loads(json_response.text)['predictions']
print(predictions)
Tensorflow的整体架构如下图所示:
Tensorflow Hub主要包含三个领域的算法:
!pip install tensorflow_hub
import tensorflow_hun as hub
直接加载模型
MODULE_HANDLE = 'https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4'
module = hub.load(MODULE_HANDLE)
与keras进行交互
model = tf.keras.Sequential([
hub.KerasLayer(MODULE_HANDLE,
input_shape=IMAGE_SIZE + (3,)),
tf.keras.layers.Activation('softmax')
])
作为特征提取器:注意这里的MODULE_HANDLE 发生了变化
MODULE_HANDLE ="https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"
# Number of classes in the new dataset
NUM_CLASSES = 20
model = tf.keras.Sequential([
hub.KerasLayer(MODULE_HANDLE,
input_shape=IMAGE_SIZE + (3,)),
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
])
使用Tensorboard可以将模型各种参数、指标进行可视化,使用Tensorboard_dev可以将模型数据部署到网络上。我们使用Tensorboard需要设置回调函数。
logdir = "logs/image/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Define the basic TensorBoard callback.
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir. histogram_freq=1)
model.fit(...,callbacks=tensorboard_callback)
!tensorboard --logdir logs/fit
Tensorboard_dev使用命令如下,运行完之后需要登录获取验证码,之后就可以发布到网络了。
!tensorboard dev upload --logdir ./logs
查看数据中的图形
img = np.reshape(train_images[0], (-1, 28, 28, 1))
# Sets up a timestamped log directory.
logdir = "logs/train_data/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Creates a file writer for the log directory.
file_writer = tf.summary.create_file_writer(logdir)
# Using the file writer, log the reshaped image.
with file_writer.as_default():
tf.summary.image("Training data", img, step=0)
查看多个图形
with file_writer.as_default():
# Don't forget to reshape.
images = np.reshape(train_images[0:25], (-1, 28, 28, 1))
tf.summary.image("25 training data examples", images, max_outputs=25, step=0)
为了考虑数据的隐私性,我们会使用联邦学习。
下图展示了一个简单的例子,首先我们在大量用户中选取可用(设备未被使用)的一个子集,之后向这些设备发送一个训练模型进行再训练,然后将训练结果返回服务器,服务器使用这些结果训练主模型。
训练之后可以利用同样的思想在可用的设备上进行测试来验证结果。
保障隐私性的两种方法:
Tensorflow Federated API包含两类:
取平均
@tff.federated_computation(tff.FederatedType(tf.float32, tff.CLIENTS))
def get_average_temperature(sensor_readings):
return tff.federated_mean(sensor_readings)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。