Tensor的操作#
支持数学运算#
PyPTO为张量计算提供了一套全面的操作,旨在为用户提供高效、灵活的计算能力。这些操作分为向量操作、矩阵操作,并将相关操作进行组合以实现更复杂的计算逻辑。
向量运算#
向量运算是在张量上执行元素级别的计算,适用于各种基本数学操作。
算术运算
# 加法 result = pypto.add(a, b) result = pypto.add(a, scalar) # 将标量添加到张量 result = pypto.add(a, b, alpha=2.0) # a + 2.0 * b result = a + b # 减法 result = pypto.sub(a, b) result = pypto.sub(a, scalar) result = pypto.sub(a, b, alpha=2.0) # a - 2.0 * b result = a - b # 乘法 result = pypto.mul(a, b) result = pypto.mul(a, scalar) result = a * b # 除法 result = pypto.div(a, b) result = pypto.div(a, scalar) result = a / b # 指数 result = pypto.pow(a, scalar) # a ** scalar
数学函数
# 指数和对数 result = pypto.exp(x) # e ** x result = pypto.log(x) # ln(x) result = x.exp() result = x.log() # 开根号 result = pypto.sqrt(x) # √x result = pypto.rsqrt(x) # 1/√x result = x.sqrt() result = x.rsqrt() # 三角函数 result = pypto.sin(x) result = pypto.cos(x) result = x.sin() result = x.cos() # 绝对值 result = pypto.abs(x) result = x.abs() # 相反数 result = pypto.neg(x) # -x result = x.neg()
激活函数
# Sigmoid result = pypto.sigmoid(x) # 1 / (1 + exp(-x)) result = x.sigmoid() # ReLU变体 result = pypto.relu(x) # 最大值(0, x) result = pypto.gelu(x) # GELU激活 result = x.relu() result = x.gelu() # Softmax result = pypto.softmax(x, dim=-1) # 沿着dim维度做Softmax result = x.softmax(x, dim=-1)
比较操作
# 最大值和最小值 result = pypto.maximum(a, b) # 逐元素最大值 result = pypto.minimum(a, b) # 逐元素最小值 # 截断 result = pypto.clip(x, min_val, max_val) # 将x的取值范围进行截断
归约操作
# 求和 result = pypto.sum(x, dim=-1, keepdim=False) result = x.sum(dim=-1, keepdim=False) # 最大值 result = pypto.amax(x, dim=-1, keepdim=False) result = x.amax(dim=-1, keepdim=False) # 最小值 result = pypto.amin(x, dim=-1, keepdim=False) result = x.amin(dim=-1, keepdim=False)
原地修改 (inplace)
# 使用move()进行就地操作 output.move(pypto.add(a, b)) # 高效,无拷贝 # 或者使用赋值 output[:] = pypto.add(a, b) # 也是高效的
广播模式(broadcast)
许多操作支持广播,这使得操作更加灵活和高效。
# 张量 + 标量(张量为标量) result = pypto.add(tensor, 2.0) # 张量 + 一维张量(一维张量) bias = pypto.tensor([features], pypto.DT_BF16, "bias") result = pypto.add(tensor, bias)
矩阵运算#
矩阵运算针对NPU的Cube核进行了优化,适用于大规模矩阵计算。
# 基本矩阵乘法
# C = A @ B,其中 A: [M, K], B: [K, N], C: [M, N]
result = pypto.matmul(A, B, out_dtype=pypto.DT_BF16)
# 用转置,其中 A: [M, K], B: [N, K]
result = pypto.matmul(A, B, out_dtype=pypto.DT_BF16, a_trans=False, b_trans=True)
# 批量矩阵乘法
# A: [B, M, K], B: [B, K, N],结果:[B, M, N]
result = pypto.matmul(A, B, out_dtype=pypto.DT_BF16)
# 带有偏置
bias = pypto.tensor([1, N], pypto.DT_BF16, "bias")
result = pypto.matmul(A, B, out_dtype=pypto.DT_BF16, extend_params={'bias_tensor': bias})
# 用转置,其中 A: [M, K], B: [N, K], 输出为NZ格式
result = pypto.matmul(A, B, out_dtype=pypto.DT_BF16, a_trans=False, b_trans=True, c_matrix_nz=True)
矩阵乘法参数:
input:左矩阵 [M, K] 或 [B, M, K]mat2:右矩阵 [K, N] 或 [B, K, N]out_dtype:输出数据类型a_trans:转置左矩阵(默认:False)b_trans:转置右矩阵(默认:False)c_matrix_nz:以NZ格式输出(默认值:False)extend_params:扩展特征(偏置、去量化等)。
组合操作#
可以组合上述基本操作,以实现更复杂的计算逻辑。
def softmax_core(x: pypto.Tensor) -> pypto.Tensor:
row_max = pypto.amax(x, dim=-1, keepdim=True) # 计算行最大值
sub = x - row_max # 值归一化
exp = pypto.exp(sub) # 指数运算
esum = pypto.sum(exp, dim=-1, keepdim=True) # 求和
return exp / esum # 概率归一化
def softmax_kernel(x: pypto.Tensor, y: pypto.Tensor) -> None:
...
for idx in pypto.loop(b_loop):
...
softmax_out = softmax_core(x_view)
...
支持逻辑结构变换#
逻辑结构变换操作允许用户在张量上进行形状、维度和类型等变换,以适应不同的计算需求。
视图和组装#
视图:视图操作创建对相同基础数据的新张量引用,适用于分块处理和局部计算。
# 视图 view = pypto.view(tensor, view_shape, offset, valid_shape)
示例:
# 创建具有特定形状和偏移量的视图 view = pypto.view( tensor, view_shape=[32, 32], offset=[10, 20], valid_shape=[actual_h, actual_w] # 可选 )
参数说明:
tensor:源张量
view_shape:视图的形状
offset:源张量的起始位置
valid_shape:实际有效尺寸(用于边界处理)
Tensor支持Python风格的索引和切片,适用于灵活的数据访问。
tensor = pypto.tensor([10, 20], pypto.DT_FP16, "tensor") # 单个元素(创建视图) element = tensor[0, 0] # 只支持INT32 # 切片(创建视图) slice_tensor = tensor[0:5, 10:20] # 椭圆 ellipsis_slice = tensor[..., 0:10]
组装:assemble函数在指定的偏移处将较小的张量放入较大的张量,适用于分块处理后的结果合并。
# 将一个小的张量组装成一个大的张量 pypto.assemble( small_tensor, # 源张量 offsets=[10, 20], # 目标位置 large_tensor # 目标张量 )
示例:
# 小张量结果 tile_result = pypto.tensor([32, 32], pypto.DT_FP16, "tile") # 大输出张量 output = pypto.tensor([100, 200], pypto.DT_FP16, "output") # 在 [10, 20] 位置组装输出张量 pypto.assemble(tile_result, [10, 20], output)
重塑形状/维度#
# 重塑张量
reshaped = pypto.reshape(tensor, [new_shape])
# 转置
transposed = pypto.transpose(tensor, dim0=0, dim1=1)
重塑不会改变数据,只会改变尺寸的视图。
类型转换#
# 转换为不同的数据类型
result = pypto.cast(tensor, pypto.DT_FP32, mode=pypto.CastMode.CAST_NONE)