46. 在线学习及云端模型部署#

46.1. 介绍#

本次挑战重点在于模型的在线增量学习,你需要按要求完成模型的线上部署并使之能对新的数据进行推理和增量学习。

46.2. 知识点#

  • 在线增量学习

  • 模型云端部署

上一个挑战完成了 毒蘑菇分类 任务,并最终利用 Flask 构建了可用于模型推理的 Web 服务。本次挑战中,同样还是使用毒蘑菇分类数据集,你需要按照下面的挑战要求构建一个可用于在线增量学习的 Flask 服务,并最终将其部署到 Render 云端服务中。

机器学习模型推理与部署实验的最后,我们给出了一个泰坦尼克生存预测的云端 API 链接,你可以实时获取到预测结果。

import requests

# 向服务器发送请求获得预测结果
sample = [
    {"pclass": 1, "sex": "male", "embarked": "C"},
    {"pclass": 2, "sex": "female", "embarked": "S"},
    {"pclass": 3, "sex": "male", "embarked": "Q"},
    {"pclass": 3, "sex": "female", "embarked": "S"},
]

# 稍等片刻,Render 线上服务存在冷却启动时间
requests.post(url="https://titanic-demo.onrender.com", json=sample).content
b'{"predict":["no","yes","no","no"]}\n'

实际上,实验将代码托管在 Render 服务 中。Render 是一个支持多种编程语言的 PaaS 云平台即服务,你可以注册一个免费账户使用。

Exercise 46.1

挑战:修改前序毒蘑菇分类挑战代码,使之符合本次挑战规定,并将其部署到 Render 服务中。

提示:Render 网站可以在大陆正常访问,但注册过程可能需要「科学上网」环境。

挑战需要满足的要求如下:

  • 对输入样本数据能够进行推理,并返回推理类别和类别所属的概率。

  • 如果输入样本数据预测类别概率大于 80%,则使用该样本和所预测类别对模型进行增量训练。反之忽略。

  • 下一次推理过程调用增量训练保存的模型。

尝试模仿实验中泰坦尼克号任务 基于 Render 部署的源代码,将训练好的模型部署到 Render 服务中,最后支持本地向云端发起 POST 请求获得推理结果。

其中,实验中采用了将代码放置于 Github 仓库中,并通过 Render 绑定相应仓库完成部署,你需要模仿仓库中相应的配置文件。关于 Github,Render 等开发者工具的使用,请充分借助于相应的官方文档和搜索引擎,你需要有一定的自学能力和探索精神。

数据集下载地址:

https://cdn.aibydoing.com/hands-on-ai/files/mushrooms.csv  # 复制链接粘贴到浏览器下载

挑战测试说明

本次挑战推荐在线下完成,同时你需要使用 scikit-learn 训练并保存模型,最终使用 Flask 完成 Web 应用构建。启动 Flask 后,可在本地向Render 部署链接发起 POST 请求获得推理结果。测试时推荐使用原数据集中的样本,传入数据需为 JSON 类型。

测试示例代码如下:

import json
import pandas as pd

df = pd.read_csv(
    "https://cdn.aibydoing.com/hands-on-ai/files/mushrooms_test.csv"
)  # 读取测试数据集
sample_data = df.sample(1).to_json()  # 从原数据中随机取 1 条用于测试推理,并转换成 JSON 样式
sample_json = json.loads(sample_data)  # 将 Pandas 转换的 JSON 样式数据处理成 JSON 类型

# 建立 POST 请求,并发送数据请求,请将下方链接替换为你所部署 Render 服务链接
requests.post(url="https://mushrooms-prediction.onrender.com", json=sample_json).content
b'<!doctype html>\n<html lang=en>\n<title>500 Internal Server Error</title>\n<h1>Internal Server Error</h1>\n<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>\n'

期望输出

如上示例,请求至少需要返回的内容包含:样本的预测类别 prediction,预测所属类别的概率 predict_proba,是否执行了增量训练状态 partial_fit

Note

本次挑战主要是考察线上模型的部署以及增量训练方法,实际意义不大。原因在于,真实场景中不会有这样的增量训练需求,模型不能单纯依据传入数据来决定是否增量训练,因为真实的样本标签未经过核对。除此之外,挑战采取的这种思路还存在模型被「攻击」的可能,导致模型失去意义。

相关链接