如何在 Python 本地部署 Amazon-SageMaker
How to Deploy Amazon-SageMaker Locally in Python
我在 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。
感谢任何帮助,我会将赏金奖励给最有帮助的人,即使他们没有完全解决问题。
这不是一个完整的答案,因为我没有设置 SageMaker(而且我不知道 MXNet),所以我无法实际测试这种方法(是的,正如已经提到的,我不想称之为完整的答案而不是可能 pointer/approach 来解决这个问题)。
假设 -
您提到您的型号与您提供的笔记本非常相似link。如果你仔细阅读笔记本中的文字,你会在某个时候看到这样的东西 -
"In this demo, we are using Caltech-256 dataset, which contains 30608 images of 256 objects. For the training and validation data, we follow the splitting scheme in this MXNet example."
看到那里提到 MXNet 了吗?让我们假设您没有做太多更改,因此您的模型也是使用 MXNet 构建的。
方法 -
假设我刚才提到的,如果你去搜索 AWS SageMaker Python SDK 的文档,你会看到关于模块序列化的部分。这又是从另一个假设开始的-
"If you train function returns a Module object, it will be serialized by the default Module serialization system, unless you've specified a custom save function."
假设这对你的情况是正确的,进一步阅读同一份文件告诉我们 "model-shapes.json" 是你的模型的 JSON 序列化表示,"model-symbol.json" 是在模块的'symbol'属性上调用'save'函数创建的模块符号,最后"module.params"是序列化的(我不确定是文本格式还是二进制格式) 形式的模块参数。
有了这些知识,我们就可以查看 MXNet 的文档。瞧!我们了解 here 如何使用 MXNet 保存和加载模型。因此,由于您已经拥有这些保存的文件,您只需将它们加载到 MXNet 的本地安装中,然后 运行 它们来预测未知。
希望本文能帮助您找到解决问题的方向。
奖金 -
我不确定这是否也可以做同样的工作,(@Seth Rothschild 在评论中也提到了)但应该可以,你可以看到 AWS SageMaker Python SDK 有一种加载模型的方法也来自已保存的。
如果您想在本地托管经过训练的模型,并且使用 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"
根据 SRC 的建议,我能够按照 question and this 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 )
我在 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。
感谢任何帮助,我会将赏金奖励给最有帮助的人,即使他们没有完全解决问题。
这不是一个完整的答案,因为我没有设置 SageMaker(而且我不知道 MXNet),所以我无法实际测试这种方法(是的,正如已经提到的,我不想称之为完整的答案而不是可能 pointer/approach 来解决这个问题)。
假设 -
您提到您的型号与您提供的笔记本非常相似link。如果你仔细阅读笔记本中的文字,你会在某个时候看到这样的东西 -
"In this demo, we are using Caltech-256 dataset, which contains 30608 images of 256 objects. For the training and validation data, we follow the splitting scheme in this MXNet example."
看到那里提到 MXNet 了吗?让我们假设您没有做太多更改,因此您的模型也是使用 MXNet 构建的。
方法 -
假设我刚才提到的,如果你去搜索 AWS SageMaker Python SDK 的文档,你会看到关于模块序列化的部分。这又是从另一个假设开始的-
"If you train function returns a Module object, it will be serialized by the default Module serialization system, unless you've specified a custom save function."
假设这对你的情况是正确的,进一步阅读同一份文件告诉我们 "model-shapes.json" 是你的模型的 JSON 序列化表示,"model-symbol.json" 是在模块的'symbol'属性上调用'save'函数创建的模块符号,最后"module.params"是序列化的(我不确定是文本格式还是二进制格式) 形式的模块参数。
有了这些知识,我们就可以查看 MXNet 的文档。瞧!我们了解 here 如何使用 MXNet 保存和加载模型。因此,由于您已经拥有这些保存的文件,您只需将它们加载到 MXNet 的本地安装中,然后 运行 它们来预测未知。
希望本文能帮助您找到解决问题的方向。
奖金 -
我不确定这是否也可以做同样的工作,(@Seth Rothschild 在评论中也提到了)但应该可以,你可以看到 AWS SageMaker Python SDK 有一种加载模型的方法也来自已保存的。
如果您想在本地托管经过训练的模型,并且使用 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"
根据 SRC 的建议,我能够按照 question and this 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 )