Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions infiniop/ops/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,21 @@
- [`Add`](/infiniop/ops/add/README.md)
- [`Causal Softmax`](/infiniop/ops/causal_softmax/README.md)
- [`Clip`](/infiniop/ops/clip/README.md)
- [`CrossEntropyLoss Backward`](/infiniop/ops/crossentropyloss_backward/README.md)
- [`Div`](/infiniop/ops/div/README.md)
- [`GELU`](/infiniop/ops/gelu/README.md)
- [`GELU Backward`](/infiniop/ops/gelu_backward/README.md)
- [`GEMM`](/infiniop/ops/gemm/README.md)
- [`Logical And`](/infiniop/ops/logical_and/README.md)
- [`Logical Equal`](/infiniop/ops/logical_equal/README.md)
- [`Logical Or`](/infiniop/ops/logical_or/README.md)
- [`Mul`](/infiniop/ops/mul/README.md)
- [`Random Sample`](/infiniop/ops/random_sample/README.md)
- [`Rearrange`](/infiniop/ops/rearrange/README.md)
- [`ReLU Backward`](/infiniop/ops/relu_backward/README.md)
- [`RMS Norm`](/infiniop/ops/rms_norm/README.md)
- [`RoPE`](/infiniop/ops/rope/README.md)
- [`SiLU`](/infiniop/ops/silu/README.md)
- [`Softmax`](/infiniop/ops/softmax/README.md)
- [`Sub`](/infiniop/ops/sub/README.md)
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
139 changes: 139 additions & 0 deletions infiniop/ops/crossentropyloss_backward/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
# `CrossEntropyLoss Backward`

`CrossEntropyLoss Backward`,即 **交叉熵损失函数反向传播**算子,计算交叉熵损失函数的梯度。
计算为:
$$grad\_logits = (probs - target) / N$$
其中probs为概率,target为形状与logits相同的one-hot张量
## 接口

### 计算

```c
infiniStatus_t infiniopCrossEntropyLossBackward(
infiniopCrossEntropyLossBackwardDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *grad_logits,
const void *probs,
const void *target,
void *stream
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数: </div>

- `desc`:
已使用 `infiniopCreateCrossEntropyLossBackwardDescriptor()` 初始化的算子描述符;
- `workspace`:
指向算子计算所需的额外工作空间;
- `workspace_size`:
`workspace` 的大小,单位:字节;
- `grad_logits`:
输出梯度张量(对 logits 的梯度)。张量限制见[创建算子描述](#创建算子描述)部分;
- `probs`:
输入概率张量(softmax 后的概率分布)。张量限制见[创建算子描述](#创建算子描述)部分;
- `target`:
目标标签张量。张量限制见[创建算子描述](#创建算子描述)部分;
- `stream`:
计算流/队列;

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`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 infiniopCreateCrossEntropyLossBackwardDescriptor(
infiniopHandle_t handle,
infiniopCrossEntropyLossBackwardDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t grad_logits_desc,
infiniopTensorDescriptor_t probs_desc,
infiniopTensorDescriptor_t target_desc,
int64_t reduction,
int64_t ignore_index
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `handle`:
`infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
- `desc_ptr`:
`infiniopCrossEntropyLossBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址;
- `grad_logits_desc` - { dT | (N, C) | (...) }:
算子计算参数 `grad_logits` 的张量描述。
- `probs_desc` - { dT | (N, C) | (...) }:
算子计算参数 `probs` 的张量描述。
- `target_desc` - { iT | (N,) | (...) }:
算子计算参数 `target` 的张量描述。
- `reduction`:
损失缩减方式。0: 无缩减,1: 求平均,2: 求和。
- `ignore_index`:
忽略的目标索引值,通常用于忽略填充标记。

参数限制:

- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。
- `iT`: (`Int32`, `Int64`) 之一。
- `probs` 张量形状为 (N, C),其中 N 为批次大小,C 为类别数。
- `target` 张量形状为 (N,),包含类别索引。
- `grad_logits` 张量形状为 (N, C),与 `probs` 形状相同。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`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 infiniopGetCrossEntropyLossBackwardWorkspaceSize(
infiniopCrossEntropyLossBackwardDescriptor_t desc,
size_t *size
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `desc`:
已使用 `infiniopCreateCrossEntropyLossBackwardDescriptor()` 初始化的算子描述符;
- `size`:
额外空间大小的计算结果的写入地址;

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].

### 销毁算子描述符

```c
infiniStatus_t infiniopDestroyCrossEntropyLossBackwardDescriptor(
infiniopCrossEntropyLossBackwardDescriptor_t desc
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数: </div>

- `desc`:
输入。 待销毁的算子描述符;

<div style="background-color: lightblue; padding: 1px;"> 返回值: </div>

- [`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
144 changes: 144 additions & 0 deletions infiniop/ops/div/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# `Div`

`Div`, 即**除法**算子,为双目逐元素算子。其计算可被表述为:

$$ c = \frac{a}{b} $$

其中 `a` 和 `b` 为输入,`c` 为输出。

## 接口

### 计算

```c
infiniStatus_t infiniopDiv(
infiniopDivDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *c,
const void *a,
const void *b,
const void *mode,
void *stream
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数: </div>

- `desc`:
已使用 `infiniopCreateDivDescriptor()` 初始化的算子描述符;
- `workspace`:
指向算子计算所需的额外工作空间;
- `workspace_size`:
`workspace` 的大小,单位:字节;
- `c`:
输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
- `a`:
输入张量(被除数)。张量限制见[创建算子描述](#创建算子描述)部分;
- `b`:
输入张量(除数)。张量限制见[创建算子描述](#创建算子描述)部分;
- 'mode':
除法模式,0为默认除法,1为trunc截断除法,2为floor向下取整,
在python层以如下代码封装
```
class InfiniDivMode(IntEnum):
DEFAULT = 0
TRUNC = 1
FLOOR = 2
```
- `stream`:
计算流/队列;

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`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 infiniopCreateDivDescriptor(
infiniopHandle_t handle,
infiniopDivDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t c_desc,
infiniopTensorDescriptor_t a_desc,
infiniopTensorDescriptor_t b_desc
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `handle`:
`infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
- `desc_ptr`:
`infiniopDivDescriptor_t` 指针,指向将被初始化的算子描述符地址;
- `c_desc` - { dT | (d1,...,dn) | (...) }:
算子计算参数 `c` 的张量描述,支持原位计算。
- `a_desc` - { dT | (d1,...,dn) | (...) }:
算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。
- `b_desc` - { dT | (d1,...,dn) | (...) }:
算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。

参数限制:

- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。
- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。
- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。
- 计算输出参数 `c` 不能进行广播(`c` 的步长不能涉及广播设置,即步长不能有 0)

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`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 infiniopGetDivWorkspaceSize(
infiniopDivDescriptor_t desc,
size_t *size
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `desc`:
已使用 `infiniopCreateDivDescriptor()` 初始化的算子描述符;
- `size`:
额外空间大小的计算结果的写入地址;

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].

### 销毁算子描述符

```c
infiniStatus_t infiniopDestroyDivDescriptor(
infiniopDivDescriptor_t desc
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数: </div>

- `desc`:
输入。 待销毁的算子描述符;

<div style="background-color: lightblue; padding: 1px;"> 返回值: </div>

- [`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
Loading