当某些特征的频率过低时,对模型的训练效果不会有帮助,还会造成内存浪费以及过拟合的问题。因此需要特征准入功能来过滤掉频率过低的特征。
对于一些对训练没有帮助的特征,需要将其淘汰以免影响训练效果,同时节约内存。Rec SDK支持特征淘汰功能,并提供了两种特征淘汰的触发方式,一是根据global step触发淘汰,二是根据时间间隔触发淘汰。
开启淘汰功能后,不支持片上内存显存侧动态扩容。
本节介绍如何使用特征准入与淘汰进行训练,涉及FeatureSpec模式与自动改图模式。
仅需要在使用sparse_lookup接口时,设置“access_and_evict_config”参数,参数类型dict,该dict由两个key-value对组成,key分别为“access_threshold”和“eviction_threshold”,value为对应的阈值。
如果set_threshold的第一个入参值为“0”,表示修改对应的emb表为特征不累加模式(准入阈值不变,但是特征计数不再累加,使用历史值)。
1 2 3 4 5 6 7 8 9 |
feature_spec_list = [FeatureSpec("user_ids", feat_count=cfg.user_feat_cnt, table_name="user_table", access_threshold=access_threshold, eviction_threshold=eviction_threshold, faae_coefficient=1), FeatureSpec("item_ids", feat_count=cfg.item_feat_cnt, table_name="item_table", access_threshold=access_threshold, eviction_threshold=eviction_threshold, faae_coefficient=4), FeatureSpec("timestamp", is_timestamp=True)] |
hook_evict = EvictHook(evict_enable=True, evict_time_interval=24*60*60, evict_step_interval=10000)
config_for_user_table = dict(access_threshold=cfg.access_threshold, eviction_threshold=cfg.eviction_threshold, faae_coefficient=1)
embedding = sparse_lookup(hash_table, feature, send_count, dim=None, is_train=is_train, access_and_evict_config=config_for_user_table , name=hash_table.table_name + "_lookup", modify_graph=modify_graph) hook_evict = EvictHook(evict_enable=True, evict_time_interval=24*60*60, evict_step_interval=10000)
1 2 3 4 5 6 7 |
from mx_rec.util.ops import import_host_pipeline_ops thres_tensor = tf.constant(60, dtype=tf.int32) set_threshold_op = import_host_pipeline_ops().set_threshold(thres_tensor, emb_name=self.table_list[0].table_name, ids_name=self.table_list[0].table_name + "_lookup") with tf.Session() as sess: sess.run(set_threshold_op) |