首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为码头集装箱运行推理模型提供额外的输入

为码头集装箱运行推理模型提供额外的输入
EN

Stack Overflow用户
提问于 2020-09-04 12:00:20
回答 1查看 736关注 0票数 2

我们正在使用AWS的Sagemaker特性,带来您自己的对接器,在这里我们有用R编写的推理模型,据我所知,批处理转换作业以如下方式运行容器:

代码语言:javascript
复制
docker run image serve

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

代码语言:javascript
复制
args <- commandArgs()
if (any(grepl('train', args))) {
    train()}
if (any(grepl('serve', args))) {
    serve()}

有没有一种方法,可以覆盖默认容器调用,以便我们可以传递一些附加参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-09 22:37:06

正如您在AWS文件中指出的那样,Sagemaker将使用以下命令运行您的容器:

代码语言:javascript
复制
docker run image serve

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

我们可以考虑使用Dockerfile ENTRYPOINT来使用一些环境变量,但是AWS的文档表明最好使用ENTRYPOINTexec形式。有些人认为:

代码语言:javascript
复制
ENTRYPOINT ["/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save"]

我认为,类似于模型训练,它们需要这样的容器执行来使容器能够接收终止信号:

ENTRYPOINT指令的exec表单直接启动可执行文件,而不是作为/bin/sh的子级启动。这使它能够接收来自SIGTERM API和SIGKILL的信号。

为了允许变量展开,我们需要使用ENTRYPOINT shell表单。想象一下:

代码语言:javascript
复制
ENTRYPOINT ["sh", "-c", "/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save", "$ENV_VAR1"]

如果您试图对exec表单做同样的操作,那么所提供的变量将被视为一个字面变量,而不会为它们的实际值而被替换。

请参阅堆栈溢出问题的批准答案,以获得对这一主题的很好解释。

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

代码语言:javascript
复制
ENV_VAR1 <- Sys.getenv("ENV_VAR1")

要向容器传递环境变量(如AWS文件中所示),可以在容器上使用CreateModelCreateTransformJob请求。

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

代码语言:javascript
复制
ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUE
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63740792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档