From be4b55fc96cd287ed65f19d067501f74440c3ab2 Mon Sep 17 00:00:00 2001 From: zhanganduo Date: Fri, 8 Dec 2023 16:22:57 +0800 Subject: [PATCH 1/6] add doc --- .../functional/fused_multi_transformer_cn.rst | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst diff --git a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst new file mode 100644 index 00000000000..806ba2274ce --- /dev/null +++ b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst @@ -0,0 +1,95 @@ +.. _cn_api_paddle_incubate_nn_functional_fused_multi_transformer: + +fused_multi_transformer +------------------------------- + +.. py:function:: paddle.incubate.nn.functional.fused_multi_transformer(x, ln_scales, ln_biases, qkv_weights, qkv_biases, linear_weights, linear_biases, ffn_ln_scales, ffn_ln_biases, ffn1_weights, ffn1_biases, ffn2_weights, ffn2_biases, pre_layer_norm=True, epsilon=1e-05, cache_kvs=None, pre_caches=None, seq_lens=None, rotary_embs=None, time_step=None, attn_mask=None, dropout_rate=0.0, rotary_emb_dims=0, activation='gelu', training=False, mode='upscale_in_train', trans_qkvw=True, ring_id=- 1, name=None) + +这是一个融合算子,用于计算 Transformer 模型架构中的多个 transformer 层。 + +fused_multi_transformer 算子仅支持在 GPU 上运行。 + +Transformer 层的功能与以下伪代码一致: + +.. code-block:: text + + >>> if pre_layer_norm: + ... out = layer_norm(x) + ... out = qkv_linear(out) + qkv_bias + ... else: + ... out = qkv_linear(x) + qkv_bias + >>> out = transpose(out, perm=[2, 0, 3, 1, 4]) + >>> # extract q, k and v from out. + >>> q = out[0:1, ::] + >>> k = out[1:2, ::] + >>> v = out[2:3, ::] + >>> out = q * k^t + >>> out = attn_mask + out + >>> out = softmax(out) + >>> out = dropout(out) + >>> out = out * v + >>> out = transpose(out, perm=[0, 2, 1, 3]) + >>> out = linear(out) + >>> if pre_layer_norm: + ... out = x + dropout(out + bias) + ... else: + ... out = layer_norm(x + dropout(out + bias)) + + >>> residual = out; + >>> if pre_layer_norm: + ... out = ffn_layer_norm(out) + >>> out = ffn1_linear(out) + >>> out = dropout(activation(out + ffn1_bias)) + >>> out = ffn2_linear(out) + >>> out = residual + dropout(out + ffn2_bias) + >>> if not pre_layer_norm: + ... out = ffn_layer_norm(out) + +参数 +:::::::::::: + - **x** (Tensor) - 输入张量可以是 3-D 张量,输入数据类型可以是 float16 或 float32,形状为`[batch\_size, sequence\_length, d\_model]`。 + - **ln_scales** (list(Tensor)|tuple(Tensor)) - 注意力层归一化的权重张量,形状为`[d\_model]`。 + - **ln_biases** (list(Tensor)|tuple(Tensor)) - 注意力层归一化的偏置张量,形状为`[d\_model]`。 + - **qkv_weights** (list(Tensor)|tuple(Tensor)) - 注意力 qkv 计算的权重张量,形状为`[3, num\_head, dim\_head, d\_model]`。 + - **qkv_biases** (list(Tensor)|tuple(Tensor)|None) - 注意力 qkv 计算的偏置张量,形状为`[3, num\_head, dim\_head]`。 + - **linear_weights** (list(Tensor)|tuple(Tensor)) - 注意力线性的权重张量,形状为`[num\_head * dim\_head, d\_model]`。 + - **linear_biases** (list(Tensor)|tuple(Tensor)|None) - 注意力线性的偏置张量,形状为`[d\_model]`。 + - **ffn_ln_scales** (list(Tensor)|tuple(Tensor)) - 前馈层归一化的权重张量,形状为`[d\_model]`。 + - **ffn_ln_biases** (list(Tensor)|tuple(Tensor)) - 前馈层归一化的偏置张量,形状为`[d\_model]`。 + - **ffn1_weights** (list(Tensor)|tuple(Tensor)) - 前馈第一线性的权重张量,形状为`[d\_model, dim\_feedforward]`。 + - **ffn1_biases** (list(Tensor)|tuple(Tensor)|None) - 前馈第一线性的偏置张量,形状为`[dim\_feedforward]`。 + - **ffn2_weights** (list(Tensor)|tuple(Tensor)) - 前馈第二线性的权重张量,形状为`[dim\_feedforward, d\_model]`。 + - **ffn2_biases** (list(Tensor)|tuple(Tensor)|None) - 前馈第二线性的偏置张量,形状为`[d_model]`。 + - **pre_layer_norm** (bool,可选) - 是否是 pre_layer_norm(True)或 post_layer_norm(False)。默认为 True。 + - **epsilon** (float,可选) - 添加到 layer_norm 的分母中的小浮点值,以避免除以零。默认为 1e-5。 + - **cache_kvs** (list(Tensor)|tuple(Tensor),可选) - 生成模型的缓存结构张量。形状为`[2, bsz, num\_head, max\_seq\_len, head\_dim]`。默认为 None。 + - **pre_caches** (list(Tensor)|tuple(Tensor),可选) - 生成模型的前缀缓存。形状为`[2, bsz, num\_head, cache\_len, head\_dim]`。默认为 None。 + - **seq_lens** (Tensor,可选) - 此批次的序列长度。形状为`[bsz]`。默认为 None。 + - **rotary_embs** (Tensor,可选) - 用于旋转计算的 RoPE 嵌入。形状为`[2, bsz, 1, seq\_len, head\_dim]`。默认为 None。 + - **time_step** (Tensor,可选) - 生成模型的时间步张量。用于解码阶段,表示时间步,即 CacheKV 的实际 seq_len。形状为`[1]`,必须位于 CPUPlace。默认为 None。 + - **attn_mask** (Tensor,可选) - 用于多头注意力中防止对某些不需要的位置(通常是填充或后续位置)进行注意力。其形状为`[batch_size, 1, sequence_length, sequence_length]`。默认为 None。 + - **dropout_rate** (float,可选) - 将单元设置为零的 dropout 概率。默认为 0.0。 + - **rotary_emb_dims** (int,可选) - 旋转计算的 rotary_emb_dims,当 rotary_embs 为 None 时为 0,当 rotary_embs 不为 None 且 pos_extra_ids 为 None 时为 1,当 rotary_embs 和 pos_extra_ids 均不为 None 时为 2。默认为 0。 + - **activation** (str,可选) - 激活函数。默认为"gelu"。 + - **training** (bool,可选) - 标志是否处于训练阶段。默认为 False。 + - **mode** (str,可选) - ['upscale_in_train'(默认) | 'downscale_in_infer'] + 1. upscale_in_train(默认),在训练时放大输出 + - 训练:out = input * mask / (1.0 - p) + - 推理:out = input + 2. downscale_in_infer,推理时减小输出 + - 训练:out = input * mask + - 推理:out = input * (1.0 - p) + - **trans_qkvw** (bool,可选) - 是否对 qkv 的权重进行转置。 + 如果为 true,则 qkv 的权重形状应为[3, num_head, dim_head, dim_embed]。 + 否则,qkv 的权重形状应为[dim_embed, 3, num_head, dim_head]。默认为 True。 + - **ring_id** (int,可选) - 用于张量模型并行中的分布式前向传播,仅支持 NCCL。默认为-1,表示不使用 mp。 + - **name** (str,可选) - 操作的名称(可选,默认为 None)。更多信息,请参阅 :ref:`api_guide_Name`。 + +返回 +:::::::::::: + - Tensor|tuple:如果 ``cache_kvs`` 为 None,则返回与 ``x`` 形状和数据类型相同的张量,代表变压器层的输出。如果 ``cache_kvs`` 不为 None,则返回元组(output, cache_kvs),其中 output 是变压器层的输出,cache_kvs 与输入`cache_kvs`原地更新。 + +代码示例 +::::::::: + +COPY-FROM: paddle.incubate.nn.functional.fused_multi_transformer From efb8283f0fd7b577e6525c78eee6c87d277d9231 Mon Sep 17 00:00:00 2001 From: zhanganduo Date: Wed, 10 Jan 2024 14:43:38 +0800 Subject: [PATCH 2/6] fix doc --- .../functional/fused_multi_transformer_cn.rst | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst index 806ba2274ce..e1bc15b9626 100644 --- a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst +++ b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst @@ -48,18 +48,18 @@ Transformer 层的功能与以下伪代码一致: 参数 :::::::::::: - **x** (Tensor) - 输入张量可以是 3-D 张量,输入数据类型可以是 float16 或 float32,形状为`[batch\_size, sequence\_length, d\_model]`。 - - **ln_scales** (list(Tensor)|tuple(Tensor)) - 注意力层归一化的权重张量,形状为`[d\_model]`。 - - **ln_biases** (list(Tensor)|tuple(Tensor)) - 注意力层归一化的偏置张量,形状为`[d\_model]`。 + - **ln_scales** (list(Tensor)|tuple(Tensor)) - 注意力机制中层归一化层的权重张量,形状为`[d\_model]`。 + - **ln_biases** (list(Tensor)|tuple(Tensor)) - 注意力机制中层归一化层的偏重张量,形状为`[d\_model]`。 - **qkv_weights** (list(Tensor)|tuple(Tensor)) - 注意力 qkv 计算的权重张量,形状为`[3, num\_head, dim\_head, d\_model]`。 - **qkv_biases** (list(Tensor)|tuple(Tensor)|None) - 注意力 qkv 计算的偏置张量,形状为`[3, num\_head, dim\_head]`。 - - **linear_weights** (list(Tensor)|tuple(Tensor)) - 注意力线性的权重张量,形状为`[num\_head * dim\_head, d\_model]`。 - - **linear_biases** (list(Tensor)|tuple(Tensor)|None) - 注意力线性的偏置张量,形状为`[d\_model]`。 - - **ffn_ln_scales** (list(Tensor)|tuple(Tensor)) - 前馈层归一化的权重张量,形状为`[d\_model]`。 - - **ffn_ln_biases** (list(Tensor)|tuple(Tensor)) - 前馈层归一化的偏置张量,形状为`[d\_model]`。 - - **ffn1_weights** (list(Tensor)|tuple(Tensor)) - 前馈第一线性的权重张量,形状为`[d\_model, dim\_feedforward]`。 - - **ffn1_biases** (list(Tensor)|tuple(Tensor)|None) - 前馈第一线性的偏置张量,形状为`[dim\_feedforward]`。 - - **ffn2_weights** (list(Tensor)|tuple(Tensor)) - 前馈第二线性的权重张量,形状为`[dim\_feedforward, d\_model]`。 - - **ffn2_biases** (list(Tensor)|tuple(Tensor)|None) - 前馈第二线性的偏置张量,形状为`[d_model]`。 + - **linear_weights** (list(Tensor)|tuple(Tensor)) - 注意力机制中线性层的权重张量,形状为`[num\_head * dim\_head, d\_model]`。 + - **linear_biases** (list(Tensor)|tuple(Tensor)|None) - 注意力机制中线性层的的偏置张量,形状为`[d\_model]`。 + - **ffn_ln_scales** (list(Tensor)|tuple(Tensor)) - 前馈层中层归一化层的权重张量,形状为`[d\_model]`。 + - **ffn_ln_biases** (list(Tensor)|tuple(Tensor)) - 前馈层中层归一化层的偏置张量,形状为`[d\_model]`。 + - **ffn1_weights** (list(Tensor)|tuple(Tensor)) - 前馈层中第一个线性变换层的权重张量,形状为`[d\_model, dim\_feedforward]`。 + - **ffn1_biases** (list(Tensor)|tuple(Tensor)|None) - 前馈层中第一个线性变换层的偏置张量,形状为`[dim\_feedforward]`。 + - **ffn2_weights** (list(Tensor)|tuple(Tensor)) - 前馈层中第二线性变换层的权重张量,形状为`[dim\_feedforward, d\_model]`。 + - **ffn2_biases** (list(Tensor)|tuple(Tensor)|None) - 前馈层中第二线性变换层的偏置张量,形状为`[d_model]`。 - **pre_layer_norm** (bool,可选) - 是否是 pre_layer_norm(True)或 post_layer_norm(False)。默认为 True。 - **epsilon** (float,可选) - 添加到 layer_norm 的分母中的小浮点值,以避免除以零。默认为 1e-5。 - **cache_kvs** (list(Tensor)|tuple(Tensor),可选) - 生成模型的缓存结构张量。形状为`[2, bsz, num\_head, max\_seq\_len, head\_dim]`。默认为 None。 @@ -67,7 +67,7 @@ Transformer 层的功能与以下伪代码一致: - **seq_lens** (Tensor,可选) - 此批次的序列长度。形状为`[bsz]`。默认为 None。 - **rotary_embs** (Tensor,可选) - 用于旋转计算的 RoPE 嵌入。形状为`[2, bsz, 1, seq\_len, head\_dim]`。默认为 None。 - **time_step** (Tensor,可选) - 生成模型的时间步张量。用于解码阶段,表示时间步,即 CacheKV 的实际 seq_len。形状为`[1]`,必须位于 CPUPlace。默认为 None。 - - **attn_mask** (Tensor,可选) - 用于多头注意力中防止对某些不需要的位置(通常是填充或后续位置)进行注意力。其形状为`[batch_size, 1, sequence_length, sequence_length]`。默认为 None。 + - **attn_mask** (Tensor,可选) - 用于多头注意力层中防止对某些不需要的位置(通常是填充或后续位置)进行注意。其形状为`[batch_size, 1, sequence_length, sequence_length]`。默认为 None。 - **dropout_rate** (float,可选) - 将单元设置为零的 dropout 概率。默认为 0.0。 - **rotary_emb_dims** (int,可选) - 旋转计算的 rotary_emb_dims,当 rotary_embs 为 None 时为 0,当 rotary_embs 不为 None 且 pos_extra_ids 为 None 时为 1,当 rotary_embs 和 pos_extra_ids 均不为 None 时为 2。默认为 0。 - **activation** (str,可选) - 激活函数。默认为"gelu"。 @@ -87,7 +87,7 @@ Transformer 层的功能与以下伪代码一致: 返回 :::::::::::: - - Tensor|tuple:如果 ``cache_kvs`` 为 None,则返回与 ``x`` 形状和数据类型相同的张量,代表变压器层的输出。如果 ``cache_kvs`` 不为 None,则返回元组(output, cache_kvs),其中 output 是变压器层的输出,cache_kvs 与输入`cache_kvs`原地更新。 + - Tensor|tuple:如果 ``cache_kvs`` 为 None,则返回与 ``x`` 形状和数据类型相同的张量,代表 Transformer 的输出。如果 ``cache_kvs`` 不为 None,则返回元组(output, cache_kvs),其中 output 是 Transformer 的输出,cache_kvs 与输入`cache_kvs`原地更新。 代码示例 ::::::::: From 5a5dc5d15ec4a954953201823ab803eb812affaf Mon Sep 17 00:00:00 2001 From: Android zhang <53324261+zade23@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:43:31 +0800 Subject: [PATCH 3/6] Update docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst Co-authored-by: zachary sun <70642955+sunzhongkai588@users.noreply.github.com> --- .../incubate/nn/functional/fused_multi_transformer_cn.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst index e1bc15b9626..4b5dbc338a7 100644 --- a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst +++ b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst @@ -80,8 +80,8 @@ Transformer 层的功能与以下伪代码一致: - 训练:out = input * mask - 推理:out = input * (1.0 - p) - **trans_qkvw** (bool,可选) - 是否对 qkv 的权重进行转置。 - 如果为 true,则 qkv 的权重形状应为[3, num_head, dim_head, dim_embed]。 - 否则,qkv 的权重形状应为[dim_embed, 3, num_head, dim_head]。默认为 True。 + 如果为 true,则 qkv 的权重形状应为[3, num_head, dim_head, dim_embed]。 + 否则,qkv 的权重形状应为[dim_embed, 3, num_head, dim_head]。默认为 True。 - **ring_id** (int,可选) - 用于张量模型并行中的分布式前向传播,仅支持 NCCL。默认为-1,表示不使用 mp。 - **name** (str,可选) - 操作的名称(可选,默认为 None)。更多信息,请参阅 :ref:`api_guide_Name`。 From 1086aad7928eff400e95dbc71fbebcc8ebca5d09 Mon Sep 17 00:00:00 2001 From: Android zhang <53324261+zade23@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:43:49 +0800 Subject: [PATCH 4/6] Update docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst Co-authored-by: zachary sun <70642955+sunzhongkai588@users.noreply.github.com> --- .../incubate/nn/functional/fused_multi_transformer_cn.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst index 4b5dbc338a7..b8f911825c5 100644 --- a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst +++ b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst @@ -73,9 +73,11 @@ Transformer 层的功能与以下伪代码一致: - **activation** (str,可选) - 激活函数。默认为"gelu"。 - **training** (bool,可选) - 标志是否处于训练阶段。默认为 False。 - **mode** (str,可选) - ['upscale_in_train'(默认) | 'downscale_in_infer'] + 1. upscale_in_train(默认),在训练时放大输出 - 训练:out = input * mask / (1.0 - p) - 推理:out = input + 2. downscale_in_infer,推理时减小输出 - 训练:out = input * mask - 推理:out = input * (1.0 - p) From 34e022115d1e78f5b9bae10644f6e199780dd3a6 Mon Sep 17 00:00:00 2001 From: Android zhang <53324261+zade23@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:51:59 +0800 Subject: [PATCH 5/6] Update docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst Co-authored-by: zachary sun <70642955+sunzhongkai588@users.noreply.github.com> --- .../incubate/nn/functional/fused_multi_transformer_cn.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst index b8f911825c5..975aba66708 100644 --- a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst +++ b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst @@ -82,8 +82,8 @@ Transformer 层的功能与以下伪代码一致: - 训练:out = input * mask - 推理:out = input * (1.0 - p) - **trans_qkvw** (bool,可选) - 是否对 qkv 的权重进行转置。 - 如果为 true,则 qkv 的权重形状应为[3, num_head, dim_head, dim_embed]。 - 否则,qkv 的权重形状应为[dim_embed, 3, num_head, dim_head]。默认为 True。 + 如果为 true,则 qkv 的权重形状应为[3, num_head, dim_head, dim_embed]。 + 否则,qkv 的权重形状应为[dim_embed, 3, num_head, dim_head]。默认为 True。 - **ring_id** (int,可选) - 用于张量模型并行中的分布式前向传播,仅支持 NCCL。默认为-1,表示不使用 mp。 - **name** (str,可选) - 操作的名称(可选,默认为 None)。更多信息,请参阅 :ref:`api_guide_Name`。 From e37aa7b9e1ea5caaa030d3db5afd6be51387ab18 Mon Sep 17 00:00:00 2001 From: zhanganduo Date: Tue, 16 Jan 2024 11:08:13 +0800 Subject: [PATCH 6/6] rerun pre-commit --- .../incubate/nn/functional/fused_multi_transformer_cn.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst index 975aba66708..e26dc58353c 100644 --- a/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst +++ b/docs/api/paddle/incubate/nn/functional/fused_multi_transformer_cn.rst @@ -73,11 +73,11 @@ Transformer 层的功能与以下伪代码一致: - **activation** (str,可选) - 激活函数。默认为"gelu"。 - **training** (bool,可选) - 标志是否处于训练阶段。默认为 False。 - **mode** (str,可选) - ['upscale_in_train'(默认) | 'downscale_in_infer'] - + 1. upscale_in_train(默认),在训练时放大输出 - 训练:out = input * mask / (1.0 - p) - 推理:out = input - + 2. downscale_in_infer,推理时减小输出 - 训练:out = input * mask - 推理:out = input * (1.0 - p) @@ -91,6 +91,7 @@ Transformer 层的功能与以下伪代码一致: :::::::::::: - Tensor|tuple:如果 ``cache_kvs`` 为 None,则返回与 ``x`` 形状和数据类型相同的张量,代表 Transformer 的输出。如果 ``cache_kvs`` 不为 None,则返回元组(output, cache_kvs),其中 output 是 Transformer 的输出,cache_kvs 与输入`cache_kvs`原地更新。 + 代码示例 :::::::::