如何使用dockerfile在AWS Sagemaker中运行python文件

时间:2019-10-09 09:16:47

标签: python amazon-web-services amazon-sagemaker

我有一个python代码和一个经过预训练的模型,并且在与代码i相同的目录中有一个model.pkl文件,现在我必须将其运行或部署到aws sagemaker,但没有得到任何解决方案,因为aws sagemaker仅支持两个命令训练或分别用于训练和部署。

当前,我正在使用命令“ python filename.py”运行该程序,并且该程序已成功运行,我希望在aws sagemaker上运行该程序。

任何解决方案?

我尝试过将模型部署到s3上,并在部署时打电话给我,我不知道它是对还是错。

1 个答案:

答案 0 :(得分:1)

如果您具有预训练的模型和要在SageMaker Endpoints上运行的文件filename.py,则只需将其打包为Docker映像即可创建模型,然后将其部署到Endpoint进行调用。

为此,我只是按照using your own inference code上AWS文档中的指南进行操作。

步骤将是:

  1. 创建模型代码
  2. 使用代码创建Docker映像
  3. 使用此图像创建端点

步骤1:创建模型代码

让我们以这个简单的模型作为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

步骤2:创建Docker映像

我们需要一个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

来获取图像ID

在这里使用。为了方便起见,我使用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

第3步:创建端点

现在,我们可以使用此图像创建模型。首先,您需要一个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

希望有帮助!