Sagemaker 图像分类:在 S3 中对许多图像进行推理的最佳方式?
Sagemaker image classification: Best way to perform inference on many images in S3?
我使用内置的 RESnet18 docker 图像训练了一个模型,现在我想将该模型部署到端点并对大约 100 万张图像进行分类。我将所有训练、验证和测试图像以 RecordIO 格式存储在 S3 上(使用 im2rec.py). According to the docs:
转换
The Amazon SageMaker Image Classification algorithm supports both RecordIO (application/x-recordio) and image (application/x-image) content types for training. The algorithm supports only application/x-image for inference.
所以我无法对 RecordIO 格式的训练数据进行推理。为了克服这个问题,我将所有原始 .jpg 图像(约 2GB)复制到我的 Sagemaker Jupyter Notebook 实例上,并按以下方式一次执行一个推理:
img_list = os.listdir('temp_data') # list of all ~1,000,000 images
for im in img_list:
with open('temp_data/'+im, 'rb') as f:
payload = f.read()
payload = bytearray(payload)
response = runtime.invoke_endpoint(EndpointName=endpoint_name,
ContentType='application/x-image',
Body=payload)
etc...
不用说,将所有数据传输到我的笔记本实例上花费了很长时间,我宁愿在 运行 推理之前不必这样做。为什么 SageMaker 图像分类不支持 RecordIO 进行推理?更重要的是,在无需将图像从 S3 移动的情况下 运行 推断许多图像的最佳方法是什么?
RecordIO 格式旨在将大量图像打包到单个文件中,因此我认为它不适用于预测单个图像。
谈到预测,您绝对不必将图像复制到笔记本实例或 S3。您只需从任何地方加载它们并将它们内联到您的预测请求中。
如果您想要基于 HTTP 的预测,您可以选择以下选项:
1) 在任何机器上使用 SageMaker SDK Predictor.predict() API(只要它具有适当的 AWS 凭证)https://github.com/aws/sagemaker-python-sdk
2) 在任何机器上使用 AWS Python SDK(又名 boto3)API invoke_endpoint()(只要它具有适当的 AWS 凭据)
您甚至可以构建一个简单的服务来使用 Lambda 执行预处理或 post 处理。这是一个示例:https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033
如果要批量预测:
最简单的方法是从 SageMaker 检索经过训练的模型,编写几行专门的 MXNet 代码来加载它和 运行 所有预测。这是一个例子:https://mxnet.incubator.apache.org/tutorials/python/predict_image.html
希望对您有所帮助。
Amazon SageMaker 现在支持批量预测,这将更适合您的用例:
我使用内置的 RESnet18 docker 图像训练了一个模型,现在我想将该模型部署到端点并对大约 100 万张图像进行分类。我将所有训练、验证和测试图像以 RecordIO 格式存储在 S3 上(使用 im2rec.py). According to the docs:
转换The Amazon SageMaker Image Classification algorithm supports both RecordIO (application/x-recordio) and image (application/x-image) content types for training. The algorithm supports only application/x-image for inference.
所以我无法对 RecordIO 格式的训练数据进行推理。为了克服这个问题,我将所有原始 .jpg 图像(约 2GB)复制到我的 Sagemaker Jupyter Notebook 实例上,并按以下方式一次执行一个推理:
img_list = os.listdir('temp_data') # list of all ~1,000,000 images
for im in img_list:
with open('temp_data/'+im, 'rb') as f:
payload = f.read()
payload = bytearray(payload)
response = runtime.invoke_endpoint(EndpointName=endpoint_name,
ContentType='application/x-image',
Body=payload)
etc...
不用说,将所有数据传输到我的笔记本实例上花费了很长时间,我宁愿在 运行 推理之前不必这样做。为什么 SageMaker 图像分类不支持 RecordIO 进行推理?更重要的是,在无需将图像从 S3 移动的情况下 运行 推断许多图像的最佳方法是什么?
RecordIO 格式旨在将大量图像打包到单个文件中,因此我认为它不适用于预测单个图像。
谈到预测,您绝对不必将图像复制到笔记本实例或 S3。您只需从任何地方加载它们并将它们内联到您的预测请求中。
如果您想要基于 HTTP 的预测,您可以选择以下选项:
1) 在任何机器上使用 SageMaker SDK Predictor.predict() API(只要它具有适当的 AWS 凭证)https://github.com/aws/sagemaker-python-sdk
2) 在任何机器上使用 AWS Python SDK(又名 boto3)API invoke_endpoint()(只要它具有适当的 AWS 凭据)
您甚至可以构建一个简单的服务来使用 Lambda 执行预处理或 post 处理。这是一个示例:https://medium.com/@julsimon/using-chalice-to-serve-sagemaker-predictions-a2015c02b033
如果要批量预测: 最简单的方法是从 SageMaker 检索经过训练的模型,编写几行专门的 MXNet 代码来加载它和 运行 所有预测。这是一个例子:https://mxnet.incubator.apache.org/tutorials/python/predict_image.html
希望对您有所帮助。
Amazon SageMaker 现在支持批量预测,这将更适合您的用例: