功能特性介绍
mxRec为用户提供了动态扩容、动态Shape、自动改图、特征准入与淘汰、Hot_Embedding和定制Warm Start等功能特性,用户可以在适配模型中加入想要使用的功能特性。
动态扩容
TensorFlow对Embedding的支持是通过变量实现的,用户需要预估每个表的大小,再通过接口创建变量。Embedding表的大小在一开始就确认,后期无法扩大或者减小,这可能会导致显存的浪费或者空间不足。在推荐场景下,多个稀疏表的大小无法预估,为更好的适配用户场景及需求,增加稀疏表动态扩容功能。片上内存支持动态扩容和非动态扩容方案,片上内存动态扩容即显存随着模型训练而增长;DDR/SSD仅支持动态扩容,即内存/磁盘随着模型训练增长,显存保持不变。
流程介绍请参见片上内存显存侧动态扩容模式。
动态Shape
mxRec训练框架支持动态Shape。动态Shape指的是TensorFlow的Shape依赖于具体的运算,算子输入是动态Shape、算子输出也是动态Shape。
流程介绍请参见动态Shape。
自动改图
mxRec支持创建特征类FeatureSpec模式和自动修改TensorFlow计算图两种特征训练方式。
推荐场景下客户希望零代码改动迁移至昇腾并应用mxRec框架,自动改图通过修改TensorFlow计算图的方式,使得客户训练脚本无需创建特征类(FeatureSpec),无需调用嵌入read emb key算子的函数即可开始模型训练。
流程介绍请参见自动改图。
自动改图目前只支持运行在tensorflow的默认图中,暂不支持用户模型新建tf.Graph来定义计算图。
特征准入与淘汰
当某些特征的频率过低时,对模型的训练效果不会有帮助,还会造成内存浪费以及过拟合的问题。因此需要特征准入功能来过滤掉频率过低的特征。特征准入与淘汰的使用分为在创建FeatureSpec模式和自动改图模式下两种情况。
对于一些对训练没有帮助的特征,我们需要将其淘汰以免影响训练效果,同时也能节约内存。在mxRec中我们支持特征淘汰功能,并提供了两种特征淘汰的触发方式,一是根据global step间隔触发淘汰,二是根据时间间隔触发淘汰。
流程介绍请参见特征准入与淘汰。
Hot_Embedding
- 将op_impl_mode.ini配置项传入到Session。代码如下:
import tensorflow as tf session_config = tf.compat.v1.ConfigProto(allow_soft_placement=False, log_device_placement=False) session_config.gpu_options.allow_growth = True custom_op = session_config.graph_options.rewrite_options.custom_optimizers.add() # 1. 将算子配置文件路径传入配置项 custom_op.parameter_map["op_precision_mode"].s = tf.compat.as_bytes("op_impl_mode.ini") # 2. 建图 # 3. 将config配置传入sess初始化中 with tf.compat.v1.Session(config=sess_config) as sess: # 4. 训练
- 在模型的路径下创建op_impl_mode.ini文件,内容如下:
GatherV2=high_performance
定制Warm Start
在Tensorflow Estimator模式下,原生的Warm Start选项支持在训练新模型时,从单个模型路径中完成部分或者全部模型参数的加载。该功能提供了更灵活的方式实现模型参数的恢复。Warm Start常用于迁移学习,即在一个任务上训练的模型被用于另一个任务,通过复用模型的某些层或参数来加速新任务的学习过程。
定制WarmStart功能描述如下:
- 兼容原生tf的Warm Start功能,支持指定稀疏表的Warm Start。
- 支持多路径的Warm Start。提供支持从多个模型路径中完成部分或者全部模型参数的加载,可支撑多模型迁移学习任务的训练。
定制warm start的使用示例如下:
示例1:模型从warm_start路径中加载稀疏表user_table。
import tensorflow as tf from tf_adapter import NPUEstimator warm_settings=tf.estimator.WarmStartSettings(ckpt_to_initialize_from="./warm_start",vars_to_warm_start ="user_table", var_name_to_prev_var_name=None) est = NPUEstimator( model_fn=get_model_fn(create_fs_params, cfg, access_and_evict), params=params, model_dir=params.model_dir, config=run_config, warm_start_from=warm_settings )
参数 |
参数类型 |
说明 |
---|---|---|
ckpt_to_initialize_from |
str(path) |
指定从哪个检查点开始初始化。 |
vars_to_warm_start |
str/正则表达式/list[str]/list[variables] |
指定从哪些变量开始初始化。 dense层变量的指定方式保持与tf原生一致;embedding参数支持:正则表达式、str(表名)和list(表名list)。 |
var_name_to_vacab_info |
dict |
指定词汇表信息,用于恢复嵌入矩阵。 |
var_name_to_prev_var_name |
dict |
用于存储变量名到warm start路径中变量名的映射关系。
说明:
embedding表名目前不支持名称映射。 |
示例2:模型从warm_start_1路径中加载所有参数,然后模型从warm_star_2t路径中加载embedding表user_table、item_table,替代已经加载了的warm_start1路径中的稀疏表结果。模型从warm_start_3路径中加载mlp_layer_w参数,替代warm_start_1的加载结果。
import tensorflow as tf from tf_adapter import NPUEstimator ckpt_to_initialize_from_list = ["./warm_start_1", "./warm_start_2", "./warm_start_3"] vars_to_warm_start_list=[".*", ["user_table", "item_table"], "mlp_layer_w" ] var_name_to_prev_var_name_list = [{}, {}, {}] warm_settings=tf.estimator.WarmStartSettings( ckpt_to_initialize_from=ckpt_to_initialize_from_list, vars_to_warm_start = vars_to_warm_start_list, var_name_to_prev_var_name=var_name_to_prev_var_name_list ) est = NPUEstimator( model_fn=get_model_fn(create_fs_params, config, access_and_evict), params=params, model_dir=params.model_dir, config=run_config warm_start_from=warm_settings )
参数 |
参数类型 |
说明 |
---|---|---|
ckpt_to_initialize_from |
List(str(path)) |
指定从哪个检查点开始初始化 |
vars_to_warm_start |
List(str/正则表达/list[str]/list[variables]) |
指定从哪些变量开始初始化。 dense层变量的指定方式保持与tf原生一致;embedding参数支持:正则表达式、str(表名)和list(表名list)。 |
var_name_to_vacab_info |
List(dict) |
指定词汇表信息,用于恢复嵌入矩阵。 |
var_name_to_prev_var_name |
List(dict) |
用于存储变量名到warm start路径中变量名的映射关系。 特别说明:embedding表名目前不支持名称映射。 |
增量模型保存与加载
此功能是为了支撑流式训练开发,推荐系统在服务的过程中,会不断产生可用于训练CTR模型的日志数据,流式训练是指数据不是一次性放入训练系统中,而是随着时间流式地加入到训练过程中去。每接收一部分数据,模型会对它进行预测,并利用该部分数据增量训练模型,同时按一定的频率(时间)保存全量或增量模型。
在这个背景下,将稀疏的参数仅保存增量模型,会极大的降低频繁保存模型带来的额外开销。同时,在训练进程结束后能尽量通过一个最近的全量的模型配合一系列的增量检查点(模型)恢复最近一次训练完成的模型参数,减少重复计算。
当前模型增量保存与加载仅支持片上内存模式和Estimator模式下的train和predict模式,不支持train_and_evaluate;仅支持扩容与非扩容场景。
当前模型增量保存与加载不支持同时开启特征准入与淘汰。
开启增量保存与加载只需要在init接口配置以下参数即可,例如:
- is_incremental_checkpoint=True 表示开启增量模型保存与加载
- save_checkpoint_due_time=4 表示每隔4秒保存一次全量模型
- save_delta_checkpoints_secs=2 表示每隔2秒保存一次增量模型
- restore_model_version=3 表示指定加载对应步数的模型,这里是去加载step=3的模型,如果不传这个参数就去加载最新的模型
使用示例如下:
from mx_rec.util.initialize import init # set init init(train_steps=args.train_steps, eval_steps=args.eval_steps, save_steps=args.save_checkpoints_steps, max_steps=args.max_steps, use_dynamic=use_dynamic, use_dynamic_expansion=use_dynamic_expansion, save_checkpoint_due_time=4, save_delta_checkpoints_secs=2, is_incremental_checkpoint=True, restore_model_version=3)