From f4948af82e4f1183a1b66ddf596308cb362f1b61 Mon Sep 17 00:00:00 2001 From: yangxudong Date: Tue, 24 Sep 2024 11:18:55 +0800 Subject: [PATCH] Add NaryDisEmbedding & Transformer Component (#485) * add transformer layer & NaryDisEmbedding --- docs/source/component/backbone.md | 57 -- docs/source/component/component.md | 174 ++++- docs/source/index.rst | 1 + easy_rec/python/compat/array_ops.py | 229 ++++++ .../python/feature_column/feature_column.py | 5 + easy_rec/python/layers/backbone.py | 83 +- easy_rec/python/layers/input_layer.py | 37 + easy_rec/python/layers/keras/__init__.py | 6 + easy_rec/python/layers/keras/activation.py | 19 + easy_rec/python/layers/keras/attention.py | 15 +- easy_rec/python/layers/keras/einsum_dense.py | 598 +++++++++++++++ easy_rec/python/layers/keras/embedding.py | 81 ++ easy_rec/python/layers/keras/mask_net.py | 5 +- .../layers/keras/multi_head_attention.py | 717 ++++++++++++++++++ .../layers/keras/numerical_embedding.py | 126 ++- easy_rec/python/layers/keras/transformer.py | 192 +++++ easy_rec/python/layers/utils.py | 17 +- easy_rec/python/loss/pairwise_loss.py | 25 +- easy_rec/python/model/multi_task_model.py | 18 +- easy_rec/python/ops/1.12/libcustom_ops.so | Bin 1378512 -> 1397296 bytes easy_rec/python/ops/1.12_pai/libcustom_ops.so | Bin 1378536 -> 1393224 bytes easy_rec/python/protos/backbone.proto | 18 +- easy_rec/python/protos/keras_layer.proto | 5 + easy_rec/python/protos/layer.proto | 9 + easy_rec/python/protos/seq_encoder.proto | 59 ++ easy_rec/python/protos/tower.proto | 8 + easy_rec/version.py | 2 +- .../dlrm_on_criteo_with_narydis.config | 586 ++++++++++++++ 28 files changed, 2955 insertions(+), 137 deletions(-) create mode 100644 easy_rec/python/compat/array_ops.py create mode 100644 easy_rec/python/layers/keras/einsum_dense.py create mode 100644 easy_rec/python/layers/keras/embedding.py create mode 100644 easy_rec/python/layers/keras/multi_head_attention.py create mode 100644 easy_rec/python/layers/keras/transformer.py create mode 100644 examples/configs/dlrm_on_criteo_with_narydis.config diff --git a/docs/source/component/backbone.md b/docs/source/component/backbone.md index d9edd2ef7..5e05ec589 100644 --- a/docs/source/component/backbone.md +++ b/docs/source/component/backbone.md @@ -1094,63 +1094,6 @@ MovieLens-1M数据集效果: - Cross Decoupling Network: [CDN](../models/cdn.md) - DLRM+SENet: [dlrm_senet_on_criteo.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/dlrm_senet_on_criteo.config) -# 组件库介绍 - -## 1.基础组件 - -| 类名 | 功能 | 说明 | 示例 | -| ----------------- | ------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| MLP | 多层感知机 | 可定制激活函数、initializer、Dropout、BN等 | [案例1](#wide-deep) | -| Highway | 类似残差链接 | 可用来对预训练embedding做增量微调 | [highway network](../models/highway.html) | -| Gate | 门控 | 多个输入的加权求和 | [Cross Decoupling Network](../models/cdn.html#id2) | -| PeriodicEmbedding | 周期激活函数 | 数值特征Embedding | [案例5](#dlrm-embedding) | -| AutoDisEmbedding | 自动离散化 | 数值特征Embedding | [dlrm_on_criteo_with_autodis.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/dlrm_on_criteo_with_autodis.config) | -| TextCNN | 文本卷积 | 提取文本序列的特征 | [text_cnn_on_movielens.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/text_cnn_on_movielens.config) | - -**备注**:Gate组件的第一个输入是权重向量,后面的输入拼凑成一个列表,权重向量的长度应等于列表的长度 - -## 2.特征交叉组件 - -| 类名 | 功能 | 说明 | 示例 | -| -------------- | --------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------- | -| FM | 二阶交叉 | DeepFM模型的组件 | [案例2](#deepfm) | -| DotInteraction | 二阶内积交叉 | DLRM模型的组件 | [案例4](#dlrm) | -| Cross | bit-wise交叉 | DCN v2模型的组件 | [案例3](#dcn) | -| BiLinear | 双线性 | FiBiNet模型的组件 | [fibinet_on_movielens.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/fibinet_on_movielens.config) | -| FiBiNet | SENet & BiLinear | FiBiNet模型 | [fibinet_on_movielens.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/fibinet_on_movielens.config) | -| Attention | Dot-product attention | Transformer模型的组件 | | - -## 3.特征重要度学习组件 - -| 类名 | 功能 | 说明 | 示例 | -| --------- | ----------------- | ------------ | ----------------------------------------------------- | -| SENet | 建模特征重要度 | FiBiNet模型的组件 | [MMoE](../models/mmoe.html#id4) | -| MaskBlock | 建模特征重要度 | MaskNet模型的组件 | [Cross Decoupling Network](../models/cdn.html#id2) | -| MaskNet | 多个串行或并行的MaskBlock | MaskNet模型 | [DBMTL](../models/dbmtl.html#dbmtl-based-on-backbone) | -| PPNet | 参数个性化网络 | PPNet模型 | [PPNet](../models/ppnet.html#id2) | - -## 4. 序列特征编码组件 - -| 类名 | 功能 | 说明 | 示例 | -| ---------- | ---------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| DIN | target attention | DIN模型的组件 | [DIN_backbone.config](https://github.com/alibaba/EasyRec/blob/master/samples/model_config/din_backbone_on_taobao.config) | -| BST | transformer | BST模型的组件 | [BST_backbone.config](https://github.com/alibaba/EasyRec/blob/master/samples/model_config/bst_backbone_on_taobao.config) | -| SeqAugment | 序列数据增强 | crop, mask, reorder | [CL4SRec](../models/cl4srec.html#id2) | - -## 5. 多目标学习组件 - -| 类名 | 功能 | 说明 | 示例 | -| ---- | --------------------------- | --------- | ------------ | -| MMoE | Multiple Mixture of Experts | MMoE模型的组件 | [案例8](#mmoe) | - -## 6. 辅助损失函数组件 - -| 类名 | 功能 | 说明 | 示例 | -| ------------- | ---------- | --------- | ----------- | -| AuxiliaryLoss | 用来计算辅助损失函数 | 常用在自监督学习中 | [案例7](#id7) | - -各组件的详细参数请查看"[组件详细参数](component.md)"。 - # 如何自定义组件 在 `easy_rec/python/layers/keras` 目录下新建一个`py`文件,也可直接添加到一个已有的文件中。我们建议目标类似的组件定义在同一个文件中,减少文件数量;比如特征交叉的组件都放在`interaction.py`里。 diff --git a/docs/source/component/component.md b/docs/source/component/component.md index 731e95759..fa50ecd32 100644 --- a/docs/source/component/component.md +++ b/docs/source/component/component.md @@ -1,3 +1,62 @@ +# 组件库介绍 + +## 1.基础组件 + +| 类名 | 功能 | 说明 | 示例 | +| ----------------- | ------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| MLP | 多层感知机 | 可定制激活函数、initializer、Dropout、BN等 | [案例1](backbone.md#wide-deep) | +| Highway | 类似残差链接 | 可用来对预训练embedding做增量微调 | [highway network](../models/highway.html) | +| Gate | 门控 | 多个输入的加权求和 | [Cross Decoupling Network](../models/cdn.html#id2) | +| PeriodicEmbedding | 周期激活函数 | 数值特征Embedding | [案例5](backbone.md#dlrm-embedding) | +| AutoDisEmbedding | 自动离散化 | 数值特征Embedding | [dlrm_on_criteo_with_autodis.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/dlrm_on_criteo_with_autodis.config) | +| TextCNN | 文本卷积 | 提取文本序列的特征 | [text_cnn_on_movielens.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/text_cnn_on_movielens.config) | + +**备注**:Gate组件的第一个输入是权重向量,后面的输入拼凑成一个列表,权重向量的长度应等于列表的长度 + +## 2.特征交叉组件 + +| 类名 | 功能 | 说明 | 示例 | +| -------------- | ---------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------- | +| FM | 二阶交叉 | DeepFM模型的组件 | [案例2](backbone.md#deepfm) | +| DotInteraction | 二阶内积交叉 | DLRM模型的组件 | [案例4](backbone.md#dlrm) | +| Cross | bit-wise交叉 | DCN v2模型的组件 | [案例3](backbone.md#dcn) | +| BiLinear | 双线性 | FiBiNet模型的组件 | [fibinet_on_movielens.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/fibinet_on_movielens.config) | +| FiBiNet | SENet & BiLinear | FiBiNet模型 | [fibinet_on_movielens.config](https://github.com/alibaba/EasyRec/tree/master/examples/configs/fibinet_on_movielens.config) | + +## 3.特征重要度学习组件 + +| 类名 | 功能 | 说明 | 示例 | +| --------- | ----------------- | ------------ | ----------------------------------------------------- | +| SENet | 建模特征重要度 | FiBiNet模型的组件 | [MMoE](../models/mmoe.html#id4) | +| MaskBlock | 建模特征重要度 | MaskNet模型的组件 | [Cross Decoupling Network](../models/cdn.html#id2) | +| MaskNet | 多个串行或并行的MaskBlock | MaskNet模型 | [DBMTL](../models/dbmtl.html#dbmtl-based-on-backbone) | +| PPNet | 参数个性化网络 | PPNet模型 | [PPNet](../models/ppnet.html#id2) | + +## 4. 序列特征编码组件 + +| 类名 | 功能 | 说明 | 示例 | +| ------------------ | --------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| DIN | target attention | DIN模型的组件 | [DIN_backbone.config](https://github.com/alibaba/EasyRec/blob/master/samples/model_config/din_backbone_on_taobao.config) | +| BST | transformer | BST模型的组件 | [BST_backbone.config](https://github.com/alibaba/EasyRec/blob/master/samples/model_config/bst_backbone_on_taobao.config) | +| SeqAugment | 序列数据增强 | crop, mask, reorder | [CL4SRec](../models/cl4srec.html#id2) | +| Attention | Dot-product attention | Transformer模型的组件 | | +| MultiHeadAttention | Multi-head attention | Transformer模型的组件 | | +| TransformerBlock | Transformer layer | Transformer模型的组件 | | +| TransformerEncoder | Transformer encoder | Transformer模型的组件 | | +| TextEncoder | BERT 模型 | 类似BERT模型 | | + +## 5. 多目标学习组件 + +| 类名 | 功能 | 说明 | 示例 | +| ---- | --------------------------- | --------- | ----------------------- | +| MMoE | Multiple Mixture of Experts | MMoE模型的组件 | [案例8](backbone.md#mmoe) | + +## 6. 辅助损失函数组件 + +| 类名 | 功能 | 说明 | 示例 | +| ------------- | ---------- | --------- | ---------------------- | +| AuxiliaryLoss | 用来计算辅助损失函数 | 常用在自监督学习中 | [案例7](backbone.md#id7) | + # 组件详细参数 ## 1.基础组件 @@ -79,33 +138,6 @@ | senet | SENet | | protobuf message | | mlp | MLP | | protobuf message | -- Attention - -Dot-product attention layer, a.k.a. Luong-style attention. - -The calculation follows the steps: - -1. Calculate attention scores using query and key with shape (batch_size, Tq, Tv). -1. Use scores to calculate a softmax distribution with shape (batch_size, Tq, Tv). -1. Use the softmax distribution to create a linear combination of value with shape (batch_size, Tq, dim). - -| 参数 | 类型 | 默认值 | 说明 | -| ----------------------- | ------ | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| use_scale | bool | False | If True, will create a scalar variable to scale the attention scores. | -| score_mode | string | dot | Function to use to compute attention scores, one of {"dot", "concat"}. "dot" refers to the dot product between the query and key vectors. "concat" refers to the hyperbolic tangent of the concatenation of the query and key vectors. | -| dropout | float | 0.0 | Float between 0 and 1. Fraction of the units to drop for the attention scores. | -| seed | int | None | A Python integer to use as random seed incase of dropout. | -| return_attention_scores | bool | False | if True, returns the attention scores (after masking and softmax) as an additional output argument. | -| use_causal_mask | bool | False | Set to True for decoder self-attention. Adds a mask such that position i cannot attend to positions j > i. This prevents the flow of information from the future towards the past. | - -- inputs: List of the following tensors: - - query: Query tensor of shape (batch_size, Tq, dim). - - value: Value tensor of shape (batch_size, Tv, dim). - - key: Optional key tensor of shape (batch_size, Tv, dim). If not given, will use value for both key and value, which is the most common case. -- output: - - Attention outputs of shape (batch_size, Tq, dim). - - (Optional) Attention scores after masking and softmax with shape (batch_size, Tq, Tv). - ## 3.特征重要度学习组件 - SENet @@ -156,7 +188,7 @@ The calculation follows the steps: ## 4. 序列特征编码组件 -- SeqAugment +- SeqAugment (序列数据增强) | 参数 | 类型 | 默认值 | 说明 | | ------------ | ----- | --- | --------------- | @@ -180,8 +212,8 @@ The calculation follows the steps: | num_hidden_layers | int | | transformer层数 | | num_attention_heads | int | | transformer head数 | | intermediate_size | int | | transformer中间层单元数 | -| hidden_act | string | gelu | 隐藏激活函数 | -| hidden_dropout_prob | float | 0.1 | 隐藏dropout rate | +| hidden_act | string | gelu | 隐藏层激活函数 | +| hidden_dropout_prob | float | 0.1 | 隐藏层dropout rate | | attention_probs_dropout_prob | float | 0.1 | attention层dropout rate | | max_position_embeddings | int | 512 | 序列最大长度 | | use_position_embeddings | bool | true | 是否使用位置编码 | @@ -190,6 +222,88 @@ The calculation follows the steps: | target_item_position | string | head | target item的插入位置,可选:head, tail, ignore | | reserve_target_position | bool | true | 是否为target item保留一个位置 | +- Attention + +Dot-product attention layer, a.k.a. Luong-style attention. + +The calculation follows the steps: + +1. Calculate attention scores using query and key with shape (batch_size, Tq, Tv). +1. Use scores to calculate a softmax distribution with shape (batch_size, Tq, Tv). +1. Use the softmax distribution to create a linear combination of value with shape (batch_size, Tq, dim). + +| 参数 | 类型 | 默认值 | 说明 | +| ----------------------- | ------ | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| use_scale | bool | False | If True, will create a scalar variable to scale the attention scores. | +| scale_by_dim | bool | Fasle | whether to scale by dimension | +| score_mode | string | dot | Function to use to compute attention scores, one of {"dot", "concat"}. "dot" refers to the dot product between the query and key vectors. "concat" refers to the hyperbolic tangent of the concatenation of the query and key vectors. | +| dropout | float | 0.0 | Float between 0 and 1. Fraction of the units to drop for the attention scores. | +| seed | int | None | A Python integer to use as random seed incase of dropout. | +| return_attention_scores | bool | False | if True, returns the attention scores (after masking and softmax) as an additional output argument. | +| use_causal_mask | bool | False | Set to True for decoder self-attention. Adds a mask such that position i cannot attend to positions j > i. This prevents the flow of information from the future towards the past. | + +> - inputs: List of the following tensors: +> \- query: Query tensor of shape (batch_size, Tq, dim). +> \- value: Value tensor of shape (batch_size, Tv, dim). +> \- key: Optional key tensor of shape (batch_size, Tv, dim). If not given, will use value for both key and value, which is the most common case. +> - output: +> \- Attention outputs of shape (batch_size, Tq, dim). +> \- (Optional) Attention scores after masking and softmax with shape (batch_size, Tq, Tv). + +- MultiHeadAttention + +| 参数 | 类型 | 默认值 | 说明 | +| ----------------------- | ------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| num_heads | uint32 | 无 | Number of attention heads. | +| key_dim | uint32 | | Size of each attention head for query and key. | +| value_dim | uint32 | | Size of each attention head for value. | +| dropout | float | 0.0 | Dropout probability. | +| use_bias | bool | true | whether the dense layers use bias vectors/matrices. | +| return_attention_scores | bool | false | whether the output should be (attention_output, attention_scores) | +| use_causal_mask | bool | false | whether to apply a causal mask to prevent tokens from attending to future tokens (e.g., used in a decoder Transformer). | +| output_shape | uint32 | | The expected shape of an output tensor, besides the batch and sequence dims. If not specified, projects back to the query feature dim (the query input's last dimension). | +| kernel_initializer | string | | Initializer for dense layer kernels. | +| bias_initializer | string | | Initializer for dense layer biases. | + +- TransformerBlock + +Transformer encoder 的其中一个layer。 + +| 参数 | 类型 | 默认值 | 说明 | +| ---------------------------- | ------ | ---- | ----------------------- | +| hidden_size | int | | transformer 编码层单元数 | +| num_attention_heads | int | | transformer head数 | +| intermediate_size | int | | transformer中间层单元数 | +| hidden_act | string | relu | 隐藏层激活函数 | +| hidden_dropout_prob | float | 0.1 | 隐藏层dropout rate | +| attention_probs_dropout_prob | float | 0.0 | attention层的dropout rate | + +- TransformerEncoder + +| 参数 | 类型 | 默认值 | 说明 | +| ---------------------------- | ------ | ---- | ----------------------- | +| vocab_size | uint32 | | 词汇表大小 | +| hidden_size | uint32 | | transformer 编码层单元数 | +| num_hidden_layers | uint32 | | transformer层数 | +| num_attention_heads | uint32 | | transformer head数 | +| intermediate_size | uint32 | | transformer中间层单元数 | +| hidden_act | string | relu | 隐藏层激活函数 | +| hidden_dropout_prob | float | 0.1 | 隐藏层dropout rate | +| attention_probs_dropout_prob | float | 0.0 | attention层的dropout rate | +| max_position_embeddings | uint32 | 512 | 序列最大长度 | +| output_all_token_embeddings | bool | true | 是否输出所有token embedding | + +- TextEncoder + +BERT模型结构 + +| 参数 | 类型 | 默认值 | 说明 | +| ---------------- | ------------------ | --- | ----------------------------- | +| transformer | TransformerEncoder | 无 | transformer 子组件的配置 | +| separator | string | ' ' | 文本分隔符 | +| vocab_file | string | 无 | 词汇表文件路径,不设置时使用hash获得token id | +| default_token_id | int32 | 0 | Out of vocabulary 的token的默认id | + ## 5. 多任务学习组件 - MMoE diff --git a/docs/source/index.rst b/docs/source/index.rst index 238952075..7eeebba67 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -31,6 +31,7 @@ Welcome to easy_rec's documentation! component/backbone component/component component/sequence + component/custom_op .. toctree:: :maxdepth: 3 diff --git a/easy_rec/python/compat/array_ops.py b/easy_rec/python/compat/array_ops.py new file mode 100644 index 000000000..d788bc8c1 --- /dev/null +++ b/easy_rec/python/compat/array_ops.py @@ -0,0 +1,229 @@ +import numpy as np +import tensorflow as tf +from tensorflow.python.framework import constant_op +from tensorflow.python.framework import ops +from tensorflow.python.framework import sparse_tensor +from tensorflow.python.ops import gen_math_ops + + +def convert_to_int_tensor(tensor, name, dtype=tf.int32): + """Converts the given value to an integer Tensor.""" + tensor = ops.convert_to_tensor(tensor, name=name, preferred_dtype=dtype) + if tensor.dtype.is_integer: + tensor = gen_math_ops.cast(tensor, dtype) + else: + raise TypeError('%s must be an integer tensor; dtype=%s' % + (name, tensor.dtype)) + return tensor + + +def _with_nonzero_rank(data): + """If `data` is scalar, then add a dimension; otherwise return as-is.""" + if data.shape.ndims is not None: + if data.shape.ndims == 0: + return tf.stack([data]) + else: + return data + else: + data_shape = tf.shape(data) + data_ndims = tf.rank(data) + return tf.reshape(data, tf.concat([[1], data_shape], axis=0)[-data_ndims:]) + + +def get_positive_axis(axis, ndims): + """Validate an `axis` parameter, and normalize it to be positive. + + If `ndims` is known (i.e., not `None`), then check that `axis` is in the + range `-ndims <= axis < ndims`, and return `axis` (if `axis >= 0`) or + `axis + ndims` (otherwise). + If `ndims` is not known, and `axis` is positive, then return it as-is. + If `ndims` is not known, and `axis` is negative, then report an error. + + Args: + axis: An integer constant + ndims: An integer constant, or `None` + + Returns: + The normalized `axis` value. + + Raises: + ValueError: If `axis` is out-of-bounds, or if `axis` is negative and + `ndims is None`. + """ + if not isinstance(axis, int): + raise TypeError('axis must be an int; got %s' % type(axis).__name__) + if ndims is not None: + if 0 <= axis < ndims: + return axis + elif -ndims <= axis < 0: + return axis + ndims + else: + raise ValueError('axis=%s out of bounds: expected %s<=axis<%s' % + (axis, -ndims, ndims)) + elif axis < 0: + raise ValueError('axis may only be negative if ndims is statically known.') + return axis + + +def tile_one_dimension(data, axis, multiple): + """Tiles a single dimension of a tensor.""" + # Assumes axis is a nonnegative int. + if data.shape.ndims is not None: + multiples = [1] * data.shape.ndims + multiples[axis] = multiple + else: + ones_value = tf.ones(tf.rank(data), tf.int32) + multiples = tf.concat( + [ones_value[:axis], [multiple], ones_value[axis + 1:]], axis=0) + return tf.tile(data, multiples) + + +def _all_dimensions(x): + """Returns a 1D-tensor listing all dimensions in x.""" + # Fast path: avoid creating Rank and Range ops if ndims is known. + if isinstance(x, ops.Tensor) and x.get_shape().ndims is not None: + return constant_op.constant(np.arange(x.get_shape().ndims), dtype=tf.int32) + if (isinstance(x, sparse_tensor.SparseTensor) and + x.dense_shape.get_shape().is_fully_defined()): + r = x.dense_shape.get_shape().dims[0].value # sparse.dense_shape is 1-D. + return constant_op.constant(np.arange(r), dtype=tf.int32) + + # Otherwise, we rely on `range` and `rank` to do the right thing at runtime. + return gen_math_ops._range(0, tf.rank(x), 1) + + +# This op is intended to exactly match the semantics of numpy.repeat, with +# one exception: numpy.repeat has special (and somewhat non-intuitive) behavior +# when axis is not specified. Rather than implement that special behavior, we +# simply make `axis` be a required argument. +# +# External (OSS) `tf.repeat` feature request: +# https://github.com/tensorflow/tensorflow/issues/8246 +def repeat_with_axis(data, repeats, axis, name=None): + """Repeats elements of `data`. + + Args: + data: An `N`-dimensional tensor. + repeats: A 1-D integer tensor specifying how many times each element in + `axis` should be repeated. `len(repeats)` must equal `data.shape[axis]`. + Supports broadcasting from a scalar value. + axis: `int`. The axis along which to repeat values. Must be less than + `max(N, 1)`. + name: A name for the operation. + + Returns: + A tensor with `max(N, 1)` dimensions. Has the same shape as `data`, + except that dimension `axis` has size `sum(repeats)`. + #### Examples: + ```python + >>> repeat(['a', 'b', 'c'], repeats=[3, 0, 2], axis=0) + ['a', 'a', 'a', 'c', 'c'] + >>> repeat([[1, 2], [3, 4]], repeats=[2, 3], axis=0) + [[1, 2], [1, 2], [3, 4], [3, 4], [3, 4]] + >>> repeat([[1, 2], [3, 4]], repeats=[2, 3], axis=1) + [[1, 1, 2, 2, 2], [3, 3, 4, 4, 4]] + ``` + """ + if not isinstance(axis, int): + raise TypeError('axis must be an int; got %s' % type(axis).__name__) + + with ops.name_scope(name, 'Repeat', [data, repeats]): + data = ops.convert_to_tensor(data, name='data') + repeats = convert_to_int_tensor(repeats, name='repeats') + repeats.shape.with_rank_at_most(1) + + # If `data` is a scalar, then upgrade it to a vector. + data = _with_nonzero_rank(data) + data_shape = tf.shape(data) + + # If `axis` is negative, then convert it to a positive value. + axis = get_positive_axis(axis, data.shape.ndims) + + # Check data Tensor shapes. + if repeats.shape.ndims == 1: + data.shape.dims[axis].assert_is_compatible_with(repeats.shape[0]) + + # If we know that `repeats` is a scalar, then we can just tile & reshape. + if repeats.shape.ndims == 0: + expanded = tf.expand_dims(data, axis + 1) + tiled = tile_one_dimension(expanded, axis + 1, repeats) + result_shape = tf.concat([data_shape[:axis], [-1], data_shape[axis + 1:]], + axis=0) + return tf.reshape(tiled, result_shape) + + # Broadcast the `repeats` tensor so rank(repeats) == axis + 1. + if repeats.shape.ndims != axis + 1: + repeats_shape = tf.shape(repeats) + repeats_ndims = tf.rank(repeats) + broadcast_shape = tf.concat( + [data_shape[:axis + 1 - repeats_ndims], repeats_shape], axis=0) + repeats = tf.broadcast_to(repeats, broadcast_shape) + repeats.set_shape([None] * (axis + 1)) + + # Create a "sequence mask" based on `repeats`, where slices across `axis` + # contain one `True` value for each repetition. E.g., if + # `repeats = [3, 1, 2]`, then `mask = [[1, 1, 1], [1, 0, 0], [1, 1, 0]]`. + max_repeat = gen_math_ops.maximum( + 0, gen_math_ops._max(repeats, _all_dimensions(repeats))) + mask = tf.sequence_mask(repeats, max_repeat) + + # Add a new dimension around each value that needs to be repeated, and + # then tile that new dimension to match the maximum number of repetitions. + expanded = tf.expand_dims(data, axis + 1) + tiled = tile_one_dimension(expanded, axis + 1, max_repeat) + + # Use `boolean_mask` to discard the extra repeated values. This also + # flattens all dimensions up through `axis`. + masked = tf.boolean_mask(tiled, mask) + + # Reshape the output tensor to add the outer dimensions back. + if axis == 0: + result = masked + else: + result_shape = tf.concat([data_shape[:axis], [-1], data_shape[axis + 1:]], + axis=0) + result = tf.reshape(masked, result_shape) + + # Preserve shape information. + if data.shape.ndims is not None: + new_axis_size = 0 if repeats.shape[0] == 0 else None + result.set_shape(data.shape[:axis].concatenate( + [new_axis_size]).concatenate(data.shape[axis + 1:])) + + return result + + +def repeat(input, repeats, axis=None, name=None): # pylint: disable=redefined-builtin + """Repeat elements of `input`. + + Args: + input: An `N`-dimensional Tensor. + repeats: An 1-D `int` Tensor. The number of repetitions for each element. + repeats is broadcasted to fit the shape of the given axis. `len(repeats)` + must equal `input.shape[axis]` if axis is not None. + axis: An int. The axis along which to repeat values. By default (axis=None), + use the flattened input array, and return a flat output array. + name: A name for the operation. + + Returns: + A Tensor which has the same shape as `input`, except along the given axis. + If axis is None then the output array is flattened to match the flattened + input array. + #### Examples: + ```python + >>> repeat(['a', 'b', 'c'], repeats=[3, 0, 2], axis=0) + ['a', 'a', 'a', 'c', 'c'] + >>> repeat([[1, 2], [3, 4]], repeats=[2, 3], axis=0) + [[1, 2], [1, 2], [3, 4], [3, 4], [3, 4]] + >>> repeat([[1, 2], [3, 4]], repeats=[2, 3], axis=1) + [[1, 1, 2, 2, 2], [3, 3, 4, 4, 4]] + >>> repeat(3, repeats=4) + [3, 3, 3, 3] + >>> repeat([[1,2], [3,4]], repeats=2) + [1, 1, 2, 2, 3, 3, 4, 4] + ``` + """ + if axis is None: + input = tf.reshape(input, [-1]) + axis = 0 + return repeat_with_axis(input, repeats, axis, name) diff --git a/easy_rec/python/feature_column/feature_column.py b/easy_rec/python/feature_column/feature_column.py index 1b74ea344..8701b55fc 100644 --- a/easy_rec/python/feature_column/feature_column.py +++ b/easy_rec/python/feature_column/feature_column.py @@ -115,6 +115,7 @@ def _cmp_embed_config(a, b): embed_name: [] for embed_name in self._share_embed_names } + self._feature_vocab_size = {} for config in self._feature_configs: assert isinstance(config, FeatureConfig) try: @@ -236,6 +237,9 @@ def is_deep(self, config): WideOrDeep.DEEP, WideOrDeep.WIDE_AND_DEEP ] + def get_feature_vocab_size(self, feature): + return self._feature_vocab_size.get(feature, 1) + def _get_vocab_size(self, vocab_path): if vocab_path in self._vocab_size: return self._vocab_size[vocab_path] @@ -623,6 +627,7 @@ def _add_deep_embedding_column(self, fc, config): feature_name = config.feature_name if config.HasField('feature_name') \ else config.input_names[0] assert config.embedding_dim > 0, 'embedding_dim is not set for %s' % feature_name + self._feature_vocab_size[feature_name] = fc.num_buckets if config.embedding_name in self._deep_share_embed_columns: fc = self._add_shared_embedding_column(config.embedding_name, fc) else: diff --git a/easy_rec/python/layers/backbone.py b/easy_rec/python/layers/backbone.py index 5c503dd31..f3dab6391 100644 --- a/easy_rec/python/layers/backbone.py +++ b/easy_rec/python/layers/backbone.py @@ -8,6 +8,7 @@ from easy_rec.python.layers.common_layers import EnhancedInputLayer from easy_rec.python.layers.keras import MLP +from easy_rec.python.layers.keras import EmbeddingLayer from easy_rec.python.layers.utils import Parameter from easy_rec.python.protos import backbone_pb2 from easy_rec.python.utils.dag import DAG @@ -47,8 +48,9 @@ def __init__(self, config, features, input_layer, l2_reg=None): self.reset_input_config(None) self._block_outputs = {} self._package_input = None + self._feature_group_inputs = {} reuse = None if config.name == 'backbone' else tf.AUTO_REUSE - input_feature_groups = {} + input_feature_groups = self._feature_group_inputs for block in config.blocks: if len(block.inputs) == 0: @@ -56,7 +58,7 @@ def __init__(self, config, features, input_layer, l2_reg=None): self._dag.add_node(block.name) self._name_to_blocks[block.name] = block layer = block.WhichOneof('layer') - if layer in {'input_layer', 'raw_input'}: + if layer in {'input_layer', 'raw_input', 'embedding_layer'}: if len(block.inputs) != 1: raise ValueError('input layer `%s` takes only one input' % block.name) one_input = block.inputs[0] @@ -69,14 +71,34 @@ def __init__(self, config, features, input_layer, l2_reg=None): if not input_layer.has_group(group): raise KeyError('invalid feature group name: ' + group) if group in input_feature_groups: - logging.warning('input `%s` already exists in other block' % group) + if layer == input_layer: + logging.warning('input `%s` already exists in other block' % group) + elif layer == 'raw_input': + input_fn = input_feature_groups[group] + self._name_to_layer[block.name] = input_fn + elif layer == 'embedding_layer': + inputs, vocab, weights = input_feature_groups[group] + block.embedding_layer.vocab_size = vocab + params = Parameter.make_from_pb(block.embedding_layer) + input_fn = EmbeddingLayer(params, block.name) + self._name_to_layer[block.name] = input_fn else: if layer == 'input_layer': input_fn = EnhancedInputLayer(self._input_layer, self._features, group, reuse) - else: + input_feature_groups[group] = input_fn + elif layer == 'raw_input': input_fn = self._input_layer.get_raw_features(self._features, group) - input_feature_groups[group] = input_fn + input_feature_groups[group] = input_fn + else: # embedding_layer + inputs, vocab, weights = self._input_layer.get_bucketized_features( + self._features, group) + block.embedding_layer.vocab_size = vocab + params = Parameter.make_from_pb(block.embedding_layer) + input_fn = EmbeddingLayer(params, block.name) + input_feature_groups[group] = (inputs, vocab, weights) + logging.info('add an embedding layer %s with vocab size %d', + block.name, vocab) self._name_to_layer[block.name] = input_fn else: self.define_layers(layer, block, block.name, reuse) @@ -94,7 +116,7 @@ def __init__(self, config, features, input_layer, l2_reg=None): num_pkg_input = 0 for block in config.blocks: layer = block.WhichOneof('layer') - if layer in {'input_layer', 'raw_input'}: + if layer in {'input_layer', 'raw_input', 'embedding_layer'}: continue name = block.name if name in input_feature_groups: @@ -150,14 +172,16 @@ def __init__(self, config, features, input_layer, l2_reg=None): num_groups = len(input_feature_groups) assert num_pkg_input > 0 or num_groups > 0, 'there must be at least one input layer/feature group' - if len(config.concat_blocks) == 0: + if len(config.concat_blocks) == 0 and len(config.output_blocks) == 0: leaf = self._dag.all_leaves() logging.warning( - '%s has no `concat_blocks`, try to use all leaf blocks: %s' % - (config.name, ','.join(leaf))) + '%s has no `concat_blocks` or `output_blocks`, try to concat all leaf blocks: %s' + % (config.name, ','.join(leaf))) self._config.concat_blocks.extend(leaf) Package.__packages[self._config.name] = self + logging.info('%s layers: %s' % + (config.name, ','.join(self._name_to_layer.keys()))) def define_layers(self, layer, layer_cnf, name, reuse): if layer == 'keras_layer': @@ -239,7 +263,12 @@ def block_input(self, config, block_outputs, training=None, **kwargs): if config.merge_inputs_into_list: output = inputs else: - output = merge_inputs(inputs, config.input_concat_axis, config.name) + try: + output = merge_inputs(inputs, config.input_concat_axis, config.name) + except ValueError as e: + logging.error('merge inputs of block %s failed: %s', config.name, + e.message) + raise e if config.HasField('extra_input_fn'): fn = eval(config.extra_input_fn) @@ -282,19 +311,37 @@ def call(self, is_training, **kwargs): input_config = self.input_config input_fn.reset(input_config, is_training) block_outputs[block] = input_fn(input_config, is_training) + elif layer == 'embedding_layer': + input_fn = self._name_to_layer[block] + feature_group = config.inputs[0].feature_group_name + inputs, _, weights = self._feature_group_inputs[feature_group] + block_outputs[block] = input_fn([inputs, weights], is_training) else: inputs = self.block_input(config, block_outputs, is_training, **kwargs) output = self.call_layer(inputs, config, block, is_training, **kwargs) block_outputs[block] = output outputs = [] + for output in self._config.output_blocks: + if output in block_outputs: + temp = block_outputs[output] + outputs.append(temp) + else: + raise ValueError('No output `%s` of backbone to be concat' % output) + if outputs: + return outputs + for output in self._config.concat_blocks: if output in block_outputs: temp = block_outputs[output] outputs.append(temp) else: raise ValueError('No output `%s` of backbone to be concat' % output) - output = merge_inputs(outputs, msg='backbone') + try: + output = merge_inputs(outputs, msg='backbone') + except ValueError as e: + logging.error("merge backbone's output failed: %s", e.message) + raise e return output def load_keras_layer(self, layer_conf, name, reuse=None): @@ -352,7 +399,12 @@ def call_keras_layer(self, inputs, name, training, **kwargs): layer, customize = self._name_to_layer[name] cls = layer.__class__.__name__ if customize: - output = layer(inputs, training=training, **kwargs) + try: + output = layer(inputs, training=training, **kwargs) + except Exception as e: + logging.error('call keras layer %s (%s) failed: %s' % + (name, cls, e.message)) + raise e else: try: output = layer(inputs, training=training) @@ -433,7 +485,10 @@ def __init__(self, config, features, input_layer, l2_reg=None): main_pkg = backbone_pb2.BlockPackage() main_pkg.name = 'backbone' main_pkg.blocks.MergeFrom(config.blocks) - main_pkg.concat_blocks.extend(config.concat_blocks) + if config.concat_blocks: + main_pkg.concat_blocks.extend(config.concat_blocks) + if config.output_blocks: + main_pkg.output_blocks.extend(config.output_blocks) self._main_pkg = Package(main_pkg, features, input_layer, l2_reg) for pkg in config.packages: Package(pkg, features, input_layer, l2_reg) @@ -445,6 +500,8 @@ def __call__(self, is_training, **kwargs): params = Parameter.make_from_pb(self._config.top_mlp) params.l2_regularizer = self._l2_reg final_mlp = MLP(params, name='backbone_top_mlp') + if type(output) in (list, tuple): + output = tf.concat(output, axis=-1) output = final_mlp(output, training=is_training, **kwargs) return output diff --git a/easy_rec/python/layers/input_layer.py b/easy_rec/python/layers/input_layer.py index 088fb79e3..bf68f5ec4 100644 --- a/easy_rec/python/layers/input_layer.py +++ b/easy_rec/python/layers/input_layer.py @@ -1,5 +1,6 @@ # -*- encoding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import logging import os from collections import OrderedDict @@ -205,6 +206,42 @@ def get_raw_features(self, features, group_name): feature_group = self._feature_groups[group_name] return [features[x] for x in feature_group.feature_names] + def get_bucketized_features(self, features, group_name): + """Get features by group_name. + + Args: + features: input tensor dict + group_name: feature_group name + + Return: + features: all raw features in list, added feature offset + """ + assert group_name in self._feature_groups, 'invalid group_name[%s], list: %s' % ( + group_name, ','.join([x for x in self._feature_groups])) + feature_group = self._feature_groups[group_name] + offset = 0 + values = [] + weights = [] + for feature in feature_group.feature_names: + vocab = self._fc_parser.get_feature_vocab_size(feature) + logging.info('vocab size of feature %s is %d' % (feature, vocab)) + weights.append(None) + if tf.is_numeric_tensor(features[feature]): + # suppose feature already have be bucketized + value = tf.to_int64(features[feature]) + elif isinstance(features[feature], tf.SparseTensor): + # TagFeature + dense = tf.sparse.to_dense(features[feature], default_value='') + value = tf.string_to_hash_bucket_fast(dense, vocab) + if (feature + '_w') in features: + weights[-1] = features[feature + '_w'] # SparseTensor + logging.info('feature %s has weight %s', feature, feature + '_w') + else: # IdFeature + value = tf.string_to_hash_bucket_fast(features[feature], vocab) + values.append(value + offset) + offset += vocab + return values, offset, weights + def __call__(self, features, group_name, is_combine=True, is_dict=False): """Get features by group_name. diff --git a/easy_rec/python/layers/keras/__init__.py b/easy_rec/python/layers/keras/__init__.py index ffbd5c8c3..ad0bf8528 100644 --- a/easy_rec/python/layers/keras/__init__.py +++ b/easy_rec/python/layers/keras/__init__.py @@ -12,6 +12,7 @@ from .custom_ops import TextNormalize from .data_augment import SeqAugment from .din import DIN +from .embedding import EmbeddingLayer from .fibinet import BiLinear from .fibinet import FiBiNet from .fibinet import SENet @@ -20,7 +21,12 @@ from .interaction import DotInteraction from .mask_net import MaskBlock from .mask_net import MaskNet +from .multi_head_attention import MultiHeadAttention from .multi_task import MMoE from .numerical_embedding import AutoDisEmbedding +from .numerical_embedding import NaryDisEmbedding from .numerical_embedding import PeriodicEmbedding from .ppnet import PPNet +from .transformer import TextEncoder +from .transformer import TransformerBlock +from .transformer import TransformerEncoder diff --git a/easy_rec/python/layers/keras/activation.py b/easy_rec/python/layers/keras/activation.py index b2a8708c8..532d5ca8f 100644 --- a/easy_rec/python/layers/keras/activation.py +++ b/easy_rec/python/layers/keras/activation.py @@ -80,6 +80,25 @@ def get_config(self,): return dict(list(base_config.items()) + list(config.items())) +class MaskedSoftmax(Layer): + + def __init__(self, axis=-1, **kwargs): + super(MaskedSoftmax, self).__init__(**kwargs) + self.axis = axis + + def call(self, inputs, mask=None): + if mask is not None: + adder = (1.0 - tf.cast(mask, inputs.dtype)) * -1e9 + inputs += adder + # Calculate softmax + if isinstance(self.axis, (tuple, list)): + if len(self.axis) > 1: + raise ValueError('MaskedSoftmax not support multiple axis') + else: + return tf.nn.softmax(inputs, axis=self.axis[0]) + return tf.nn.softmax(inputs, axis=self.axis) + + def activation_layer(activation): if activation in ('dice', 'Dice'): act_layer = Dice() diff --git a/easy_rec/python/layers/keras/attention.py b/easy_rec/python/layers/keras/attention.py index cf686356f..4831ccae8 100644 --- a/easy_rec/python/layers/keras/attention.py +++ b/easy_rec/python/layers/keras/attention.py @@ -79,10 +79,14 @@ def __init__(self, params, name='attention', reuse=None, **kwargs): self.seed = params.get_or_default('seed', None) self.scale = None self.concat_score_weight = None - self.return_attention_scores = params.get_or_default( + self._return_attention_scores = params.get_or_default( 'return_attention_scores', False) self.use_causal_mask = params.get_or_default('use_causal_mask', False) + @property + def return_attention_scores(self): + return self._return_attention_scores + def build(self, input_shape): self._validate_inputs(input_shape) if self.use_scale: @@ -199,12 +203,7 @@ def _calculate_score_mask(self, scores, v_mask, use_causal_mask): # or None if the value mask is not provided. return v_mask - def call( - self, - inputs, - mask=None, - training=False, - ): + def call(self, inputs, mask=None, training=False, **kwargs): self._validate_inputs(inputs=inputs, mask=mask) q = inputs[0] v = inputs[1] @@ -220,7 +219,7 @@ def call( # Mask of shape [batch_size, Tq, 1]. q_mask = tf.expand_dims(q_mask, axis=-1) result *= tf.cast(q_mask, dtype=result.dtype) - if self.return_attention_scores: + if self._return_attention_scores: return result, attention_scores return result diff --git a/easy_rec/python/layers/keras/einsum_dense.py b/easy_rec/python/layers/keras/einsum_dense.py new file mode 100644 index 000000000..7531644dc --- /dev/null +++ b/easy_rec/python/layers/keras/einsum_dense.py @@ -0,0 +1,598 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import re +import string + +import tensorflow as tf +from tensorflow.python.keras import activations +from tensorflow.python.keras import constraints +from tensorflow.python.keras import initializers +from tensorflow.python.keras import regularizers +from tensorflow.python.keras.layers import Layer + + +class EinsumDense(Layer): + """A layer that uses `einsum` as the backing computation. + + This layer can perform einsum calculations of arbitrary dimensionality. + + Args: + equation: An equation describing the einsum to perform. + This equation must be a valid einsum string of the form + `ab,bc->ac`, `...ab,bc->...ac`, or + `ab...,bc->ac...` where 'ab', 'bc', and 'ac' can be any valid einsum + axis expression sequence. + output_shape: The expected shape of the output tensor + (excluding the batch dimension and any dimensions + represented by ellipses). You can specify `None` for any dimension + that is unknown or can be inferred from the input shape. + activation: Activation function to use. If you don't specify anything, + no activation is applied + (that is, a "linear" activation: `a(x) = x`). + bias_axes: A string containing the output dimension(s) + to apply a bias to. Each character in the `bias_axes` string + should correspond to a character in the output portion + of the `equation` string. + kernel_initializer: Initializer for the `kernel` weights matrix. + bias_initializer: Initializer for the bias vector. + kernel_regularizer: Regularizer function applied to the `kernel` weights + matrix. + bias_regularizer: Regularizer function applied to the bias vector. + kernel_constraint: Constraint function applied to the `kernel` weights + matrix. + bias_constraint: Constraint function applied to the bias vector. + lora_rank: Optional integer. If set, the layer's forward pass + will implement LoRA (Low-Rank Adaptation) + with the provided rank. LoRA sets the layer's kernel + to non-trainable and replaces it with a delta over the + original kernel, obtained via multiplying two lower-rank + trainable matrices + (the factorization happens on the last dimension). + This can be useful to reduce the + computation cost of fine-tuning large dense layers. + You can also enable LoRA on an existing + `EinsumDense` layer by calling `layer.enable_lora(rank)`. + **kwargs: Base layer keyword arguments, such as `name` and `dtype`. + + Examples: + **Biased dense layer with einsums** + + This example shows how to instantiate a standard Keras dense layer using + einsum operations. This example is equivalent to + `keras.layers.Dense(64, use_bias=True)`. + + >>> layer = tf.keras.layers.EinsumDense("ab,bc->ac", + ... output_shape=64, + ... bias_axes="c") + >>> input_tensor = tf.keras.Input(shape=[32]) + >>> output_tensor = layer(input_tensor) + >>> output_tensor.shape + (None, 64) + + **Applying a dense layer to a sequence** + + This example shows how to instantiate a layer that applies the same dense + operation to every element in a sequence. Here, the `output_shape` has two + values (since there are two non-batch dimensions in the output); the first + dimension in the `output_shape` is `None`, because the sequence dimension + `b` has an unknown shape. + + >>> layer = tf.keras.layers.EinsumDense("abc,cd->abd", + ... output_shape=(None, 64), + ... bias_axes="d") + >>> input_tensor = tf.keras.Input(shape=[32, 128]) + >>> output_tensor = layer(input_tensor) + >>> output_tensor.shape + (None, 32, 64) + + **Applying a dense layer to a sequence using ellipses** + + This example shows how to instantiate a layer that applies the same dense + operation to every element in a sequence, but uses the ellipsis notation + instead of specifying the batch and sequence dimensions. + + Because we are using ellipsis notation and have specified only one axis, the + `output_shape` arg is a single value. When instantiated in this way, the + layer can handle any number of sequence dimensions - including the case + where no sequence dimension exists. + + >>> layer = tf.keras.layers.EinsumDense("...x,xy->...y", + ... output_shape=64, + ... bias_axes="y") + >>> input_tensor = tf.keras.Input(shape=[32, 128]) + >>> output_tensor = layer(input_tensor) + >>> output_tensor.shape + (None, 32, 64) + """ + + def __init__(self, + equation, + output_shape, + activation=None, + bias_axes=None, + kernel_initializer='glorot_uniform', + bias_initializer='zeros', + kernel_regularizer=None, + bias_regularizer=None, + kernel_constraint=None, + bias_constraint=None, + lora_rank=None, + **kwargs): + super(EinsumDense, self).__init__(**kwargs) + self.equation = equation + if isinstance(output_shape, int): + self.partial_output_shape = (output_shape,) + else: + self.partial_output_shape = tuple(output_shape) + self.bias_axes = bias_axes + self.activation = activations.get(activation) + self.kernel_initializer = initializers.get(kernel_initializer) + self.bias_initializer = initializers.get(bias_initializer) + self.kernel_regularizer = regularizers.get(kernel_regularizer) + self.bias_regularizer = regularizers.get(bias_regularizer) + self.kernel_constraint = constraints.get(kernel_constraint) + self.bias_constraint = constraints.get(bias_constraint) + self.lora_rank = lora_rank + self.lora_enabled = False + + def build(self, input_shape): + shape_data = _analyze_einsum_string( + self.equation, + self.bias_axes, + input_shape, + self.partial_output_shape, + ) + kernel_shape, bias_shape, full_output_shape = shape_data + for i in range(len(kernel_shape)): + dim = kernel_shape[i] + if isinstance(dim, tf.Dimension): + kernel_shape[i] = dim.value + for i in range(len(bias_shape)): + dim = bias_shape[i] + if isinstance(dim, tf.Dimension): + bias_shape[i] = dim.value + for i in range(len(full_output_shape)): + dim = full_output_shape[i] + if isinstance(dim, tf.Dimension): + full_output_shape[i] = dim.value + self.full_output_shape = tuple(full_output_shape) + self._kernel = self.add_weight( + name='kernel', + shape=tuple(kernel_shape), + initializer=self.kernel_initializer, + regularizer=self.kernel_regularizer, + constraint=self.kernel_constraint, + dtype=self.dtype, + trainable=True, + ) + if bias_shape is not None: + self.bias = self.add_weight( + name='bias', + shape=tuple(bias_shape), + initializer=self.bias_initializer, + regularizer=self.bias_regularizer, + constraint=self.bias_constraint, + dtype=self.dtype, + trainable=True, + ) + else: + self.bias = None + self.built = True + if self.lora_rank: + self.enable_lora(self.lora_rank) + + @property + def kernel(self): + if not self.built: + raise AttributeError( + 'You must build the layer before accessing `kernel`.') + if self.lora_enabled: + return self._kernel + tf.matmul(self.lora_kernel_a, self.lora_kernel_b) + return self._kernel + + def compute_output_shape(self, _): + return self.full_output_shape + + def call(self, inputs, training=None): + x = tf.einsum(self.equation, inputs, self.kernel) + if self.bias is not None: + x += self.bias + if self.activation is not None: + x = self.activation(x) + return x + + def enable_lora(self, + rank, + a_initializer='he_uniform', + b_initializer='zeros'): + if self.kernel_constraint: + raise ValueError('Lora is incompatible with kernel constraints. ' + 'In order to enable lora on this layer, remove the ' + '`kernel_constraint` argument.') + if not self.built: + raise ValueError("Cannot enable lora on a layer that isn't yet built.") + if self.lora_enabled: + raise ValueError('lora is already enabled. ' + 'This can only be done once per layer.') + self._tracker.unlock() + self.lora_kernel_a = self.add_weight( + name='lora_kernel_a', + shape=(self.kernel.shape[:-1] + (rank,)), + initializer=initializers.get(a_initializer), + regularizer=self.kernel_regularizer, + ) + self.lora_kernel_b = self.add_weight( + name='lora_kernel_b', + shape=(rank, self.kernel.shape[-1]), + initializer=initializers.get(b_initializer), + regularizer=self.kernel_regularizer, + ) + self._kernel.trainable = False + self._tracker.lock() + self.lora_enabled = True + self.lora_rank = rank + + def save_own_variables(self, store): + # Do nothing if the layer isn't yet built + if not self.built: + return + # The keys of the `store` will be saved as determined because the + # default ordering will change after quantization + kernel_value, kernel_scale = self._get_kernel_with_merged_lora() + target_variables = [kernel_value] + if self.bias is not None: + target_variables.append(self.bias) + for i, variable in enumerate(target_variables): + store[str(i)] = variable + + def load_own_variables(self, store): + if not self.lora_enabled: + self._check_load_own_variables(store) + # Do nothing if the layer isn't yet built + if not self.built: + return + # The keys of the `store` will be saved as determined because the + # default ordering will change after quantization + target_variables = [self._kernel] + if self.bias is not None: + target_variables.append(self.bias) + for i, variable in enumerate(target_variables): + variable.assign(store[str(i)]) + if self.lora_enabled: + self.lora_kernel_a.assign(tf.zeros(self.lora_kernel_a.shape)) + self.lora_kernel_b.assign(tf.zeros(self.lora_kernel_b.shape)) + + def get_config(self): + base_config = super(EinsumDense, self).get_config() + config = { + 'output_shape': + self.partial_output_shape, + 'equation': + self.equation, + 'activation': + activations.serialize(self.activation), + 'bias_axes': + self.bias_axes, + 'kernel_initializer': + initializers.serialize(self.kernel_initializer), + 'bias_initializer': + initializers.serialize(self.bias_initializer), + 'kernel_regularizer': + regularizers.serialize(self.kernel_regularizer), + 'bias_regularizer': + regularizers.serialize(self.bias_regularizer), + 'activity_regularizer': + regularizers.serialize(self.activity_regularizer), + 'kernel_constraint': + constraints.serialize(self.kernel_constraint), + 'bias_constraint': + constraints.serialize(self.bias_constraint), + } + if self.lora_rank: + config['lora_rank'] = self.lora_rank + config.update(base_config) + return config + + def _check_load_own_variables(self, store): + all_vars = self._trainable_variables + self._non_trainable_variables + if len(store.keys()) != len(all_vars): + if len(all_vars) == 0 and not self.built: + raise ValueError( + "Layer '{name}' was never built " + "and thus it doesn't have any variables. " + 'However the weights file lists {num_keys} ' + 'variables for this layer.\n' + 'In most cases, this error indicates that either:\n\n' + '1. The layer is owned by a parent layer that ' + 'implements a `build()` method, but calling the ' + "parent's `build()` method did NOT create the state of " + "the child layer '{name}'. A `build()` method " + 'must create ALL state for the layer, including ' + 'the state of any children layers.\n\n' + '2. You need to implement ' + 'the `def build_from_config(self, config)` method ' + "on layer '{name}', to specify how to rebuild " + 'it during loading. ' + 'In this case, you might also want to implement the ' + 'method that generates the build config at saving time, ' + '`def get_build_config(self)`. ' + 'The method `build_from_config()` is meant ' + 'to create the state ' + 'of the layer (i.e. its variables) upon deserialization.'.format( + name=self.name, num_keys=len(store.keys()))) + raise ValueError( + "Layer '{name}' expected {num_var} variables, but received " + '{num_key} variables during loading. ' + 'Expected: {names}'.format( + name=self.name, + num_var=len(store.keys()), + num_key=len(store.keys()), + names=[v.name for v in all_vars])) + + def _get_kernel_with_merged_lora(self): + kernel_value = self.kernel + kernel_scale = None + return kernel_value, kernel_scale + + +def _analyze_einsum_string(equation, bias_axes, input_shape, output_shape): + """Analyzes an einsum string to determine the required weight shape.""" + dot_replaced_string = re.sub(r'\.\.\.', '0', equation) + + # This is the case where no ellipses are present in the string. + split_string = re.match('([a-zA-Z]+),([a-zA-Z]+)->([a-zA-Z]+)', + dot_replaced_string) + if split_string: + return _analyze_split_string(split_string, bias_axes, input_shape, + output_shape) + + # This is the case where ellipses are present on the left. + split_string = re.match('0([a-zA-Z]+),([a-zA-Z]+)->0([a-zA-Z]+)', + dot_replaced_string) + if split_string: + return _analyze_split_string( + split_string, bias_axes, input_shape, output_shape, left_elided=True) + + # This is the case where ellipses are present on the right. + split_string = re.match('([a-zA-Z]{2,})0,([a-zA-Z]+)->([a-zA-Z]+)0', + dot_replaced_string) + if split_string: + return _analyze_split_string(split_string, bias_axes, input_shape, + output_shape) + + raise ValueError( + "Invalid einsum equation '{equation}'. Equations must be in the form " + '[X],[Y]->[Z], ...[X],[Y]->...[Z], or [X]...,[Y]->[Z]....'.format( + equation=equation)) + + +def _analyze_split_string(split_string, + bias_axes, + input_shape, + output_shape, + left_elided=False): + """Analyze an pre-split einsum string to find the weight shape.""" + input_spec = split_string.group(1) + weight_spec = split_string.group(2) + output_spec = split_string.group(3) + elided = len(input_shape) - len(input_spec) + if isinstance(output_shape, int): + output_shape = [output_shape] + else: + output_shape = list(output_shape) + + output_shape.insert(0, input_shape[0]) + + if elided > 0 and left_elided: + for i in range(1, elided): + # We already inserted the 0th input dimension at dim 0, so we need + # to start at location 1 here. + output_shape.insert(1, input_shape[i]) + elif elided > 0 and not left_elided: + for i in range(len(input_shape) - elided, len(input_shape)): + output_shape.append(input_shape[i]) + + if left_elided: + # If we have beginning dimensions elided, we need to use negative + # indexing to determine where in the input dimension our values are. + input_dim_map = { + dim: (i + elided) - len(input_shape) for i, dim in enumerate(input_spec) + } + # Because we've constructed the full output shape already, we don't need + # to do negative indexing. + output_dim_map = {dim: (i + elided) for i, dim in enumerate(output_spec)} + else: + input_dim_map = {dim: i for i, dim in enumerate(input_spec)} + output_dim_map = {dim: i for i, dim in enumerate(output_spec)} + + for dim in input_spec: + input_shape_at_dim = input_shape[input_dim_map[dim]] + if dim in output_dim_map: + output_shape_at_dim = output_shape[output_dim_map[dim]] + if (output_shape_at_dim is not None and + output_shape_at_dim != input_shape_at_dim): + raise ValueError( + 'Input shape and output shape do not match at shared ' + "dimension '{dim}'. Input shape is {input_shape_at_dim}, " + 'and output shape is {output_shape}.'.format( + dim=dim, + input_shape_at_dim=input_shape_at_dim, + output_shape=output_shape[output_dim_map[dim]])) + + for dim in output_spec: + if dim not in input_spec and dim not in weight_spec: + raise ValueError( + "Dimension '{dim}' was specified in the output " + "'{output_spec}' but has no corresponding dim in the input " + "spec '{input_spec}' or weight spec '{output_spec}'".format( + dim=dim, output_spec=output_spec, input_spec=input_spec)) + + weight_shape = [] + for dim in weight_spec: + if dim in input_dim_map: + weight_shape.append(input_shape[input_dim_map[dim]]) + elif dim in output_dim_map: + weight_shape.append(output_shape[output_dim_map[dim]]) + else: + raise ValueError( + "Weight dimension '{dim}' did not have a match in either " + "the input spec '{input_spec}' or the output " + "spec '{output_spec}'. For this layer, the weight must " + 'be fully specified.'.format( + dim=dim, input_spec=input_spec, output_spec=output_spec)) + + if bias_axes is not None: + num_left_elided = elided if left_elided else 0 + idx_map = { + char: output_shape[i + num_left_elided] + for i, char in enumerate(output_spec) + } + + for char in bias_axes: + if char not in output_spec: + raise ValueError( + "Bias dimension '{char}' was requested, but is not part " + "of the output spec '{output_spec}'".format( + char=char, output_spec=output_spec)) + + first_bias_location = min([output_spec.find(char) for char in bias_axes]) + bias_output_spec = output_spec[first_bias_location:] + + bias_shape = [ + idx_map[char] if char in bias_axes else 1 for char in bias_output_spec + ] + + if not left_elided: + for _ in range(elided): + bias_shape.append(1) + else: + bias_shape = None + + return weight_shape, bias_shape, output_shape + + +def _analyze_quantization_info(equation, input_shape): + + def get_specs(equation, input_shape): + possible_labels = string.ascii_letters + dot_replaced_string = re.sub(r'\.\.\.', '0', equation) + + # This is the case where no ellipses are present in the string. + split_string = re.match('([a-zA-Z]+),([a-zA-Z]+)->([a-zA-Z]+)', + dot_replaced_string) + if split_string is not None: + input_spec = split_string.group(1) + weight_spec = split_string.group(2) + output_spec = split_string.group(3) + return input_spec, weight_spec, output_spec + + # This is the case where ellipses are present on the left. + split_string = re.match('0([a-zA-Z]+),([a-zA-Z]+)->0([a-zA-Z]+)', + dot_replaced_string) + if split_string is not None: + input_spec = split_string.group(1) + weight_spec = split_string.group(2) + output_spec = split_string.group(3) + elided = len(input_shape) - len(input_spec) + possible_labels = sorted( + set(possible_labels) - set(input_spec) - set(weight_spec) - + set(output_spec)) + # Pad labels on the left to `input_spec` and `output_spec` + for i in range(elided): + input_spec = possible_labels[i] + input_spec + output_spec = possible_labels[i] + output_spec + return input_spec, weight_spec, output_spec + + # This is the case where ellipses are present on the right. + split_string = re.match('([a-zA-Z]{2,})0,([a-zA-Z]+)->([a-zA-Z]+)0', + dot_replaced_string) + if split_string is not None: + input_spec = split_string.group(1) + weight_spec = split_string.group(2) + output_spec = split_string.group(3) + elided = len(input_shape) - len(input_spec) + possible_labels = sorted( + set(possible_labels) - set(input_spec) - set(weight_spec) - + set(output_spec)) + # Pad labels on the right to `input_spec` and `output_spec` + for i in range(elided): + input_spec = input_spec + possible_labels[i] + output_spec = output_spec + possible_labels[i] + return input_spec, weight_spec, output_spec + + raise ValueError( + "Invalid einsum equation '{equation}'. Equations must be in the " + 'form [X],[Y]->[Z], ...[X],[Y]->...[Z], or [X]...,[Y]->[Z]....'.format( + equation=equation)) + + input_spec, weight_spec, output_spec = get_specs(equation, input_shape) + + # Determine the axes that should be reduced by the quantizer + input_reduced_axes = [] + weight_reduced_axes = [] + for i, label in enumerate(input_spec): + index = output_spec.find(label) + if index == -1: + input_reduced_axes.append(i) + for i, label in enumerate(weight_spec): + index = output_spec.find(label) + if index == -1: + weight_reduced_axes.append(i) + + # Determine the axes of `ops.expand_dims` + input_expand_axes = [] + weight_expand_axes = [] + for i, label in enumerate(output_spec): + index_input = input_spec.find(label) + index_weight = weight_spec.find(label) + if index_input == -1: + input_expand_axes.append(i) + if index_weight == -1: + weight_expand_axes.append(i) + + # Determine the axes of `ops.transpose` + input_transpose_axes = [] + weight_transpose_axes = [] + for i, label in enumerate(output_spec): + index_input = input_spec.find(label) + index_weight = weight_spec.find(label) + if index_input != -1: + input_transpose_axes.append(index_input) + if index_weight != -1: + weight_transpose_axes.append(index_weight) + # Postprocess the information: + # 1. Add dummy axes (1) to transpose_axes + # 2. Add axis to squeeze_axes if 1. failed + input_squeeze_axes = [] + weight_squeeze_axes = [] + for ori_index in input_reduced_axes: + try: + index = input_expand_axes.pop(0) + except IndexError: + input_squeeze_axes.append(ori_index) + input_transpose_axes.insert(index, ori_index) + for ori_index in weight_reduced_axes: + try: + index = weight_expand_axes.pop(0) + except IndexError: + weight_squeeze_axes.append(ori_index) + weight_transpose_axes.insert(index, ori_index) + # Prepare equation for `einsum_with_inputs_gradient` + custom_gradient_equation = '{output_spec},{weight_spec}->{input_spec}'.format( + output_spec=output_spec, input_spec=input_spec, weight_spec=weight_spec) + weight_reverse_transpose_axes = [ + i for (_, i) in sorted((v, i) + for (i, v) in enumerate(weight_transpose_axes)) + ] + return ( + input_reduced_axes, + weight_reduced_axes, + input_transpose_axes, + weight_transpose_axes, + input_expand_axes, + weight_expand_axes, + input_squeeze_axes, + weight_squeeze_axes, + custom_gradient_equation, + weight_reverse_transpose_axes, + ) diff --git a/easy_rec/python/layers/keras/embedding.py b/easy_rec/python/layers/keras/embedding.py new file mode 100644 index 000000000..77b513951 --- /dev/null +++ b/easy_rec/python/layers/keras/embedding.py @@ -0,0 +1,81 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +"""Fused embedding layer.""" +import tensorflow as tf +from tensorflow.python.keras.layers import Embedding +from tensorflow.python.keras.layers import Layer + + +def _combine(embeddings, weights, comb_fn): + # embeddings shape: [B, N, D] + if callable(comb_fn): + return comb_fn(embeddings, axis=1) + if weights is None: + return tf.reduce_mean(embeddings, axis=1) + if isinstance(weights, tf.SparseTensor): + if weights.dtype == tf.string: + weights = tf.sparse.to_dense(weights, default_value='0') + weights = tf.string_to_number(weights) + else: + weights = tf.sparse.to_dense(weights, default_value=0.0) + sum_weights = tf.reduce_sum(weights, axis=1, keepdims=True) + weights = tf.expand_dims(weights / sum_weights, axis=-1) + return tf.reduce_sum(embeddings * weights, axis=1) + + +class EmbeddingLayer(Layer): + + def __init__(self, params, name='embedding_layer', reuse=None, **kwargs): + super(EmbeddingLayer, self).__init__(name=name, **kwargs) + params.check_required(['vocab_size', 'embedding_dim']) + vocab_size = int(params.vocab_size) + combiner = params.get_or_default('combiner', 'weight') + if combiner == 'mean': + self.combine_fn = tf.reduce_mean + elif combiner == 'sum': + self.combine_fn = tf.reduce_sum + elif combiner == 'max': + self.combine_fn = tf.reduce_max + elif combiner == 'min': + self.combine_fn = tf.reduce_min + elif combiner == 'weight': + self.combine_fn = 'weight' + else: + raise ValueError('unsupported embedding combiner: ' + combiner) + self.embed_dim = int(params.embedding_dim) + self.embedding = Embedding(vocab_size, self.embed_dim) + self.do_concat = params.get_or_default('concat', True) + + def call(self, inputs, training=None, **kwargs): + inputs, weights = inputs + # 将多个特征的输入合并为一个索引 tensor + flat_inputs = [tf.reshape(input_field, [-1]) for input_field in inputs] + all_indices = tf.concat(flat_inputs, axis=0) + # 从共享的嵌入表中进行一次 embedding lookup + all_embeddings = self.embedding(all_indices) + is_multi = [] + # 计算每个特征的嵌入 + split_sizes = [] + for input_field in inputs: + assert input_field.shape.ndims <= 2, 'dims of embedding layer input must be <= 2' + input_shape = tf.shape(input_field) + size = input_shape[0] + if input_field.shape.ndims > 1: + size *= input_shape[-1] + is_multi.append(True) + else: + is_multi.append(False) + split_sizes.append(size) + embeddings = tf.split(all_embeddings, split_sizes, axis=0) + for i in range(len(embeddings)): + if is_multi[i]: + batch_size = tf.shape(inputs[i])[0] + embeddings[i] = tf.cond( + tf.equal(tf.size(embeddings[i]), 0), + lambda: tf.zeros([batch_size, self.embed_dim]), lambda: _combine( + tf.reshape(embeddings[i], [batch_size, -1, self.embed_dim]), + weights[i], self.combine_fn)) + if self.do_concat: + embeddings = tf.concat(embeddings, axis=-1) + print('Embedding layer:', self.name, embeddings) + return embeddings diff --git a/easy_rec/python/layers/keras/mask_net.py b/easy_rec/python/layers/keras/mask_net.py index 08ea698c0..67176851c 100644 --- a/easy_rec/python/layers/keras/mask_net.py +++ b/easy_rec/python/layers/keras/mask_net.py @@ -1,5 +1,7 @@ # -*- encoding:utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import logging + import tensorflow as tf from tensorflow.python.keras.layers import Activation from tensorflow.python.keras.layers import Dense @@ -55,6 +57,7 @@ def build(self, input_shape): name='aggregation') self.weight_layer = Dense(input_dim, name='weights') if self._projection_dim is not None: + logging.info('%s project dim is %d', self.name, self._projection_dim) self.project_layer = Dense( self._projection_dim, kernel_regularizer=self.l2_reg, @@ -78,7 +81,7 @@ def build(self, input_shape): self.output_layer_norm = LayerNormalization(name='output_ln') super(MaskBlock, self).build(input_shape) - def call(self, inputs, **kwargs): + def call(self, inputs, training=None, **kwargs): if type(inputs) in (tuple, list): net, mask_input = inputs[:2] else: diff --git a/easy_rec/python/layers/keras/multi_head_attention.py b/easy_rec/python/layers/keras/multi_head_attention.py new file mode 100644 index 000000000..a5ca0b40d --- /dev/null +++ b/easy_rec/python/layers/keras/multi_head_attention.py @@ -0,0 +1,717 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import math +import string + +import numpy as np +import tensorflow as tf +from tensorflow.python.keras import constraints +from tensorflow.python.keras import initializers +from tensorflow.python.keras import regularizers +from tensorflow.python.keras.layers import Dropout +from tensorflow.python.keras.layers import Layer +from tensorflow.python.keras.layers import Softmax + +from easy_rec.python.layers.keras.activation import MaskedSoftmax +from easy_rec.python.layers.keras.einsum_dense import EinsumDense + + +class MultiHeadAttention(Layer): + """MultiHeadAttention layer. + + This is an implementation of multi-headed attention as described in the + paper "Attention is all you Need" + [Vaswani et al., 2017](https://arxiv.org/abs/1706.03762). + If `query`, `key,` `value` are the same, then + this is self-attention. Each time step in `query` attends to the + corresponding sequence in `key`, and returns a fixed-width vector. + + This layer first projects `query`, `key` and `value`. These are + (effectively) a list of tensors of length `num_attention_heads`, where the + corresponding shapes are `(batch_size, , key_dim)`, + `(batch_size, , key_dim)`, + `(batch_size, , value_dim)`. + + Then, the query and key tensors are dot-producted and scaled. These are + softmaxed to obtain attention probabilities. The value tensors are then + interpolated by these probabilities, then concatenated back to a single + tensor. + + Finally, the result tensor with the last dimension as `value_dim` can take + a linear projection and return. + + Args: + num_heads: Number of attention heads. + key_dim: Size of each attention head for query and key. + value_dim: Size of each attention head for value. + dropout: Dropout probability. + use_bias: Boolean, whether the dense layers use bias vectors/matrices. + output_shape: The expected shape of an output tensor, besides the batch + and sequence dims. If not specified, projects back to the query + feature dim (the query input's last dimension). + attention_axes: axes over which the attention is applied. `None` means + attention over all axes, but batch, heads, and features. + kernel_initializer: Initializer for dense layer kernels. + bias_initializer: Initializer for dense layer biases. + kernel_regularizer: Regularizer for dense layer kernels. + bias_regularizer: Regularizer for dense layer biases. + activity_regularizer: Regularizer for dense layer activity. + kernel_constraint: Constraint for dense layer kernels. + bias_constraint: Constraint for dense layer kernels. + use_causal_mask: A boolean to indicate whether to apply a causal mask to + prevent tokens from attending to future tokens (e.g., used in a + decoder Transformer). + return_attention_scores: A boolean to indicate whether the output should + be `(attention_output, attention_scores)` if `True`, or + `attention_output` if `False`. Defaults to `False`. + + Call arguments: + query: Query tensor of shape `(B, T, dim)`, where `B` is the batch size, + `T` is the target sequence length, and dim is the feature dimension. + value: Value tensor of shape `(B, S, dim)`, where `B` is the batch size, + `S` is the source sequence length, and dim is the feature dimension. + key: Optional key tensor of shape `(B, S, dim)`. If not given, will + use `value` for both `key` and `value`, which is the most common + case. + attention_mask: a boolean mask of shape `(B, T, S)`, that prevents + attention to certain positions. The boolean mask specifies which + query elements can attend to which key elements, 1 indicates + attention and 0 indicates no attention. Broadcasting can happen for + the missing batch dimensions and the head dimension. + training: Python boolean indicating whether the layer should behave in + training mode (adding dropout) or in inference mode (no dropout). + Will go with either using the training mode of the parent + layer/model, or `False` (inference) if there is no parent layer. + + Returns: + attention_output: The result of the computation, of shape `(B, T, E)`, + where `T` is for target sequence shapes and `E` is the query input + last dimension if `output_shape` is `None`. Otherwise, the + multi-head outputs are projected to the shape specified by + `output_shape`. + attention_scores: (Optional) multi-head attention coefficients over + attention axes. + """ + + def __init__(self, params, name='multi_head_attention', reuse=None, **kwargs): + super(MultiHeadAttention, self).__init__(name=name, **kwargs) + self.supports_masking = True + self._num_heads = params.num_heads + self._key_dim = params.key_dim + # Cache 1.0 / math.sqrt(self._key_dim). + self._inverse_sqrt_key_dim = None + value_dim = params.get_or_default('value_dim', None) + self._value_dim = value_dim if value_dim else self._key_dim + self._dropout = params.get_or_default('dropout', 0.0) + self._use_bias = params.get_or_default('use_bias', True) + self._output_shape = params.get_or_default('output_shape', None) + self._kernel_initializer = initializers.get( + params.get_or_default('kernel_initializer', 'glorot_uniform')) + self._bias_initializer = initializers.get( + params.get_or_default('bias_initializer', 'zeros')) + self._kernel_regularizer = regularizers.get( + params.get_or_default('kernel_regularizer', None)) + self._bias_regularizer = regularizers.get( + params.get_or_default('bias_regularizer', None)) + self._activity_regularizer = regularizers.get( + params.get_or_default('activity_regularizer', None)) + self._kernel_constraint = constraints.get( + params.get_or_default('kernel_constraint', None)) + self._bias_constraint = constraints.get( + params.get_or_default('bias_constraint', None)) + self._attention_axes = params.get_or_default('attention_axes', None) + self._use_causal_mask = params.get_or_default('use_causal_mask', False) + self._return_attention_scores = params.get_or_default( + 'return_attention_scores', False) + + @property + def num_heads(self): + return self._num_heads + + @property + def key_dim(self): + return self._key_dim + + @property + def value_dim(self): + return self._value_dim + + @property + def dropout(self): + return self._dropout + + @property + def use_bias(self): + return self._use_bias + + @property + def output_shape(self): + return self._output_shape + + @property + def attention_axes(self): + return self._attention_axes + + def get_config(self): + base_config = super(MultiHeadAttention, self).get_config() + config = { + 'num_heads': + self._num_heads, + 'key_dim': + self._key_dim, + 'value_dim': + self._value_dim, + 'dropout': + self._dropout, + 'use_bias': + self._use_bias, + 'output_shape': + self._output_shape, + 'attention_axes': + self._attention_axes, + 'kernel_initializer': + initializers.serialize(self._kernel_initializer), + 'bias_initializer': + initializers.serialize(self._bias_initializer), + 'kernel_regularizer': + regularizers.serialize(self._kernel_regularizer), + 'bias_regularizer': + regularizers.serialize(self._bias_regularizer), + 'activity_regularizer': + regularizers.serialize(self._activity_regularizer), + 'kernel_constraint': + constraints.serialize(self._kernel_constraint), + 'bias_constraint': + constraints.serialize(self._bias_constraint), + } + config.update(base_config) + return config + + def build(self, input_shape): + """Builds layers and variables.""" + if len(input_shape) == 3: + query_shape, value_shape, key_shape = input_shape + elif len(input_shape) == 2: + query_shape, value_shape = input_shape + key_shape = None + else: + raise ValueError('invalid input shape of MultiHeadAttention') + + key_shape = value_shape if key_shape is None else key_shape + query_rank = len(query_shape) + value_rank = len(value_shape) + key_rank = len(key_shape) + einsum_equation, bias_axes, output_rank = _build_proj_equation( + query_rank - 1, bound_dims=1, output_dims=2) + self._query_dense = EinsumDense( + einsum_equation, + output_shape=_get_output_shape(output_rank - 1, + [self._num_heads, self._key_dim]), + bias_axes=bias_axes if self._use_bias else None, + name='query', + **self._get_common_kwargs_for_sublayer()) + self._query_dense.build(query_shape) + einsum_equation, bias_axes, output_rank = _build_proj_equation( + key_rank - 1, bound_dims=1, output_dims=2) + self._key_dense = EinsumDense( + einsum_equation, + output_shape=_get_output_shape(output_rank - 1, + [self._num_heads, self._key_dim]), + bias_axes=bias_axes if self._use_bias else None, + name='key', + **self._get_common_kwargs_for_sublayer()) + self._key_dense.build(key_shape) + einsum_equation, bias_axes, output_rank = _build_proj_equation( + value_rank - 1, bound_dims=1, output_dims=2) + self._value_dense = EinsumDense( + einsum_equation, + output_shape=_get_output_shape(output_rank - 1, + [self._num_heads, self._value_dim]), + bias_axes=bias_axes if self._use_bias else None, + name='value', + **self._get_common_kwargs_for_sublayer()) + self._value_dense.build(value_shape) + # Builds the attention computations for multi-head dot product + # attention. These computations could be wrapped into the keras + # attention layer once it supports multi-head einsum computations. + self._build_attention(output_rank) + self._output_dense = self._make_output_dense( + query_shape, + self._get_common_kwargs_for_sublayer(), + 'attention_output', + ) + output_dense_input_shape = list( + self._query_dense.compute_output_shape(query_shape)) + output_dense_input_shape[-1] = self._value_dim + self._output_dense.build(tuple(output_dense_input_shape)) + self.built = True + print('MultiHeadAttention (%s) built' % self.name) + + @property + def query_dense(self): + return self._query_dense + + @property + def key_dense(self): + return self._key_dense + + @property + def value_dense(self): + return self._value_dense + + @property + def output_dense(self): + return self._output_dense + + def _get_common_kwargs_for_sublayer(self): + common_kwargs = dict( + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + dtype=tf.float32, + ) + # Create new clone of kernel/bias initializer, so that we don't reuse + # the initializer instance, which could lead to same init value since + # initializer is stateless. + kernel_initializer = self._kernel_initializer.__class__.from_config( + self._kernel_initializer.get_config()) + bias_initializer = self._bias_initializer.__class__.from_config( + self._bias_initializer.get_config()) + common_kwargs['kernel_initializer'] = kernel_initializer + common_kwargs['bias_initializer'] = bias_initializer + return common_kwargs + + def _make_output_dense(self, query_shape, common_kwargs, name=None): + """Builds the output projection matrix. + + Args: + query_shape: query tensor shape + common_kwargs: Common keyword arguments for einsum layer. + name: Name for the projection layer. + + Returns: + Projection layer. + """ + query_rank = len(query_shape) + if self._output_shape: + if hasattr(self._output_shape, '__len__'): + output_shape = self._output_shape + else: + output_shape = [self._output_shape] + else: + output_shape = [query_shape[-1]] + einsum_equation, bias_axes, output_rank = _build_proj_equation( + query_rank - 1, bound_dims=2, output_dims=len(output_shape)) + return EinsumDense( + einsum_equation, + output_shape=_get_output_shape(output_rank - 1, output_shape), + bias_axes=bias_axes if self._use_bias else None, + name=name, + **common_kwargs) + + def _build_attention(self, rank): + """Builds multi-head dot-product attention computations. + + This function builds attributes necessary for `_compute_attention` to + customize attention computation to replace the default dot-product + attention. + + Args: + rank: the rank of query, key, value tensors. + """ + if self._attention_axes is None: + self._attention_axes = tuple(range(1, rank - 2)) + else: + self._attention_axes = tuple(self._attention_axes) + ( + self._dot_product_equation, + self._combine_equation, + attn_scores_rank, + ) = _build_attention_equation( + rank, attn_axes=self._attention_axes) + norm_axes = tuple( + range(attn_scores_rank - len(self._attention_axes), attn_scores_rank)) + self._softmax = Softmax( + axis=norm_axes) if tf.__version__ >= '2.0' else MaskedSoftmax( + axis=norm_axes) + self._dropout_layer = Dropout(rate=self._dropout) + self._inverse_sqrt_key_dim = 1.0 / math.sqrt(float(self._key_dim)) + + def _masked_softmax(self, attention_scores, attention_mask=None): + # Normalize the attention scores to probabilities. + # attention_scores = [B, N, T, S] + if attention_mask is not None: + # The expand dim happens starting from the `num_heads` dimension, + # (, num_heads, ) + mask_expansion_axis = -len(self._attention_axes) * 2 - 1 + for _ in range(len(attention_scores.shape) - len(attention_mask.shape)): + attention_mask = tf.expand_dims( + attention_mask, axis=mask_expansion_axis) + return self._softmax(attention_scores, mask=attention_mask) + + def _compute_attention(self, + query, + key, + value, + attention_mask=None, + training=None): + """Applies Dot-product attention with query, key, value tensors. + + This function defines the computation inside `call` with projected + multi-head Q, K, V inputs. Users can override this function for + customized attention implementation. + + Args: + query: Projected query tensor of shape `(B, T, N, key_dim)`. + key: Projected key tensor of shape `(B, S, N, key_dim)`. + value: Projected value tensor of shape `(B, S, N, value_dim)`. + attention_mask: a boolean mask of shape `(B, T, S)`, that prevents + attention to certain positions. It is generally not needed if + the `query` and `value` (and/or `key`) are masked. + training: Python boolean indicating whether the layer should behave + in training mode (adding dropout) or in inference mode (doing + nothing). + + Returns: + attention_output: Multi-headed outputs of attention computation. + attention_scores: Multi-headed attention weights. + """ + # Note: Applying scalar multiply at the smaller end of einsum improves + # XLA performance, but may introduce slight numeric differences in + # the Transformer attention head. + query = tf.multiply(query, tf.cast(self._inverse_sqrt_key_dim, query.dtype)) + + # Take the dot product between "query" and "key" to get the raw + # attention scores. + attention_scores = tf.einsum(self._dot_product_equation, key, query) + + attention_scores = self._masked_softmax(attention_scores, attention_mask) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + if self.dropout: + final_attn_scores = self._dropout_layer( + attention_scores, training=training) + else: + final_attn_scores = attention_scores + + # `context_layer` = [B, T, N, H] + attention_output = tf.einsum(self._combine_equation, final_attn_scores, + value) + return attention_output, attention_scores + + def call(self, inputs, mask=None, training=None, **kwargs): + assert isinstance( + inputs, (tuple, list)), 'inputs of MultiHeadAttention must be a list' + query, value, key = (list(inputs) + [None] * 2)[:3] + if key is None: + key = value + if mask is None: + masks = [None] * 4 + elif type(mask) in (list, tuple): + masks = (list(mask) + [None] * 4)[:4] + else: + masks = ([mask] + [None] * 3)[:4] + query_mask, value_mask, key_mask, attention_mask = masks + if attention_mask is None and value_mask is None: + value_mask = query_mask + attention_mask = self._compute_attention_mask( + query, + value, + query_mask=query_mask, + value_mask=value_mask, + key_mask=key_mask, + attention_mask=attention_mask, + use_causal_mask=self._use_causal_mask, + ) + + # N = `num_attention_heads` + # H = `size_per_head` + # `query` = [B, T, N ,H] + query = self._query_dense(query) + + # `key` = [B, S, N, H] + key = self._key_dense(key) + + # `value` = [B, S, N, H] + value = self._value_dense(value) + attention_output, attention_scores = self._compute_attention( + query, key, value, attention_mask, training) + attention_output = self._output_dense(attention_output) + if self._return_attention_scores: + return attention_output, attention_scores + return attention_output + + def _compute_attention_mask( + self, + query, + value, + query_mask=None, + value_mask=None, + key_mask=None, + attention_mask=None, + use_causal_mask=False, + ): + """Computes the attention mask, using the Keras masks of the inputs. + + * The `query`'s mask is reshaped from [B, T] to [B, T, 1]. + * The `value`'s mask is reshaped from [B, S] to [B, 1, S]. + * The `key`'s mask is reshaped from [B, S] to [B, 1, S]. The `key`'s + mask is ignored if `key` is `None` or if `key is value`. + * If `use_causal_mask=True`, then the causal mask is computed. Its shape + is [1, T, S]. + + All defined masks are merged using a logical AND operation (`&`). + + In general, if the `query` and `value` are masked, then there is no need + to define the `attention_mask`. + + Args: + query: Projected query tensor of shape `(B, T, N, key_dim)`. + value: Projected value tensor of shape `(B, T, N, value_dim)`. + attention_mask: a boolean mask of shape `(B, T, S)`, that prevents + attention to certain positions. + use_causal_mask: A boolean to indicate whether to apply a causal + mask to prevent tokens from attending to future tokens (e.g., + used in a decoder Transformer). + + Returns: + attention_mask: a boolean mask of shape `(B, T, S)`, that prevents + attention to certain positions, based on the Keras masks of the + `query`, `key`, `value`, and `attention_mask` tensors, and the + causal mask if `use_causal_mask=True`. + """ + auto_mask = None + if query_mask is not None: + query_mask = tf.cast(query_mask, tf.bool) # defensive casting + # B = batch size, T = max query length + auto_mask = tf.expand_dims(query_mask, -1) # shape is [B, T, 1] + if value_mask is not None: + value_mask = tf.cast(value_mask, tf.bool) # defensive casting + # B = batch size, S == max value length + mask = tf.expand_dims(value_mask, -2) # shape is [B, 1, S] + auto_mask = mask if auto_mask is None else auto_mask & mask + if key_mask is not None: + key_mask = tf.cast(key_mask, tf.bool) # defensive casting + # B == batch size, S == max key length == max value length + mask = tf.expand_dims(key_mask, -2) # shape is [B, 1, S] + auto_mask = mask if auto_mask is None else auto_mask & mask + if use_causal_mask: + # the shape of the causal mask is [1, T, S] + mask = self._compute_causal_mask(query, value) + auto_mask = mask if auto_mask is None else auto_mask & mask + if auto_mask is not None: + # merge attention_mask & automatic mask, to shape [B, T, S] + attention_mask = ( + auto_mask if attention_mask is None else + tf.cast(attention_mask, tf.bool) & auto_mask) + return attention_mask + + def _compute_causal_mask(self, query, value=None): + """Computes a causal mask (e.g., for masked self-attention layers). + + For example, if query and value both contain sequences of length 4, + this function returns a boolean tensor equal to: + + ``` + [[[True, False, False, False], + [True, True, False, False], + [True, True, True, False], + [True, True, True, True]]] + ``` + + Args: + query: query tensor of shape `(B, T, ...)`. + value: value tensor of shape `(B, S, ...)` (optional, defaults to + query). + + Returns: + mask: a boolean tensor of shape `(1, T, S)` containing a lower + triangular matrix of shape `(T, S)`. + """ + q_seq_length = tf.shape(query)[1] + v_seq_length = q_seq_length if value is None else tf.shape(value)[1] + ones_mask = tf.ones((1, q_seq_length, v_seq_length), dtype='int32') + row_index = tf.cumsum(ones_mask, axis=-2) + col_index = tf.cumsum(ones_mask, axis=-1) + return tf.greater_equal(row_index, col_index) + + def compute_output_shape(self, input_shape): + if len(input_shape) == 3: + query_shape, value_shape, key_shape = input_shape + elif len(input_shape) == 2: + query_shape, value_shape = input_shape + key_shape = None + else: + raise ValueError('invalid input shape of MultiHeadAttention') + if key_shape is None: + key_shape = value_shape + + if query_shape[-1] != value_shape[-1]: + raise ValueError( + 'The last dimension of `query_shape` and `value_shape` ' + 'must be equal, but are {query_last_dim}, {value_last_dim}. ' + 'Received: query_shape={query_shape}, value_shape={value_shape}' + .format( + query_shape=query_shape, + value_shape=value_shape, + query_last_dim=query_shape[-1], + value_last_dim=value_shape[-1])) + + if value_shape[1:-1] != key_shape[1:-1]: + raise ValueError( + 'All dimensions of `value` and `key`, except the last one, ' + 'must be equal. Received: value_shape={value_shape} and ' + 'key_shape={key_shape}'.format( + key_shape=key_shape, value_shape=value_shape)) + + if self._output_shape: + if hasattr(self._output_dense, '__len__'): + return query_shape[:-1] + self._output_shape + else: + return query_shape[:-1] + [self._output_shape] + + return query_shape + + +def _index_to_einsum_variable(i): + """Coverts an index to a einsum variable name. + + We simply map indices to lowercase characters, e.g. 0 -> 'a', 1 -> 'b'. + """ + return string.ascii_lowercase[i] + + +def _build_attention_equation(rank, attn_axes): + """Builds einsum equations for the attention computation. + + Query, key, value inputs after projection are expected to have the shape as: + `(bs, , , num_heads, channels)`. + `bs` and `` are treated as ``. + + The attention operations can be generalized: + 1. Query-key dot product: + (, , num_heads, channels), + (, , num_heads, channels) -> + (, num_heads, , ) + 2. Combination: + (, num_heads, , ), + (, , num_heads, channels) -> (, , num_heads, channels) + + Args: + rank: Rank of query, key, value tensors. + attn_axes: List/tuple of axes, `[-1, rank)`, + that attention will be applied to. + + Returns: + Einsum equations. + """ + target_notation = '' + for i in range(rank): + target_notation += _index_to_einsum_variable(i) + # `batch_dims` includes the head dim. + batch_dims = tuple(np.delete(range(rank), attn_axes + (rank - 1,))) + letter_offset = rank + source_notation = '' + for i in range(rank): + if i in batch_dims or i == rank - 1: + source_notation += target_notation[i] + else: + source_notation += _index_to_einsum_variable(letter_offset) + letter_offset += 1 + + product_notation = ''.join([target_notation[i] for i in batch_dims] + + [target_notation[i] for i in attn_axes] + + [source_notation[i] for i in attn_axes]) + dot_product_equation = '%s,%s->%s' % ( + source_notation, + target_notation, + product_notation, + ) + attn_scores_rank = len(product_notation) + combine_equation = '%s,%s->%s' % ( + product_notation, + source_notation, + target_notation, + ) + return dot_product_equation, combine_equation, attn_scores_rank + + +def _build_proj_equation(free_dims, bound_dims, output_dims): + """Builds an einsum equation for projections inside multi-head attention.""" + input_str = '' + kernel_str = '' + output_str = '' + bias_axes = '' + letter_offset = 0 + for i in range(free_dims): + char = _index_to_einsum_variable(i + letter_offset) + input_str += char + output_str += char + + letter_offset += free_dims + for i in range(bound_dims): + char = _index_to_einsum_variable(i + letter_offset) + input_str += char + kernel_str += char + + letter_offset += bound_dims + for i in range(output_dims): + char = _index_to_einsum_variable(i + letter_offset) + kernel_str += char + output_str += char + bias_axes += char + equation = '{input_str},{kernel_str}->{output_str}'.format( + input_str=input_str, kernel_str=kernel_str, output_str=output_str) + return equation, bias_axes, len(output_str) + + +def _get_output_shape(output_rank, known_last_dims): + return [None] * (output_rank - len(known_last_dims)) + list(known_last_dims) + + # def __init__(self, params, name='multi_head_attention', reuse=None, **kwargs): + # super(MultiHeadAttention, self).__init__(name=name, **kwargs) + # self.num_heads = params.num_attention_heads + # self.d_model = params.hidden_size + # if self.d_model % self.num_heads != 0: + # raise ValueError( + # 'The hidden size (%d) is not a multiple of the number of attention ' + # 'heads (%d)' % (self.d_model, self.num_heads)) + # self.depth = self.d_model // self.num_heads + # self.wq = Dense(self.d_model) + # self.wk = Dense(self.d_model) + # self.wv = Dense(self.d_model) + # self.dense = Dense(self.d_model) + # att_params = Parameter.make_from_pb(params.attention) + # self.attention = Attention(att_params, 'scaled_dot_product_attention') + # + # # def split_heads(self, x, batch_size): + # # x = tf.reshape(x, (batch_size, -1, self.num_heads, self.depth)) + # # return tf.transpose(x, perm=[0, 2, 1, 3]) + # + # def call(self, inputs, training=None, **kwargs): + # q, v, k, mask = inputs + # batch_size = tf.shape(q)[0] + # + # q = self.wq(q) + # k = self.wk(k) + # v = self.wv(v) + # + # # q = self.split_heads(q, batch_size) + # # k = self.split_heads(k, batch_size) + # # v = self.split_heads(v, batch_size) + # + # attn = self.attention([q, v, k], mask=[mask, mask], training=training) + # return_attn_score = self.attention.return_attention_scores + # attention, attention_scores = attn if return_attn_score else attn, None + # + # # attention = tf.transpose(attention, perm=[0, 2, 1, 3]) + # # attention = tf.reshape(attention, (batch_size, -1, self.d_model)) + # output = self.dense(attention) + # if return_attn_score: + # return output, attention_scores + # return output diff --git a/easy_rec/python/layers/keras/numerical_embedding.py b/easy_rec/python/layers/keras/numerical_embedding.py index a5205dfed..1b37bcf83 100644 --- a/easy_rec/python/layers/keras/numerical_embedding.py +++ b/easy_rec/python/layers/keras/numerical_embedding.py @@ -1,11 +1,41 @@ # -*- encoding:utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +import logging import math +import os import tensorflow as tf +from tensorflow.python.keras.layers import Layer +from easy_rec.python.compat.array_ops import repeat from easy_rec.python.utils.activation import get_activation +curr_dir, _ = os.path.split(__file__) +parent_dir = os.path.dirname(curr_dir) +ops_idr = os.path.dirname(parent_dir) +ops_dir = os.path.join(ops_idr, 'ops') +if 'PAI' in tf.__version__: + ops_dir = os.path.join(ops_dir, '1.12_pai') +elif tf.__version__.startswith('1.12'): + ops_dir = os.path.join(ops_dir, '1.12') +elif tf.__version__.startswith('1.15'): + if 'IS_ON_PAI' in os.environ: + ops_dir = os.path.join(ops_dir, 'DeepRec') + else: + ops_dir = os.path.join(ops_dir, '1.15') +elif tf.__version__.startswith('2.12'): + ops_dir = os.path.join(ops_dir, '2.12') + +logging.info('ops_dir is %s' % ops_dir) +custom_op_path = os.path.join(ops_dir, 'libcustom_ops.so') +try: + custom_ops = tf.load_op_library(custom_op_path) + logging.info('load custom op from %s succeed' % custom_op_path) +except Exception as ex: + logging.warning('load custom op from %s failed: %s' % + (custom_op_path, str(ex))) + custom_ops = None + if tf.__version__ >= '2.0': tf = tf.compat.v1 @@ -84,7 +114,7 @@ def __call__(self, x, *args, **kwargs): return x -class PeriodicEmbedding(tf.keras.layers.Layer): +class PeriodicEmbedding(Layer): """Periodic embeddings for numerical features described in [1]. References: @@ -157,7 +187,7 @@ def call(self, inputs, **kwargs): return output -class AutoDisEmbedding(tf.keras.layers.Layer): +class AutoDisEmbedding(Layer): """An Embedding Learning Framework for Numerical Features in CTR Prediction. Refer: https://arxiv.org/pdf/2012.08986v2.pdf @@ -210,3 +240,95 @@ def call(self, inputs, **kwargs): if self.output_3d_tensor: return output, emb return output + + +class NaryDisEmbedding(Layer): + """Numerical Feature Representation with Hybrid 𝑁 -ary Encoding, CIKM 2022.. + + Refer: https://dl.acm.org/doi/pdf/10.1145/3511808.3557090 + """ + + def __init__(self, params, name='nary_dis_embedding', reuse=None, **kwargs): + super(NaryDisEmbedding, self).__init__(name=name, **kwargs) + self.reuse = reuse + self.nary_carry = custom_ops.nary_carry + params.check_required(['embedding_dim', 'carries']) + self.emb_dim = int(params.embedding_dim) + self.carries = params.get_or_default('carries', [2, 9]) + self.lengths = list(map(self.max_length, self.carries)) + self.vocab_size = int(sum(self.lengths)) + self.multiplier = params.get_or_default('multiplier', 1.0) + self.intra_ary_pooling = params.get_or_default('intra_ary_pooling', 'sum') + self.inter_ary_pooling = params.get_or_default('inter_ary_pooling', + 'concat') + self.output_3d_tensor = params.get_or_default('output_3d_tensor', False) + logging.info( + '{} carries: {}, lengths: {}, vocab_size: {}, intra_ary: {}, inter_ary: {}, multiplier: {}' + .format(self.name, ','.join(map(str, self.carries)), + ','.join(map(str, self.lengths)), self.vocab_size, + self.intra_ary_pooling, self.inter_ary_pooling, + self.multiplier)) + + @staticmethod + def max_length(carry): + bits = math.log(4294967295, carry) + return (math.floor(bits) + 1) * carry + + def build(self, input_shape): + assert isinstance(input_shape, + tf.TensorShape), 'NaryDisEmbedding only takes 1 input' + self.num_features = int(input_shape[-1]) + logging.info('%s has %d input features', self.name, self.num_features) + vocab_size = self.num_features * self.vocab_size + self.embedding_table = self.add_weight( + 'embed_table', + shape=[vocab_size, self.emb_dim], + initializer='he_uniform', + dtype=tf.float32, + trainable=True) + super(NaryDisEmbedding, self).build(input_shape) + + def call(self, inputs, **kwargs): + if inputs.shape.ndims != 2: + raise ValueError('inputs of NaryDisEmbedding must have 2 dimensions.') + if self.multiplier != 1.0: + inputs *= self.multiplier + inputs = tf.to_int32(inputs) + offset, emb_indices, emb_splits = 0, [], [] + for carry, length in zip(self.carries, self.lengths): + values, splits = self.nary_carry(inputs, carry=carry, offset=offset) + offset += length + emb_indices.append(values) + emb_splits.append(splits) + indices = tf.concat(emb_indices, axis=0) + splits = tf.concat(emb_splits, axis=0) + # embedding shape: [B*N*C, D] + embedding = tf.nn.embedding_lookup(self.embedding_table, indices) + + total_length = tf.size(splits) + if self.intra_ary_pooling == 'sum': + segment_ids = repeat(tf.range(total_length), repeats=splits) + embedding = tf.math.segment_sum(embedding, segment_ids) + elif self.intra_ary_pooling == 'mean': + segment_ids = repeat(tf.range(total_length), repeats=splits) + embedding = tf.math.segment_mean(embedding, segment_ids) + else: + raise ValueError('Unsupported intra ary pooling method %s' % + self.intra_ary_pooling) + + if self.inter_ary_pooling == 'concat': + embeddings = tf.split(embedding, len(self.carries)) + embedding = tf.concat(embeddings, axis=-1) # [B*N, C*D] + else: + raise ValueError('Unsupported inter ary pooling method %s' % + self.inter_ary_pooling) + if self.output_3d_tensor: + embedding = tf.reshape( + embedding, [-1, self.num_features, + len(self.carries) * self.emb_dim]) # [B, N, C*D] + else: + embedding = tf.reshape( + embedding, [-1, self.num_features * len(self.carries) * self.emb_dim + ]) # [B, N*C*D] + print('NaryDisEmbedding:', embedding) + return embedding diff --git a/easy_rec/python/layers/keras/transformer.py b/easy_rec/python/layers/keras/transformer.py new file mode 100644 index 000000000..d71a02831 --- /dev/null +++ b/easy_rec/python/layers/keras/transformer.py @@ -0,0 +1,192 @@ +# -*- encoding:utf-8 -*- +# Copyright (c) Alibaba, Inc. and its affiliates. +import logging + +import numpy as np +import tensorflow as tf +from tensorflow.python.keras.layers import Dense +from tensorflow.python.keras.layers import Dropout +from tensorflow.python.keras.layers import Embedding +from tensorflow.python.keras.layers import Layer + +from easy_rec.python.layers.keras import MultiHeadAttention +from easy_rec.python.layers.keras.layer_norm import LayerNormalization +from easy_rec.python.layers.utils import Parameter +from easy_rec.python.protos import seq_encoder_pb2 + + +class TransformerBlock(Layer): + """A transformer block combines multi-head attention and feed-forward networks with layer normalization and dropout. + + Purpose: Combines attention and feed-forward layers with residual connections and normalization. + Components: Multi-head attention, feed-forward network, dropout, and layer normalization. + Output: Enhanced representation after applying attention and feed-forward layers. + """ + + def __init__(self, params, name='transformer_block', reuse=None, **kwargs): + super(TransformerBlock, self).__init__(name=name, **kwargs) + d_model = params.hidden_size + num_heads = params.num_attention_heads + mha_cfg = seq_encoder_pb2.MultiHeadAttention() + mha_cfg.num_heads = num_heads + mha_cfg.key_dim = d_model // num_heads + mha_cfg.dropout = params.get_or_default('attention_probs_dropout_prob', 0.0) + mha_cfg.return_attention_scores = False + args = Parameter.make_from_pb(mha_cfg) + self.mha = MultiHeadAttention(args, 'multi_head_attn') + dropout_rate = params.get_or_default('hidden_dropout_prob', 0.1) + ffn_units = params.get_or_default('intermediate_size', d_model) + ffn_act = params.get_or_default('hidden_act', 'relu') + self.ffn_dense1 = Dense(ffn_units, activation=ffn_act) + self.ffn_dense2 = Dense(d_model) + if tf.__version__ >= '2.0': + self.layer_norm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6) + self.layer_norm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6) + else: + self.layer_norm1 = LayerNormalization(epsilon=1e-6) + self.layer_norm2 = LayerNormalization(epsilon=1e-6) + self.dropout1 = Dropout(dropout_rate) + self.dropout2 = Dropout(dropout_rate) + + def call(self, inputs, training=None, **kwargs): + x, mask = inputs + attn_output = self.mha([x, x, x], mask=mask, training=training) + attn_output = self.dropout1(attn_output, training=training) + out1 = self.layer_norm1(x + attn_output) + ffn_mid = self.ffn_dense1(out1) + ffn_output = self.ffn_dense2(ffn_mid) + ffn_output = self.dropout2(ffn_output, training=training) + out2 = self.layer_norm2(out1 + ffn_output) + return out2 + + +# Positional Encoding, https://www.tensorflow.org/text/tutorials/transformer +def positional_encoding(length, depth): + depth = depth / 2 + positions = np.arange(length)[:, np.newaxis] # (seq, 1) + depths = np.arange(depth)[np.newaxis, :] / depth # (1, depth) + angle_rates = 1 / (10000**depths) # (1, depth) + angle_rads = positions * angle_rates # (pos, depth) + pos_encoding = np.concatenate( + [np.sin(angle_rads), np.cos(angle_rads)], axis=-1) + return tf.cast(pos_encoding, dtype=tf.float32) + + +class PositionalEmbedding(Layer): + + def __init__(self, vocab_size, d_model, max_position, name='pos_embedding'): + super(PositionalEmbedding, self).__init__(name=name) + self.d_model = d_model + self.embedding = Embedding(vocab_size, d_model) + self.pos_encoding = positional_encoding(length=max_position, depth=d_model) + + def call(self, x, training=None): + length = tf.shape(x)[1] + x = self.embedding(x) + # This factor sets the relative scale of the embedding and positional_encoding. + x *= tf.math.sqrt(tf.cast(self.d_model, tf.float32)) + x = x + self.pos_encoding[tf.newaxis, :length, :] + return x + + +class TransformerEncoder(Layer): + """The encoder consists of a stack of encoder layers. + + It converts the input sequence into a set of embeddings enriched with positional information. + Purpose: Encodes the input sequence into a set of embeddings. + Components: Embedding layer, positional encoding, and a stack of transformer blocks. + Output: Encoded representation of the input sequence. + """ + + def __init__(self, params, name='transformer_encoder', reuse=None, **kwargs): + super(TransformerEncoder, self).__init__(name=name, **kwargs) + d_model = params.hidden_size + dropout_rate = params.get_or_default('hidden_dropout_prob', 0.1) + max_position = params.get_or_default('max_position_embeddings', 512) + num_layers = params.get_or_default('num_hidden_layers', 1) + vocab_size = params.vocab_size + logging.info('vocab size of TransformerEncoder(%s) is %d', name, vocab_size) + self.output_all = params.get_or_default('output_all_token_embeddings', True) + self.pos_encoding = PositionalEmbedding(vocab_size, d_model, max_position) + self.dropout = Dropout(dropout_rate) + self.enc_layers = [ + TransformerBlock(params, 'layer_%d' % i) for i in range(num_layers) + ] + self._vocab_size = vocab_size + self._max_position = max_position + + @property + def vocab_size(self): + return self._vocab_size + + @property + def max_position(self): + return self._max_position + + def call(self, inputs, training=None, **kwargs): + x, mask = inputs + # `x` is token-IDs shape: (batch, seq_len) + x = self.pos_encoding(x) # Shape `(batch_size, seq_len, d_model)`. + x = self.dropout(x, training=training) + for block in self.enc_layers: + x = block([x, mask], training) + # x Shape `(batch_size, seq_len, d_model)`. + return x if self.output_all else x[:, 0, :] + + +class TextEncoder(Layer): + + def __init__(self, params, name='text_encoder', reuse=None, **kwargs): + super(TextEncoder, self).__init__(name=name, **kwargs) + self.separator = params.get_or_default('separator', ' ') + self.cls_token = '[CLS]' + self.separator + self.sep_token = self.separator + '[SEP]' + self.separator + params.transformer.output_all_token_embeddings = False + trans_params = Parameter.make_from_pb(params.transformer) + vocab_file = params.get_or_default('vocab_file', None) + self.vocab = None + self.default_token_id = params.get_or_default('default_token_id', 0) + if vocab_file is not None: + self.vocab = tf.feature_column.categorical_column_with_vocabulary_file( + 'tokens', + vocabulary_file=vocab_file, + default_value=self.default_token_id) + logging.info('vocab file of TextEncoder(%s) is %s', name, vocab_file) + trans_params.vocab_size = self.vocab.vocabulary_size + self.encoder = TransformerEncoder(trans_params, name='transformer') + + def call(self, inputs, training=None, **kwargs): + if type(inputs) not in (tuple, list): + inputs = [inputs] + inputs = [tf.squeeze(text) for text in inputs] + batch_size = tf.shape(inputs[0]) + cls = tf.fill(batch_size, self.cls_token) + sep = tf.fill(batch_size, self.sep_token) + sentences = [cls] + for sentence in inputs: + sentences.append(sentence) + sentences.append(sep) + text = tf.strings.join(sentences) + tokens = tf.strings.split(text, self.separator) + if self.vocab is not None: + features = {'tokens': tokens} + token_ids = self.vocab._transform_feature(features) + token_ids = tf.sparse.to_dense( + token_ids, default_value=self.default_token_id, name='token_ids') + length = tf.shape(token_ids)[-1] + token_ids = tf.cond( + tf.less_equal(length, self.encoder.max_position), lambda: token_ids, + lambda: tf.slice(token_ids, [0, 0], [-1, self.encoder.max_position])) + mask = tf.not_equal(token_ids, self.default_token_id, name='mask') + else: + tokens = tf.sparse.to_dense(tokens, default_value='') + length = tf.shape(tokens)[-1] + tokens = tf.cond( + tf.less_equal(length, self.encoder.max_position), lambda: tokens, + lambda: tf.slice(tokens, [0, 0], [-1, self.encoder.max_position])) + token_ids = tf.string_to_hash_bucket_fast( + tokens, self.encoder.vocab_size, name='token_ids') + mask = tf.not_equal(tokens, '', name='mask') + + encoding = self.encoder([token_ids, mask], training=training) + return encoding diff --git a/easy_rec/python/layers/utils.py b/easy_rec/python/layers/utils.py index 8d1094465..7eb86b791 100644 --- a/easy_rec/python/layers/utils.py +++ b/easy_rec/python/layers/utils.py @@ -163,6 +163,10 @@ def mark_input_src(name, src_desc): def is_proto_message(pb_obj, field): + if not hasattr(pb_obj, 'DESCRIPTOR'): + return False + if field not in pb_obj.DESCRIPTOR.fields_by_name: + return False field_type = pb_obj.DESCRIPTOR.fields_by_name[field].type return field_type == FieldDescriptor.TYPE_MESSAGE @@ -199,7 +203,6 @@ def __getattr__(self, key): return Parameter(value, True, self._l2_reg) else: return value - value = getattr(self.params, key) if is_proto_message(self.params, key): return Parameter(value, False, self._l2_reg) @@ -220,12 +223,14 @@ def get_or_default(self, key, def_val): return def_val else: # pb message value = getattr(self.params, key, def_val) - if hasattr(value, '__len__'): - if len(value) > 0: + if hasattr(value, '__len__'): # repeated + return value if len(value) > 0 else def_val + try: + if self.params.HasField(key): return value - elif self.params.HasField(key): - return value - return def_val + except ValueError: + pass + return def_val # maybe not equal to the default value of msg field def check_required(self, keys): if not self.is_struct: diff --git a/easy_rec/python/loss/pairwise_loss.py b/easy_rec/python/loss/pairwise_loss.py index 5b48f8dff..604f1ce2e 100644 --- a/easy_rec/python/loss/pairwise_loss.py +++ b/easy_rec/python/loss/pairwise_loss.py @@ -42,7 +42,7 @@ def pairwise_loss(labels, pairwise_logits = tf.math.subtract( tf.expand_dims(logits, -1), tf.expand_dims(logits, 0)) - margin pairwise_mask = tf.greater( - tf.expand_dims(labels, -1) - tf.expand_dims(labels, 0), 0) + tf.expand_dims(labels, -1), tf.expand_dims(labels, 0)) if session_ids is not None: logging.info('[%s] use session ids' % loss_name) group_equal = tf.equal( @@ -91,7 +91,7 @@ def pairwise_focal_loss(labels, pairwise_logits = tf.expand_dims(logits, -1) - tf.expand_dims(logits, 0) pairwise_mask = tf.greater( - tf.expand_dims(labels, -1) - tf.expand_dims(labels, 0), 0) + tf.expand_dims(labels, -1), tf.expand_dims(labels, 0)) if hinge_margin is not None: hinge_mask = tf.less(pairwise_logits, hinge_margin) pairwise_mask = tf.logical_and(pairwise_mask, hinge_mask) @@ -134,7 +134,7 @@ def pairwise_logistic_loss(labels, ohem_ratio=1.0, use_label_margin=False, name=''): - r"""Computes pairwise logistic loss between `labels` and `logits`. + r"""Computes pairwise logistic loss between `labels` and `logits`, equivalent to RankNet loss. Definition: $$ @@ -146,7 +146,8 @@ def pairwise_logistic_loss(labels, labels: A `Tensor` of the same shape as `logits` representing graded relevance. logits: A `Tensor` with shape [batch_size]. - session_ids: a `Tensor` with shape [batch_size]. Session ids of each sample, used to max GAUC metric. e.g. user_id + session_ids: a `Tensor` with shape [batch_size]. Session ids of each + sample, used to max GAUC metric. e.g. user_id temperature: (Optional) The temperature to use for scaling the logits. hinge_margin: the margin between positive and negative logits weights: A scalar, a `Tensor` with shape [batch_size] for each sample @@ -163,23 +164,23 @@ def pairwise_logistic_loss(labels, logits /= temperature if use_label_margin: labels /= temperature + pairwise_logits = tf.math.subtract( tf.expand_dims(logits, -1), tf.expand_dims(logits, 0)) - pairwise_labels = tf.math.subtract( - tf.expand_dims(labels, -1), tf.expand_dims(labels, 0)) + if use_label_margin: + pairwise_logits -= tf.math.subtract( + tf.expand_dims(labels, -1), tf.expand_dims(labels, 0)) + elif hinge_margin is not None: + pairwise_logits -= hinge_margin - pairwise_mask = tf.greater(pairwise_labels, 0) - if hinge_margin is not None: - hinge_mask = tf.less(pairwise_logits, hinge_margin) - pairwise_mask = tf.logical_and(pairwise_mask, hinge_mask) + pairwise_mask = tf.greater( + tf.expand_dims(labels, -1), tf.expand_dims(labels, 0)) if session_ids is not None: logging.info('[%s] use session ids' % loss_name) group_equal = tf.equal( tf.expand_dims(session_ids, -1), tf.expand_dims(session_ids, 0)) pairwise_mask = tf.logical_and(pairwise_mask, group_equal) - if use_label_margin: - pairwise_logits -= pairwise_labels pairwise_logits = tf.boolean_mask(pairwise_logits, pairwise_mask) num_pair = tf.size(pairwise_logits) tf.summary.scalar('loss/%s_num_of_pairs' % loss_name, num_pair) diff --git a/easy_rec/python/model/multi_task_model.py b/easy_rec/python/model/multi_task_model.py index 6361138bf..d792d3131 100644 --- a/easy_rec/python/model/multi_task_model.py +++ b/easy_rec/python/model/multi_task_model.py @@ -4,7 +4,6 @@ from collections import OrderedDict import tensorflow as tf -from google.protobuf import struct_pb2 from tensorflow.python.keras.layers import Dense from easy_rec.python.builders import loss_builder @@ -12,6 +11,7 @@ from easy_rec.python.layers.keras.attention import Attention from easy_rec.python.layers.utils import Parameter from easy_rec.python.model.rank_model import RankModel +from easy_rec.python.protos import seq_encoder_pb2 from easy_rec.python.protos import tower_pb2 from easy_rec.python.protos.easy_rec_model_pb2 import EasyRecModel from easy_rec.python.protos.loss_pb2 import LossType @@ -103,9 +103,9 @@ def build_predict_graph(self): queries = tf.stack([Dense(dim)(x) for x in tower_inputs], axis=1) keys = tf.stack([Dense(dim)(x) for x in tower_inputs], axis=1) values = tf.stack([Dense(dim)(x) for x in tower_inputs], axis=1) - st_params = struct_pb2.Struct() - st_params.update({'scale_by_dim': True}) - params = Parameter(st_params, True) + attn_cfg = seq_encoder_pb2.Attention() + attn_cfg.use_scale = True + params = Parameter.make_from_pb(attn_cfg) attention_layer = Attention(params, name='AITM_%s' % tower_name) result = attention_layer([queries, values, keys]) relation_fea = result[:, 0, :] @@ -239,6 +239,16 @@ def build_loss_graph(self): task_tower_cfg.in_task_space_weight * in_task_space + task_tower_cfg.out_task_space_weight * (1 - in_task_space)) + if task_tower_cfg.HasField('task_space_indicator_name') and \ + task_tower_cfg.HasField('task_space_indicator_value'): + in_task_space = tf.to_float( + tf.equal( + self._feature_dict[task_tower_cfg.task_space_indicator_name], + task_tower_cfg.task_space_indicator_value)) + loss_weight = loss_weight * ( + task_tower_cfg.in_task_space_weight * in_task_space + + task_tower_cfg.out_task_space_weight * (1 - in_task_space)) + task_loss_weight = task_loss_weights[tower_name] loss_dict = {} losses = task_tower_cfg.losses diff --git a/easy_rec/python/ops/1.12/libcustom_ops.so b/easy_rec/python/ops/1.12/libcustom_ops.so index ee2e093224ca96293259de7b7828f924e71b6ca4..9014d3c9b1e3037f4d09e6df16e9d9e321248032 100755 GIT binary patch delta 183256 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 NiaRxiHzzx8`5(XQpWFZd delta 167442 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%0An*$h1T4v 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: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 MC4cT@5v`r_e~zEbJpcdz delta 167204 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�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 Qa8EnQHXj$oquuoX0XJ~&Z~y=R diff --git a/easy_rec/python/protos/backbone.proto b/easy_rec/python/protos/backbone.proto index 8bf5fd7cc..b86da78ec 100644 --- a/easy_rec/python/protos/backbone.proto +++ b/easy_rec/python/protos/backbone.proto @@ -20,6 +20,13 @@ message InputLayer { message RawInputLayer { } +message EmbeddingLayer { + required uint32 embedding_dim = 1; + optional uint32 vocab_size = 2; + optional string combiner = 3 [default = 'weight']; + optional bool concat = 4 [default = true]; +} + message Lambda { required string expression = 1; } @@ -82,6 +89,7 @@ message Block { RecurrentLayer recurrent = 104; RepeatLayer repeat = 105; RawInputLayer raw_input = 106; + EmbeddingLayer embedding_layer = 107; } } @@ -91,8 +99,10 @@ message BlockPackage { required string name = 1; // a few blocks generating a DAG repeated Block blocks = 2; - // the names of output blocks + // the names of output blocks, will be merge into a tensor repeated string concat_blocks = 3; + // the names of output blocks, return as a list or single tensor + repeated string output_blocks = 4; } message BackboneTower { @@ -100,8 +110,10 @@ message BackboneTower { repeated BlockPackage packages = 1; // a few blocks generating a DAG repeated Block blocks = 2; - // the names of output blocks + // the names of output blocks, will be merge into a tensor repeated string concat_blocks = 3; + // the names of output blocks, return as a list or single tensor + repeated string output_blocks = 4; // optional top mlp layer - optional MLP top_mlp = 4; + optional MLP top_mlp = 5; } diff --git a/easy_rec/python/protos/keras_layer.proto b/easy_rec/python/protos/keras_layer.proto index d9b8b2e11..8a12207a4 100644 --- a/easy_rec/python/protos/keras_layer.proto +++ b/easy_rec/python/protos/keras_layer.proto @@ -13,6 +13,7 @@ message KerasLayer { google.protobuf.Struct st_params = 2; PeriodicEmbedding periodic_embedding = 3; AutoDisEmbedding auto_dis_embedding = 4; + NaryDisEmbedding nary_dis_embedding = 21; FM fm = 5; MaskBlock mask_block = 6; MaskNet masknet = 7; @@ -29,5 +30,9 @@ message KerasLayer { HighWayTower highway = 18; OverlapFeature overlap = 19; MappedDotProduct dot_product = 20; + Attention attention = 22; + MultiHeadAttention multi_head_attention = 23; + Transformer transformer = 24; + TextEncoder text_encoder = 25; } } diff --git a/easy_rec/python/protos/layer.proto b/easy_rec/python/protos/layer.proto index 63f32a85a..a76dfce34 100644 --- a/easy_rec/python/protos/layer.proto +++ b/easy_rec/python/protos/layer.proto @@ -30,6 +30,15 @@ message AutoDisEmbedding { optional bool output_tensor_list = 6; } +message NaryDisEmbedding { + required uint32 embedding_dim = 1; + repeated uint32 carries = 2; + optional float multiplier = 3 [default = 1.0]; + optional string intra_ary_pooling = 4 [default = 'sum']; + optional string inter_ary_pooling = 5 [default = 'concat']; + optional bool output_3d_tensor = 6 [default = false]; +} + message SENet { required uint32 reduction_ratio = 1 [default = 4]; optional uint32 num_squeeze_group = 2 [default = 2]; diff --git a/easy_rec/python/protos/seq_encoder.proto b/easy_rec/python/protos/seq_encoder.proto index 54ebd306f..2edf71fa3 100644 --- a/easy_rec/python/protos/seq_encoder.proto +++ b/easy_rec/python/protos/seq_encoder.proto @@ -4,6 +4,65 @@ package protos; import "easy_rec/python/protos/dnn.proto"; +message Attention { + optional bool use_scale = 1 [default = false]; + optional bool scale_by_dim = 2 [default = false]; + optional string score_mode = 3 [default = 'dot']; + optional float dropout = 4 [default = 0.0]; + optional int32 seed = 5; + optional bool return_attention_scores = 6 [default = false]; + optional bool use_causal_mask = 7 [default = false]; +} + +message MultiHeadAttention { + required uint32 num_heads = 1; + required uint32 key_dim = 2; + optional uint32 value_dim = 3; + optional float dropout = 4 [default = 0.0]; + optional bool use_bias = 5 [default = true]; + optional bool return_attention_scores = 6 [default = false]; + optional bool use_causal_mask = 7 [default = false]; + // The expected shape of an output tensor, besides the batch + // and sequence dims. If not specified, projects back to the query + // feature dim (the query input's last dimension). + optional uint32 output_shape = 8; + // axes over which the attention is applied. + repeated int32 attention_axes = 9; + optional string kernel_initializer = 10 [default = 'glorot_uniform']; + optional string bias_initializer = 11 [default = 'zeros']; +} + +message Transformer { + // Size of the encoder layers and the pooler layer + required uint32 hidden_size = 1; + // Number of hidden layers in the Transformer encoder + required uint32 num_hidden_layers = 2; + // Number of attention heads for each attention layer in the Transformer encoder + required uint32 num_attention_heads = 3; + // The size of the "intermediate" (i.e. feed-forward) layer in the Transformer encoder + required uint32 intermediate_size = 4; + // The non-linear activation function (function or string) in the encoder and pooler. + required string hidden_act = 5 [default = 'relu']; + // The dropout probability for all fully connected layers in the embeddings, encoder, and pooler + required float hidden_dropout_prob = 6 [default = 0.1]; + required uint32 vocab_size = 7; + // The maximum sequence length that this model might ever be used with + required uint32 max_position_embeddings = 8 [default = 512]; + // Whether to add position embeddings for the position of each token in the text sequence + required bool use_position_embeddings = 9 [default = false]; + // Whether to output all token embedding, if set to false, then only output the first token embedding + required bool output_all_token_embeddings = 10 [default = true]; + // The dropout ratio for the attention probabilities + optional float attention_probs_dropout_prob = 11 [default = 0.0]; +} + +message TextEncoder { + required Transformer transformer = 1; + required string separator = 2 [default = ' ']; + optional string vocab_file = 3; + optional int32 default_token_id = 4 [default = 0]; +} + message BSTEncoder { // Size of the encoder layers and the pooler layer required uint32 hidden_size = 1; diff --git a/easy_rec/python/protos/tower.proto b/easy_rec/python/protos/tower.proto index 14cf64c63..fcaedafcd 100644 --- a/easy_rec/python/protos/tower.proto +++ b/easy_rec/python/protos/tower.proto @@ -36,6 +36,10 @@ message TaskTower { repeated Loss losses = 13; // whether to use sample weight in this tower required bool use_sample_weight = 14 [default = true]; + // field name for indicating the sample space for this task + optional string task_space_indicator_name = 15; + // field value for indicating the sample space for this task + optional string task_space_indicator_value = 16; }; @@ -76,4 +80,8 @@ message BayesTaskTower { optional bool use_ait_module = 17 [default = false]; // set this when the dimensions of last layer of towers are not equal optional uint32 ait_project_dim = 18; + // field name for indicating the sample space for this task + optional string task_space_indicator_name = 19; + // field value for indicating the sample space for this task + optional string task_space_indicator_value = 20; }; diff --git a/easy_rec/version.py b/easy_rec/version.py index 2a148c007..f6722ee1a 100644 --- a/easy_rec/version.py +++ b/easy_rec/version.py @@ -1,4 +1,4 @@ # -*- encoding:utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. -__version__ = '0.8.2' +__version__ = '0.8.3' diff --git a/examples/configs/dlrm_on_criteo_with_narydis.config b/examples/configs/dlrm_on_criteo_with_narydis.config new file mode 100644 index 000000000..469734c23 --- /dev/null +++ b/examples/configs/dlrm_on_criteo_with_narydis.config @@ -0,0 +1,586 @@ +train_input_path: "examples/data/criteo/criteo_train_data" +eval_input_path: "examples/data/criteo/criteo_test_data" +model_dir: "examples/ckpt/dlrm_narydis_criteo" + +train_config { + log_step_count_steps: 500 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + initial_learning_rate: 0.001 + decay_steps: 1000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 20000 + sync_replicas: True +} + +eval_config { + metrics_set: { + auc {} + } +} + +data_config { + separator: "\t" + input_fields: { + input_name: "label" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F1" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F2" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F3" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F4" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F5" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F6" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F7" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F8" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F9" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F10" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F11" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F12" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "F13" + input_type: FLOAT + default_val:"0" + } + input_fields: { + input_name: "C1" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C2" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C3" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C4" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C5" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C6" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C7" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C8" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C9" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C10" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C11" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C12" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C13" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C14" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C15" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C16" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C17" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C18" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C19" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C20" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C21" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C22" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C23" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C24" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C25" + input_type: STRING + default_val:"" + } + input_fields: { + input_name: "C26" + input_type: STRING + default_val:"" + } + label_fields: "label" + + batch_size: 4096 + num_epochs: 1 + prefetch_size: 32 + input_type: CSVInput +} + +feature_config: { + features: { + input_names: "F1" + feature_type: RawFeature + min_val:0.0 + max_val: 5775.0 + } + features: { + input_names: "F2" + feature_type: RawFeature + min_val: -3.0 + max_val: 257675.0 + } + features: { + input_names: "F3" + feature_type: RawFeature + min_val: 0.0 + max_val: 65535.0 + } + features: { + input_names: "F4" + feature_type: RawFeature + min_val: 0.0 + max_val: 969.0 + } + features: { + input_names: "F5" + feature_type: RawFeature + min_val: 0.0 + max_val: 23159456.0 + } + features: { + input_names: "F6" + feature_type: RawFeature + min_val: 0.0 + max_val: 431037.0 + } + features: { + input_names: "F7" + feature_type: RawFeature + min_val: 0.0 + max_val: 56311.0 + } + features: { + input_names: "F8" + feature_type: RawFeature + min_val: 0.0 + max_val: 6047.0 + } + features: { + input_names: "F9" + feature_type: RawFeature + min_val: 0.0 + max_val: 29019.0 + } + features: { + input_names: "F10" + feature_type: RawFeature + min_val: 0.0 + max_val: 46.0 + } + features: { + input_names: "F11" + feature_type: RawFeature + min_val: 0.0 + max_val: 231.0 + } + features: { + input_names: "F12" + feature_type: RawFeature + min_val: 0.0 + max_val: 4008.0 + } + features: { + input_names: "F13" + feature_type: RawFeature + min_val: 0.0 + max_val: 7393.0 + } + features: { + input_names: "C1" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C2" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C3" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C4" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C5" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C6" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C7" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C8" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C9" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C10" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C11" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C12" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C13" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C14" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C15" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C16" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C17" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C18" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C19" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C20" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C21" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C22" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C23" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C24" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + }features: { + input_names: "C25" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } + features: { + input_names: "C26" + hash_bucket_size: 1000000 + feature_type: IdFeature + embedding_dim: 16 + } +} +model_config: { + model_name: 'DLRM with autodis' + model_class: 'RankModel' + feature_groups: { + group_name: "dense" + feature_names: "F1" + feature_names: "F2" + feature_names: "F3" + feature_names: "F4" + feature_names: "F5" + feature_names: "F6" + feature_names: "F7" + feature_names: "F8" + feature_names: "F9" + feature_names: "F10" + feature_names: "F11" + feature_names: "F12" + feature_names: "F13" + wide_deep:DEEP + } + feature_groups: { + group_name: "sparse" + feature_names: "C1" + feature_names: "C2" + feature_names: "C3" + feature_names: "C4" + feature_names: "C5" + feature_names: "C6" + feature_names: "C7" + feature_names: "C8" + feature_names: "C9" + feature_names: "C10" + feature_names: "C11" + feature_names: "C12" + feature_names: "C13" + feature_names: "C14" + feature_names: "C15" + feature_names: "C16" + feature_names: "C17" + feature_names: "C18" + feature_names: "C19" + feature_names: "C20" + feature_names: "C21" + feature_names: "C22" + feature_names: "C23" + feature_names: "C24" + feature_names: "C25" + feature_names: "C26" + wide_deep:DEEP + } + backbone { + blocks { + name: 'num_emb' + inputs { + feature_group_name: 'dense' + } + keras_layer { + class_name: 'NaryDisEmbedding' + nary_dis_embedding { + embedding_dim: 8 + carries: [2, 9] + multiplier: 1e6 + } + } + } + blocks { + name: 'sparse' + inputs { + feature_group_name: 'sparse' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'dot' + inputs { + block_name: 'num_emb' + input_slice: '[1]' + } + inputs { + block_name: 'sparse' + input_slice: '[1]' + } + keras_layer { + class_name: 'DotInteraction' + } + } + blocks { + name: 'sparse_2d' + inputs { + block_name: 'sparse' + input_slice: '[0]' + } + } + blocks { + name: 'num_emb_2d' + inputs { + block_name: 'num_emb' + input_slice: '[0]' + } + } + concat_blocks: ['num_emb_2d', 'dot', 'sparse_2d'] + top_mlp { + hidden_units: [256, 128, 64] + } + } + model_params { + l2_regularization: 1e-5 + } + embedding_regularization: 1e-5 +}