本章节以matmulleakyrelu算子工程为例,介绍如何利用msKPP工具提供的mskpp.tiling_func和mskpp.get_kernel_from_binary接口调用msOpGen工程中的tiling函数以及用户自定义的Kernel函数,其他类型的算子操作均可参考此流程进行操作。
bash install.sh -v Ascendxxxyy # xxxyy为用户实际使用的具体芯片类型
cd CustomOp
import numpy as np
import mskpp
# 这个函数的入参必须和Kernel函数的入参一致
def run_kernel(input_a, input_b, input_bias, output, workspace, tiling_data):
kernel_binary_file = "MatmulLeakyreluCustom.o" #不同的硬件和操作系统展示的.o文件的名称稍有不同,具体路径请参考表1中的-reloc参数
kernel = mskpp.get_kernel_from_binary(kernel_binary_file, 'mix')
return kernel(input_a, input_b, input_bias, output, workspace, tiling_data)
if __name__ == "__main__":
# input/output tensor
M = 1024
N = 640
K = 256
input_a = np.random.randint(1, 10, [M, K]).astype(np.float16)
input_b = np.random.randint(1, 10, [K, N]).astype(np.float16)
input_bias = np.random.randint(1, 10, [N]).astype(np.float32)
output = np.zeros([M, N]).astype(np.float32)
# shape info
inputs_info = [{"shape": [M, K], "dtype": "float16", "format": "ND"},
{"shape": [K, N], "dtype": "float16", "format": "ND"},
{"shape": [N], "dtype": "float32", "format": "ND"}]
outputs_info = [{"shape": [M, N], "dtype": "float32", "format": "ND"}]
attr = {}
# 调用tiling函数
tiling_output = mskpp.tiling_func(
op_type="MatmulLeakyreluCustom",
inputs_info=inputs_info, outputs_info=outputs_info, # 可选
inputs=[input_a, input_b, input_bias], outputs=[output],
attr=attr, # 可选
lib_path="liboptiling.so", # tiling代码编译产物,具体位置可参考步骤2中的目录结构
# soc_version="", # 可选
)
blockdim = tiling_output.blockdim
workspace_size = tiling_output.workspace_size
tiling_data = tiling_output.tiling_data # numpy数组
workspace = np.zeros(workspace_size).astype(np.uint8) # workspace需要用户自行申请
# 调用Kernel函数
run_kernel(input_a, input_b, input_bias, output, workspace, tiling_data)
# 校验输出
alpha = 0.001
golden = (np.matmul(input_a.astype(np.float32), input_b.astype(np.float32)) + input_bias).astype(np.float32)
golden = np.where(golden >= 0, golden, golden * alpha)
is_equal = np.array_equal(output, golden)
result = "success" if is_equal else "failed"
print("compare {}.".format(result))
python3 matmulleakyrelu.py