project/
├── build/ #用于存放编译过程的中间文件
├── operator_bangc/ #算子的bangc代码,cncc编译
| └── {operator_name}.mlu
|
├── operator_bind/ #算子的host端代码,g++编译
| └── {operator_name}_bind.cpp
|
├── operator_so/ #编译后得到的动态链接库文件
| └── {operator_name}_bang.so
|
├── operator_submit/ #可以直接提交到评测系统的版本
| └── {operator_name}.mlu
|
├── operator_check.py #实现对算子构建情况的检查
├── operator_input_gen.py #随机生成各个算子的输入
├── operator_name.py #包含所有算子的名字
├── operator_output.py #合并.mlu与.cpp文件,生成可提交的版本
├── operator_pytorch.py #包含所有算子的pytorch实现,每个算子对应一个函数
├── operator_test.py #可测试算子的性能、正确性等
├── setup.py #一键编译
├── run.sh #一键编译及运行
├── test_result.json #保存测试算子之后所得到延迟以及误差数据
└── README.md
- 执行./run.sh可直接编译生成相应算子并对其进行测试
./run.sh 1 # 编译生成1号算子(LeakyReLU)并对其进行测试
- 若已经编译成功在当前目录下生成了.so文件,则可直接运行python operator_test.py
# 编译生成1号算子(LeakyReLU)并对其进行测试(序号与官网保持一致)
python operator_test.py -num 1
# 编译生成LeakyReLU算子(1号算子)并对其进行测试(名字与官网保持一致)
python operator_test.py -name LeakyReLU
# 添加-perf选项则可对算子进行性能测试,计算加速比
python operator_test.py -num 1 -perf
# 继续添加-save选项则可将得到的延迟以及误差保存到test_result.json(不存在时自动创建)
python operator_test.py -num 1 -perf -save
# 导入operator_check模块中的函数,列出算子构建情况,,格式如下
python operator_test.py -list
+-----+-----------------------------------------------------+---------+----------+--------+---------+------+-------------+---------+
| | 算子名称 | MLU文件 | Bind文件 | SO文件 | 状态 | 输出 | 精度 | 得分 |
+-----+-----------------------------------------------------+---------+----------+--------+---------+------+-------------+---------+
| 001 | LeakyReLU | ✓ | ✓ | ✓ | ✅ 完整 | ✅ | ✅ 1.46e-05 | ⭐ 0.33 |
| 002 | matrix_scalar_multiplication | ✓ | ✓ | ✓ | ✅ 完整 | ✅ | ✅ 2.98e-08 | ⭐ 0.10 |
| 003 | LogSoftmax | ✓ | ✓ | ✓ | ✅ 完整 | ✅ | ✅ 3.91e-03 | ⭐ 0.01 |
# 未实现功能,可自行实现
python operator_test.py -file
python operator_test.py -all
- operator_output.py可对写好的文件进行转换,转为可提交的版本
python operator_output.py -num 1 # 为1号算子(LeakyReLU)生成可提交的版本并保存在operator_submit目录下
python operator_output.py -name LeakyReLU # 为LeakyReLU(1号算子)生成可提交的版本并保存在operator_submit目录下
python operator_output.py -all # 未实现,可自行实现(生成所有算子的可提交版本)
python operator_output.py -file # 未实现,可自行实现(读取文件中的算子名称,生成这些算子的可提交版本)
-
operator_bangc/{operator_name}.mlu中是算子的实现(该实例代码实现的是LeakyRelu算子,可修改以实现其他算子),extern "C" {}是为了保证编译能够通过,请勿删除
-
operator_bind/{operator_name}_bind.cpp则是调用kernel函数,需要正确传入参数到kernel函数中,//FUNC_BEGIN与//FUNC_END是为了更方便提取bang_func函数而增加的注释,请勿修改,最后的PYBIND11_MODULE也不用修改,这里需要改的就是bang_func以及文件开始的核函数声明,即以extern "C"为修饰符的函数
-
可手动make clean,即删除当前目录下的.so文件以及build文件夹:->
ValueError: Unknown operator: 'Sqrt'
Available operators: ['LeakyReLU', 'matrix_scalar_multiplication', 'LogSoftmax']
Please add 'Sqrt' to OPERATOR_TEMPLATES or check the spelling.
---------------------------------------------------------------------------------
eg:
#001
'LeakyReLU': {
'params': {
'x': {'type': 'tensor', 'shape': [16, 16384]},
'negative_slope': {'type': 'float', 'default': 0.01}
}
},
表示Sqrt算子还并未在operator_input_gen中注册,在其中的OPERATOR_TEMPLATES字典中注册即可,以LeakyReLU为例,在params中添加相应的参数,例如输入张量x,输入系数negative_slope,每个参数又在其中声明参数类型,以及默认值,若是tensor类型,定义了形状,最终输入到operator_test.py中的均是随机生成的张量。eg中的#001是注释内容,便于查找哪些算子还未注册
Failed to import Sqrt: /workspace/volume/memory-xufeng1/operator/./operator_so/Sqrt_bang.so: undefined symbol: Sqrt_kernel
很有可能是由于operator_bangc/{operator_name}.mlu中缺少extern "C"{}导致的报错
you are confident about your operator, but the difference is huge
your operator runs successfully, but the pytorch operator fails
可以相信自己,完全有可能是operator_pytorch.py中算子的pytorch实现不正确,对相应实现进行修改即可。也可能部分算子在小规模的输入下是可行的,可规模一大就超出了限制,需要进行分块处理,遇到这种情况,让ai稍做修改即可
将该项目复制到/workspace/volume/memory-xufeng1下,也就是自己创建的存储卷下,创建的存储卷下的内容在重启实验平台后不会丢失,其他位置的内容在重启实验平台之后会重置
