【问题标题】:Provide additional input to docker container running inference model为 docker 容器运行推理模型提供额外的输入
【发布时间】:2020-09-04 12:00:20
【问题描述】:

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

docker run image serve

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

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

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

【问题讨论】:

  • 为什么不将附加参数作为超参数传递?
  • 能否详细说明您的回复。
  • 在 docker 容器中,您的代码可以访问 SageMaker 创建的名为 hyperparameter.json (docs.aws.amazon.com/sagemaker/latest/dg/…) 的文件。这包含您在启动训练作业时提供给 SDK 的超参数值。因此,您可以使用该占位符来传递训练时所需的参数
  • 你需要使用 entrypoint ,如果我明白你在你的帖子中的确切意思
  • 所以,提供有关我们案例的更多信息。我们使用 Lambda 使用 CreateTransformJobRequest 创建批量转换作业。在那里我们指定模型进行推理。这样,我们有几个模型指向 ECR 上的几个不同图像,我们只在创建批量转换作业时提供模型名称。想法是有一个 sagemaker 模型,指向一个图像,它将包含容器中的所有推理模型。然后,以某种方式在运行时选择触发哪一个。最初的想法是检查我们是否可以传递额外的参数。 @OlivierCruchant 我会研究 hyperparameter.json。

标签: amazon-web-services docker amazon-sagemaker


【解决方案1】:

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

docker run image serve

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

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

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

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

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

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

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

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

请参阅thisstackoverflow 问题的已批准答案,以获得对该主题的详细解释。

但是,您可以做的一件事是在您的 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

【讨论】:

  • 最后我使用了传递给容器的环境变量,使用 CreateTransformJobRequest 和属性 Environment。在 R 脚本中,我使用以下行 env_var1
  • 我很高兴知道这个答案很有帮助。
  • @jccampanero 你知道在 docker run 命令中添加--privileged 标志的任何方法吗?
  • 嗨,奥斯汀。老实说没有,但恐怕你不能在 Sagemaker 中提升容器,原因有两个:首先,他们运行你的容器,你无法控制它,这就是这个特定问题的重点;更重要的是,它们提供了您的容器将在其中运行的托管环境:如果它们使您能够以特权模式运行容器,除非他们重新映射您的容器 root 用户-我认为他们不会这样做-您拥有完全控制权在容器运行的主机环境上运行它可能具有的安全隐患。
猜你喜欢
  • 2018-06-29
  • 2019-11-10
  • 2017-08-26
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多