簡體   English   中英

如何在 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 調用模型。

編輯:我使用的模型是使用與此示例非常相似的代碼創建的。

感謝任何幫助,即使他們沒有完全解決問題,我也會將賞金獎勵給最有幫助的人。

這不是一個完整的答案,因為我沒有 SageMaker 設置(而且我不知道 MXNet),所以我無法實際測試這種方法(是的,正如已經提到的,我不想稱之為完整的答案,而是一個可能的解決此問題的指針/方法)。

假設 -

您提到您的模型與您提供的筆記本鏈接非常相​​似。 如果你仔細閱讀筆記本中的文字,你會在某個時候看到有這樣的東西——

“在這個演示中,我們使用 Caltech-256 數據集,其中包含 256 個對象的 30608 張圖像。對於訓練和驗證數據,我們遵循這個 MXNet 示例中的拆分方案。”

看到那里提到 MXNet 了嗎? 讓我們假設您沒有進行太多更改,因此您的模型也是使用 MXNet 構建的。

方法 -

假設我剛才提到的,如果您在AWS SageMaker Python SDK的文檔中搜索,您將看到有關模塊序列化的部分。 這本身又是從另一個假設開始的——

“如果您的訓練函數返回一個 Module 對象,它將被默認的 Module 序列化系統序列化,除非您指定了自定義保存函數。”

假設這對你的情況是真的,進一步閱讀同一文檔告訴我們“model-shapes.json”是你的模型的 JSON 序列化表示,“model-symbol.json”是由創建的模塊符號的序列化在模塊的'symbol'屬性上調用'save'函數,最后“module.params”是模塊參數的序列化(我不確定是文本格式還是二進制格式)形式。

有了這些知識,我們就去查看 MXNet 的文檔。 瞧! 我們在這里看到如何使用 MXNet 保存和加載模型。 因此,由於您已經擁有這些保存的文件,您只需要將它們加載到 MXNet 的本地安裝中,然后運行它們來預測未知。

我希望這能幫助您找到解決問題的方向。

獎金 -

我不確定這是否也可以做同樣的工作,(@Seth Rothschild 在評論中也提到了這一點)但是應該可以,你可以看到AWS SageMaker Python SDK也有一種從保存的模型加載模型的方法。

按照 SRC 的建議,我能夠按照本問題和本文檔中的說明進行操作,該文檔描述了如何加載 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 )

如果您想在本地托管經過訓練的模型,並且使用 Apache MXNet 作為模型框架(如上例所示),最簡單的方法是使用 MXNet 模型服務器: https : //github.com/awslabs/ mxnet 模型服務器

在本地安裝后,您可以開始使用:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM