使用 TensorFlow 服务将机器学习模型部署到生产环境 教程

一、介绍

TensorFlow Serving 是一个灵活的高性能服务系统,用于专为生产环境设计的机器学习模型。本指南展示了如何使用 Docker 训练一个简单的模型并通过 TensorFlow 服务来提供该模型。它还演示了如何同时为多个模型提供服务。

二、准备工作

  • Python 的工作知识。
  • 正确安装和配置了 Python 工具链,包括 pip。

三、部署 Docker 实例

使用Vultr 一键式Docker 部署您的 Docker 实例。本指南使用 Ubuntu 版本。

部署完成后,通过SSH登录服务器

更新计算机并重新启动计算机以应用更新

# apt-get update && apt-get dist-upgrade -y

# reboot

建议在处理 Python 项目时使用虚拟环境。安装软件包以使用 Pythonvenv模块或使用您喜欢的任何其他方法。

在 Ubuntu 20.04 上:

# apt-get install python3.8-venv

在 Ubuntu 22.04 上:

# apt-get install python-3.10-venv

重新启动后,切换到 docker 用户并下载 TensorFlow Serving 镜像。

# su -l docker -s /usr/bin/bash

$ docker pull tensorflow/serving

 四、创建示例模型

使用 Fashion-MNIST 数据集训练模型,该数据集

由 60K 训练示例和 10K 测试示例组成,包含 10 个不同的类,其中每个样本是一件衣服的 28×28 像素灰度图像。

时尚-MNIST样本。每个班级占三行(由Zalando,MIT许可证)

本指南不详细介绍模型训练或进行任何参数调优。重点是 TensorFlow Serving,而不是模型训练。

设置虚拟环境并安装必要的 Python 包。

$ python3 -m venv tfserving-venv

$ . tfserving-venv/bin/activate

$ pip install tensorflow requests

使用以下代码创建一个文件,用于加载和准备数据。model.py

import tensorflow as tf

from tensorflow import keras



# load data

fashion_mnist = keras.datasets.fashion_mnist

(train_data, train_labels), (test_data, test_labels) = fashion_mnist.load_data()

class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",

               "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]



# scale data values to [0,1] interval

train_data = train_data / 255.0

test_data = test_data / 255.0



# reshape data to represent 28x28 pixels grayscale images

train_data = train_data.reshape(train_data.shape[0], 28, 28, 1)

test_data = test_data.reshape(test_data.shape[0], 28, 28, 1)

构建具有单个卷积层(8 个大小为 3×3 的过滤器)和一个具有 10 个单元的输出层的 CNN。

model = keras.Sequential([

    keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3,

                        strides=2, activation="relu", name="Conv1"),

    keras.layers.Flatten(),

    keras.layers.Dense(10, name="Dense")

])

训练模型。

epochs = 3

model.compile(optimizer="adam",

              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),

              metrics=[keras.metrics.SparseCategoricalAccuracy()])

model.fit(train_data, train_labels, epochs=epochs)

保存模型。

import os

MODEL_DIR = "/home/docker/tfserving-fashion"

VERSION = "1"

export_path = os.path.join(MODEL_DIR, VERSION)



tf.keras.models.save_model(

    model,

    export_path,

    overwrite=True,

    include_optimizer=True,

    save_format=None,

    signatures=None,

    options=None

)

运行代码。model.py

$ python model.py

...

Epoch 1/3

1875/1875 [==============================] - 5s 3ms/step - loss: 0.5629 - sparse_categorical_accuracy: 0.8033

Epoch 2/3

1875/1875 [==============================] - 5s 3ms/step - loss: 0.4119 - sparse_categorical_accuracy: 0.8566

Epoch 3/3

1875/1875 [==============================] - 5s 3ms/step - loss: 0.3708 - sparse_categorical_accuracy: 0.8696

您可以使用该命令可视化模型信息。saved_model_cli

$ saved_model_cli show --dir ~/tfserving-fashion/1 --all

 五、启动服务器

使用 Docker 启动服务器。

$ docker run -t --rm -p 8501:8501 \

    -v "/home/docker/tfserving-fashion:/models/fashion" \

    -e MODEL_NAME=fashion \

    tensorflow/serving &

 六、如何进行查询

使用以下代码创建一个文件,该文件加载数据、设置查询标头并将查询数据定义为测试数据集中的第一个示例。query.py

import json

import requests

import numpy as np

from tensorflow import keras



fashion_mnist = keras.datasets.fashion_mnist

(train_data, train_labels), (test_data, test_labels) = fashion_mnist.load_data()

class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",

               "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]



# scale data values to [0,1] interval

train_data = train_data / 255.0

test_data = test_data / 255.0



# reshape data to represent 28x28 pixels grayscale images

train_data = train_data.reshape(train_data.shape[0], 28, 28, 1)

test_data = test_data.reshape(test_data.shape[0], 28, 28, 1)



data = json.dumps({"instances": test_data[0:1].tolist()})

headers = {"content-type": "application/json"}

进行查询并获取响应。请记住将地址更改为服务器 IP 或 FQDN。

json_response = requests.post("http://<<SERVER IP/FQDN>>:8501/v1/models/fashion:predict",

                              data=data, headers=headers)

predictions = json.loads(json_response.text)["predictions"]

变量包含一个列表,其中包含属于 10 个类中每个类的对象查询的概率。这些值中最大的是模型进行的分类。该函数从变量返回模型分类。predictionsnp.argmaxpredictions

print("Real class:", class_names[test_labels[0]])

print("Predicted class:", class_names[np.argmax(predictions[0])])

运行,您应该会看到此查询的结果。query.py

$ python3 query.py

...

Real class: Ankle boot

Predicted class: Ankle boot

您还可以在每个请求中查询多个示例。例如,将变量更改为测试数据中的前五个样本和输出,以显示五个查询中每个查询的分类。dataquery.py

data = json.dumps({"instances": test_data[0:5].tolist()})



...



for i in range(len(predictions)):

    print("Query", str(i))

    print("Real class:", class_names[test_labels[i]])

    print("Predicted class:", class_names[np.argmax(predictions[i])])

Runningagain 给出了包含五个示例的查询结果。query.py

$ python3 query.py

...

Query 0

Real class: Ankle boot

Predicted class: Ankle boot

Query 1

Real class: Pullover

Predicted class: Pullover

Query 2

Real class: Trouser

Predicted class: Trouser

Query 3

Real class: Trouser

Predicted class: Trouser

Query 4

Real class: Shirt

Predicted class: Shirt

 七、服务多个模型

TensorFlow Serving 还能够同时为多个模型提供服务。这一次,使用TensorFlow Serve GitHub存储库中提供的一些预训练模型。

如果尚未安装 Git,请安装 Git。

# apt-get install git

并克隆存储库。

$ git clone https://github.com/tensorflow/serving

创建一个以以下内容命名的文件,该文件配置两个模型,定义名称、相对于运行服务器的 Docker 容器的目录以及每个模型的模型平台。models.config

model_config_list {

    config {

        name: 'half_plus_two'

        base_path: '/models/saved_model_half_plus_two_cpu'

        model_platform: 'tensorflow'

    }

    config {

        name: 'half_plus_three'

        base_path: '/models/saved_model_half_plus_three'

        model_platform: 'tensorflow'

    }

}

这些模型计算数字的一半,并分别加 2 和 3。

启动服务器加载此配置文件并使用预训练模型挂载卷。

$ docker run -t --rm -p 8501:8501 \

    -v "/home/docker/serving/tensorflow_serving/servables/tensorflow/testdata/:/models/" \

    -v "/home/docker/models.config:/tmp/models.config" \

    tensorflow/serving \

    --model_config_file=/tmp/models.config

您可以使用浏览器上的 HTTP GET 请求或使用 curl 查看每个模型状态信息。

$ curl http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_two

{

    "model_version_status": [

        {

            "version": "123",

            "state": "AVAILABLE",

            "status": {

                "error_code": "OK",

                "error_message": ""

            }

        }

    ]

}

$ curl http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_three

{

    "model_version_status": [

        {

            "version": "123",

            "state": "AVAILABLE",

            "status": {

                "error_code": "OK",

                "error_message": ""

            }

        }

    ]

}

并通过运行以下命令,使用 curl 使用 HTTP POST 请求请求对两个模型进行预测:

$ curl -d '{"instances": [1.0, 2.0, 3.0]}' \

    -X POST http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_two:predict

{

    "predictions": [2.5, 3.0, 3.5]

}

$ curl -d '{"instances": [1.0, 2.0, 3.0]}' \

    -X POST http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_three:predict

{

    "predictions": [3.5, 4.0, 4.5]

}

 八、结论

本指南介绍了如何训练 TensorFlow 模型并部署 TensorFlow Serving 以与 Docker 同时提供此模型和许多模型。

赞(0)
未经允许不得转载:主机百科 » 使用 TensorFlow 服务将机器学习模型部署到生产环境 教程