Tensorflow2.0数据和部署(四)——Tensorflow高级模型部署

一、TF Serving

Tensorflow Serving是TFX(Tensorflow Extended)的一部分,是一个专门为生产环境下机器学习服务的API,使用TF Serving,可以在云平台通过HTTP来访问不同版本的模型。

下图展示了在实际项目生产过程中需要经历的过程,这里主要介绍服务架构。
在这里插入图片描述
在此之前,我们介绍了例如TFJS,TensorFlow Lite等将模型部署在手机端、网页端的方法,但是,部署在服务器端会有更好的体验,例如,不同客户端支持的模型版本可能不同,无法获得最新的体验;可以根据需求增加新硬件;可以动态分配服务经程。
在这里插入图片描述

1.安装

一共有四种方法安装TF Serving:

  1. Docker
  2. APT
  3. 源代码安装
  4. 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主要包含三个领域的算法:

  1. 文本:Embedding
  2. 图像:分类、目标检测等
  3. 视频:分类

1.安装

!pip install tensorflow_hub
import tensorflow_hun as hub

2.简单使用

  1. 直接加载模型

    MODULE_HANDLE = 'https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4'
    module = hub.load(MODULE_HANDLE)
    
  2. 与keras进行交互

    model = tf.keras.Sequential([
            hub.KerasLayer(MODULE_HANDLE,
                           input_shape=IMAGE_SIZE + (3,)),
            tf.keras.layers.Activation('softmax')
    ])
    
  3. 作为特征提取器:注意这里的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.概述

下图展示了一个简单的例子,首先我们在大量用户中选取可用(设备未被使用)的一个子集,之后向这些设备发送一个训练模型进行再训练,然后将训练结果返回服务器,服务器使用这些结果训练主模型。

训练之后可以利用同样的思想在可用的设备上进行测试来验证结果。
在这里插入图片描述
保障隐私性的两种方法:

  1. 聚合:将不同设备的数据通过某种协议聚合到一起发送到服务器上,可以避免特定设备的数据泄露。
  2. 加密:每个特定设备的数据都会增加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)
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值