我有一个python代码和一个经过预训练的模型,并且在与代码i相同的目录中有一个model.pkl文件,现在我必须将其运行或部署到aws sagemaker,但没有得到任何解决方案,因为aws sagemaker仅支持两个命令训练或分别用于训练和部署。
当前,我正在使用命令“ python filename.py”运行该程序,并且该程序已成功运行,我希望在aws sagemaker上运行该程序。
任何解决方案?
我尝试过将模型部署到s3上,并在部署时打电话给我,我不知道它是对还是错。
答案 0 :(得分:1)
如果您具有预训练的模型和要在SageMaker Endpoints上运行的文件filename.py
,则只需将其打包为Docker映像即可创建模型,然后将其部署到Endpoint进行调用。
为此,我只是按照using your own inference code上AWS文档中的指南进行操作。
步骤将是:
让我们以这个简单的模型作为Python示例:
from flask import Flask, request
app = Flask(__name__)
@app.route('/ping')
def ping():
return ''
@app.route('/invocations')
def invoke():
return 'should do inference with your model here'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=8080)
以下是requirements.txt:
Flask==0.10.1
我们需要一个Dockerfile来构建我们的映像。这是我使用的那个:
Dockerfile:
FROM ubuntu:16.04
RUN apt-get update -y && apt-get install -y python-pip python-dev
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY . /app
EXPOSE 8080
ENTRYPOINT ["python"]
CMD ["model.py"]
我们可以通过运行docker build -t simple-model:latest .
这将创建图像,现在我们可以通过运行它进行测试:
docker run -d -p 8080:8080 simple-model
如果它正在运行,则应该能够curl
的任何端点:
curl localhost:8080/ping
> ok
现在,当SageMaker从ECR读取模型时,我们需要将其发布到ECR。我正在关注this guide from AWS
通过运行docker images
在这里使用。为了方便起见,我使用us-west-2。将其替换为您选择的区域:
docker tag <image id> <aws accound id>.dkr.ecr.us-west-2.amazonaws.com/simple-model
现在我们应该将其推送到ECR:
docker push <aws accound id>.dkr.ecr.us-west-2.amazonaws.com/simple-model
现在,我们可以使用此图像创建模型。首先,您需要一个SageMaker执行角色。这将用于访问您的图像和其他资源。您可以在此AWS doc page上进行设置。
第二,您需要进行AWS CLI设置。
开始吧。
首先创建模型。这将指向您在上一步中创建的ECR图像。用此命令替换您在上面创建的角色名称:
aws sagemaker create-model --model-name "SimpleModel" --execution-role-arn "arn:aws:iam::<aws account id>:role/<role name>" --primary-container "{
\"ContainerHostname\": \"ModelHostname\",
\"Image\": \"<aws account id>.dkr.ecr.us-west-2.amazonaws.com/simple-model:latest\"
}"
这将创建您的模型。现在我们需要创建一个EndpointConfig
,它将告诉您的SageMaker Endpoint如何配置它:
aws sagemaker create-endpoint-config --endpoint-config-name "SimpleConfig" --production-variants "[
{
\"VariantName\" : \"SimpleVariant\",
\"ModelName\" : \"SimpleModel\",
\"InitialInstanceCount\" : 1,
\"InstanceType\" : \"ml.t2.medium\"
}
]"
现在终于可以使用该配置创建端点了:
aws sagemaker create-endpoint --endpoint-name "SimpleEndpoint" --endpoint-config-name "SimpleConfig"
如果所有方法都起作用,请等到aws sagemaker describe-endpoint --endpoint-name SimpleEndpoint
说是InService
。
一旦存在,我们现在可以对其进行调用:
aws sagemaker-runtime invoke-endpoint --endpoint-name SimpleEndpoint --body "empty"
如果一切正常,您将拥有自己的端点。下一步将是自定义该Python脚本,以对自己的模型进行推断。 SageMaker还具有自动获取模型工件的能力,您不必将其包含在模型容器中。参见the documentation here。
希望有帮助!