尝试使用 SageMaker Neo 编译 SageMaker 语义分割模型(内置算法)时缺少 -symbol.json 错误

Missing -symbol.json error when trying to compile a SageMaker semantic segmentation model (built-in algorithm) with SageMaker Neo

我使用内置的 sagemaker 语义分割算法训练了一个 SageMaker 语义分割模型。这可以正常部署到 SageMaker 端点,我可以 运行 从中成功地在云中进行推理。 我想在边缘设备 (AWS Panorama Appliance) 上使用该模型,这应该只是意味着使用 SageMaker Neo 将模型编译为目标设备的规格。

但是,无论我的目标设备是什么(Neo 设置),我似乎都无法使用 Neo 编译模型,因为我收到以下错误:

ClientError: InputConfiguration: No valid Mxnet model file -symbol.json found

语义分割模型的model.tar.gz包含hyperparams.json、model_algo-1、model_best.params。根据文档,model_algo-1 是序列化的 mxnet 模型。 Neo 不支持胶子模型吗?

顺便说一句,我遇到了与另一个 SageMaker 内置算法完全相同的问题,即 k-最近邻 (k-NN)。它似乎也是在没有 -symbol.json.

的情况下编译的

是否有一些脚本可以让我运行重新创建一个-symbol.json文件或转换已编译的 sagemaker 模型?

使用 Estimator 构建我的模型后,我必须使用代码在 SageMaker Neo 中编译它:

optimized_ic = my_estimator.compile_model(
 target_instance_family="ml_c5",
 target_platform_os="LINUX",
 target_platform_arch="ARM64",
 input_shape={"data": [1,3,512,512]},  
 output_path=s3_optimized_output_location,
 framework="mxnet",
 framework_version="1.8", 
)

我希望它编译正常,但那是我收到错误消息说模型缺少 *-symbol.json 文件的地方。

出于某种原因,AWS 决定不使其 built-in 算法直接与 Neo 兼容...但是,您可以 re-engineer 使用 model.tar.gz 输出文件的网络参数然后编译。

第 1 步:从 tar 文件中提取模型

import tarfile
#path to local tar file
model = 'ss_model.tar.gz'

#extract tar file 
t = tarfile.open(model, 'r:gz')
t.extractall()

这应该输出两个文件: model_algo-1、model_best.params

  1. 从 gluon model zoo 中为您选择的架构将权重加载到网络中

在这种情况下,我使用了 DeepLabv3 和 resnet50

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

model = model_zoo.DeepLabV3(nclass=2, backbone='resnet50', pretrained_base=False, height=800, width=1280, crop_size=240)
model.load_parameters("model_algo-1")
  1. 通过使用新模型进行预测来检查参数是否已正确加载

使用用于训练的图像。

#use cpu
ctx = mx.cpu(0)
#decode image bytes of loaded file
img = image.imdecode(imbytes)

#transform image
img = test_transform(img, ctx)
img = img.astype('float32')
print('tranformed image shape: ', img.shape)

#get prediction
output = model.predict(img)
  1. 将模型混合为 Sagemaker Neo 所需的输出

图像形状兼容性的额外检查

model.hybridize()
model(mx.nd.ones((1,3,800,1280)))
export_block('deeplabv3-res50', model, data_shape=(3,800,1280), preprocess=None, layout='CHW')
  1. 将模型重新编译为 tar.gz 格式

这包含 Neo 查找的参数和 json 文件。

tar = tarfile.open("comp_model.tar.gz", "w:gz")
for name in ["deeplabv3-res50-0000.params", "deeplabv3-res50-symbol.json"]:
    tar.add(name)
tar.close()
  1. 保存tar.gz文件到s3然后使用Neo GUI编译