2021 年 3 月 30 日
在这两篇系列文章的第二篇中,我将深入探讨模型的大规模部署和服务。如果您错过了第一篇关于在 AI Platform Training 上大规模训练 fastai 模型的文章,这里有 链接.

简要说明

在这两篇系列文章的第二篇中,我将深入探讨模型的大规模部署和服务。如果您错过了第一篇关于在 AI Platform Training 上大规模训练 fastai 模型的文章,这里有 链接.

为深度学习模型提供服务可能会面临一些挑战,其中包括

  • 在带或不带加速器(英伟达™(NVIDIA®)GPU)的实例上缩放资源

  • 成本效益

在本文中,我将介绍我是如何按照两个主要步骤为使用 FastAI 库训练的深度学习文本分类器提供服务的:

  • 使用 TorchServe 部署 fastai 模型

  • 在 GCP AI 平台上提供主机服务 预测

所有资料可在 giTunes 存储库. .该存储库的灵感来自另一个项目,该项目旨在将 fastai 图像分类器部署到 AWS SageMaker Inference Endpoint 上。 这里.

1- 使用 TorchServe 部署 fastai 模型

TorchServe 可轻松地在生产环境中大规模部署 PyTorch 模型。它消除了开发自己的客户端服务器架构的繁重工作。FastAI 库基于 PyTorch 框架。它通过将 fastai 模型加载为纯 pytorch 对象(移除 fastai 抽象),使使用该技术为 fastai 模型提供服务成为可能。.

1-1 从 FastAI 导出模型权重

为此,您需要从上一篇文章中的导出 pickle 中恢复 FastAI 学习器,并用 PyTorch 保存其模型权重。.

进口火炬
从 fastai.text 导入 load_learner
从 fastai.text.learner 导入 get_c、get_text_vocab
learn = load_learner(“fastai_cls.pkl”)
vocab_sz = len(_get_text_vocab(dls)) #dls 是您用于培训的 dataloader
n_class = get_c(dls)
config = awd_lstm_clas_config.copy()
torch.save(learn.model.state_dict(), “fastai_cls_weights.pth”)

1-2 来自 FastAI 的 PyTorch 模型

导出 pytorch 权重后,您需要重建模型结构,以便将权重加载到模型中。你可能需要在 fastai 源代码中挖掘一下才能找到你的实现,但幸运的是,在 Jupyter 笔记本中,你可以在函数名前添加?.

对于文本分类器,可使用 fastai get_text_classifier 函数加载纯 pytorch 对象

从 fastai.text.learner 导入 get_text_classifier
从 fastai.text.all 导入 AWD_LSTM
torch_pure_model = get_text_classifier(AWD_LSTM, vocab_sz, n_class, config=config)

1-3 重现 fastai 预处理步骤

获得 pytorch 纯模型后,您需要应用与训练时相同的预处理。FastAI 有一个非常方便的方法 .predict,可以应用于文本(简单字符串对象),自然地重现训练预处理,从而消除训练服务偏差的风险。.

text = “这是一部非常好的电影”
pred_fastai = learn.predict(text)
预快换
>>(Category 张量(1), 张量(1), 张量([0.0036, 0.9964]))

在我们的案例中,我们必须自己承担这个责任,因为我们需要摆脱 fastai 抽象,直接使用 PyTorch 对象。.

在我的例子中,我使用了一个 spacy 标记符号生成器,因此我重现了 fastai 预处理,如下所示:
进口火炬

进口火炬
from fastai.text.core import Tokenizer, SpacyTokenizerfrom fastai.text.data import Numericalize
example = “你好,这是一个测试”。”
tokenizer = Tokenizer(
tok=SpacyTokenizer(“en”)
)
numericalizer = Numericalize(vocab=vocab)
example_processed = numericalizer(tokenizer(example))
已处理示例
>>> 张量([ 4, 7, 26, 29, 16, 72, 69, 31])
输入 = example_processed.resize(1, len(example_processed))
输出 = model_torch.forward(inputs)[0] preds = torch.softmax(outputs, dim=-1) #Y你可以使用任何你需要的激活函数
预设
>>> 张量([[0.0036, 0.9964]], grad_fn=)

正如你所注意到的,我使用 torch 函数和 learn.predict 得到的结果是一样的,因为我设法保留了相同的预处理步骤。.

1-4 通过 torchserve 部署模型

在本节中,我们将把 PyTorch 模型部署到 TorchServe。有关安装,请参阅 TorchServe Github Repository。.
总的来说,使用 TorchServe 主要有 3 个步骤:

  1. 将模型存档为 *.mar。.
  2. 启动火炬服务。.

调用应用程序接口并获取响应。.
为了将模型存档,我们至少需要 2 个文件:

  1. PyTorch 模型权重 fastai_cls_weights.pth。.
  2. TorchServe 自定义处理程序。.

自定义处理程序

如 /deployment/handler.py 所示,TorchServe 处理程序接受 data 和上下文。在我们的示例中,我们定义了另一个辅助 Python 类,并实现了 4 个实例方法:初始化、预处理、推理和后处理。.

现在就可以设置和启动 TorchServe 了。.

火炬服务行动

步骤 1:归档模型 PyTorch
火炬模型存档器
--模型名称=ffastai_模型
-版本=1.0
-serialized-file=/home/model-server/fastai_cls_weights.pth。
-- extra-files=/home/model-server/config.py,/home/model-server/vocab.json
-handler=/home/model-server/handler.py
--export-path=/home/model-server/model-store/输出路径
步骤 2:为模型服务
torchserve -start -ncs -model-store model_store -models fastai_model.mar
第 3 步:调用 API 并获取响应(此处使用 curl)。.
curl -X POST -H "Content-Type: application/json" -d '["this was a bad movie"]' http://127.0.0.1:8080/predictions/fastai_model

第一次调用会因初始化中定义的模型权重加载而产生较长的延迟,但从第二次调用开始,这种情况将得到缓解。.

2- 部署到人工智能平台预测

在本节中,我们将使用定制的 Docker 镜像在 GCP AI 平台预测中部署带有 TorchServe 的 FastAI 训练模型。有关使用自定义容器的 GCP AI 平台预测例程的更多详情,请参阅本文。请注意,只有在使用区域端点的 AI Platform Prediction 时,此选项才可用。.

在人工智能平台预测上部署 fastai 模型的步骤:

首先,在区域终端上创建人工智能平台预测模型:

gcloud beta ai-platform 模型创建 MODEL_NAME #eg: fastai_text_clf
-region=REGION #eg:europe-west1
-启用日志记录
-启用控制台日志记录

2-1 构建版本将使用的 docker 映像

  • 在版本库根目录下创建 model/ 文件夹

  • 将 fastai 模型权重放入 model/text/,并命名为 fastai_cls_weights.pth

  • 创建工件库

gcloud beta 工具库创建 ARTIFACT_REGISTRY_NAME #eg: getting-started-fastai
-reprepository-format=docker
-location=REGION #eg:europe-west1
  • 构建你的 docker 映像

docker build -f TextDockerfile -t REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0

2-2 (可选)检查你的 docker 镜像是否运行正常

  • 在本地运行你的 docker 镜像并进行测试

docker run -it -p 8080:8080 REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0
curl -X POST -H "Content-Type: application/json" -d '["这是一部烂片"]'127.0.0.1:8080/predictions/fastai_model

2-3 将你的 docker 镜像推送到 GCP 项目中的容器注册中心

为此,您需要获得 IAM 凭据。确保拥有这些证书后,运行以下程序

gcloud auth configure-docker
docker push REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0

2-4 使用 docker 映像创建模型版本

gcloud 测试版 ai-platform 版本创建 VERSION_NAME
-region=REGION
-model=MODEL_NAME
-image=REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0
-端口=8080
-health-route=/ping
-predict-route=/predictions/fastai_model

2-5 测试您的型号版本

curl -X POST
-H "授权:Bearer $(gcloud auth print-access-token)"
-H "内容类型:应用程序/json"
-d'["这是一部烂片"]'
https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/MODEL_NAME/versions/VERSION_NAME:predict

您的 fastai 模型现已部署在人工智能平台预测的无服务器架构中。您可以通过向模型发送 REST API 请求来进行在线预测。所有请求预测的方法都可以在 谷歌文档.

结论

使用人工智能平台预测来提供任何类型的模型都非常有用。本文旨在展示一个使用重型框架(pytorch)的深度学习模型的示例,并以一种具有成本效益的方式为其提供服务。.

需要牢记一些限制:

  • 使用部署在区域端点上的 AI Platform 模型时,即使有自动缩放功能,也无法将实例缩放到 0。因为这是使用自定义容器的唯一选择,所以您将始终至少有一个实例在运行。

  • 另一个探索过的方案是使用自定义例程而不是自定义容器,但只有当模型和打包代码的大小低于 500 MB 的限制时才能这样做,而在我们的案例中,这是不可能实现的。.

您可以在我们的 Medium 博客上找到更多关于我们和我们项目的信息