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

问题描述 投票:0回答:1

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

docker run image serve

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

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

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

amazon-web-services docker amazon-sagemaker
1个回答
3
投票

正如您所说,并且如 AWS 文档中所示,Sagemaker 将使用以下命令运行您的容器:

docker run image serve

通过发出此命令,Sagemaker 将覆盖您在容器 Dockerfile 中提供的任何

CMD
,因此您无法使用
CMD
为程序提供动态参数。

我们考虑使用 Dockerfile

ENTRYPOINT
来使用一些环境变量,但 AWS 的文档规定最好使用
exec
ENTRYPOINT
形式。比如:

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

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

ENTRYPOINT
指令的exec形式直接启动可执行文件,而不是作为
/bin/sh
的子指令。这使其能够从 SageMaker API 接收
SIGTERM
SIGKILL
等信号。

为了允许变量扩展,我们需要使用

ENTRYPOINT
shell
形式。想象一下:

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

如果您尝试对

exec
形式执行相同操作,则提供的变量将被视为文字,并且不会替换其实际值。

请参阅this Stack Overflow 问题的批准答案,以获得对此主题的详细解释。

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

commandArgs
:

ENV_VAR1 <- Sys.getenv("ENV_VAR1")

要将环境变量传递到容器,如 AWS 文档中所示,您可以在容器上使用

CreateModel
CreateTransformJob
请求。

您可能需要在 Dockerfile 中包含容器上每个所需环境变量的

ENV
定义,并使用
ARG
:

为这些定义提供默认值
ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUE
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.