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

Posted

技术标签:

【中文标题】如何在 Python 中本地部署 Amazon-SageMaker【英文标题】:How to Deploy Amazon-SageMaker Locally in Python 【发布时间】:2018-08-12 16:59:31 【问题描述】:

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

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

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 非常相似的代码创建的。

感谢任何帮助,我会将赏金奖励给最有帮助的人,即使他们没有完全解决问题。

【问题讨论】:

您是否使用 MXNet 来训练模型? 我不相信,除非它在亚马逊后端的某个地方使用过。我使用的模型是使用与此示例非常相似的脚本创建的:github.com/awslabs/amazon-sagemaker-examples/blob/master/… 我没有设置 sagemaker 进行测试,但我认为您正在寻找的答案可能在 sdk README 中。看起来在链接部分的正上方列出了一个models.get_model 命令,然后 python 调用在其下方使用加载的模型。 【参考方案1】:

按照 SRC 的建议,我能够按照 question 和 doc 中的说明进行操作,这些说明描述了如何加载 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)

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

import mxnet as mx
import matplotlib.pyplot as plot
import cv2
import numpy as np
from mxnet.io import DataBatch

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(DataBatch([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 )

【讨论】:

我应该从哪里导入Batchlenet_model.forward(Batch([mx.nd.array(img)])) 对文档的引用已更改 :(【参考方案2】:

如果您想在本地托管经过训练的模型,并且使用 Apache MXNet 作为模型框架(如上例所示),最简单的方法是使用 MXNet 模型服务器: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 "data=@kitten.jpg"

【讨论】:

谢谢你,但我正在尝试在没有现有端点的情况下运行模型。【参考方案3】:

这不是一个完整的答案,因为我没有 SageMaker 设置(而且我不知道 MXNet),因此我无法实际测试这种方法(是的,如前所述,我不想称之为完整的答案而是解决此问题的可能指针/方法)。

假设 -

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

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

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

方法 -

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

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

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

有了这些知识,我们开始研究 MXNet 的文档。瞧!我们看到here 如何使用 MXNet 保存和加载模型。因此,由于您已经拥有这些保存的文件,您只需将它们加载到 MXNet 的本地安装中,然后运行它们来预测未知数。

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

奖金 -

我不确定这是否也能做同样的工作,(@Seth Rothschild 在 cmets 中也提到过)但它应该,你可以看到 AWS SageMaker Python SDK 有一种方法可以从保存的模型中加载模型好吧。

【讨论】:

感谢您的建议,我将尝试通过文档解决问题。您是否对 mxnet 文档中的此示例中的迭代意味着什么有任何见解? # save a model to mymodel-symbol.json and mymodel-0100.params prefix = 'mymodel' iteration = 100 model.save(prefix, iteration) # load model back model_loaded = mx.model.FeedForward.load(prefix, iteration)?是特定于前馈模型的吗? 正如我所提到的,我不知道 MXNet,但查看文档并在此后四处寻找,我相信它可能是检查点迭代次数。您的模型可能运行了 400 次迭代,并且在每 100 次之后您保存了参数。所以你有 4 个参数文件。您也可以查看this SO 答案,了解有关模块级保存和加载的更多上下文。 谢谢!能够让它工作,感谢您的帮助。我会输入我所做的答案。 很高兴知道 :) 很高兴我能提供帮助。建模快乐!

以上是关于如何在 Python 中本地部署 Amazon-SageMaker的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Firebase 托管上部署流线型 python 应用程序?

如何优雅的部署Python应用到Linux服务器?

在 Hadoop 上部署 Python pip 包?

如何在本地下载 pip 依赖项? [复制]

CentOS8部署自己本地的django项目