From 216a725919925cf1d1fdfdc0c46a7903043e32a7 Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:09:17 +0800 Subject: [PATCH 1/7] =?UTF-8?q?issue/12:=20=E6=B7=BB=E5=8A=A0ReduceMax?= =?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/reduce_max/README.md | 123 ++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 infiniop/ops/reduce_max/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..25a274e 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -12,3 +12,4 @@ - [`Softmax`](/infiniop/ops/softmax/README.md) - [`Sub`](/infiniop/ops/sub/README.md) - [`SwiGLU`](/infiniop/ops/swiglu/README.md) +- [`ReduceMax`](/infiniop/ops/reduce_max/README.md) diff --git a/infiniop/ops/reduce_max/README.md b/infiniop/ops/reduce_max/README.md new file mode 100644 index 0000000..bca7f58 --- /dev/null +++ b/infiniop/ops/reduce_max/README.md @@ -0,0 +1,123 @@ + +# `Reduce Max` + +`Reduce Max`, 计算输入张量指定维度中所有元素的最大值。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopReduceMax( + infiniopReduceMaxDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateReduceMaxDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateReduceMaxDescriptor( + infiniopHandle_t handle, + infiniopReduceMaxDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + size_t dim +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,1,...,dn) | ($...$) }: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | (d1,...,dn) | ($...$) }: + 算子计算参数 `input` 的张量描述。 +- `dim` - int: 计算最大值的维度,0 $\leq$ dim $\lt$ n。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- 在`dim`维度上,`output`长度为1,其余维度`output`与`input`长度一致。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetReduceMaxWorkspaceSize( + infiniopReduceMaxDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateReduceMaxDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyReduceMaxDescriptor( + infiniopReduceMaxDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From 7da357fb5d21174fd30a7d8e4b7ff31cdf1c92d5 Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:10:34 +0800 Subject: [PATCH 2/7] =?UTF-8?q?issue/13:=20=E6=B7=BB=E5=8A=A0ReduceMean?= =?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/reduce_mean/README.md | 123 +++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 infiniop/ops/reduce_mean/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 25a274e..540b018 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -13,3 +13,4 @@ - [`Sub`](/infiniop/ops/sub/README.md) - [`SwiGLU`](/infiniop/ops/swiglu/README.md) - [`ReduceMax`](/infiniop/ops/reduce_max/README.md) +- [`ReduceMean`](/infiniop/ops/reduce_mean/README.md) diff --git a/infiniop/ops/reduce_mean/README.md b/infiniop/ops/reduce_mean/README.md new file mode 100644 index 0000000..c03ba00 --- /dev/null +++ b/infiniop/ops/reduce_mean/README.md @@ -0,0 +1,123 @@ + +# `Reduce Mean` + +`Reduce Mean`, 计算输入张量指定维度中所有元素的平均值 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopReduceMean( + infiniopReduceMeanDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateReduceMeanDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateReduceMeanDescriptor( + infiniopHandle_t handle, + infiniopReduceMeanDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + size_t dim +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,1,...,dn) | ($...$) }: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | (d1,...,dn) | ($...$) }: + 算子计算参数 `input` 的张量描述。 +- `dim` - int: 计算平均值的维度,0 $\leq$ dim $\lt$ n。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- 在`dim`维度上,`output`长度为1,其余维度`output`与`input`长度一致。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetReduceMeanWorkspaceSize( + infiniopReduceMeanDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateReduceMeanDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyReduceMeanDescriptor( + infiniopReduceMeanDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From 683e1dd08fc2ed9f62dcff1ea0a23c60f1304f37 Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:11:34 +0800 Subject: [PATCH 3/7] =?UTF-8?q?issue/14:=20=E6=B7=BB=E5=8A=A0BatchNorm?= =?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/batch_norm/README.md | 161 ++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 infiniop/ops/batch_norm/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 540b018..7f49d7f 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -14,3 +14,4 @@ - [`SwiGLU`](/infiniop/ops/swiglu/README.md) - [`ReduceMax`](/infiniop/ops/reduce_max/README.md) - [`ReduceMean`](/infiniop/ops/reduce_mean/README.md) +- [`BatchNorm`](/infiniop/ops/batch_norm/README.md) diff --git a/infiniop/ops/batch_norm/README.md b/infiniop/ops/batch_norm/README.md new file mode 100644 index 0000000..3425feb --- /dev/null +++ b/infiniop/ops/batch_norm/README.md @@ -0,0 +1,161 @@ + +# `Batch Norm` + +`Batch Norm`, 对3D输入张量在中间维度进行归一化和移动放缩。其公式如下: + +$$ + y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}\cdot\gamma+\beta +$$ + +其中`x`为输入元素,$\epsilon$ 是一个小的常数,用于避免除以零。$\gamma$ 和 $\beta$ 为权重张量和平移张量。 + +`E[x]`和`Var[x]`为针对第一、第三维度的均值和方差,其更新根据规则如下: +$$ + {\rm{E}}\left[x\right]_{\rm{new}} = (1 - {\rm{momentum}})\cdot{\rm{E}}\left[x\right]_{\rm{old}} + {\rm{momentum}} \cdot{\rm{E}}\left[x\right] +$$ +$$ + {\rm{Var}}\left[x\right]_{\rm{new}} = (1 - {\rm{momentum}})\cdot{\rm{Var}}\left[x\right]_{\rm{old}} + {\rm{momentum}} \cdot{\rm{Var}}\left[x\right] +$$ + +其中`momentum`为设定动量参数。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopBatchNorm( + infiniopBatchNormDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + void * running_mean, + void * running_var, + const void * input, + const void * weight, + const void * bias, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateBatchNormDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `running_mean`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `running_var`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `bias`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateBatchNormDescriptor( + infiniopHandle_t handle, + infiniopBatchNormDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t running_mean_desc, + infiniopTensorDescriptor_t running_var_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t weight_desc, + infiniopTensorDescriptor_t bias_desc, + float momentum, + float eps +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }: + 算子计算参数 `output` 的张量描述, N是批次大小, C是特征或通道数, L是序列长度。 +- `running_mean_desc` - { dT | (C) | (...) }: + 算子计算参数 `running_mean` 的张量描述,对应公式中的 ${\rm{E}}\left[x\right]$。 +- `running_var_desc` - { dT | (C) | (...) }: + 算子计算参数 `running_var` 的张量描述,对应公式中的 ${\rm{Var}}\left[x\right]$。 +- `input_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }: + 算子计算参数 `input` 的张量描述。 +- `weight_desc` - { dT | (C) | (...) }: + 算子计算参数 `weight` 的张量描述,对应公式中的 $\gamma$。 +- `bias_desc` - { dT | (C) | (...) }: + 算子计算参数 `bias` 的张量描述,对应公式中的 $\beta$。 +- `momentum` - float: 即公式中的 `momentum`。 +- `eps` - float: 即公式中的 $\epsilon$。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- `output`与`input`均为全连续张量。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetBatchNormWorkspaceSize( + infiniopBatchNormDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateBatchNormDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyBatchNormDescriptor( + infiniopBatchNormDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From 45b2136bf38ff8d24360f17bdedcdb915c219cbf Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:12:35 +0800 Subject: [PATCH 4/7] =?UTF-8?q?issue/15:=20=E6=B7=BB=E5=8A=A0BatchNorm=20B?= =?UTF-8?q?ackward=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/batch_norm_backward/README.md | 158 +++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 infiniop/ops/batch_norm_backward/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 7f49d7f..f306dd4 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -15,3 +15,4 @@ - [`ReduceMax`](/infiniop/ops/reduce_max/README.md) - [`ReduceMean`](/infiniop/ops/reduce_mean/README.md) - [`BatchNorm`](/infiniop/ops/batch_norm/README.md) +- [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md) diff --git a/infiniop/ops/batch_norm_backward/README.md b/infiniop/ops/batch_norm_backward/README.md new file mode 100644 index 0000000..2d50dd6 --- /dev/null +++ b/infiniop/ops/batch_norm_backward/README.md @@ -0,0 +1,158 @@ + +# `Batch Norm Backward` + +`Batch Norm Backward`, 即`Batch Norm`算子所对应的反向传播算子。其正向公式如下: +$$ + y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]}}\cdot\gamma+\beta +$$ + +其中`x`为输入元素。$\gamma$ 和 $\beta$ 为权重张量和平移张量。 + +`E[x]`和`Var[x]`为同时针对第一、第三维度的均值和方差。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopBatchNormBackward( + infiniopBatchNormBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * grad_input, + void * grad_weight, + void * grad_bias, + const void * input, + const void * grad_output, + const void * weight, + const void * running_mean, + const void * running_var, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateBatchNormBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `grad_input`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_weight`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_bias`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_output`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `running_mean`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `running_var`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateBatchNormBackwardDescriptor( + infiniopHandle_t handle, + infiniopBatchNormBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input_desc, + infiniopTensorDescriptor_t grad_weight_desc, + infiniopTensorDescriptor_t grad_bias_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t grad_output_desc, + infiniopTensorDescriptor_t weight_desc, + infiniopTensorDescriptor_t running_mean_desc, + infiniopTensorDescriptor_t running_var_desc +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_input_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }: + 算子计算参数 `output` 的张量描述,对应输入张量`input`的梯度,N是批次大小, C是特征或通道数, L是序列长度。 +- `grad_weight_desc` - { dT | (C) | (...) }: + 算子计算参数 `grad_weight` 的张量描述, 对应公式中权重向量 $\gamma$ 的梯度。 +- `grad_bias_desc` - { dT | (C) | (...) }: + 算子计算参数 `grad_bias` 的张量描述, 对应公式中向量 $\beta$ 的梯度。 +- `input_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }: + 算子计算参数 `input` 的张量描述。 +- `grad_output_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }: + 算子计算参数 `grad_output` 的张量描述, 对应`output`的梯度。 +- `weight_desc` - { dT | (C) | (...) }: + 算子计算参数 `weight` 的张量描述,对应公式中权重向量 $\gamma$ 。 +- `running_mean_desc` - { dT | (C) | (...) }: + 算子计算参数 `running_mean` 的张量描述, 对应于${\rm{E}}[x]$,即`input`针对中间维度的均值。 +- `running_var_desc` - { dT | (C) | (...) }: + 算子计算参数 `running_var` 的张量描述, 对应于${\rm{Var}}[x]$,即`input`针对中间维度的方差。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- `grad_input`、`grad_output`、`input`均为全连续张量。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetBatchNormBackwardWorkspaceSize( + infiniopBatchNormBackwardDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateBatchNormBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyBatchNormBackwardDescriptor( + infiniopBatchNormBackwardDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From 17b3d501efbf94dff6acc76ef9a54176105dcded Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:13:31 +0800 Subject: [PATCH 5/7] =?UTF-8?q?issue/16:=20=E6=B7=BB=E5=8A=A0LayerNorm?= =?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/layer_norm/README.md | 152 ++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 infiniop/ops/layer_norm/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index f306dd4..8fc3122 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -16,3 +16,4 @@ - [`ReduceMean`](/infiniop/ops/reduce_mean/README.md) - [`BatchNorm`](/infiniop/ops/batch_norm/README.md) - [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md) +- [`LayerNorm`](/infiniop/ops/layer_norm/README.md) diff --git a/infiniop/ops/layer_norm/README.md b/infiniop/ops/layer_norm/README.md new file mode 100644 index 0000000..9827178 --- /dev/null +++ b/infiniop/ops/layer_norm/README.md @@ -0,0 +1,152 @@ + +# `Layer Norm` + +`Layer Norm`, 对3D输入张量在最后一维进行归一化和移动放缩。其公式如下: + +$$ + y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}\cdot\gamma+\beta +$$ + +其中`x`为输入元素,$\epsilon$ 是一个小的常数,用于避免除以零。$\gamma$ 和 $\beta$ 为权重张量和平移张量。 +`E[x]`和`Var[x]`为针对最后一维的均值和方差。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLayerNorm( + infiniopLayerNormDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + void * input_standardization, + void * input_std_deviation, + const void * input, + const void * weight, + const void * bias, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLayerNormDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input_standardization`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input_std_deviation`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `bias`:输入张量(可选)。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateLayerNormDescriptor( + infiniopHandle_t handle, + infiniopLayerNormDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_standardization_desc, + infiniopTensorDescriptor_t input_std_deviation_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t weight_desc, + infiniopTensorDescriptor_t bias_desc, + float eps +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (N1, N2, L) | (..., 1) }: + 算子计算参数 `output` 的张量描述, 。 +- `input_standardization_desc` - { dT | (N1, N2, L) | (...) }: + 算子计算参数 `input_standardization` 的张量描述,,对应公式中的`input`归一化的结果: $\left({x-{\rm{E}}\left[x\right]}\right)/{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}$。 +- `input_std_deviation_desc` - { dT | (N1, N2) | (...) }: + 算子计算参数 `input_std_deviation` 的张量描述,对应公式中的标准差: $\sqrt{{\rm{Var}}\left[x\right]+\epsilon}$。 +- `input_desc` - { dT | (N1, N2, L) | (..., 1) }: + 算子计算参数 `input` 的张量描述。 +- `weight_desc` - { dT | (L) | (...) }: + 算子计算参数 `weight` 的张量描述,对应公式中的 $\gamma$。 +- `bias_desc` - { dT | (L) | (...) }: + 算子计算参数 `bias` 的张量描述(可选),对应公式中的 $\beta$ 。 +- `eps` - float: + 对应公式中的 $\epsilon$。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- `output`与`input`最后一维连续。 +- 对于没有`bias`的情况,`bias_desc`应传入nullptr。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetLayerNormWorkspaceSize( + infiniopLayerNormDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateLayerNormDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyLayerNormDescriptor( + infiniopLayerNormDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From 36fa4807360417978c23dc8d115b834c667f6e34 Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:14:19 +0800 Subject: [PATCH 6/7] =?UTF-8?q?issue/17:=20=E6=B7=BB=E5=8A=A0LayerNorm=20B?= =?UTF-8?q?ackward=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/layer_norm_backward/README.md | 154 +++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 infiniop/ops/layer_norm_backward/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 8fc3122..171c98c 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -17,3 +17,4 @@ - [`BatchNorm`](/infiniop/ops/batch_norm/README.md) - [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md) - [`LayerNorm`](/infiniop/ops/layer_norm/README.md) +- [`LayerNormBackward`](/infiniop/ops/layer_norm_backward/README.md) diff --git a/infiniop/ops/layer_norm_backward/README.md b/infiniop/ops/layer_norm_backward/README.md new file mode 100644 index 0000000..0bc1911 --- /dev/null +++ b/infiniop/ops/layer_norm_backward/README.md @@ -0,0 +1,154 @@ + +# `Layer Norm Backward` + +`Layer Norm Backward`, 是`Layer Norm`算子对应的反向传播算子。其正向算子的计算公式如下: + +$$ + y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}\cdot\gamma+\beta +$$ + +其中`x`为输入元素,$\epsilon$ 是一个小的常数,用于避免除以零。$\gamma$ 和 $\beta$ 为权重张量和平移张量。 +`E[x]`和`Var[x]`为针对最后一维的均值和方差。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLayerNormBackward( + infiniopLayerNormBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * grad_input, + void * grad_weight, + void * grad_bias, + const void * grad_output, + const void * weight, + const void * input_standardization, + const void * input_std_deviation, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLayerNormBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `grad_input`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_weight`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_bias`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_output`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input_standardization`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input_std_deviation`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateLayerNormBackwardDescriptor( + infiniopHandle_t handle, + infiniopLayerNormBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input_desc, + infiniopTensorDescriptor_t grad_weight_desc, + infiniopTensorDescriptor_t grad_bias_desc, + infiniopTensorDescriptor_t grad_output_desc, + infiniopTensorDescriptor_t weight_desc, + infiniopTensorDescriptor_t input_standardization_desc, + infiniopTensorDescriptor_t input_std_deviation_desc +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_input_desc` - { dT | (N1, N2, L) | (...,1) }: + 算子计算参数 `grad_input` 的张量描述, 。 +- `grad_weight_desc` - { dT | (L) | (...) }: + 算子计算参数 `grad_weight` 的张量描述, 。 +- `grad_bias_desc` - { dT | (L) | (...) }: + 算子计算参数 `grad_bias` 的张量描述, 。 +- `grad_output_desc` - { dT | (N1, N2, L) | (...,1) }: + 算子计算参数 `grad_output` 的张量描述, 。 +- `weight_desc` - { dT | (L) | (...) }: + 算子计算参数 `weight` 的张量描述, 。 +- `input_standardization_desc` - { dT | (N1, N2, L) | (..., 1) }: + 算子计算参数 `input_standardization` 的张量描述,,对应公式中的`input`归一化的结果: $\left({x-{\rm{E}}\left[x\right]}\right)/{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}$。 +- `input_std_deviation_desc` - { dT | (N1, N2) | (...) }: + 算子计算参数 `input_std_deviation` 的张量描述,对应公式中的标准差: $\sqrt{{\rm{Var}}\left[x\right]+\epsilon}$。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- `grad_input_desc`、`grad_output_desc`和 `input_standardization_desc`的最后一维要求连续。 + + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetLayerNormBackwardWorkspaceSize( + infiniopLayerNormBackwardDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateLayerNormBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyLayerNormBackwardDescriptor( + infiniopLayerNormBackwardDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES From d40148c9b049bb46f8a09d51c7675be382c296ce Mon Sep 17 00:00:00 2001 From: ourkevindebruyne <651592287@qq.com> Date: Thu, 14 Aug 2025 23:15:02 +0800 Subject: [PATCH 7/7] =?UTF-8?q?issue/18:=20=E6=B7=BB=E5=8A=A0RMSNorm=20Bac?= =?UTF-8?q?kward=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infiniop/ops/README.md | 1 + infiniop/ops/rms_norm_backward/README.md | 142 +++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 infiniop/ops/rms_norm_backward/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 171c98c..7640f45 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -18,3 +18,4 @@ - [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md) - [`LayerNorm`](/infiniop/ops/layer_norm/README.md) - [`LayerNormBackward`](/infiniop/ops/layer_norm_backward/README.md) +- [`RMSNormBackward`](/infiniop/ops/rms_norm_backward/README.md) diff --git a/infiniop/ops/rms_norm_backward/README.md b/infiniop/ops/rms_norm_backward/README.md new file mode 100644 index 0000000..c662e2e --- /dev/null +++ b/infiniop/ops/rms_norm_backward/README.md @@ -0,0 +1,142 @@ + +# `RMS Norm Backward` + +`RMS Norm Backward`, 是`RMS Norm`算子所对应的反向传播算子。其正向公式如下: + +$$ + y_i=\frac{x_i}{\sqrt{\frac{1}{\rm{D}}\sum_{i=1}^{\rm{D}}x_i^2}}\cdot \gamma_i +$$ + +其中分母是针对3D输入张量的第三维向量的二范数,D为输入张量第三维的长度。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopRMSNormBackward( + infiniopRMSNormBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * grad_x, + void * grad_w, + const void * grad_y, + const void * x, + const void * w, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateRMSNormBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `grad_x`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_w`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_y`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `x`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `w`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `stream`: 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +--- + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateRMSNormBackwardDescriptor( + infiniopHandle_t handle, + infiniopRMSNormBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_x_desc, + infiniopTensorDescriptor_t grad_w_desc, + infiniopTensorDescriptor_t grad_y_desc, + infiniopTensorDescriptor_t x_desc, + infiniopTensorDescriptor_t w_desc +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_x_desc` - { dT | (N1, N2, D) | (...,1) }: + 算子计算参数 `grad_x` 的张量描述,对应于`x`的梯度。 +- `grad_w_desc` - { dT | (D) | (...) }: + 算子计算参数 `grad_w` 的张量描述,对应于公式中 $\gamma$ 的梯度。 +- `grad_y_desc` - { dT | (N1, N2, D) | (...,1) }: + 算子计算参数 `grad_y` 的张量描述,对应于公式中`y`的梯度。 +- `x_desc` - { dT | (N1, N2, D) | (...,1) }: + 算子计算参数 `x` 的张量描述。 +- `w_desc` - { dT | (D) | (...) }: + 算子计算参数 `w` 的张量描述,对应于公式中的 $\gamma$。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- `grad_x`、`grad_y`、`x`的最后一维均连续 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. +--- + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetRMSNormBackwardWorkspaceSize( + infiniopRMSNormBackwardDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateRMSNormBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyRMSNormBackwardDescriptor( + infiniopRMSNormBackwardDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。 待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +## 已知问题 + +无 + + +[`InfiniopHandle_t`]: /infiniop/handle/README.md + +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES