请教AICPU自定义算子编译、ATC模型转换等问题
收藏回复举报
请教AICPU自定义算子编译、ATC模型转换等问题
t('forum.solved') 已解决
发表于2025-10-15 16:01:53
0 查看

1.环境说明

1)开发环境和运行环境不一致的情况,开发环境为本地ubuntu20.04,运行环境为域控mdc510。

2)开发环境下安装了MDC_ASCEND310M1_ACC_LIB-1.0.005-T0000020.SPC1-Ubuntu20-llvm-dev.tar.gz,安装后目录为home\xxx\Ascend\ascend-toolkit\mdc,文件列表如下:

3)同时也安装了MDC_SDK-1.0.005-T0000020.SPC1-Ubuntu20-llvm-dev.tar.gz,安装目录为usr\local\mdc_sdk_llvm,文件列表如下:

2.请教问题

1)关于交叉编译器

文档里《自定义算子开发-算子编译部署-算子工程编译》章节提到MDC_ASCENDxxx安装后会在其安装目录\home\xxx\Ascend\ascend-toolkit\mdc下的toolkit/toolchain/hcc会有交叉编译器文件,但是我安装后该目录下为一个空文件,不存在任何文件;

而根据文档《平台二次开发-搭建编译环境-安装SDK》安装的MDC_SDKxxx,会在\usr\local\mdc_sdk_llvm\dp_gea\mdc_cross_compiler\bin存在clang和clang++编译器。

请问:交叉编译器是否就是这个clang和clang++,在定义算子部署时指定TOOLCHAIN_DIR环境变量时,将其赋值为usr\local\mdc_sdk_llvm\dp_gea\mdc_cross_compiler目录?

2)关于自定义算子的样例工程构建

采用AICPU方式开发自定义算子,根据文档《自定义算子开发-算子开发准备-工程创建-基于msopgen》章节,用msopgen gen -i创建onnx样例工程,我理解是要加上-lan cpp参数,表明“基于Ascend C编程框架,使用C++编程语言进行开发。”但我发现,加上该参数后op_proto文件下会缺失Cmakelists.txt文件,如下所示。而不加该参数则正常,但部分文件夹内容会有一些不同。

请问:op_proto是做算子IR注册的,应该是要有有CmakeLists.txt参与编译吧?

3)关于样例工程编译

我尝试用不加-lan cpp的样例工程,安装自定义算子开发流程修改相关的文件后,编译后发现还是缺失一些文件,并且编译器也会报错。

用加-lan cpp构样例工程,做一些修改后可以编译,但由于前面提到的op_proto下没用Cmakelists.txt,因此只有如下提及的onnx算子的适配文件编译了.so文件出来,ai cpu算子的实现文件和原型文件都没用.so文件生成。

这两种方法生成的样例工程似乎都有问题,最后我参考了你们官网上https://www.hiascend.com/document/detail/zh/canncommercial/700/operatordev/tbeaicpudevg/atlasopdev_10_0090.html文档中的《算子交付件独立编译》章节(我本地510配套的文档里没有该章节),在只保留如下目录文件,然后用msopgen compile -i 生成样例工程,此时样例工程看上去比较正常,在做必要修改后可以编译。

请问:到底应该用哪种方式?在用msopgen compile -i 生成的目录和如下文档里提及的一致,新增的文件一致,这个工程看上去更正确符合要求,并且编译后前面提到的3个so文件都可以生成,这3个so文件应该都是需要的吧?

4)关于交叉编译选项

如前所述,安装MDC_ASCENDxxx后目录下没为空有交叉编译器,安装MDC_SDKxxx只有clang和clang++,没有aarch64-target-linux-gnu-c++。以上msopgen compile -i生成的样例工程,内部cmakelist或者toolchain.cmake用的编译选项是:

set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-target-linux-gnu-g++)

set(CMAKE_C_COMPILER   ${TOOLCHAIN_DIR}/bin/aarch64-target-linux-gnu-gcc)

由于我没有这两个文件,修改为

set(CMAKE_C_COMPILER   ${TOOLCHAIN_DIR}/bin/clang)

set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/clang++)

set(CMAKE_C_FLAGS   "--target=aarch64-target-linux-gnu --sysroot=${TOOLCHAIN_DIR}/sysroot ${CMAKE_C_FLAGS}")

set(CMAKE_CXX_FLAGS "--target=aarch64-target-linux-gnu --sysroot=${TOOLCHAIN_DIR}/sysroot ${CMAKE_CXX_FLAGS}")

set(CMAKE_EXE_LINKER_FLAGS "--target=aarch64-target-linux-gnu --sysroot=${TOOLCHAIN_DIR}/sysroot ${CMAKE_EXE_LINKER_FLAGS}")

请问:我这样修改是否正确?

       

5)关于atc转换

按如4)中修改可成功编译,由于我是在本地Ubuntu。04开发,前面自定义算子是交叉编译,只能运行在目标mdc510平台。

请问:在本地ubutnu20.04,用atc转换包含该自定义算子的onnx文件时,是否需要还编译本地x86_64版本的自定义算子才能转换,还是只需要交叉编译版本的自定义算子就可以转换了?

我要发帖子