Skip to content

Repository files navigation

测试环境说明文档

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

使用说明

  1. 执行./run.sh可直接编译生成相应算子并对其进行测试
./run.sh 1      # 编译生成1号算子(LeakyReLU)并对其进行测试
  1. 若已经编译成功在当前目录下生成了.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
  1. 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下,也就是自己创建的存储卷下,创建的存储卷下的内容在重启实验平台后不会丢失,其他位置的内容在重启实验平台之后会重置

不要外传噢😮 alt text

About

operator test environment for AICS lesson

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages