我们正在使用AWS的Sagemaker特性,带来您自己的对接器,在这里我们有用R编写的推理模型,据我所知,批处理转换作业以如下方式运行容器:
docker run image serve另外,在docker上,我们有一个逻辑来确定要调用哪个函数:
args <- commandArgs()
if (any(grepl('train', args))) {
train()}
if (any(grepl('serve', args))) {
serve()}有没有一种方法,可以覆盖默认容器调用,以便我们可以传递一些附加参数?
发布于 2020-09-09 22:37:06
正如您在AWS文件中指出的那样,Sagemaker将使用以下命令运行您的容器:
docker run image serve通过发出此命令,Sagemaker将覆盖您在容器Dockerfile中提供的任何CMD,因此不能使用CMD为程序提供动态参数。
我们可以考虑使用Dockerfile ENTRYPOINT来使用一些环境变量,但是AWS的文档表明最好使用ENTRYPOINT的exec形式。有些人认为:
ENTRYPOINT ["/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save"]我认为,类似于模型训练,它们需要这样的容器执行来使容器能够接收终止信号:
ENTRYPOINT指令的exec表单直接启动可执行文件,而不是作为/bin/sh的子级启动。这使它能够接收来自SIGTERMAPI和SIGKILL的信号。
为了允许变量展开,我们需要使用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文件中所示),可以在容器上使用CreateModel和CreateTransformJob请求。
您可能需要在您的Dockerfile中为容器中的每个必需环境变量包括ENV定义,并为这些定义提供ARG默认值
ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUEhttps://stackoverflow.com/questions/63740792
复制相似问题