为 docker 容器 运行 推理模型提供额外输入
Provide additional input to docker container running inference model
我们正在使用 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 的文档规定最好使用 ENTRYPOINT
的 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
表单执行相同的操作,所提供的变量将被视为文字,不会被替换为它们的实际值。
请参阅 Whosebug 问题的批准答案,以获得对该主题的很好解释。
但是,您可以做的一件事是在 R 代码中获取这些变量的值,类似于处理 commandArgs
:
ENV_VAR1 <- Sys.getenv("ENV_VAR1")
要将环境变量传递给容器,如AWS documentation所示,您可以使用CreateModel
和CreateTransformJob
对您的容器的请求。
您可能需要在 Dockerfile 中为容器上的每个必需环境变量包含 ENV
定义,并使用 ARG
:
为这些定义提供默认值
ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUE
我们正在使用 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 的文档规定最好使用 ENTRYPOINT
的 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 likeSIGTERM
andSIGKILL
from SageMaker APIs.
为了允许变量扩展,我们需要使用ENTRYPOINT
shell
形式。想象一下:
ENTRYPOINT ["sh", "-c", "/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save", "$ENV_VAR1"]
如果您尝试对 exec
表单执行相同的操作,所提供的变量将被视为文字,不会被替换为它们的实际值。
请参阅
但是,您可以做的一件事是在 R 代码中获取这些变量的值,类似于处理 commandArgs
:
ENV_VAR1 <- Sys.getenv("ENV_VAR1")
要将环境变量传递给容器,如AWS documentation所示,您可以使用CreateModel
和CreateTransformJob
对您的容器的请求。
您可能需要在 Dockerfile 中为容器上的每个必需环境变量包含 ENV
定义,并使用 ARG
:
ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUE