适配模型
用户需要适配所使用的模型,可以在适配模型过程中加入Rec SDK提供的功能特性。本章节旨在介绍模型适配过程中的一些关键步骤,以及怎样在适配模型过程中加入想要使用的功能特性。
关键步骤操作参考如下。
- 初始化框架。
调用init接口初始化Rec SDK模型训练框架。
如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。
- 定义优化器。
选择mx_rec.optimizers下的优化器并通过调用优化器对应的接口得到稀疏网络层的优化器对象,当前可选优化器请参见优化器。密集网络层的优化接口可使用TensorFlow内置的优化器。
如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。
表2 功能特性 特性名称
操作步骤
动态扩容
片上内存显存侧动态扩容调用mx_rec.optimizers包中对应优化器的create_hash_optimizer_by_address接口来创建稀疏表sparse_optimizer。具体可用优化器参考如下。
动态shape
-
自动改图
-
特征准入与淘汰
-
- 选择定义特征或自动改图。
- 定义特征列表和模型
使用FeatureSpec定义特征列表并配置相应的模型。
如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。
表3 功能特性 特性名称
操作步骤
动态扩容
-
动态shape
-
特征准入与淘汰
在FeatureSpec模式下,请参考FeatureSpec进行配置。- 开启准入功能需要设置准入阈值“access_threshold”大于或等于0(单位:次),设置阈值小于“-1”时将会报参数错误。
- 开启淘汰功能需要依次执行以下步骤:
- 设置淘汰阈值“eviction_threshold”大于或等于0(单位:秒),设置阈值小于“-1”时将会报参数错误。
- 设置“index_key”索引键为“timestamp”的FeatureSpec并携带参数is_timestamp=True,代表数据集含有时间戳。
- 使用EvictHook接口为淘汰的触发方式设置“hook”,接口参数有三个,evict_enable=True,evict_time_interval=24 * 60 * 60,evict_step_interval=10000,分别代表淘汰功能开关、淘汰触发的时间间隔(单位:秒)、global step间隔。“evict_time_interval”与“evict_step_interval”参数可选其一。
- 特征淘汰功能hook仅在训练模式下使用。
- 自动改图
- 定义特征列表和模型
- 定义数据集。选择自动改图模式时无需定义数据集,请跳过本步骤。
使用FeatureSpec定义特征列表,根据特征列表创建数据集并对数据集进行预处理,调用get_asc_insert_func接口得到Rec SDK的数据预处理接口并在数据集上应用该接口。
- 建立稀疏表。
通过调用create_table接口创建稀疏网络层,每个稀疏特征都可以创建一个稀疏网络层。
- 建立模型计算图。
传入稀疏网络层和特征列表创建模型计算图,在计算图中使用sparse_lookup进行特征查询和误差计算。
如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。
表4 功能特性 特性名称
操作步骤
动态扩容
-
动态shape
-
自动改图
查询稀疏特征表时调用sparse_lookup接口,设置参数“modify_graph ”= “True”表示在查表时采用自动改图模式,该参数默认为“False”。
特征准入与淘汰
在自动改图模式下,需要在使用sparse_lookup接口时,设置“access_and_evict_config”参数,参数类型dict,该dict由两个key-value对组成,key分别为“access_threshold”和“eviction_threshold”,value为对应的阈值。
- 定义梯度计算和优化过程。
调用get_dense_and_sparse_variable得到密集网络层和稀疏网络层的参数,通过优化器计算梯度并执行优化。
如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。
表5 功能特性 特性名称
操作步骤
动态扩容
片上内存显存侧动态扩容:
- 获取嵌入表示结果(emb)和映射地址(addr)。
- 使用tf.get_collection("ASCEND_SPARSE_LOOKUP_LOCAL_EMB")接口获取训练用的嵌入表示结果
- 使用tf.get_collection("ASCEND_SPARSE_LOOKUP_ID_OFFSET")接口获取训练用的映射地址。
- 反向梯度计算。使用tf.gradients(loss, emb)接口对1获取的嵌入表示结果求导,得到梯度(grad)。
- 反向稀疏表更新。
使用sparse优化器,导入创建的sparse_optimizer.apply_gradients([grad, addr])接口对映射地址对应位置的稀疏表进行更新。
动态shape
-
自动改图
-
特征准入与淘汰
-
- 获取嵌入表示结果(emb)和映射地址(addr)。
- 启动数据加载和预处理。
- 定义特征类FeatureSpec模式
调用start_asc_pipeline启动数据流水线。
- 自动改图模式
调用modify_graph_and_start_emb_cache,同时sess.run(iterator.initializer)也需修改为自动改图的数据集初始化接口sess.run(get_initializer(True))或者sess.run(get_initializer(False)),前者用于训练(train)、后者用于评估(eval)。
- 定义特征类FeatureSpec模式