PyPTO API 速查
Kernel 装饰器
@pypto.frontend.jit(
runtime_options={"run_mode": _PYPTO_RUN_MODE},
debug_options={"runtime_debug_mode": _PYPTO_RUNTIME_DEBUG_MODE},
)
def kernel(x: pypto.Tensor(shape_tuple, dtype)) -> pypto.Tensor(shape_tuple, dtype):
...
张量
| API |
用途 |
示例 |
pypto.Tensor(shape, dtype) |
输入/输出类型标注 |
x: pypto.Tensor((m, k), pypto.DT_FP32) |
pypto.tensor(shape_list, dtype) |
kernel 内创建输出 |
output = pypto.tensor([m, n], pypto.DT_FP32) |
pypto.zeros(shape_list, dtype=) |
零初始化张量(累加器) |
acc = pypto.zeros([1], dtype=pypto.DT_FP32) |
pypto.full(shape, val, dtype, valid_shape=) |
常量填充张量 |
ones = pypto.full(s, 1.0, pypto.DT_FP32, valid_shape=s) |
数据类型:pypto.DT_FP32、pypto.DT_INT32、pypto.DT_INT64(INT64 仅用于输入标注)。
Tile 配置
| API |
约束 |
pypto.set_vec_tile_shapes(*shapes) |
参数个数 = 被操作张量 rank |
pypto.set_cube_tile_shapes(m, k, n, l1, split_k) |
固定 5 参数 |
tile 双约束:
prod(tile_shape) ≤ 16384
auto_tiles = prod(每维 ceil(shape[i]/tile[i])) ≤ 2048(每个 op)
- 必须在任何计算操作之前调用。一个 kernel 内可多次切换 tile。
- 若
auto_tiles > 2048,优先改为 loop + view/assemble 分块实现。
- vec tile 推荐:
(8192) (1D)、(1, 16384) (2D)、(1, 1, 16384) (3D)
- cube tile 推荐:
set_cube_tile_shapes([128, 128], [32, 128], [256, 256], True, False)
分块
| API |
用途 |
约束 |
pypto.loop(start, end, step, name=, idx_name=) |
编译期循环 |
不嵌套、尽量少用 |
pypto.view(tensor, shape, offset) |
切片提取(等价 tensor[a:b, c:d]) |
shape 各维为编译期常量,rank 不变,每维 ≤ 输入对应维 |
pypto.assemble(chunk, offset, output) |
写回子块(等价切片赋值) |
无 |
pypto.view 不是 reshape。它是 tensor[offset[0]:offset[0]+shape[0], ...] 的等价 API。不能改变维度数,不能改变维度排布。所有 reshape 必须在 forward 中用 torch 完成。
算术运算
运算符规则:+ * 支持标量在任意位置;- / 要求 tensor 在左侧(1.0 - x crash)。
函数调用:pypto.add/sub/mul/div 第一参数必须 Tensor。
一元取反 -x:不支持,用 pypto.mul(x, -1.0) 或 x * (-1.0)。
切片赋值:output[:] = expr
数学函数
| 函数 |
说明 |
pypto.exp(x) |
指数 |
pypto.log(x) |
对数 |
pypto.sqrt(x) |
平方根 |
pypto.abs(x) |
绝对值 |
pypto.sigmoid(x) |
sigmoid |
pypto.softmax(x, dim=) |
softmax |
pypto.maximum(a, b) |
逐元素最大,b 可以是标量:pypto.maximum(x, 0.0) |
pypto.minimum(a, b) |
逐元素最小,b 可以是标量:pypto.minimum(x, 0.0) |
有内建函数时直接调用,禁止手写等价公式。
禁用 API:pypto.where(有 bug)、pypto.clamp(不稳定)。条件逻辑用 maximum/minimum 组合实现。
归约
pypto.sum(x, dim=int, keepdim=bool)
pypto.amax(x, dim=int, keepdim=bool)
pypto.amin(x, dim=int, keepdim=bool)
无 pypto.mean API。 mean 语义请用 sum * (1.0 / count) 实现。
dim 只接受单个 int,不支持 list。 多轴归约需连续多次调用。
dim 在实际实现中应作为闭包常量参与编译;静态任务不要在同一 kernel 内写多 dim 运行时分支。
矩阵乘法
pypto.matmul(a, b, out_dtype, a_trans=False, b_trans=False)
- 2D:
[M,K] @ [K,N] → [M,N]
- 3D batched:
[B,M,K] @ [B,K,N] → [B,M,N](两边必须同 rank 同 batch,不支持广播)
a_trans / b_trans 支持转置。
- 限制:每个输入最后一维 ≤ 65535。超过时用
sum(a * b_broadcast, dim=) 替代。
- matmul 几乎必须配合 loop(M 轴分块),因 matmul 内部展开复杂,不 loop 容易 timeout。例外:M 很小(≤128)时可不 loop。
类型转换与索引
| API |
示例 |
pypto.cast(tensor, dtype) |
pypto.cast(x, pypto.DT_INT32) |
pypto.unsqueeze(tensor, dim) |
pypto.unsqueeze(x, 1) |
pypto.gather(tensor, dim, index) |
pypto.gather(log_probs, dim=1, index=idx) |
pypto.expand_clone(tensor, shape) |
单轴广播,每次只能扩展一个轴 |
1---2name: pypto-api3description: PyPTO 全部 API 签名与约束速查4---56# PyPTO API 速查78## Kernel 装饰器910```python11@pypto.frontend.jit(12 runtime_options={"run_mode": _PYPTO_RUN_MODE},13 debug_options={"runtime_debug_mode": _PYPTO_RUNTIME_DEBUG_MODE},14)15def kernel(x: pypto.Tensor(shape_tuple, dtype)) -> pypto.Tensor(shape_tuple, dtype):16 ...17```1819## 张量2021| API | 用途 | 示例 |22|-----|------|------|23| `pypto.Tensor(shape, dtype)` | 输入/输出类型标注 | `x: pypto.Tensor((m, k), pypto.DT_FP32)` |24| `pypto.tensor(shape_list, dtype)` | kernel 内创建输出 | `output = pypto.tensor([m, n], pypto.DT_FP32)` |25| `pypto.zeros(shape_list, dtype=)` | 零初始化张量(累加器) | `acc = pypto.zeros([1], dtype=pypto.DT_FP32)` |26| `pypto.full(shape, val, dtype, valid_shape=)` | 常量填充张量 | `ones = pypto.full(s, 1.0, pypto.DT_FP32, valid_shape=s)` |2728数据类型:`pypto.DT_FP32`、`pypto.DT_INT32`、`pypto.DT_INT64`(INT64 仅用于输入标注)。2930## Tile 配置3132| API | 约束 |33|-----|------|34| `pypto.set_vec_tile_shapes(*shapes)` | 参数个数 = 被操作张量 rank |35| `pypto.set_cube_tile_shapes(m, k, n, l1, split_k)` | 固定 5 参数 |3637**tile 双约束**:381. `prod(tile_shape)` ≤ 16384392. `auto_tiles = prod(每维 ceil(shape[i]/tile[i]))` ≤ 2048(每个 op)4041- 必须在任何计算操作之前调用。一个 kernel 内可多次切换 tile。42- 若 `auto_tiles > 2048`,优先改为 `loop + view/assemble` 分块实现。43- **vec tile 推荐**:`(8192)` (1D)、`(1, 16384)` (2D)、`(1, 1, 16384)` (3D)44- **cube tile 推荐**:`set_cube_tile_shapes([128, 128], [32, 128], [256, 256], True, False)`4546## 分块4748| API | 用途 | 约束 |49|-----|------|------|50| `pypto.loop(start, end, step, name=, idx_name=)` | 编译期循环 | 不嵌套、尽量少用 |51| `pypto.view(tensor, shape, offset)` | **切片提取**(等价 `tensor[a:b, c:d]`) | shape 各维为编译期常量,rank 不变,每维 ≤ 输入对应维 |52| `pypto.assemble(chunk, offset, output)` | 写回子块(等价切片赋值) | 无 |5354`pypto.view` **不是 reshape**。它是 `tensor[offset[0]:offset[0]+shape[0], ...]` 的等价 API。不能改变维度数,不能改变维度排布。所有 reshape 必须在 forward 中用 torch 完成。5556## 算术运算5758**运算符规则**:`+` `*` 支持标量在任意位置;`-` `/` 要求 tensor 在左侧(`1.0 - x` crash)。59**函数调用**:`pypto.add`/`sub`/`mul`/`div` 第一参数必须 Tensor。60一元取反 `-x`:不支持,用 `pypto.mul(x, -1.0)` 或 `x * (-1.0)`。61切片赋值:`output[:] = expr`6263## 数学函数6465| 函数 | 说明 |66|------|------|67| `pypto.exp(x)` | 指数 |68| `pypto.log(x)` | 对数 |69| `pypto.sqrt(x)` | 平方根 |70| `pypto.abs(x)` | 绝对值 |71| `pypto.sigmoid(x)` | sigmoid |72| `pypto.softmax(x, dim=)` | softmax |73| `pypto.maximum(a, b)` | 逐元素最大,b 可以是标量:`pypto.maximum(x, 0.0)` |74| `pypto.minimum(a, b)` | 逐元素最小,b 可以是标量:`pypto.minimum(x, 0.0)` |7576有内建函数时直接调用,禁止手写等价公式。7778**禁用 API**:`pypto.where`(有 bug)、`pypto.clamp`(不稳定)。条件逻辑用 `maximum`/`minimum` 组合实现。7980## 归约8182```python83pypto.sum(x, dim=int, keepdim=bool)84pypto.amax(x, dim=int, keepdim=bool)85pypto.amin(x, dim=int, keepdim=bool)86```8788**无 `pypto.mean` API。** `mean` 语义请用 `sum * (1.0 / count)` 实现。89**`dim` 只接受单个 `int`,不支持 `list`。** 多轴归约需连续多次调用。90`dim` 在实际实现中应作为闭包常量参与编译;静态任务不要在同一 kernel 内写多 `dim` 运行时分支。9192## 矩阵乘法9394```python95pypto.matmul(a, b, out_dtype, a_trans=False, b_trans=False)96```9798- 2D:`[M,K] @ [K,N] → [M,N]`99- 3D batched:`[B,M,K] @ [B,K,N] → [B,M,N]`(两边必须同 rank 同 batch,**不支持广播**)100- `a_trans` / `b_trans` 支持转置。101- **限制**:每个输入最后一维 ≤ 65535。超过时用 `sum(a * b_broadcast, dim=)` 替代。102- **matmul 几乎必须配合 loop**(M 轴分块),因 matmul 内部展开复杂,不 loop 容易 timeout。例外:M 很小(≤128)时可不 loop。103104## 类型转换与索引105106| API | 示例 |107|-----|------|108| `pypto.cast(tensor, dtype)` | `pypto.cast(x, pypto.DT_INT32)` |109| `pypto.unsqueeze(tensor, dim)` | `pypto.unsqueeze(x, 1)` |110| `pypto.gather(tensor, dim, index)` | `pypto.gather(log_probs, dim=1, index=idx)` |111| `pypto.expand_clone(tensor, shape)` | 单轴广播,每次只能扩展一个轴 |