尝试使用 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
- 从 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")
- 通过使用新模型进行预测来检查参数是否已正确加载
使用用于训练的图像。
#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)
- 将模型混合为 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')
- 将模型重新编译为 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()
- 保存tar.gz文件到s3然后使用Neo GUI编译
我使用内置的 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
- 从 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")
- 通过使用新模型进行预测来检查参数是否已正确加载
使用用于训练的图像。
#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)
- 将模型混合为 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')
- 将模型重新编译为 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()
- 保存tar.gz文件到s3然后使用Neo GUI编译