我们正在使用使用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
并且可以直接访问。