nuget server logo nuget api documents
↑

API Docs / Microsoft.VisualBasic.MachineLearning.TensorFlow / ITensorCompute

ITensorCompute

Full name Microsoft.VisualBasic.MachineLearning.TensorFlow.Compute.ITensorCompute Assembly Microsoft.VisualBasic.MachineLearning.TensorFlow Members 66

张量计算后端契约。

00 Remarks

形状校验、广播等“语义边界”仍然由 Tensor 层负责, 后端只需要实现纯粹的数值计算。后端应当是无状态(或线程安全)的, 因为 Tensor.computeKernel 是一个全局共享变量。

01 Syntax

Microsoft.VisualBasic.MachineLearning.TensorFlow.Compute.ITensorCompute

02 Methods

NameOverloadsSummary
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

NameOverloadsSummary
Name 1 后端名称,用于诊断输出(例如 "SIMD" / "CUDA")。
SupportsDeviceResidency 1 是否支持把张量钉成设备常驻缓冲。
PinnedDeviceBytes 1 当前钉住的显存总字节数(供显存占用报告使用)。

04 Members

method Heaviside #
Heaviside(Tensor)

阶跃函数(Heaviside): 大于 0 的元素取 1, 否则取 0。

Remarks

后端本身没有比较/掩码算子, 而 ReLU 系激活函数的反向传播需要的正是 (x > 0) ? dy : 0 这样的逐元素掩码; 有了本算子之后就可以写成 Heaviside(x) 与上游梯度逐元素相乘, 从而让整个反向过程同样可以下放到 GPU。 (命名为 Heaviside 而不是 Step, 是因为 Step 是 VB 的保留字)

method SpMM #

稀疏 × 稠密矩阵乘法:dense[batch, Rows] · W[Rows, Columns] → [batch, Columns]。

Remarks

这是脉冲神经网络加载真实突触连接组(如 FlyWire,十万级神经元 / 千万级突触) 的核心算子:稠密矩阵在此规模下不可行,必须走稀疏路径。

Parameters
NameTypeDescription
csrSparseCsr

CSR 稀疏连接矩阵(行 = 突触前,列 = 突触后)。SDK 后端可据此把 CSR 数组 常驻显存并按 SparseCsr.Version 判定失效。

denseTensor

稠密张量 [batch, csr.Rows](例如上一时刻的脉冲矩阵)

Returns

稠密张量 [batch, csr.Columns]

method Slice #
Slice(Tensor, Int32, Int32, Int32)

沿指定轴截取 [start, start + length) 区间,返回独立的张量副本。

Remarks

这是纯数据搬移算子,服务于 "只读取缓存前缀" 的场景(典型例子:KV Cache 按当前 序列长度取出 K/V)。它不参与梯度计算,反向由调用方用散射类算子完成。

Parameters
NameTypeDescription
tTensor

输入张量(秩 >= 1)

axisInt32

切片轴,支持负数(-1 表示最后一维)

startInt32

起始下标(含)

lengthInt32

截取长度

Returns

与 t 同秩、仅 axis 维变为 length 的新张量

method Concat #
Concat(Tensor(), Int32)

沿指定轴拼接若干张量(除 axis 外其余维度必须一致)。

Remarks

既有的 Transformer.TensorOps.ConcatLastDim 只支持最后一维;本算子支持任意轴, 是 KV Cache 沿 "序列维" 追加、以及多段 prompt 片段拼接的基础。

Parameters
NameTypeDescription
partsTensor()

待拼接的张量序列(至少一个,且秩相同)

axisInt32

拼接轴,支持负数

Returns

沿 axis 维长度为各输入该维长度之和的新张量

method TopK #
TopK(Tensor, Int32, Tensor)

沿最后一维取最大的 k 个元素(按值降序)。

Remarks

MoE 路由器(专家打分 Top-K)与采样器(Top-k / Top-p)的共同前置步骤。 纯选择算子,同样不参与梯度计算。

Parameters
NameTypeDescription
tTensor

输入张量(秩 >= 1)

kInt32

保留的元素个数,取值范围 [1, t.Shape(t.Rank - 1)]

indicesTensor

输出参数:与返回值同形,元素为被选中元素在原始最后一维中的下标。 与 ITensorCompute.ArgMax() 保持一致,下标同样以 Double 存储。

Returns

形状与 t 相同、仅最后一维变为 k 的张量

method MaskedCrossEntropy #
MaskedCrossEntropy(Tensor, Int32(), Boolean(), Tensor)

带损失掩码的 softmax 交叉熵(语言模型训练的核心损失)。

Remarks

这是 SFT 能成立的关键:只对 assistant 自己产出的 token 计损失, 用户消息与工具返回结果不计 —— 模型要学的是"该怎么回应"。

Parameters
NameTypeDescription
logitsTensor

形状 [rows, vocab] 的二维 logits

targetsInt32()

长度 >= rows 的目标 token 下标

maskBoolean()

长度 >= rows 的损失掩码;Nothing 表示全部计入。 mask(r) = False 的位置既不计入损失,梯度也保持 0。

dLogitsTensor

输出参数:形状同 logits, 内容为 (softmax − onehot) / count(未计入的位置为 0)。

Returns

平均到每个有效位置上的负对数似然;没有任何有效位置时返回 0

method TryAdamWStep #
TryAdamWStep(Tensor, Tensor, Tensor, Tensor, Double, Double, Double, Double, Double, Double, Double)

试做一次 AdamW 参数更新。

Remarks

之所以设计成"试做 + 返回布尔"而不是直接实现:主机侧的 AdamW 实现包含 参数张量的读写语义(MarkHostModified 等),把它整体搬进后端会 让契约承担超出"算子"的职责。让后端只负责"能不能替你做",边界更清晰。

Parameters
NameTypeDescription
paramTensor

待更新的参数(可能被就地改写)

gradientTensor

梯度累加器;成功后由实现负责清零

momentumTensor

一阶矩估计(与参数同形)

velocityTensor

二阶矩估计(与参数同形)

learningRateDouble

学习率

beta1Double

一阶矩衰减率

beta2Double

二阶矩衰减率

epsDouble

数值稳定项

biasCorrection1Double

1 − beta1^step(由调用方算好)

biasCorrection2Double

1 − beta2^step(由调用方算好)

weightDecayDouble

解耦权重衰减系数;0 表示退化为纯 Adam

Returns

True 表示本轮更新已由本后端完成(调用方不得再走主机循环); False 表示本后端不提供该能力,由调用方回退。

method PinDevice #
PinDevice(Tensor, String, Boolean)

把张量钉成设备常驻缓冲,避免训练时每步重新上传。

Parameters
NameTypeDescription
tTensor

要被钉住的张量(其底层数组作为键)

labelString

诊断用标签,例如 layer3.moe.expert5.Wg

zeroFillBoolean

是否用 0 初始化(梯度累加器与优化器状态用 True)。

Returns

钉住成功返回 True;后端不支持时返回 False

method UnpinDevice #
UnpinDevice(Tensor)

解除钉住并立即释放对应的显存。

method IsDevicePinned #
IsDevicePinned(Tensor)

该张量当前是否已被钉住。

method SyncFromDevice #
SyncFromDevice(Tensor)

把设备常驻缓冲的内容回写到主机数组。

Remarks

被钉住的张量以设备为主副本,主机 Data 会逐渐陈旧。 凡是需要"读主机内容"的场合(检查点落盘、主机侧统计、 以及那些在主机循环里直接读权重的模块)都必须先调用本方法同步。

Returns

该张量未被钉住、或后端不支持常驻时返回 False

method Conv2D #
Conv2D(Tensor, Tensor, Tensor, Int32, Int32)

二维卷积(严格来说是互相关,与主流深度学习框架一致)。

Parameters
NameTypeDescription
xTensor

输入,形状 (N, H, W, C)

filtersTensor

卷积核,形状 (KH, KW, C, OutC)

biasTensor

偏置,形状 (OutC);传 Nothing 表示不加偏置

strideInt32

步长

paddingInt32

四周零填充宽度

Returns

输出,形状 (N, OH, OW, OutC)

method Conv2DBackwardInput #
Conv2DBackwardInput(Tensor, Tensor, Int32(), Int32, Int32)

卷积反向:计算对输入的梯度。

Parameters
NameTypeDescription
gradOutputTensor

上游梯度,形状 (N, OH, OW, OutC)

filtersTensor

前向使用过的卷积核,形状 (KH, KW, C, OutC)

inputShapeInt32()

前向输入的形状 (N, H, W, C),用于确定输出形状

Returns

对输入的梯度,形状 (N, H, W, C)

method Conv2DBackwardFilter #
Conv2DBackwardFilter(Tensor, Tensor, Int32(), Int32, Int32)

卷积反向:计算对卷积核的梯度。

Parameters
NameTypeDescription
gradOutputTensor

上游梯度,形状 (N, OH, OW, OutC)

xTensor

前向使用过的输入,形状 (N, H, W, C)

filterShapeInt32()

卷积核形状 (KH, KW, C, OutC),用于确定输出形状

Returns

对卷积核的梯度,形状 (KH, KW, C, OutC)

method Conv2DBackwardBias #
Conv2DBackwardBias(Tensor)

卷积反向:计算对偏置的梯度(沿 N / OH / OW 三个维度求和)。

Parameters
NameTypeDescription
gradOutputTensor

上游梯度,形状 (N, OH, OW, OutC)

Returns

对偏置的梯度,形状 (OutC)

method MaxPool2D #
MaxPool2D(Tensor, Int32, Int32, Int32, Tensor)

二维最大池化前向,同时输出每个输出位置所对应的输入扁平下标(供反向 scatter)。

Parameters
NameTypeDescription
xTensor

输入,形状 (N, H, W, C)

sizeInt32

池化窗口边长

strideInt32

步长

paddingInt32

四周零填充宽度

argMaxTensor

输出参数:形状 (N, OH, OW, C),元素为获胜元素在输入张量之中的扁平下标 (即 n*H*W*C + h*W*C + w*C + c)。反向传播依赖它做梯度回填, 因为每个输出位置唯一的对应一个输入位置,所以反向不需要原子操作。

Returns

输出,形状 (N, OH, OW, C)

method MaxPool2DBackward #
MaxPool2DBackward(Tensor, Tensor, Int32())

二维最大池化反向:按前向记录的 argMax 把梯度回填到输入位置。

Parameters
NameTypeDescription
gradOutputTensor

上游梯度,形状 (N, OH, OW, C)

argMaxTensor

前向返回的输入扁平下标,形状 (N, OH, OW, C)

inputShapeInt32()

前向输入的形状 (N, H, W, C)

Returns

对输入的梯度,形状 (N, H, W, C)

method Sum #
Sum(Tensor, Nullable(Of Int32), Boolean)

沿指定轴(Nothing 表示整体)求和

method SumAll #
SumAll(Tensor)

整体求和

method Mean #
Mean(Tensor, Nullable(Of Int32), Boolean)

沿指定轴(Nothing 表示整体)求均值

method MeanAll #
MeanAll(Tensor)

整体求均值

method StdDev #
StdDev(Tensor)

总体标准差

method L2Norm #
L2Norm(Tensor)

L2 范数(欧几里得范数)

property Name #
Name

后端名称,用于诊断输出(例如 "SIMD" / "CUDA")。

property SupportsDeviceResidency #
SupportsDeviceResidency

是否支持把张量钉成设备常驻缓冲。

Remarks

默认实现返回 False(纯 CPU 后端自然不需要这个概念)。 只有 True 时调用方才应该去调用 ITensorCompute.PinDevice()。

property PinnedDeviceBytes #
PinnedDeviceBytes

当前钉住的显存总字节数(供显存占用报告使用)。

method Add #
method Subtract #
Subtract(Tensor, Tensor)
method Multiply #
Multiply(Tensor, Tensor)
method Divide #
Divide(Tensor, Tensor)
method Maximum #
Maximum(Tensor, Tensor)
method Minimum #
Minimum(Tensor, Tensor)
method Exp #
Exp(Tensor)
method Log #
Log(Tensor)
method Sqrt #
Sqrt(Tensor)
method Square #
Square(Tensor)
method Abs #
Abs(Tensor)
method Sin #
Sin(Tensor)
method Cos #
Cos(Tensor)
method Tanh #
Tanh(Tensor)
method Sigmoid #
Sigmoid(Tensor)
method Negate #
Negate(Tensor)
method Reciprocal #
Reciprocal(Tensor)
method Relu #
Relu(Tensor)
method LeakyRelu #
LeakyRelu(Tensor, Double)
method Elu #
Elu(Tensor, Double)
method Gelu #
Gelu(Tensor)
method Swish #
Swish(Tensor)
method AddScalar #
AddScalar(Tensor, Double)
method MultiplyScalar #
MultiplyScalar(Tensor, Double)
method DivideScalar #
DivideScalar(Tensor, Double)
method Pow #
Pow(Tensor, Double)
method Clip #
Clip(Tensor, Double, Double)
method MatMul #
MatMul(Tensor, Tensor)
method Transpose #
Transpose(Tensor)
method Max #
Max(Tensor, Nullable(Of Int32), Boolean)
method Min #
Min(Tensor, Nullable(Of Int32), Boolean)
method Prod #
Prod(Tensor, Nullable(Of Int32))
method ArgMax #
ArgMax(Tensor, Nullable(Of Int32))
method ArgMin #
ArgMin(Tensor, Nullable(Of Int32))
method Softmax #
Softmax(Tensor, Int32)
method LogSoftmax #
LogSoftmax(Tensor, Int32)
method SigmoidCrossEntropyWithLogits #
SigmoidCrossEntropyWithLogits(Tensor, Tensor)
method MseLoss #
MseLoss(Tensor, Tensor)
method L2Loss #
L2Loss(Tensor)
method HuberLoss #
HuberLoss(Tensor, Tensor, Double)