如何在Python中本地部署Amazon-SageMaker

问题描述 投票:0回答:3

我在Amazon-SageMaker中训练我的模型并将其下载到我的本地计算机。不幸的是,我不知道如何在本地运行模型。

Model位于包含以下文件的目录中:

image-classification-0001.params
image-classification-0002.params
image-classification-0003.params
image-classification-0004.params
image-classification-0005.params
image-classification-symbol.json
model-shapes.json

谁会知道如何在本地使用Python运行,或者能够指向一个可以帮助的资源?我试图避免使用Amazon API调用模型。

编辑:我使用的模型是使用与此example非常相似的代码创建的。

任何帮助表示赞赏,即使他们没有完全解决问题,我也会奖励那些最有帮助的人。

python amazon-web-services machine-learning neural-network amazon-sagemaker
3个回答
1
投票

这不是一个完整的答案,因为我没有SageMaker设置(我不知道MXNet),所以我实际上无法测试这种方法(是的,正如已经提到的,我不想把这个称为一个完整的答案,而不是一个可能的指针/方法来解决这个问题)。

假设 -

您提到您的模型与您提供的笔记本链接非常相​​似。如果你仔细阅读笔记本中的文字,你会在某些时候看到这样的东西 -

“在本演示中,我们使用的是Caltech-256数据集,其中包含30608个256个对象的图像。对于训练和验证数据,我们遵循MXNet示例中的分割方案。”

看到那里提到的MXNet?我们假设您没有进行太多更改,因此您的模型也是使用MXNet构建的。

该方法 -

假设我刚才提到过,如果你去搜索AWS SageMaker Python SDK的文档,你会看到一个关于模块序列化的部分。这本身再次以另一个假设开始 -

“如果训练函数返回一个Module对象,它将由默认的Module序列化系统序列化,除非你指定了一个自定义保存函数。”

假设对于您的情况这是真的,在同一文档中进一步阅读告诉我们“model-shapes.json”是模型的JSON序列化表示,“model-symbol.json”是由模型符号创建的序列化在模块的'symbol'属性上调用'save'函数,最后“module.params”是模块参数的序列化(我不确定它是文本格式还是二进制格式)。

掌握了这些知识后,我们将查看MXNet的文档。还有瞧!我们看到here我们如何使用MXNet保存和加载模型。因此,当您已经拥有这些已保存的文件时,您只需要在MXNet的本地安装中加载它们,然后运行它们来预测未知。

我希望这能帮助您找到解决问题的方向。

奖金 -

我不确定这是否也可以做同样的工作,(@Seth Rothschild在评论中也提到过)但是应该可以看出,AWS SageMaker Python SDK也有办法从已保存的模型中加载模型。


1
投票

根据SRC的建议,我能够按照此questiondoc中的说明进行操作,该说明描述了如何加载MXnet模型。

我这样加载模型:

lenet_model = mx.mod.Module.load('model_directory/image-classification',5)
image_l = 64
image_w = 64
lenet_model.bind(for_training=False, data_shapes=[('data',(1,3,image_l,image_w))],label_shapes=lenet_model._label_shapes)

然后使用先前链接的文档中稍微修改过的辅助函数进行预测:

def get_image(url, show=False):
    # download and show the image
    fname = mx.test_utils.download(url)
    img = cv2.cvtColor(cv2.imread(fname), cv2.COLOR_BGR2RGB)
    if img is None:
         return None
    if show:
         plt.imshow(img)
         plt.axis('off')
    # convert into format (batch, RGB, width, height)
    img = cv2.resize(img, (64, 64))
    img = np.swapaxes(img, 0, 2)
    img = np.swapaxes(img, 1, 2)
    img = img[np.newaxis, :]
    return img

def predict(url, labels):
    img = get_image(url, show=True)
    # compute the predict probabilities
    lenet_model.forward(Batch([mx.nd.array(img)]))
    prob = lenet_model.get_outputs()[0].asnumpy()

    # print the top-5
    prob = np.squeeze(prob)
    a = np.argsort(prob)[::-1]

    for i in a[0:5]:
       print('probability=%f, class=%s' %(prob[i], labels[i]))

最后我用这段代码调用了预测:

labels = ['a','b','c', 'd','e', 'f']
predict('https://eximagesite/img_tst_a.jpg', labels )

0
投票

如果您想在本地托管训练有素的模型,并且使用Apache MXNet作为模型框架(如上例所示),最简单的方法是使用MXNet Model Server:https://github.com/awslabs/mxnet-model-server

在本地安装后,您可以开始使用:

mxnet-model-server \ --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model

然后使用图像调用本地端点

curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg curl -X POST http://127.0.0.1:8080/squeezenet/predict -F "[email protected]"

© www.soinside.com 2019 - 2024. All rights reserved.