在 aws SageMaker 容器中设置 env 变量(自带容器)



我们正在使用使用ecs容器的aws sagemaker,有没有办法,当使用低级Python SDK调用sagemaker api时,我们可以在容器中设置环境变量(例如阶段或产品(

即使直接调用 API(比使用 python SDK 的级别低(,也不能直接在容器内设置环境任意变量。 但是,您可以将任意超参数作为训练作业的配置传入,例如传入超参数,如{"mystage": "prod"}. 超参数显示在容器中名为/opt/ml/input/config/hyperparameters.json的文件中,该文件是作为 JSON 对象的简单键值映射。 您可以使用它在启动脚本中设置环境变量,如下所示:

#!/bin/bash
export STAGE=$(jq -r ".mystage" /opt/ml/input/config/hyperparameters.json)
# Now run your code...

您可以让 SageMaker 调用此脚本,方法是使其成为Dockerfile中的ENTRYPOINT,或者调用它train并确保它位于 shell 的PATH(如果您未设置ENTRYPOINT(。

您可以为 ECS 任务配置环境变量,这是区分开发/生产模式的常见变量。

环境 - 要传递给容器的环境变量。这 参数映射到 Docker 的创建容器部分中的环境 远程 API 和 --env 选项以运行 docker。

我的答案与Sagemaker无关,因为我认为这个问题仅涉及ECS。

如果您使用的是低级 Boto SageMaker 客户端,则使用create_model方法为模型设置环境变量可能很有用。此方法允许您将环境变量定义为 PrimaryContainer 的一部分,该变量将与容器实例中的模型工件一起提供。

源:

  • https://boto3.readthedocs.io/en/latest/reference/services/sagemaker.html#SageMaker.Client.create_model

高级 sagemaker Python 包中,也可以设置环境变量,例如通过Estimator.deploy()Estimator.create_model()方法(因为额外的参数将传递给Model(。

来源:

  • http://sagemaker.readthedocs.io/en/latest/estimators.html#sagemaker.estimator.Estimator.deploy
  • http://sagemaker.readthedocs.io/en/latest/estimators.html#sagemaker.estimator.Estimator.create_model
  • http://sagemaker.readthedocs.io/en/latest/model.html

注意:这种方法似乎仅在推理时有效,而不是在训练作业期间有效。

@leopd答案的一个扩展是解析 Sagemaker 设置的 EnvVarSM_TRAINING_ENV并直接从您的 Python 代码中使用它(train.py(:

import json
import os
if __name__ == '__main__':
envs = dict(os.environ)
sm_training_env = envs.get('SM_TRAINING_ENV')
sm_training_env = json.loads(sm_training_env)
hyperparameters = sm_training_env.get('hyperparameters')
#do_train(hyperparameters)

另外,刚刚意识到传递给估算器的超参数被设置为SM_HP_NAMEOFPARAMETER并且可以直接访问。

最新更新