hpc2Torch

May 26, 2026 · View on GitHub

这个仓库打算搭建一个高性能底层库的测试框架,将会针对onnx的算子编写相关的高性能kernel,作为pytorch的补充,从python端对比手写kernel和pytorch库函数的性能以及精度对比。

src

这个文件夹下面存放的是不同算子的kernel

test

这个文件夹存放的是不同算子的python测试脚本,其中performance.py是功能文件,用于对比性能

run.sh

默认编译CPU端代码,运行仓库命令是:

bash run.sh

编译结束以后,可以直接做python端测试,测试softmax算子的CPU端代码命令为:

python test/test_softmax.py --device cpu

如果需要编译测试其他平台代码,比如说GPU端测试,那么修改run.sh里面的cmake ../ -DUSE_CPU=ON为 cmake ../ -DUSE_CUDA=ON,对应的测试python脚本--device cpu也修改为--device cuda

已知问题

英伟达平台

cutlass准备

编译cutlass相关代码需要选择合适的sm,另外对于cutlass仓库,搜索头文件路径包括cutlass/,cutlass/include/,cutlass/tools/util/include/,并且需要设置CUTLASS_ROOT

git clone https://github.com/NVIDIA/cutlass.git --recursive
export CUTLASS_ROOT=<path>/cutlass

awq_marlin_gemm和gptq_marlin_gemm注意事项

测试awq_marlin_gemm算子注意:需要进入hpc2torch/src/awq_marlin_gemm/gpu里面,使用

python generate_kernels.py 8.0

生成对应架构上(比如我这里是CUDA_ARCH=80)的sm80_kernel_*.cu以及一个kernel_selector.h,否则就算编译通过,测试也会报错

undefined symbol: _ZN6marlin6MarlinILl1125899906910725ELl1125899923621888ELl1125899906910725ELl1125899906910725ELi256ELi2ELi16ELi4ELb0ELi4ELi8ELb0EEEvPK4int4S3_PS1_S4_S3_PKfS3_S6_S3_PKiiiiiiPibbbi

这里本人在source_nvidia.cmake里面做了自动处理,编译过程可以自动生成并且编译这些文件

另外编译gptq_marlin_gemm算子过程中需要使用tvm,使用

git clone https://github.com/apache/tvm-ffi.git --recursive

目前来看,commit id为35c99d0ac4cb784862115d0089f60c603acec8f9的tvm-ffi是可以使用的,如果想要编译gptq_marlin_gemm,需要设置环境变量

export TVM_ROOT=<path>/tvm-ffi

per_quant_group_fp4和per_tensor_quant_fp8注意事项

这两个算子使用了flashinfer,使用

pip install flashinfer-python

安装相关的库,然后设置环境变量CPATH,注意替换为自己的路径

export CPATH=<path>/python3.xx/site-packages/flashinfer/data/include:$CPATH

寒武纪平台

matmul算子在f16的数据测试中精度存在巨大问题,原因不明

pool算子在f16,ndim=5的数据测试中,avgpool精度只有1e-3,但是maxpool精度正常,原因不明

clip算子在f16数据测试中精度存在巨大问题,f32正常,原因不明

layernorm算子cnnl不支持axis=0,手写算子处理axis=0,f16时必须控制规模,规模太大会导致精度无法对齐

寒武纪reduce算子处理sum,prod时,规模太大也会带来精度问题,应该是累积误差导致

昇腾平台

conv算子面对f32,ndim=5测试报错,但是f16,ndim=5精度正常,原因是昇腾机器torch.conv3d不支持f32,convTranspose有类似问题

pool算子处理ndim=3的avgpool测试精度出错,对于三维向量必须手动填充为四维向量才能处理,昇腾平台目前缺少支持ndim=5的maxPool库函数

昇腾调库softmax处理f16数据精度不足

昇腾reduce算子min,prod仅支持针对某一个维度做规约,不支持同时处理多个axis

昇腾clip不管input是f16还是f32,传入的min,max都必须是f32,否则结果报错

昇腾matmul算子对于高维矩阵乘法不支持alpha, beta参数,并且对于大规模矩阵存在精度问题,怀疑是规模太大造成的误差累积

太初平台

causal_softmax算子必须在计算结束以后加入打印信息才能保证测试通过,如果不做打印会报错segmentation fault (core dumped)

random_sample算子多个测试也会报错segmentation fault (core dumped),而且performance.TecoProfile调用也会导致问题,原因不详

如果在python端计算以及数值对比的时候提前把tensor转移到CPU,这样可以避免上面的问题,原因不详

算子定义

batchnorm算子有一个momentum参数,onnx默认值是0.9,torch默认是0.1

slice算子onnx定义中有一个optional参数axis指定切片维度,但是寒武纪和昇腾库函数不支持这个参数