如何在AzureML SDK管道训练步骤中结合HyperDrive超参数调优配置
核心实现逻辑
你之前找不到config=hyperdrive的放置位置,本质是混淆了独立运行Hyperdrive和在AzureML管道中嵌入Hyperdrive的场景:管道内跑超参调优不能用普通的PythonScriptStep,必须用专用的HyperDriveStep,Hyperdrive配置是作为这个步骤的入参传递的,不是随便塞给原有PythonScriptStep或者pipeline提交接口的。
分步改动指南
1. 替换原训练步骤的基础配置
把原来给独立Hyperdrive用的ScriptRunConfig适配管道流转逻辑,不要硬编码静态数据集输入,要对接上游预处理步骤的输出:
- 用你已经注册好环境的
run_config作为运行配置,不要混用之前独立测试用的sklearn_env - 把训练脚本的入参对齐原有管道的输入逻辑,接收上游
prep_step输出的预处理数据路径
# 构造适配管道的训练脚本运行配置 train_script_config = ScriptRunConfig( source_directory=experiment_folder, script='train_diabetes.py', arguments=[ # 对齐原有PythonScriptStep的输入逻辑,把预处理输出作为命名输入传给训练脚本 '--training-folder', prepped_data_folder.as_named_input('prepped_data') ], run_config=run_config # 复用你之前配好的计算目标、环境的运行配置 )
2. 保留原有Hyperdrive超参配置逻辑
你之前写的网格采样、指标定义、运行数限制这些逻辑完全不用改,只需要把run_config参数替换成上面适配管道的train_script_config就行:
from azureml.train.hyperdrive import GridParameterSampling, PrimaryMetricGoal, HyperDriveConfig from azureml.core.runconfig import RunConfiguration # 超参采样逻辑和独立运行时完全一致 params = GridParameterSampling( { '--learning_rate': choice(0.01, 0.1, 1.0), '--n_estimators' : choice(10, 100) } ) # 构造HyperDrive配置,和独立运行的参数保持一致 hyperdrive_config = HyperDriveConfig( run_config=train_script_config, hyperparameter_sampling=params, policy=None, primary_metric_name='AUC', primary_metric_goal=PrimaryMetricGoal.MAXIMIZE, max_total_runs=6, max_concurrent_runs=2 )
3. 替换原训练步骤为HyperDriveStep
这就是config=hyperdrive的核心放置位置:把原来的普通PythonScriptStep训练代码整段删掉,替换成HyperDriveStep,把上面构造好的hyperdrive_config传进去:
from azureml.pipeline.steps import HyperDriveStep # 删掉原来的普通PythonScriptStep训练步骤,替换成下面的HyperDriveStep train_step = HyperDriveStep( name="超参调优训练", hyperdrive_config=hyperdrive_config, # 这里就是你要找的Hyperdrive配置的挂载位置 inputs=[prepped_data_folder], # 声明步骤依赖上游预处理的输出,保证执行顺序 allow_reuse=True )
不需要改动的部分
- 上游
prep_step的代码完全保留,不用做任何修改 - 管道构造、提交的逻辑完全和原来一致:
pipeline_steps = [prep_step, train_step] pipeline = Pipeline(workspace=ws, steps=pipeline_steps) experiment = Experiment(workspace=ws, name = 'mslearn-diabetes-pipeline') pipeline_run = experiment.submit(pipeline, regenerate_outputs=True)
常见踩坑提醒
- 不要把
hyperdrive_config直接塞给原PythonScriptStep的runconfig参数,普通脚本步骤不识别Hyperdrive配置,提交会直接报类型错误 - 不要把
hyperdrive_config作为参数传给experiment.submit(),管道提交接口只接受Pipeline对象,超参调优是管道内部的一个执行步骤 - 要保证训练脚本
train_diabetes.py的逻辑和独立Hyperdrive运行时一致:能接收超参命令行参数、能在日志里打印AUC指标供Hyperdrive抓取 - 如果需要把超参调优得到的最佳模型传给管道后续的注册、部署步骤,可以在
HyperDriveStep里声明对应的输出路径,正常被后续步骤引用
内容的提问来源于stack exchange,提问作者Mohsen Sichani
相关产品推荐
相关产品推荐

