昇腾社区首页
中文
注册

调用示例

本章节以matmulleakyrelu算子工程为例,介绍如何利用msKPP工具提供的mskpp.tiling_funcmskpp.get_kernel_from_binary接口调用msOpGen工程中的tiling函数以及用户自定义的Kernel函数,其他类型的算子操作均可参考此流程进行操作。

环境准备

  • 请参考环境准备,完成相关环境变量的配置。
  • 单击Link获取样例工程,为进行算子检测做准备。
    • 本样例工程以Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件为例。
    • 下载代码样例时,需执行以下命令指定分支版本。
      git clone https://gitee.com/ascend/samples.git -b v1.5-8.2.RC1

具体操作

  1. 参见环境准备中的样例工程,运行${git_clone_path}/operator/ascendc/0_introduction/12_matmulleakyrelu_frameworklaunch目录下的install.sh脚本,生成自定义算子工程,并进行Host侧和Kernel侧的算子实现。
    bash install.sh -v Ascendxxxyy    # xxxyy为用户实际使用的具体芯片类型
  2. 切换至自定义算子工程目录。
    cd CustomOp
  3. 编辑算子拉起脚本matmulleakyrelu.py。
    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))
  4. 运行脚本。
    python3 matmulleakyrelu.py