catlass_cppgen 使用指南:用 Python 描述算子,快速生成高性能 C++ 核函数
【免费下载链接】YiA series of large language models trained from scratch by developers @01-ai项目地址: https://gitcode.com/GitHub_Trending/yi/Yi
在昇腾平台上手写一个高性能 GEMM 算子,往往要在 Tile 形状、调度策略、多架构适配之间反复试错,后处理逻辑还得手工往核函数里拼。catlass_cppgen 是面向 Ascend 的算子代码生成框架:你用 Python 描述张量形状与算子参数,它负责产出优化后的 C++ 核函数代码,调参只改 Python 侧配置。
它替你把哪些脏活干了
一句话定位:在 Python 里声明"输入什么张量、算什么算子",框架输出目标架构下可用的 C++ 核函数模板与参数绑定代码。核心能力点:
- 只描述不绑定:OpTensor 用 shape、stride 和数据类型刻画输入,无需先备好真实数据
- 多架构覆盖:构造算子时声明目标架构(AtlasA2/A3、Ascend950),生成对应实现
- 调优参数外置:两级 TileShape(分块大小)与 DispatchPolicy(线程级调度策略)都能在 Python 侧调
- 后处理成图:EVG(Epilogue Visitor Graph)把核函数尾部的偏置、激活等逻辑交给一张访问者图承载
工作流:四步从算子规划到核函数
整条链路是固定的:
- 用 OpTensor 描述 A、B 等输入张量
- 构造
Gemm/GroupGemm算子对象,调用get_kernels()拿到候选 Kernel kernel.tune(...)指定 Tile 形状和调度策略kernel.gen_kernel_template()输出 C++ 核函数模板;gen_params_device()生成参数绑定代码
相当于把算子当图纸交给一条流水线:你给规格,它出货。最小可运行示例:
from catlass_cppgen.op.gemm import Gemm from catlass_cppgen.common.op_tensor import OpTensor from catlass_cppgen.common.data_type import DataType from catlass_cppgen.catlass.layout.layout import RowMajor from catlass_cppgen.catlass.gemm_coord import GemmShape from catlass_cppgen.catlass.arch.arch import Arch # 1. 只声明张量形状、步长和类型,不绑定真实数据 a = OpTensor.from_shape_stride((128, 256), (256, 1), DataType.FLOAT) b = OpTensor.from_shape_stride((256, 384), (384, 1), DataType.FLOAT) # 2. 声明算子,拉出候选 Kernel 列表 gemm = Gemm(atlas_arch=Arch.Ascend950, element=DataType.FLOAT, layout=RowMajor, A=a, B=b) kernel = gemm.get_kernels()[0] # 3. 调优两级 Tile 形状后,生成 C++ 核函数模板 kernel.tune(GemmShape(128, 256, 64), GemmShape(128, 256, 64)) print(kernel.gen_kernel_template())能力地图:按场景挑 Kernel
基础 GEMM覆盖二维场景。BasicMatmulKernel处理最普通的 A(M,K) × B(K,N),固定 alpha=1、beta=0,可挂可选 Bias;输入升到三维、各 batch 共享维度时用BatchedMatmulKernel。K 维很长时计算量会堆在少数尾块上,切 K 类 Kernel 就是把 K 维分摊到多核并行:MultiCoreSplitkMatmulKernel是标准多核 Split-K,TailMultiCoreSplitkMatmulKernel针对尾块做了优化变体,StreamkMatmulKernel用 Stream-K 调度动态分块,避免最后一个 tile 空等。
Group GEMM面向 M 轴切分的分组矩阵乘:GroupedMatmulSliceMKernel接收三维的 A/B 和一个 INT64 的groupList(VectorLayout 向量),各组 M 维度可以不同。
EVG 后处理解决"核函数收尾那几行激活、偏置不好维护"的问题。BasicMatmulTlaVisitorKernel支持 EVG:你在 Python 里写一个 epilogue 函数,可用 add/sub/mul/div 四则、relu/silu/sigmoid/leakyRelu/Prelu 激活、max/min 选择、cast 类型转换、constant 常量,多节点可自由串联,也支持行广播(比如 (1,256) 的 bias 广播到 (128,256) 的 accum)。
安装与目录速览
从源码构建后安装 wheel:
pip install build python -m build pip install dist/catlass_cppgen-*.whl开发场景直接装编辑模式:
pip install -e .仓库分几块:catlass_cppgen/是主体(op算子基类、kernel特化类、common张量与类型、catlass架构与布局组件),docs/是 API 文档,tests/按特性分目录放单测。
进阶:定向选 Kernel、调优与 EVG 拼法
不想默认取第一个 Kernel 时,按类型定向拿:
from catlass_cppgen.kernel.gemm import BasicMatmulKernel kernel = find_kernel_by_type(kernels, BasicMatmulKernel)tune()接收两级 TileShape,可追加dispatch_policy指定调度(如MmadPingpong(arch_tag=Arch.Ascend950))。EVG 则通过算子构造时的evg_config传入:fn_src放 epilogue 函数源码字符串,example_inputs给出每个变量的张量规格:
evg_config = { "fn_src": "def epilogue(accum, bias):\n return relu(accum + bias)", "example_inputs": { "accum": OpTensor.from_shape_stride((128, 256), (256, 1), DataType.FLOAT), "bias": OpTensor.from_shape_stride((1, 256), (256, 1), DataType.FLOAT), }, } gemm = Gemm(atlas_arch=Arch.Ascend950, evg_config=evg_config, A=a, B=b) assert gemm.get_kernels()[0].is_support_evgAPI 细节看仓库内文档:kernel_api.md、evg_api.md、optensor_api.md。
谁适合用
如果你要在昇腾上批量产出或调优 GEMM 类高性能算子,又不想把时间耗在核函数手拼上,catlass_cppgen 值得装进工具链。入门建议从 kernel_api.md 读起,再对照tests/op/下的用例改参数验证行为。
【免费下载链接】YiA series of large language models trained from scratch by developers @01-ai项目地址: https://gitcode.com/GitHub_Trending/yi/Yi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考