适配模型

用户需要适配所使用的模型,可以在适配模型过程中加入Rec SDK提供的功能特性。本章节旨在介绍模型适配过程中的一些关键步骤,以及怎样在适配模型过程中加入想要使用的功能特性。

功能特性可以叠加使用,用户需在对应的关键步骤中修改适配。如需查看单个功能特性的调用流程,请参考训练功能特性流程

特征淘汰功能和片上内存显存侧动态扩容模式不能同时开启。

关键步骤操作参考如下。

  1. 初始化框架。

    调用init接口初始化Rec SDK模型训练框架。

    如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。

    表1 功能特性

    特性名称

    操作步骤

    动态扩容

    设置参数use_dynamic_expansion = True表示启用片上内存显存侧动态扩容功能,该参数默认为“False”。DDR和SSD模式仅支持内存/磁盘侧的动态扩容。

    动态Shape

    配置init接口的“use_dynamic”参数为“True”

    启用动态Shape功能前,需要安装Kernels算子包,具体操作请参见《CANN 软件安装指南》的“安装CANN(物理机场景)”章节的“安装Kernels”部分。

    自动改图

    -

    特征准入与淘汰

    -

  2. 选择定义特征自动改图
    • 定义特征列表和模型。

      使用FeatureSpec定义特征列表并配置相应的模型。

      如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。
      表2 功能特性

      特性名称

      操作步骤

      动态扩容

      -

      动态Shape

      -

      特征准入与淘汰

      1. 开启准入功能需要设置准入阈值“access_threshold”大于或等于0(单位:次),设置阈值小于“-1”时将会报参数错误。
      2. 开启淘汰功能需要依次执行以下步骤:
        1. 设置淘汰阈值“eviction_threshold”大于或等于0(单位:秒),设置阈值小于“-1”时将会报参数错误。
        2. 设置“index_key”索引键为“timestamp”的FeatureSpec并携带参数is_timestamp=True,代表数据集含有时间戳。
        3. 使用EvictHook接口为淘汰的触发方式设置“hook”,接口参数有三个,evict_enable=Trueevict_time_interval=24 * 60 * 60evict_step_interval=10000,分别代表淘汰功能开关、淘汰触发的时间间隔(单位:秒)、global step间隔。“evict_time_interval”“evict_step_interval”参数可选其一。
      3. 特征淘汰功能hook仅在训练模式下使用。
    • 自动改图

      在NPUEstimator模式下,需要在NPUEstimator的多个模式(train、predict、train_and_evaluate)中添加自动改图的GraphModifierHook,如当前为训练(train),则在训练的钩子(Hook)中添加GraphModifierHook,即可完成自动改图模式的训练。

      如果想要加入功能特性,可选择所需功能特性并进行以下相应的修改。

      表3 功能特性

      特性名称

      操作步骤

      动态扩容

      -

      动态Shape

      -

      特征准入与淘汰

      在使用sparse_lookup接口时,设置“access_and_evict_config”参数,参数类型dict,该dict由两个key-value对组成,key分别为“access_threshold”“eviction_threshold”value为对应的阈值。

  3. 定义数据集。选择自动改图模式时无需定义数据集,请跳过本步骤。

    使用FeatureSpec定义特征列表时,根据特征列表创建数据集并对数据集进行预处理,调用get_asc_insert_func接口得到Rec SDK的数据预处理接口并在数据集上应用该接口。

  4. 定义优化器。

    选择mx_rec.optimizers下的优化器并通过调用优化器对应的接口得到稀疏网络层的优化器对象,当前可选优化器请参见优化器。密集网络层的优化接口可使用TensorFlow内置的优化器。

    如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。

    表4 功能特性

    特性名称

    操作步骤

    动态扩容

    片上内存显存侧动态扩容调用mx_rec.optimizers包中对应优化器的create_hash_optimizer_by_address接口来创建稀疏表sparse_optimizer。具体可用优化器参考如下。

    动态Shape

    -

    自动改图

    -

    特征准入与淘汰

    -

  5. 建立稀疏表。

    通过调用create_table接口创建稀疏网络层,每个稀疏特征都可以创建一个稀疏网络层。

    在Estimator模式下,create_table接口必须在传入Estimator的model_fn里面调用,Estimator源码会在调用model_fn时创建新的图实例,这个和入口函数main所在的默认图不是同一张图。

  6. 传入稀疏网络层和特征列表创建模型计算图,在计算图中使用sparse_lookup进行特征查询和误差计算。

    表5 功能特性

    特性名称

    操作步骤

    动态扩容

    -

    动态shape

    -

    自动改图

    查询稀疏特征表。调用sparse_lookup接口,设置参数modify_graph = True表示在查表时采用自动改图模式,该参数默认为“False”

    特征准入与淘汰

    -

  7. 定义梯度计算和优化过程。

    调用get_dense_and_sparse_variable得到密集网络层和稀疏网络层的参数,通过优化器计算梯度并执行优化。

    如果想要加入功能特性,可在本步骤选择所需功能特性并进行以下相应的修改。

    表6 功能特性

    特性名称

    操作步骤

    动态扩容

    片上内存显存侧动态扩容:

    1. 获取嵌入表示结果(emb)和映射地址(addr)。
      • 使用tf.get_collection("ASCEND_SPARSE_LOOKUP_LOCAL_EMB")接口获取训练用的嵌入表示结果
      • 使用tf.get_collection("ASCEND_SPARSE_LOOKUP_ID_OFFSET")接口获取训练用的映射地址。
    2. 反向梯度计算。使用tf.gradients(loss, emb)接口对上一步骤获取的嵌入表示结果求导,得到梯度(grad)。
    3. 反向稀疏表更新。

      使用sparse优化器,导入创建的sparse_optimizer.apply_gradients([grad, addr])接口对映射地址对应位置的稀疏表进行更新。

    动态Shape

    -

    自动改图

    -

    特征准入与淘汰

    -

  8. 启动数据加载和预处理。选择自动改图模式时已完成,请跳过本步骤。

    使用FeatureSpec定义特征列表时,调用start_asc_pipeline启动数据流水线。