当前位置: 首页 > 知识库问答 >
问题:

如何使用dockerfile在aws sagemaker中运行python文件

凌经赋
2023-03-14

我有一个python代码和一个模型,是预先训练和有一个model.pkl文件与我在同一个目录中的代码我,现在我必须运行或部署这到aws sagemaker但没有得到任何解决方案由于aws sagemaker只支持两个命令,分别用于训练和部署。

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

有什么解决办法吗??

我尝试了与将模型部署到s3相同的方法,并在部署时调用,我不知道这是正确的还是错误的。

共有1个答案

祝高超
2023-03-14

如果您有一个预训练模型和一个文件名。py如果要在SageMakerendpoint上运行,只需将其打包为Docker映像,以创建一个模型,然后将其部署到endpoint并进行调用。

为了做到这一点,我只是遵循AWS文档中关于使用您自己的推理代码的指南。

这些步骤将是:

  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)

以下是一些要求。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任何endpoint:

curl localhost:8080/ping
> ok

现在我们需要将其发布到ECR,因为SageMaker从ECR读取模型。我在跟随AWS的指引

通过运行docker图像获取图像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

现在我们可以用这个图像创建一个模型。首先,您需要一个SageMaker执行角色。这将用于访问您的图像和其他资源。你可以在这个AWS文档页面上设置。

其次,需要设置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,它将告诉您的SageMakerendpoint需要如何配置:

aws sagemaker create-endpoint-config --endpoint-config-name "SimpleConfig" --production-variants "[
    {
        \"VariantName\" : \"SimpleVariant\",
        \"ModelName\" : \"SimpleModel\",
        \"InitialInstanceCount\" : 1,
        \"InstanceType\" : \"ml.t2.medium\"
    }
]"

最后,我们可以使用该配置创建endpoint:

aws sagemaker create-endpoint --endpoint-name "SimpleEndpoint" --endpoint-config-name "SimpleConfig"

如果所有这些都有效,请等到aws sagemaker描述-终结点-终结点名称SimpleEndpoint说它是InService

一旦它是,我们现在可以调用反对它:

aws sagemaker-runtime invoke-endpoint --endpoint-name SimpleEndpoint --body "empty"

如果这一切都成功了,你将有自己的终结点。接下来的步骤是自定义Python脚本,以便用自己的模型进行自己的推断。SageMaker还具有自动抓取模型工件的能力,您不必将它们包含在模型容器中。看这里的留档。

希望这有帮助!

 类似资料:
  • 问题内容: 我正在制作一个dockerfile来安装elasticsearch:6.5.4并将少量文件添加到所需位置,并运行一个名为test.sh的脚本,以便在Elasticsearch运行时在elasticsearch中创建新索引。 我不确定是否应该使用RUN,CMD或ENTRYPOINT来执行此操作。 我已经通过注释最后一行(包含RUN / CMD / ENTRYPOINT test.sh)成

  • 上述方法工作良好,但有一个警告 我想知道,有没有一种简单明了的方法可以直接调用bash函数,因为它是正常的二进制函数,而不需要包装?也许像是

  • 问题内容: 我在代理后面,我需要通过安装一些东西。 我最好的是这个 问题是,我之后需要取消设置这些环境变量。 任何想法如何做到少于5层? 问题答案: 您需要使用构建时变量(–build-arg)。 该标志允许您传递在Dockerfile的RUN指令中像常规环境变量一样被访问的构建时变量。而且,这些值不会像ENV值那样保留在中间或最终图像中。 因此,您只有3行: 您只需要定义构建时变量和/或在图像构

  • 问题内容: 我正在尝试在Dockerfile的构建过程中运行脚本。但这似乎不起作用。 我尝试过这种方式: 也这样: 并且也执行我正在运行的容器: 似乎没有任何作用。 你知道怎么做吗? 问题答案: 和是执行脚本的两种不同方式。 意味着它将创建一个中间容器,运行脚本并将该容器的新状态冻结在新的中间映像中。此后该脚本将不再运行:您的最终图像应该反映出该脚本的结果。 表示您的映像(尚未执行脚本)将创建一个

  • 问题内容: 我正在尝试对laravel应用程序进行Docker化。该应用程序已经构建并且在git中,但是我.gitignore我的供应商文件夹。我添加了一个Dockerfile,如下所示: 当我构建时,这似乎很棒。我看到依赖项已下载,我看到输出中正在生成自动加载文件。但是,一旦构建完成,vendor文件夹实际上就不存在了。我猜这都是在中间容器中完成的,然后将其删除?所以当我运行docker- co

  • 问题内容: 在mongo shell js文件中,可以使用以下命令运行: 如何使用spring-data做到这一点?或Java中的任何其他方式。我试过了: 和: 但这不起作用。 问题答案: 这是参考文档中有关如何在Spring Data MongoDB中使用脚本的相关部分。