amazon-web-services - 为运行推理模型的 docker 容器提供额外的输入

标签 amazon-web-services docker amazon-sagemaker

我们正在使用 AWS Sagemaker 功能,自带 docker,其中我们有用 R 编写的推理模型。据我了解,批量转换作业以以下方式运行容器:

docker run image serve

此外,在 docker 上我们有一个逻辑来确定要调用哪个函数:

args <- commandArgs()
if (any(grepl('train', args))) {
    train()}
if (any(grepl('serve', args))) {
    serve()}

有没有办法覆盖默认的容器调用,以便我们可以传递一些额外的参数?

最佳答案

正如您所说,并在 AWS documentation 中指出,Sagemaker 将使用以下命令运行您的容器:

docker run image serve

通过发出此命令,Sagemaker 将覆盖您在容器 Dockerfile 中提供的任何 CMD,因此您无法使用 CMD 为程序提供动态参数。

我们可以考虑使用 Dockerfile ENTRYPOINT 来使用一些环境变量,但 AWS 的文档规定最好使用 exec 形式入口点。有些人认为:

ENTRYPOINT ["/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save"]

我认为,与 model training 类比,他们需要这种容器执行来使容器能够接收终止信号:

The exec form of the ENTRYPOINT instruction starts the executable directly, not as a child of /bin/sh. This enables it to receive signals like SIGTERM and SIGKILL from SageMaker APIs.

为了允许变量扩展,我们需要使用ENTRYPOINT shell 形式。想象一下:

ENTRYPOINT ["sh", "-c", "/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save", "$ENV_VAR1"]

如果您尝试对 exec 表单执行相同操作,则提供的变量将被视为文字,并且不会替代其实际值。

请参阅 this 的批准答案stackoverflow 问题对这个主题有很好的解释。

但是,您可以做的一件事是在 R 代码中获取这些变量的值,类似于处理 commandArgs 时:

ENV_VAR1 <- Sys.getenv("ENV_VAR1")

将环境变量传递给容器,如 AWS documentation 中所示,您可以使用CreateModelCreateTransformJob对您的容器的请求。

您可能需要在 Dockerfile 中包含容器上每个所需环境变量的 ENV 定义,并使用 ARG 为这些定义提供默认值:

ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUE

关于amazon-web-services - 为运行推理模型的 docker 容器提供额外的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63740792/

相关文章:

java - 如何使用AWS STS为s3中的文件的特定资源创建只读和只写 token

amazon-web-services - 从 Aurora RDS 存储过程权限问题调用 AWS Lambda

amazon-web-services - 缺少必需参数 : Missing required key 'FunctionName' in params

amazon-sagemaker - BlazingText jsonlines 批量转换的问题

Node.js 服务器不可见

amazon-web-services - 使用 Dockerrun.aws.json 通过 CLI deploy 命令部署到 elasticbeanstalk

docker - docker 和 kubernetes 的正确代理设置是什么

linux - docker中的多个桥接网络?

node.js -/bin/sh : 1: [“npm” ,:在 docker-compose up 上找不到

python - SageMaker 实验商店