首页 > 解决方案 > 如何使用内置算法语义分割在 AWS SageMaker 上训练的模型在本地 PC 上进行推理?

问题描述

类似于训练好的模型可以在不依赖 sagemaker 或 aws 服务的情况下部署在其他平台上的问题?.

我使用内置算法Semantic Segmentation在 AWS SageMaker 上训练了一个模型。这个名为 asmodel.tar.gz的训练模型存储在 S3 上。所以我想从 S3 下载这个文件,然后用它在我的本地 PC 上进行推理,而不再使用 AWS SageMaker。由于内置算法语义分割是使用MXNet Gluon 框架和 Gluon CV 工具包构建的,所以我尝试参考mxnet和gluon -cv的文档在本地 PC 上进行推理。

从S3下载这个文件很容易,然后我解压这个文件得到三个文件:

  1. hyperparams.json:包括网络架构、数据输入和训练的参数。请参阅语义分割超参数
  2. model_algo-1
  3. model_best.params

model_algo -1model_best.params都是经过训练的模型,我认为它是net.save_parameters(请参阅训练神经网络)的输出。我也可以用函数加载它们mxnet.ndarray.load

请参阅使用预训练模型进行预测。我发现有两个必要的东西:

  1. 重构网络以进行推理。
  2. 加载训练好的参数。

至于重构网络进行推理,由于我在训练中使用过PSPNet,所以我可以使用类gluoncv.model_zoo.PSPNet来重构网络。而且我知道如何使用 AWS SageMaker 的一些服务(例如批量转换作业)进行推理。我想在我的本地 PC 上重现它。如果我使用该类gluoncv.model_zoo.PSPNet来重建网络,我无法确定该网络的参数是否与 AWS SageMaker 在推理时使用的参数相同。因为我看不到501404015308.dkr.ecr.ap-northeast-1.amazonaws.com/semantic-segmentation:latest详细的图像。

至于加载训练好的参数,我可以使用load_parameters. 但是对于model_algo-1model_best.params,我不知道应该使用哪个。

标签: amazon-sagemakermxnetgluon

解决方案


以下代码对我来说效果很好。

import mxnet as mx
from mxnet import image
from gluoncv.data.transforms.presets.segmentation import test_transform
import gluoncv

# use cpu
ctx = mx.cpu(0)

# load test image
img = image.imread('./img/IMG_4015.jpg')
img = test_transform(img, ctx)
img = img.astype('float32')

# reconstruct the PSP network model
model = gluoncv.model_zoo.PSPNet(2)

# load the trained model
model.load_parameters('./model/model_algo-1')

# make inference
output = model.predict(img)
predict = mx.nd.squeeze(mx.nd.argmax(output, 1)).asnumpy()

推荐阅读