Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/mindspore-ai/akg --skill pypto-basics명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
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