diff --git a/infiniop/ops/embedding-backward/README.md b/infiniop/ops/embedding-backward/README.md new file mode 100644 index 0000000..36373c1 --- /dev/null +++ b/infiniop/ops/embedding-backward/README.md @@ -0,0 +1,130 @@ + +# `EmbeddingBackward` + +`EmbeddingBackward`,即[**嵌入**算子](/infiniop/ops/embedding/README.md)的反向算子。用于训练大模型的词嵌入和加性位置嵌入。 + +`EmbeddingBackward` 算子支持 1 个或 2 个相同的步骤,根据“号码”从将输出的梯度叠加到嵌入表的梯度,其公式表述为: + +$$ \begin{equation} d_{table1} = \alpha_1 \cdot dy[i_1] \end{equation} $$ + +$$ \begin{equation} d_{table2} = \alpha_2 \cdot dy[i_2] \end{equation} $$ + +- 通常 $α$ 为 1; +- $table2$ 可以不使用,则公式 $(2)$ 不存在; + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopEmbeddingBackward( + infiniopEmbeddingBackwardDescriptor_t desc, + void *dtable1, + void *dtable2, + const void *dy, + const void *i1, + const void *i2, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopEmbeddingBackwardDescriptor_t()` 初始化的算子描述符; +- `dtable1`: + 第 1 个嵌入表的梯度; +- `dtable2`: + 第 2 个嵌入表的梯度,不使用则为空; +- `dy`: + 输出结果的梯度; +- `i1`: + 第 1 个嵌入序号; +- `i2`: + 第 2 个嵌入序号,不使用则为空; +- `stream`: + 计算流/队列; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_DEVICE`], [`INFINI_STATUS_EXECUTION_FAILED`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateEmbeddingBackwardDescriptor( + infiniopHandle_t handle, + infiniopEmbeddingBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t dtable1_desc, + infiniopTensorDescriptor_t dtable2_desc, + infiniopTensorDescriptor_t dy_desc, + infiniopTensorDescriptor_t i1_desc, + infiniopTensorDescriptor_t i2_desc, + float alpha1, + float alpha2, + char dtable1_acc, + char dtable2_acc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`] +- `desc_ptr`: + `infiniopCreateEmbeddingBackwardDescriptor` 指针,指向将被初始化的算子描述符地址; +- `dtable1_desc` - { dT | (N1, D) | (..., 1) }: + 算子输入 `table1` 的张量描述; +- `dtable2_desc` - { dT | (N2, D) | (..., 1) }: + 算子输入 `table2` 的张量描述; +- `dy_desc` - { dT | (N, D) | (..., 1) }: + 算子输出 `y` 的张量描述; +- `i1_desc` - { dI | (N) | (1) }: + 算子输入 `i1` 的张量描述; +- `i2_desc` - { dI | (N) | (1) }: + 算子输入 `i2` 的张量描述,为空表示不使用 $ table2 $, `alpha2` 必须同时为 0; +- `alpha1` - float: + 第 1 项嵌入的缩放因子; +- `alpha2` - float: + 第 2 项嵌入的缩放因子,取 0 表示不使用 $ table2 $,`i2_desc` 必须同时为空; +- `dtable1_acc` - char: + 第 1 项嵌入是否叠加梯度,0 表示不叠加; +- `dtable2_acc` - float: + 第 2 项嵌入是否叠加梯度,0 表示不叠加; + +
参数限制:
+ +- $dT$: 任意代数类型; +- $dT_i$: 任意整型; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_BAD_DEVICE`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyEmbeddingBackwardDescriptor( + infiniopEmbeddingBackwardDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_DEVICE`]. + + +[`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_BAD_DEVICE`]:/common/status/README.md#INFINI_STATUS_BAD_DEVICE +[`INFINI_STATUS_EXECUTION_FAILED`]:/common/status/README.md#INFINI_STATUS_EXECUTION_FAILED +[`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 diff --git a/infiniop/ops/embedding/README.md b/infiniop/ops/embedding/README.md new file mode 100644 index 0000000..28c1edb --- /dev/null +++ b/infiniop/ops/embedding/README.md @@ -0,0 +1,122 @@ + +# `Embedding` + +`Embedding`,即**嵌入**算子。用于对大模型进行词嵌入和加性位置嵌入。 + +`Embedding` 算子支持 1 个或 2 个相同的步骤,根据“号码”从嵌入表中获取嵌入向量并叠加到输出,其公式表述为: + +$$ Y = \alpha_1 \cdot table_1[i_1] + \alpha_2 \cdot table_2[i_2] $$ + +- 通常 $α$ 为 1; +- $table2$ 可以不使用,则公式变为 $Y = \alpha_1 \cdot table_1[i_1]$; + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopEmbedding( + infiniopEmbeddingDescriptor_t desc, + void *y, + const void *table1, + const void *table2, + const void *i1, + const void *i2, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateEmbeddingDescriptor()` 初始化的算子描述符; +- `y`: + 计算输出结果; +- `table1`: + 第 1 个嵌入表; +- `table2`: + 第 2 个嵌入表,不使用则为空; +- `i1`: + 第 1 个嵌入序号; +- `i2`: + 第 2 个嵌入序号,不使用则为空; +- `stream`: + 计算流/队列; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_DEVICE`], [`INFINI_STATUS_EXECUTION_FAILED`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateEmbeddingDescriptor( + infiniopHandle_t handle, + infiniopEmbeddingDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t y_desc, + infiniopTensorDescriptor_t table1_desc, + infiniopTensorDescriptor_t table2_desc, + infiniopTensorDescriptor_t i1_desc, + infiniopTensorDescriptor_t i2_desc, + float alpha1, + float alpha2 +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`] +- `desc_ptr`: + `infiniopCreateEmbeddingDescriptor` 指针,指向将被初始化的算子描述符地址; +- `y_desc` - { dT | (N, D) | (..., 1) }: + 算子输出 `y` 的张量描述; +- `table1_desc` - { dT | (N1, D) | (..., 1) }: + 算子输入 `table1` 的张量描述; +- `table2_desc` - { dT | (N2, D) | (..., 1) }: + 算子输入 `table2` 的张量描述; +- `i1_desc` - { dI | (N) | (1) }: + 算子输入 `i1` 的张量描述; +- `i2_desc` - { dI | (N) | (1) }: + 算子输入 `i2` 的张量描述,为空表示不使用 $ table2 $, `alpha2` 必须同时为 0; +- `alpha1` - float: + 第 1 项嵌入的缩放因子; +- `alpha2` - float: + 第 2 项嵌入的缩放因子,取 0 表示不使用 $ table2 $,`i2_desc` 必须同时为空; + +参数限制: + +- $dT$: 任意代数类型; +- $dT_i$: 任意整型; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_BAD_DEVICE`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyEmbeddingDescriptor( + infiniopEmbeddingDescriptor_t desc +); +``` + +
参数:
+ +- `desc`: + 输入。待销毁的算子描述符; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_DEVICE`]. + + +[`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_BAD_DEVICE`]:/common/status/README.md#INFINI_STATUS_BAD_DEVICE +[`INFINI_STATUS_EXECUTION_FAILED`]:/common/status/README.md#INFINI_STATUS_EXECUTION_FAILED +[`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 diff --git a/infiniop/ops/gemm/README.md b/infiniop/ops/gemm/README.md index ed04840..bfa72aa 100644 --- a/infiniop/ops/gemm/README.md +++ b/infiniop/ops/gemm/README.md @@ -80,8 +80,6 @@ infiniStatus_t infiniopCreateGemmDescriptor( - `beta` - float: 算子计算累加系数。 -
参数限制:
- 参数限制: - `dT`: (`Float16`, `Float32`) 之一; diff --git a/infiniop/ops/rearrange/README.md b/infiniop/ops/rearrange/README.md index 22dd052..5f48ef8 100644 --- a/infiniop/ops/rearrange/README.md +++ b/infiniop/ops/rearrange/README.md @@ -114,8 +114,6 @@ infiniStatus_t infiniopCreateRearrangeDescriptor( - `src_desc` - $\{ dT | shape | strides_{src} \}$: 算子计算参数 `src` 的张量描述。 -
参数限制:
- 参数限制: - $dT$: 任意类型。