HPO启动配置包含exp.yml. trial.ini, search_space.json三个模块。
exp.yml是作为NNI的配置文件,将代码和搜索空间进行结合,并使用指定的环境来运行您的训练代码,具体参考此exp.yml文件。在这里,您还可以还提供其他信息,例如并发度、调优算法、最大Trial数量和最大持续时间等参数。https://nni.readthedocs.io/zh/stable/reference/experiment_config.html#experimentconfig
字段可以直接参考NNI官网,区别在于为了结合PAI,这些字段需保持不变
trialCommand: python3 -m hpo_tools.core.utils.run --config=./trial.ini
trainingService:
platform: local
assessor:
name: PAIAssessor
同时,为了能够停止PAI任务,需要使用PAIAssessor
支持将该组中的实验结果和同组中的所有历史进行比较,如果不满足比较标准(例如小于中位数),则停止该组超参数的运行。比如说设置最大运行次数max_trial_num, 实际使用量会显著小于max_trial_num,但具体数量就和实际跑的任务及随机到的超参有关系了。例如max_trial_num=50时,可能最终可能不到 25 次,并且差不多已经是完整探索了50组超参。
PAIAssessor | 描述 | 值 |
---|---|---|
optimize_mode | 最大化优化的方向 | maximize/minimize |
start_step | 从第几步开始进行早停判定 | 2 |
moving_avg | 早停判断时,采用所有历史的滑动平均值作为判断标准 | True |
proportion | 本次超参搜索的最优值和历史记录的proportion值比较 | 0.5 |
patience | metric指标连续下降几次,就停止 | 10 |
experimentWorkingDirectory: ../expdir
searchSpaceFile: search_space.json
trialCommand: python3 -m hpo_tools.core.utils.run --config=./trial.ini
trialConcurrency: 1
maxTrialNumber: 4
tuner:
name: TPE
classArgs:
optimize_mode: maximize
debug: true
logLevel: debug
trainingService:
platform: local
assessor:
name: PAIAssessor
classArgs:
platform: MAXCOMPUTE
optimize_mode: maximize
start_step: 1
moving_avg: true
proportion: 0.5
程序会将trial.ini 中以下这些key默认替换成对应的值。参数默认支持值替换、列表替换、字典替换、json替换、文件替换(params_config)、支持嵌套字典的key替换(组合参数例子dlc_mnist_nested_search_space)
-
cmd = cmd.replace('${exp_id}', experment_id.lower())
-
cmd = cmd.replace('${trial_id}', trial_id.lower())
-
cmd = cmd.replace('${NNI_OUTPUT_DIR}',os.environ.get('NNI_OUTPUT_DIR', './tmp'))
-
cmd = cmd.replace('${tuner_params_list}', tuner_params_list)
-
cmd = cmd.replace('${tuner_params_dict}', tuner_params_dict)
-
cmd = cmd.replace('${tuner_params_json}', json.dumps(tuner_params))
-
cmd = cmd.replace('${params}', params)->支持参数标识路径,例如lr0.001_batchsize64 注意其中可能含有浮点数,请确定是否支持用来标识数据/数据表
-
cmd = cmd.replace(p, str(v)) 将搜索的参数替换为搜索的值,搜索参数可以使用${batch_size}、${lr}来标记,需要和search_space.json中的key匹配使用
每个配置模块支持jinja模版渲染,用于用户在一开始设置变量,具体可以查看案例cross-validation/maxcompute-easyrec
[metric_config]
# metric type is summary/table
metric_type=summary
{% set date_list = [20220616,20220617] %}
{% for bizdate in date_list %}
metric_source_{{bizdate}}=oss://automl-nni/easyrec/finetune/{{bizdate}}_finetune_model_nni_622/${exp_id}_${trial_id}/eval_val/
{% endfor %}
配置模块 | 描述 | 是否可选 |
---|---|---|
platform_config | 用于标记任务执行的平台以及对应的执行命令 | 必选 |
metric_config | 用于标记任务metric的获取来源、metric的key以及对应权重、metric类型、最终metric的方式 | 必选 |
output_config | 如果使用服务版,可以配置output_config用来获取最优模型配置summary_path,用于配制tensorboard路径 | 可选 |
schedule_config | 如果任务在指定时间内调度任务,则需要配置schedule_config,修改对应的schedule_config的值 | 可选 |
params_config | 如果用户的参数是保存在文件中,则需要配置params_config, 用于标记需要修改参数的源文件路径和目标路径 | 可选 |
oss_config | 如果任务需要使用OSS存储,则需要配置OSS config | 可选 |
odps_config | 如果任务需要使用maxcompute平台执行任务,则需要配置odps config | 可选 |
ts_config | 如果任务需要使用trainingservice平台执行任务,则需要配置ts config | 可选 |
paiflow_config | 如果任务需要执行工作流任务,则需要配置paiflow_config,修改对应的paiflow_config的值 | 可选 |
dlc_config | 如果任务需要执行dlc任务,则需要配置dlc_config,修改对应的dlc_config的值 | 可选 |
monitor_config | 支持失败告警,最优metric更新时提醒 | 可选 |
platform_config | 描述 | 值 |
---|---|---|
name | 用于标记任务执行的平台 | DLC/MaxCompute/DataScience/LOCAL/PAI/PAIFLOW |
cmdxx | 用于标记执行的命令,以cmd开头 | dlc submit pytorch --name=test_nni_${exp_id}_${trial_id} xxx |
resume | 1表示开启续跑模式;用于用户一次运行时,比如说第一行任务成功,第二行由于资源不足失败,可以开启续跑,从第二行命令开始运行 | 0/1 |
metric_config | 描述 | 值 |
---|---|---|
metric_type | metric类型 | summary/table/api/json/stdout |
metric_source | metric来源(可以为多个以metric_source开头的,具体可以看maxcompute_crossvalidation案例) | 对应为具体的路径或者job |
final_mode | 如果任务运行过程中,存在很多中间metric,那么需要确定最终metric的计算方式 | final/best/avg |
source_list_final_mode | 可选,默认值为final_mode,可选值为final/best/avg,用于有多个metric_source时最终metric如何计算,具体可以看maxcompute_crossvalidation案例 | final/best/avg |
metric_dict | 对应查询的key以及对应的权重;可以为负值 | metric_dict={'auc_is_like':0.25, 'auc_is_valid_play':0.5, 'auc_is_comment':0.25, 'loss_play_time':-0.25} metric=val(’auc_is_valid_play’)*0.5+val(’auc_is_like’)*0.25+val(’auc_is_comment’)*0.25-val(’loss_play_time’)*0.25 |
- 如果metric_type=stdout类型,则metric_dict对应的key为正则表达式,value为对应的权重
[metric_config]
# metric type is summary/table
metric_type=stdout
metric_source=oss://test-nni/examples/search/pai/stdout/stdout_${exp_id}_${trial_id}
# best or final,default=best
final_mode=best
metric_dict={'validation: accuracy=([0-9\\.]+)':1}
- 如果metric_type=stdout类型,则metric_source支持指定默认任务的日志为来源
- stdoutmetric:支持指定具体的任务;例如metric_source=cmd1,即使用cmd1输出的任务日志做正则
- stdoutmetric:支持指定具体的任务,并过滤文件,例如metric_source=cmd,worker;即使用cmd1任务中所有的worker日志做正则
[metric_config]
# metric type is summary/table
metric_type=stdout
# default is cmd, cmd->platform job 1,we will get the job1 all default stdout
# if the job is distributed, you can use [cmd,worker] to assign which log has metric or just use [cmd] to choose all stdout
metric_source=cmd,worker
# best or final,default=best
final_mode=best
metric_dict={'validation: accuracy=([0-9\\.]+)':1}
optimize_mode=maximize
- 如果metric_type=summary类型,则metric_source为对应的summary路径
[metric_config]
# metric type is summary/table
metric_type=summary
# the easyrec model_dir/eval_val/ have the events summary file
metric_source=hdfs://123.57.44.211:9000/user/nni/datascience_easyrec/model_nni/${exp_id}_${trial_id}/eval_val/
- 如果metric_type=table类型,则metric_source为对应的sql语句
[metric_config]
# metric type is summary/table
metric_type=table
metric_source=select * from ps_smart_classification_metrics where pt='${exp_id}_${trial_id}';
- 如果metric_type=api类型,则metric支持指定具体的任务;例如metric_source=cmd1
[metric_config]
# metric type is summary/table/api
metric_type=api
# default is cmd1,cmd1->platform job 1, we will get the default job1 metric
# if is list,metric_source_1=cm1,metric_source_2=cmd2
metric_source=cmd1
output_config | 描述 | 值 |
---|---|---|
model_path | 如果使用服务版,可以配置model_path用来获取最优模型 | 路径 |
summary_path | 如果使用单机版,可以配置summary用于本地查看TensorBoard | 路径 |
schedule_config | 描述 | 值 |
---|---|---|
day | 支持在指定时间范围内调度AutoML任务 | everyday/weekend |
start_time | 指定调度开始时间 | 00:00-23:59 |
end_time | 指定调度结束时间 | 00:00-23:59 |
如果用户的参数是保存在文件中,则需要配置params_config,
params_config | 描述 | 值 |
---|---|---|
params_src_dst_filepath1xx | 用于标记需要修改参数的源文件路径和目标路径,可以为多个,以params_src_dst_filepath开头 | src_path,dst_path |
params_src_dst_filepath2xx | xx | xx |
oss_config | 描述 | 值 |
---|---|---|
endpoint | endpoint | http://oss-cn-shanghai.aliyuncs.com |
accessKeyID | ak | ak |
accessKeySecret | sk | sk |
role_arn | role_arn | acs:ram::xxx:role/aliyunserviceroleforpaiautoml |
odps_config | 描述 | 值 |
---|---|---|
access_id | ak | ak |
access_key | sk | ak |
project_name | project_name | xxx |
end_point | end_point | 弹外: http://service.odps.aliyun.com/api 弹内:http://service-corp.odps.aliyun-inc.com/api |
log_view_host | logview host | 弹外:http://logview.odps.aliyun.com 弹内:http://logview.alibaba-inc.com |
role_arn | role_arn | acs:ram::xxx:role/aliyunserviceroleforpaiautoml |
dlc_config | 描述 | 值 |
---|---|---|
access_id | ak | ak |
access_key | sk | ak |
end_point | end_point | 弹外:pai-dlc.cn-shanghai.aliyuncs.com 弹内:pai-dlc-share.aliyuncs.com |
region | cn-shanghai | cn-shanghai |
protocol | protocol | http/https |
ts_config | 描述 | 值 |
---|---|---|
access_key_id | ak | ak |
access_key_secret | sk | ak |
region_id | reigin | xxx |
endpoint | end_point | pai.cn-hangzhou.aliyuncs.com |
paiflow_config | 描述 | 值 |
---|---|---|
access_key_id | ak | ak |
access_key_secret | sk | ak |
region_id | reigin | xxx |
workspace_id | workspace_id | 2332411 |
- 参考阿里钉机器人去添加自定义机器人,获取url
- 点击阿里钉头像->机器人管理-自定义机器人->群组选择工作通知
- 点击阿里钉头像->机器人管理-自定义机器人->群组:选择对应的群号
monitor_config | 描述 | 值 |
---|---|---|
url | url为创建自定义机器人对应的Webhook地址 | https://oapi.dingtalk.com/robot/send?access_token=xxx |
keyword | 添加自定义机器人:自定义关键词 | monitor |
at_mobiles | 在content里添加@人的手机号,且只有在群内的成员才可被@,非群内成员手机号会被脱敏 | ['11xx'] |
at_user_ids | 被@人的用户userid。即工号 | [] |
is_at_all | 是否@所有人 | True/False |
search_space | 描述 | 值 |
---|---|---|
key | trial.ini中配置的搜索参数变量 | |
type | nni中定义的搜索类型,相关配置参考NNI searchSpace参考手册 |
- {”_type”: “choice”, “_value”: options}:从options中选取一个。
- {”_type”: “randint”, “_value”: [lower, upper]}:[low,upper)之间选择一个随机整数。
- {”_type”: “uniform”, “_value”: [low, high]}:[low,upper]之间随机采样。 | | value | value是根据业务、经验设置相关搜索值 | |
{
"${batch_size}": {"_type":"choice", "_value": [16, 32, 64, 128]},
"${lr}":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]}
}