finetune训练(可选)

由于推荐业务每天都有实时更新的数据,如果用户采用先训练一批历史数据,后面每天finetune更新模型的话,可以利用以上begin调优的最优结果,再在新数据上微调。如果用户每次更新模型都是重新开始训练的话,则不需要此步骤。

调优经验

例如:用户有40天历史数据,可以先利用以上步骤调优30天数据,然后根据搜索出的最优参数,再finetuen剩余10天。 经验是:根据begin训练得出的最优参数,将learning_rate设置为begin结束时的learning_rate。 例如: begin训练时learning_rate如下,begin训练总计为8000步,因此可以设置finetune时initial_learning_rate=1e-6或者1e-7:

learning_rate {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.001
          decay_steps: 1000
          decay_factor: 0.1
          min_learning_rate: 1e-07
        }
      }

支持手动修改,也支持代码修改配置,修改效果如下: image.png

使用代码修改配置(可选)

支持本地上pipeline文件修改

python modify_pipeline_config.py --pipeline_config_path=./samples/pipeline.config --save_path=./samples/pipeline_finetune.config --learning_rate=1e-6

也支持oss上pipeline文件直接修改

python modify_pipeline_config.py  --pipeline_config_path=oss://easyrec/pipeline889.config --save_path=oss://easyrec/pipeline889-f.config --learning_rate=1e-6 --oss_config=../config/.ossutilconfig

如果用户想要看是否有更优参数,可以看下级目录启动调优。

启动调优(可选)

nnictl create --config config_finetune.yml --port=8617

config_finetune.ini

[platform_config]
name=MaxCompute
{% set date_list = [20220616,20220617] %}
{% set date_begin = 20220616 %}
{% for bizdate in date_list %}
{% set eval_ymd = bizdate +1 %}
{% set predate = bizdate -1 %}
{% if bizdate == date_begin %}
cmd1_{{bizdate}}=PAI -name=easy_rec_ext
    -project=algo_public
    -Dscript='oss://automl-nni/easyrec/easy_rec_ext_615_res.tar.gz'
    -Dtrain_tables='odps://pai_rec_dev/tables/rec_sv_rebuild_acc_rnk_rank_sample_embedding_modify/dt={{bizdate}}'
    -Deval_tables='odps://pai_rec_dev/tables/rec_sv_rebuild_acc_rnk_rank_sample_embedding_modify/dt={{eval_ymd}}'
    -Dcmd=train
    -Deval_method=separate
    -Dfine_tune_checkpoint="oss://automl-nni/easyrec/finetune/{{predate}}_finetune_model_nni_622"
    -Dconfig='oss://automl-nni/easyrec/config/easyrec_model_${exp_id}_${trial_id}.config'
    -Dmodel_dir='oss://automl-nni/easyrec/finetune/{{bizdate}}_finetune_model_nni_622/${exp_id}_${trial_id}'
    -Dselected_cols='is_valid_play,ln_play_time,is_like,is_comment,features,content_features'
    -Dbuckets='oss://automl-nni/'
    -Darn='xxx'
    -DossHost='oss-cn-beijing-internal.aliyuncs.com'
    -Dcluster={"ps":{"count":1,"cpu":1600,"memory":40000 },"worker":{"count":12,"cpu":1600,"memory":40000}}

{% else %}
cmd1_{{bizdate}}=PAI -name=easy_rec_ext
    -project=algo_public
    -Dscript='oss://automl-nni/easyrec/easy_rec_ext_615_res.tar.gz'
    -Dtrain_tables='odps://pai_rec_dev/tables/rec_sv_rebuild_acc_rnk_rank_sample_embedding_modify/dt={{bizdate}}'
    -Deval_tables='odps://pai_rec_dev/tables/rec_sv_rebuild_acc_rnk_rank_sample_embedding_modify/dt={{eval_ymd}}'
    -Dcmd=train
    -Deval_method=separate
    -Dfine_tune_checkpoint="oss://automl-nni/easyrec/finetune/{{predate}}_finetune_model_nni_622/${exp_id}_${trial_id}"
    -Dconfig='oss://automl-nni/easyrec/config/easyrec_model_${exp_id}_${trial_id}.config'
    -Dmodel_dir='oss://automl-nni/easyrec/finetune/{{bizdate}}_finetune_model_nni_622/${exp_id}_${trial_id}'
    -Dselected_cols='is_valid_play,ln_play_time,is_like,is_comment,features,content_features'
    -Dbuckets='oss://automl-nni/'
    -Darn='xxx'
    -DossHost='oss-cn-beijing-internal.aliyuncs.com'
    -Dcluster={"ps":{"count":1,"cpu":1600,"memory":40000 },"worker":{"count":12,"cpu":1600,"memory":40000}}
{% endif %}

{% endfor %}


[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 %}
# best/final/avg,default=best
final_mode=final
source_list_final_mode=avg
metric_dict={'auc_is_like':0.25, 'auc_is_valid_play':0.5, 'auc_is_comment':0.25}

与begin训练的差异点:

  • 每个配置模块支持jinja模版渲染

  • 配置finetune日期{% set date_list = [20220616,20220617] %}

  • 配置finetune开始日期{% set date_begin = 20220616 %},Dfine_tune_checkpoint开始日期和后续日期采取的model路径不一样

  • 假设每天finetune:

    • {bizdate} 必须保留,将会在代码中根据当天日期进行替换

    • {eval_ymd} 必须保留,将会在代码中根据第二天日期进行替换

    • {predate} 必须保留,将会在代码中根据前一天日期进行替换

  • metric_source也是多条路径,每一天训练结果为summary的最终结果,整组参数finetune的结果为这些天的平均值

配置超参搜索空间search_space.json

参考begin训练阶段中想要搜索的参数即可,注意由于是finetune训练,网络结构相关的参数不要进行搜索,经验是搜索LR