我有一个关于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程序的命令行参数之前对其进行预处理。