张量计算后端契约。
ITensorCompute
00 Remarks
形状校验、广播等“语义边界”仍然由 Tensor 层负责, 后端只需要实现纯粹的数值计算。后端应当是无状态(或线程安全)的, 因为 Tensor.computeKernel 是一个全局共享变量。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Heaviside | 1 | 阶跃函数(Heaviside): 大于 0 的元素取 1, 否则取 0。 |
| SpMM | 1 | 稀疏 × 稠密矩阵乘法:dense[batch, Rows] · W[Rows, Columns] → [batch, Columns]。 |
| Slice | 1 | 沿指定轴截取 [start, start + length) 区间,返回独立的张量副本。 |
| Concat | 1 | 沿指定轴拼接若干张量(除 axis 外其余维度必须一致)。 |
| TopK | 1 | 沿最后一维取最大的 k 个元素(按值降序)。 |
| MaskedCrossEntropy | 1 | 带损失掩码的 softmax 交叉熵(语言模型训练的核心损失)。 |
| TryAdamWStep | 1 | 试做一次 AdamW 参数更新。 |
| PinDevice | 1 | 把张量钉成设备常驻缓冲,避免训练时每步重新上传。 |
| UnpinDevice | 1 | 解除钉住并立即释放对应的显存。 |
| IsDevicePinned | 1 | 该张量当前是否已被钉住。 |
| SyncFromDevice | 1 | 把设备常驻缓冲的内容回写到主机数组。 |
| Conv2D | 1 | 二维卷积(严格来说是互相关,与主流深度学习框架一致)。 |
| Conv2DBackwardInput | 1 | 卷积反向:计算对输入的梯度。 |
| Conv2DBackwardFilter | 1 | 卷积反向:计算对卷积核的梯度。 |
| Conv2DBackwardBias | 1 | 卷积反向:计算对偏置的梯度(沿 N / OH / OW 三个维度求和)。 |
| MaxPool2D | 1 | 二维最大池化前向,同时输出每个输出位置所对应的输入扁平下标(供反向 scatter)。 |
| MaxPool2DBackward | 1 | 二维最大池化反向:按前向记录的 argMax 把梯度回填到输入位置。 |
| Sum | 1 | 沿指定轴(Nothing 表示整体)求和 |
| SumAll | 1 | 整体求和 |
| Mean | 1 | 沿指定轴(Nothing 表示整体)求均值 |
| MeanAll | 1 | 整体求均值 |
| StdDev | 1 | 总体标准差 |
| L2Norm | 1 | L2 范数(欧几里得范数) |
| Add | 1 | |
| Subtract | 1 | |
| Multiply | 1 | |
| Divide | 1 | |
| Maximum | 1 | |
| Minimum | 1 | |
| Exp | 1 | |
| Log | 1 | |
| Sqrt | 1 | |
| Square | 1 | |
| Abs | 1 | |
| Sin | 1 | |
| Cos | 1 | |
| Tanh | 1 | |
| Sigmoid | 1 | |
| Negate | 1 | |
| Reciprocal | 1 | |
| Relu | 1 | |
| LeakyRelu | 1 | |
| Elu | 1 | |
| Gelu | 1 | |
| Swish | 1 | |
| AddScalar | 1 | |
| MultiplyScalar | 1 | |
| DivideScalar | 1 | |
| Pow | 1 | |
| Clip | 1 | |
| MatMul | 1 | |
| Transpose | 1 | |
| Max | 1 | |
| Min | 1 | |
| Prod | 1 | |
| ArgMax | 1 | |
| ArgMin | 1 | |
| Softmax | 1 | |
| LogSoftmax | 1 | |
| SigmoidCrossEntropyWithLogits | 1 | |
| MseLoss | 1 | |
| L2Loss | 1 | |
| HuberLoss | 1 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Name | 1 | 后端名称,用于诊断输出(例如 "SIMD" / "CUDA")。 |
| SupportsDeviceResidency | 1 | 是否支持把张量钉成设备常驻缓冲。 |
| PinnedDeviceBytes | 1 | 当前钉住的显存总字节数(供显存占用报告使用)。 |
04 Members
阶跃函数(Heaviside): 大于 0 的元素取 1, 否则取 0。
后端本身没有比较/掩码算子, 而 ReLU 系激活函数的反向传播需要的正是 (x > 0) ? dy : 0 这样的逐元素掩码; 有了本算子之后就可以写成 Heaviside(x) 与上游梯度逐元素相乘, 从而让整个反向过程同样可以下放到 GPU。 (命名为 Heaviside 而不是 Step, 是因为 Step 是 VB 的保留字)
稀疏 × 稠密矩阵乘法:dense[batch, Rows] · W[Rows, Columns] → [batch, Columns]。
这是脉冲神经网络加载真实突触连接组(如 FlyWire,十万级神经元 / 千万级突触) 的核心算子:稠密矩阵在此规模下不可行,必须走稀疏路径。
| Name | Type | Description |
|---|---|---|
csr | SparseCsr | CSR 稀疏连接矩阵(行 = 突触前,列 = 突触后)。SDK 后端可据此把 CSR 数组 常驻显存并按 SparseCsr.Version 判定失效。 |
dense | Tensor | 稠密张量 |
稠密张量 [batch, csr.Columns]
沿指定轴截取 [start, start + length) 区间,返回独立的张量副本。
这是纯数据搬移算子,服务于 "只读取缓存前缀" 的场景(典型例子:KV Cache 按当前 序列长度取出 K/V)。它不参与梯度计算,反向由调用方用散射类算子完成。
| Name | Type | Description |
|---|---|---|
t | Tensor | 输入张量(秩 >= 1) |
axis | Int32 | 切片轴,支持负数(-1 表示最后一维) |
start | Int32 | 起始下标(含) |
length | Int32 | 截取长度 |
与 t 同秩、仅 axis 维变为 length 的新张量
Int32)沿指定轴拼接若干张量(除 axis 外其余维度必须一致)。
既有的 Transformer.TensorOps.ConcatLastDim 只支持最后一维;本算子支持任意轴, 是 KV Cache 沿 "序列维" 追加、以及多段 prompt 片段拼接的基础。
| Name | Type | Description |
|---|---|---|
parts | Tensor() | 待拼接的张量序列(至少一个,且秩相同) |
axis | Int32 | 拼接轴,支持负数 |
沿 axis 维长度为各输入该维长度之和的新张量
沿最后一维取最大的 k 个元素(按值降序)。
MoE 路由器(专家打分 Top-K)与采样器(Top-k / Top-p)的共同前置步骤。 纯选择算子,同样不参与梯度计算。
| Name | Type | Description |
|---|---|---|
t | Tensor | 输入张量(秩 >= 1) |
k | Int32 | 保留的元素个数,取值范围 |
indices | Tensor | 输出参数:与返回值同形,元素为被选中元素在原始最后一维中的下标。 与 ITensorCompute.ArgMax() 保持一致,下标同样以 |
形状与 t 相同、仅最后一维变为 k 的张量
带损失掩码的 softmax 交叉熵(语言模型训练的核心损失)。
这是 SFT 能成立的关键:只对 assistant 自己产出的 token 计损失, 用户消息与工具返回结果不计 —— 模型要学的是"该怎么回应"。
| Name | Type | Description |
|---|---|---|
logits | Tensor | 形状 |
targets | Int32() | 长度 |
mask | Boolean() | 长度 |
dLogits | Tensor | 输出参数:形状同 logits, 内容为 |
平均到每个有效位置上的负对数似然;没有任何有效位置时返回 0
Double, Double, Double, Double, Double, Double, Double)试做一次 AdamW 参数更新。
之所以设计成"试做 + 返回布尔"而不是直接实现:主机侧的 AdamW 实现包含 参数张量的读写语义(MarkHostModified 等),把它整体搬进后端会 让契约承担超出"算子"的职责。让后端只负责"能不能替你做",边界更清晰。
| Name | Type | Description |
|---|---|---|
param | Tensor | 待更新的参数(可能被就地改写) |
gradient | Tensor | 梯度累加器;成功后由实现负责清零 |
momentum | Tensor | 一阶矩估计(与参数同形) |
velocity | Tensor | 二阶矩估计(与参数同形) |
learningRate | Double | 学习率 |
beta1 | Double | 一阶矩衰减率 |
beta2 | Double | 二阶矩衰减率 |
eps | Double | 数值稳定项 |
biasCorrection1 | Double |
|
biasCorrection2 | Double |
|
weightDecay | Double | 解耦权重衰减系数;0 表示退化为纯 Adam |
True 表示本轮更新已由本后端完成(调用方不得再走主机循环); False 表示本后端不提供该能力,由调用方回退。
把张量钉成设备常驻缓冲,避免训练时每步重新上传。
| Name | Type | Description |
|---|---|---|
t | Tensor | 要被钉住的张量(其底层数组作为键) |
label | String | 诊断用标签,例如 |
zeroFill | Boolean | 是否用 0 初始化(梯度累加器与优化器状态用 |
钉住成功返回 True;后端不支持时返回 False
解除钉住并立即释放对应的显存。
该张量当前是否已被钉住。
把设备常驻缓冲的内容回写到主机数组。
被钉住的张量以设备为主副本,主机 Data 会逐渐陈旧。 凡是需要"读主机内容"的场合(检查点落盘、主机侧统计、 以及那些在主机循环里直接读权重的模块)都必须先调用本方法同步。
该张量未被钉住、或后端不支持常驻时返回 False
二维卷积(严格来说是互相关,与主流深度学习框架一致)。
| Name | Type | Description |
|---|---|---|
x | Tensor | 输入,形状 (N, H, W, C) |
filters | Tensor | 卷积核,形状 (KH, KW, C, OutC) |
bias | Tensor | 偏置,形状 (OutC);传 Nothing 表示不加偏置 |
stride | Int32 | 步长 |
padding | Int32 | 四周零填充宽度 |
输出,形状 (N, OH, OW, OutC)
卷积反向:计算对输入的梯度。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, OutC) |
filters | Tensor | 前向使用过的卷积核,形状 (KH, KW, C, OutC) |
inputShape | Int32() | 前向输入的形状 (N, H, W, C),用于确定输出形状 |
对输入的梯度,形状 (N, H, W, C)
卷积反向:计算对卷积核的梯度。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, OutC) |
x | Tensor | 前向使用过的输入,形状 (N, H, W, C) |
filterShape | Int32() | 卷积核形状 (KH, KW, C, OutC),用于确定输出形状 |
对卷积核的梯度,形状 (KH, KW, C, OutC)
卷积反向:计算对偏置的梯度(沿 N / OH / OW 三个维度求和)。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, OutC) |
对偏置的梯度,形状 (OutC)
二维最大池化前向,同时输出每个输出位置所对应的输入扁平下标(供反向 scatter)。
| Name | Type | Description |
|---|---|---|
x | Tensor | 输入,形状 (N, H, W, C) |
size | Int32 | 池化窗口边长 |
stride | Int32 | 步长 |
padding | Int32 | 四周零填充宽度 |
argMax | Tensor | 输出参数:形状 (N, OH, OW, C),元素为获胜元素在输入张量之中的扁平下标 (即 |
输出,形状 (N, OH, OW, C)
二维最大池化反向:按前向记录的 argMax 把梯度回填到输入位置。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, C) |
argMax | Tensor | 前向返回的输入扁平下标,形状 (N, OH, OW, C) |
inputShape | Int32() | 前向输入的形状 (N, H, W, C) |
对输入的梯度,形状 (N, H, W, C)
沿指定轴(Nothing 表示整体)求和
整体求和
沿指定轴(Nothing 表示整体)求均值
整体求均值
总体标准差
L2 范数(欧几里得范数)
后端名称,用于诊断输出(例如 "SIMD" / "CUDA")。
是否支持把张量钉成设备常驻缓冲。
默认实现返回 False(纯 CPU 后端自然不需要这个概念)。 只有 True 时调用方才应该去调用 ITensorCompute.PinDevice()。
当前钉住的显存总字节数(供显存占用报告使用)。
Double)Double)Double)Double)Double)Double)Nullable(Of Int32))Nullable(Of Int32))Nullable(Of Int32))Int32)Int32)