文章目录
一、TF Serving
Tensorflow Serving是TFX(Tensorflow Extended)的一部分,是一个专门为生产环境下机器学习服务的API,使用TF Serving,可以在云平台通过HTTP来访问不同版本的模型。
下图展示了在实际项目生产过程中需要经历的过程,这里主要介绍服务架构。
在此之前,我们介绍了例如TFJS,TensorFlow Lite等将模型部署在手机端、网页端的方法,但是,部署在服务器端会有更好的体验,例如,不同客户端支持的模型版本可能不同,无法获得最新的体验;可以根据需求增加新硬件;可以动态分配服务经程。
1.安装
一共有四种方法安装TF Serving:
- Docker
- APT
- 源代码安装
- pip
2.搭建服务
(1)构建模型
下面构建一个最简单的线性模型
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")
(2)保存模型
为了将模型加载进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
(3)运行TF Model Server
使用bash脚本运行 TF Model Server,一共三个参数,分别是:
- rest_api_port:进行request的端口号
- model_name:包含在request的URL
- model_base_path:模型路径
另外,由于指向保存文件的变量是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
3.使用服务
(1)将数据传递给服务器
使用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)
(2)从服务器获取结果
发送请求时,我们需要指定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 Hub
Tensorflow的整体架构如下图所示:
Tensorflow Hub主要包含三个领域的算法:
- 文本:Embedding
- 图像:分类、目标检测等
- 视频:分类
1.安装
!pip install tensorflow_hub
import tensorflow_hun as hub
2.简单使用
-
直接加载模型
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可以将模型各种参数、指标进行可视化,使用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)
四、联邦学习(federated learning)
为了考虑数据的隐私性,我们会使用联邦学习。
1.概述
下图展示了一个简单的例子,首先我们在大量用户中选取可用(设备未被使用)的一个子集,之后向这些设备发送一个训练模型进行再训练,然后将训练结果返回服务器,服务器使用这些结果训练主模型。
训练之后可以利用同样的思想在可用的设备上进行测试来验证结果。
保障隐私性的两种方法:
- 聚合:将不同设备的数据通过某种协议聚合到一起发送到服务器上,可以避免特定设备的数据泄露。
- 加密:每个特定设备的数据都会增加mask(由不同颜色的三角表示),在数据聚合时,根据某种协议会将同类型的mask互相抵消,这样做就可以在聚合的同时不会泄露特定设备的数据。
2.API介绍
Tensorflow Federated API包含两类:
- Federated Learning API
- 实现联邦训练/测试
- 可以应用到已有的模型/数据
- Federated Core API:允许使用新的联邦学习算法
取平均
@tff.federated_computation(tff.FederatedType(tf.float32, tff.CLIENTS))
def get_average_temperature(sensor_readings):
return tff.federated_mean(sensor_readings)