当前位置:   article > 正文

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

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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

(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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

使用命令行工具检查保存的模型

!saved_model_cli show --dir {export_path} --all
  • 1

(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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查看日志

!tail server.log
  • 1

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)
  • 1
  • 2
  • 3

(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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

二、Tensorflow Hub

Tensorflow的整体架构如下图所示:
在这里插入图片描述
Tensorflow Hub主要包含三个领域的算法:

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

1.安装

!pip install tensorflow_hub
import tensorflow_hun as hub
  • 1
  • 2

2.简单使用

  1. 直接加载模型

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

    model = tf.keras.Sequential([
            hub.KerasLayer(MODULE_HANDLE,
                           input_shape=IMAGE_SIZE + (3,)),
            tf.keras.layers.Activation('softmax')
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
  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')
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

三、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)
  • 1
  • 2
  • 3
  • 4
!tensorboard --logdir logs/fit
  • 1

Tensorboard_dev使用命令如下,运行完之后需要登录获取验证码,之后就可以发布到网络了。

!tensorboard dev upload --logdir ./logs
  • 1

查看数据中的图形

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查看多个图形

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)
  • 1
  • 2
  • 3
  • 4

四、联邦学习(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)
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/330674?site
推荐阅读
相关标签
  

闽ICP备14008679号