使用submit_child创建Estimator子运行失败的问题咨询
解决Estimator创建子运行时的TrainingException问题
嘿,我之前遇到过完全一样的问题!这个报错的原因很清楚:submit_child()并不是设计用来直接接收Estimator对象的,它的定位是启动脚本类型的子运行,只支持script_params、inputs和source_directory_data_store这三类参数。当你直接传入Estimator时,底层代码会尝试传递它的所有内部参数(包括_parent_run_id),而这个参数是submit_child()不允许手动覆盖的,所以就触发了异常。
下面给你两种可行的替代方案,根据你的场景选择:
方案一:手动关联父运行ID,用Estimator的submit方法 (推荐)
如果你需要保留Estimator的所有配置(比如自定义环境、计算目标、依赖包管理等),同时让它成为父运行的子运行,最直接的方式是在调用Estimator的submit()方法时,手动指定父运行ID:
# 启动父运行 run = experiment.start_logging() parent_run_id = run.id # 创建你的TensorFlow Estimator(PyTorch/普通Estimator用法完全一致) estimator = TensorFlow( source_directory='.', compute_target=cpu_cluster, entry_script='keras.py', pip_packages=["keras"], max_run_duration_seconds=1200, ) # 提交Estimator时指定父运行ID,自动关联为子运行 child_run = estimator.submit(experiment=experiment, parent_run_id=parent_run_id) # 可选:等待子运行完成并查看输出 child_run.wait_for_completion(show_output=True)
这种方式能完美保留Estimator的所有特性,同时父子运行的关联关系会在Azure ML的运行面板里正确显示,方便后续的实验追踪和结果管理。
方案二:用submit_child()的允许参数直接运行训练脚本
如果你的训练逻辑不需要Estimator的复杂配置(比如只是简单的单脚本运行,不需要自定义计算环境、分布式训练等),可以直接用submit_child()支持的参数来启动子运行:
run = experiment.start_logging() # 使用submit_child创建子运行,传入脚本运行所需的参数 child_run = run.submit_child( source_directory='.', # 你的训练代码所在目录 script_params={ # 这里可以传递脚本需要的自定义参数,比如依赖包、运行时长限制等 "--pip-packages": "keras", "--max-run-duration": "1200" } ) # 等待子运行完成 child_run.wait_for_completion(show_output=True)
需要注意的是,这种方式下你需要在keras.py脚本里自行处理传入的参数(比如手动安装依赖包、实现运行时长限制逻辑),因为不再依赖Estimator的自动配置能力。
最佳实践总结
- 如果你需要使用Estimator的高级特性(分布式训练、自定义Docker镜像、自动化依赖管理等),优先选择方案一,手动指定
parent_run_id是最稳妥且功能完整的方式。 - 如果你只是需要快速启动一个简单的脚本子运行,且不需要Estimator的复杂配置,可以用方案二,简化代码流程。
内容的提问来源于stack exchange,提问作者Keita Onabuta
相关产品推荐
相关产品推荐

