将SageMaker与Hydra一起使用



我有一个关于SageMaker和Hydra的问题。

TL;DR是否有方法将参数从SageMaker估计器传递到Hydra脚本?目前,它以非常严格的方式传递参数。

完整问题我使用Hydra将配置传递给我的训练脚本。我有很多配置,它对我来说很好。例如,如果我想使用特定的优化器,我会:

python train.py optimizer=adam

这是我的训练脚本,例如:

@hydra.main(version_base=None, config_path="configs/", config_name="config")
def train(config: DictConfig):
logging.info(f"Instantiating dataset <{config.dataset._target_}>")
train_ds, val_ds = hydra.utils.call(config.dataset)
logging.info(f"Instantiating model <{config.model._target_}>")
model = hydra.utils.call(config.model)
logging.info(f"Instantiating optimizer <{config.optimizer._target_}>")
optimizer = hydra.utils.instantiate(config.optimizer)
logging.info(f"Instantiating loss <{config.loss._target_}>")
loss = hydra.utils.instantiate(config.loss)
callbacks = []
if "callbacks" in config:
for _, cb_conf in config.callbacks.items():
if "_target_" in cb_conf:
logging.info(f"Instantiating callback <{cb_conf._target_}>")
callbacks.append(hydra.utils.instantiate(cb_conf))
metrics = []
if "metrics" in config:
for _, metric_conf in config.metrics.items():
if "_target_" in metric_conf:
logging.info(f"Instantiating metric <{metric_conf._target_}>")
metrics.append(hydra.utils.instantiate(metric_conf))
model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
model.fit(
train_ds,
validation_data=val_ds,
epochs=config.epochs,
callbacks=callbacks,
)

if __name__ == "__main__":
train()

我有一个相关的optimizer/adam.yaml文件。

现在,我开始使用SageMaker在云中运行我的实验,我注意到了一个问题。它不支持hydra语法(+optimizer=sgd(之类的东西。

有没有一种方法可以让它很好地使用Hydra语法?如果没有,你有没有建议重构我的训练代码,以便它能很好地与Hydra/OmegaConf配合使用?

我在SageMaker问题页面上看到了一个类似的问题,但没有任何回复:https://github.com/aws/sagemaker-python-sdk/issues/1837

您可以考虑将参数作为ENV传递,并将其纳入您的训练脚本中?

您可以传递一个包含ENV的dict:https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html#estimators

您可以考虑使用Hydra的Compose API。通过这种方式,您可以在Hydra获取传递给python程序的命令行参数之前对其进行预处理。

相关内容

  • 没有找到相关文章

最新更新