Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/mindspore-ai/akg --skill pypto-basicsコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
矩阵乘法矩阵乘法 A[M, K] @ B[K, N] = C[M, N]中,大K维度矩阵乘法(K>>M,N)优化:针对M/N较小但K极大(如M=N=256,K=131072)的场景,Split-K切分K维度并行化、Workspace+Reduce替代全局同步,实现显著性能提升
Triton Ascend hard API restrictions and forbidden syntax. MUST-follow rules that apply to every kernel: forbidden control flow (return/break/continue/lambda/while), tensor slice/index restrictions, scalar conversion rules, BLOCK_SIZE upper bound. Violating any of these produces a compile or runtime error on Ascend.
Triton Ascend 性能优化通用策略: BLOCK_SIZE 选择 (1024-2048 for elementwise, must be <65536), grid configuration (use VEC_CORE_NUM / CUBE_CORE_NUM, 2D/3D grid for matmul / conv / reduce, 1D grid + inner loop for elementwise / pointwise), 256B alignment for memory transfers, autotune block-size patterns, fp16 / fp32 precision conversion. Bind via keywords like matmul, elementwise, reduce, block_size, grid, autotune, alignment, fp16, fp32, tile, interleaved-loop, cube-core, vec-core.
SOC 職業分類に基づく
SKILL.md を表示中
| name | pypto-basics |
| description | PyPTO 编程原则与核心模式 |
| category | fundamental |
| version | 1.0.0 |
| metadata | {"backend":"ascend","dsl":"pypto","operator_patterns":"all"} |
写 PyPTO 前,先把 baseline forward 变成“可执行语义合同”,再做实现与优化。
最少做 5 件事:
input/target/prediction 这些名字经常误导)。sum、batchmean、或 mean 语义=sum/count,并明确规约轴与 keepdim)。A||B 与 B||A 是否等价)。注意:性能规则(tile/loop)只能在语义合同确定后应用,不能反向决定语义。
kernel 一切在编译时确定。工厂函数封装 kernel,shape 和标量参数(eps、slope 等)作为闭包传入。forward 直接传 torch.Tensor。ModelNew.init 签名必须与原始 Model 一致,shape 在 forward 中获取。
补充(高优先级):
get_inputs/get_init_inputs 在单次任务里是固定参数;把它当静态合同,不要过度通用化。get_init_inputs 的返回值,作为本次任务常量(例如 dim=1)。Example, change to desired ... 视为数据集说明噪声,不是本次实现要求。dim 的任务,生成单一固定 dim kernel;不要在一个 kernel 里写 if dim == 0/1/2 分支。assert x.dim() == N、assert tuple(x.shape) == (...)forward 内禁止 torch 计算。kernel 内不能 reshape。
输出语义(keepdim/是否 squeeze)要与 baseline 直接对齐;不要先改语义再靠额外 squeeze/unsqueeze 回补。
| 算子类型 | forward 策略 | kernel 维度 |
|---|---|---|
| Elementwise / 简单 Loss | reshape(-1) | 1D |
| GroupNorm / InstanceNorm | reshape(flat_batch, hidden) | 2D |
| BatchNorm / RMSNorm | reshape(B, C, -1) | 3D |
| Batched matmul(同 batch) | 保持 3D,不需要 loop | 3D |
| 2D Matmul | 保持 2D | 2D |
| 单轴归约 | 保持原始维度 | 原维 |
补充:
auto_tiles > 2048 触发,与维度无关。补充:
H,W -> HW)。prod(tile_shape) ≤ 16384auto_tiles = prod(ceil(shape[i]/tile[i])) ≤ 2048tile 参数个数 = 被操作 tensor 的 rank。常用:
(8192) | 2D: (1, 16384) | 3D: (1, 1, 16384) 或 (1, 16, 256)(单轴 3D 归约常见起步)set_cube_tile_shapes([128, 128], [32, 128], [256, 256], True, False)tile[i] > shape[i] 的参数浪费;如确需使用,必须有明确理由(例如实测收益)。+ *:标量任意位置。- /:tensor 必须在左。 1.0 - x crash → 用 x * (-1.0) + 1.0。函数调用第一参数必须 Tensor。
能不用 loop 就不用。loop 场景:auto_tiles > 2048(优先原因)/ 极大归约轴 / matmul M 轴(按对数刻度先定中段 loop_count,常见先试 16/32,再反推 BASIC_BATCH=ceil_div(m, loop_count);必要时再扩到 8/64)。不嵌套,沿最外轴。 view shape 只能用编译期常量。
模块名 pypto(不是 pyto)。
import os, pypto, torch
_PYPTO_RUN_MODE = int(os.getenv("AIKG_PYPTO_RUN_MODE", "0"))
_PYPTO_RUNTIME_DEBUG_MODE = int(os.getenv("AIKG_PYPTO_RUNTIME_DEBUG_MODE", "0"))
关键判断:auto_tiles = prod(ceil(shape[i]/tile[i])) 必须 ≤ 2048。 超过则必须 loop。
优先策略:Elementwise 无数据依赖,优先 flatten 为 1D;loop 仅由 auto_tiles > 2048 触发,与维度无关。
小矩阵(flatten 后 auto_tiles ≤ 2048):reshape(-1) → 1D kernel。
大矩阵(如 16384×4096,flatten 后 auto_tiles > 2048):1D + loop(或 2D + loop 仅当语义需要保持 2D)。
# 小矩阵:ELU(16×16384=262144, tile 8192, auto_tiles=32)
def create_elu_kernel(flat_size, alpha):
@pypto.frontend.jit(...)
def kernel(x: pypto.Tensor((flat_size,), pypto.DT_FP32)) -> ...:
output = pypto.tensor([flat_size], pypto.DT_FP32)
pypto.set_vec_tile_shapes(8192)
pos = pypto.maximum(x, 0.0)
neg = pypto.minimum(x, 0.0)
output[:] = pos + (pypto.exp(neg) - 1.0) * alpha
return output
return kernel
# 大矩阵 1D 版本:scalar mul(16384×4096,flatten 后 loop)
def create_scalar_mul_kernel_1d(m, n, s):
flat_size = m * n
TARGET_LOOP_COUNT = 32
BASIC_BATCH = ceil_div(flat_size, TARGET_LOOP_COUNT)
num_iters = ceil_div(flat_size, BASIC_BATCH)
@pypto.frontend.jit(...)
def kernel(a: pypto.Tensor((m, n), pypto.DT_FP32)) -> ...:
a_flat = pypto.view(a, [flat_size], [0])
c = pypto.tensor([flat_size], pypto.DT_FP32)
pypto.set_vec_tile_shapes(8192)
for bi in pypto.loop(0, num_iters, 1, name="LOOP", idx_name="bi"):
off = bi * BASIC_BATCH
chunk = pypto.view(a_flat, [BASIC_BATCH], [off])
pypto.assemble(chunk * s, [off], c)
return pypto.view(c, [m, n], [0])
return kernel
# 大矩阵 2D 版本:仅当语义需要保持 2D 布局时使用
():
TARGET_LOOP_COUNT =
BASIC_BATCH = ceil_div(m, TARGET_LOOP_COUNT)
num_iters = ceil_div(m, BASIC_BATCH)
() -> ...:
c = pypto.tensor([m, n], pypto.DT_FP32)
pypto.set_vec_tile_shapes(, )
bi pypto.loop(, num_iters, , name=, idx_name=):
off = bi * BASIC_BATCH
chunk = pypto.view(a, [BASIC_BATCH, n], [off, ])
pypto.assemble(chunk * s, [off, ], c)
c
kernel
loop_count,1~128 常见从 16/32 起步,再反推 BASIC_BATCH),view → matmul → assemblepypto.matmul(a_chunk, b, pypto.DT_FP32, b_trans=True)c[:] = pypto.matmul(a, b, pypto.DT_FP32),不需要 loopGroupNorm / InstanceNorm(2D):reshape (flat_batch, hidden_size),tile (1, 16384),loop 沿 flat_batch。var = sq_sum * inv_hidden - mean * mean。
RMSNorm / BatchNorm(3D):(B, C, S),tile (1, 1, 16384) 或 (1, 16, 256)。
sum(dim=1) 归一化沿 C 轴sum(dim=0) + sum(dim=2) 跨 batch 和 spatialC 轴归约且 C 中等(如 64),先保证连续搬运达标,再在 C 轴候选里比较(常试 16/32/64)。简单 loss(MSE/Hinge/KLDiv)flatten 到 1D。per-sample loss(Triplet/Cosine)保持 2D,两段 tile。
F.kl_div(torch.log(pred), target, reduction='batchmean') 应实现为
KL(target || pred),并按 batchmean 规约。pypto.zeros 累加器 + loop 分块 + acc[:] = acc + part。
def ceil_div(a, b):
return (a + b - 1) // b