diff --git a/.jenkins/check/config/filter_cppcheck.txt b/.jenkins/check/config/filter_cppcheck.txt index ef11c1125b6..74cd061f8be 100644 --- a/.jenkins/check/config/filter_cppcheck.txt +++ b/.jenkins/check/config/filter_cppcheck.txt @@ -81,6 +81,7 @@ "mindspore/mindspore/ccsrc/plugin/device/ascend/kernel/tbe/tbe_utils.cc" "knownConditionTrueFalse" "mindspore/mindspore/lite/tools/kernel_builder/ascend/tbe_dsl/sample/op_proto/add_dsl.cc" "syntaxError" "mindspore/mindspore/lite/tools/kernel_builder/ascend/tbe_tik/sample/op_proto/matmul_tik.cc" "syntaxError" +"mindspore/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/" "syntaxError" # AICPU migration "mindspore/mindspore/ccsrc/plugin/device/ascend/kernel/aicpu/aicpu_ops/cpu_kernel/ms_kernel/" "constVariable" diff --git a/.jenkins/check/config/filter_cpplint.txt b/.jenkins/check/config/filter_cpplint.txt index 436a87f7552..752613f71b1 100644 --- a/.jenkins/check/config/filter_cpplint.txt +++ b/.jenkins/check/config/filter_cpplint.txt @@ -105,6 +105,8 @@ "mindspore/mindspore/lite/tools/kernel_builder/ascend/aicpu/sample/" "build/include" "mindspore/mindspore/lite/tools/kernel_builder/ascend/tbe_dsl/sample/" "build/include" "mindspore/mindspore/lite/tools/kernel_builder/ascend/tbe_tik/sample/" "build/include" +"mindspore/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/" "build/include" +"mindspore/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/" "build/include" # AICPU migration "mindspore/mindspore/ccsrc/plugin/device/ascend/kernel/aicpu/aicpu_ops/cpu_kernel/" "build/include_subdir" diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/CMakeLists.txt new file mode 100755 index 00000000000..ac027c2e05e --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/CMakeLists.txt @@ -0,0 +1,116 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall -s") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CAMKE_SKIP_RPATH TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") +add_compile_options( + -fstack-protector-all + -D_FORTIFY_SOURCE=2 -O2 + ) +cmake_minimum_required(VERSION 3.5.1) +add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) +message(STATUS "CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}") +message(STATUS "CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}") + +project(opp) + +if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/cmake/config.cmake) + include(${CMAKE_CURRENT_BINARY_DIR}/cmake/config.cmake) +else() + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.cmake) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.cmake) + endif() +endif() + +execute_process(COMMAND rm -rf ./makepkg) + +message(STATUS "OP_COMMON_INC=${OP_COMMON_INC}") +# add sub compile directory +# open this when aicpu env is ok +#if(EXISTS "${CMAKE_SOURCE_DIR}/cpukernel") +# add_subdirectory(cpukernel) +#endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/framework") + if(NOT EXISTS "${CMAKE_SOURCE_DIR}/framework/mindspore") + add_subdirectory(framework) + endif() +endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/op_proto") + add_subdirectory(op_proto) +endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/op_tiling") + add_subdirectory(op_tiling) +endif() +if(EXISTS "${CMAKE_SOURCE_DIR}/tbe") + add_subdirectory(tbe) +endif() + +if(UNIX) + if(NOT "x$ENV{ADD_TESTCASE}" STREQUAL "x") + # add testcases subdirectory + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/testcases") + add_subdirectory(testcases) + endif() + endif() +endif() + +message(STATUS "operation system is ${CMAKE_HOST_SYSTEM_NAME}") + +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/op_proto") + set(ALL_MODULES ${OP_PROTO_TARGET}) +endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/op_tiling") + set(ALL_MODULES ${ALL_MODULES} ${OP_TILING_TARGET}) +endif() +#if(EXISTS "${CMAKE_SOURCE_DIR}/cpukernel/CMakeLists.txt") +# set(ALL_MODULES ${ALL_MODULES} ${AICPU_KERNEL_TARGET}) +# set(ALL_MODULES ${ALL_MODULES} ${AICPU_CONFIG_JSON_TARGET}) +#endif() +message(STATUS "AICPU_CONFIG_INFO_FLAG=${AICPU_CONFIG_INFO_FLAG}") + +if(EXISTS "${CMAKE_SOURCE_DIR}/tbe/CMakeLists.txt") + set(ALL_MODULES ${ALL_MODULES} config_json) +endif() + +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/framework/caffe_plugin") + set(ALL_MODULES ${ALL_MODULES} ${CAFFE_PLUGIN_TARGET}) +endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/framework/tf_plugin") + set(ALL_MODULES ${ALL_MODULES} ${TF_PLUGIN_TARGET}) +endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/framework/tf_scope_fusion_pass") + set(ALL_MODULES ${ALL_MODULES} ${TF_SCOPE_FUSION_PASS_TARGET}) +endif() +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/framework/onnx_plugin") + set(ALL_MODULES ${ALL_MODULES} ${ONNX_PLUGIN_TARGET}) +endif() + +message(STATUS "ALL_MODULES=${ALL_MODULES}") +add_custom_target(${RUN_TARGET} ALL DEPENDS ${ALL_MODULES}) + +add_custom_command(TARGET ${RUN_TARGET} + PRE_BUILD + COMMAND mkdir -p ./makepkg/packages/${PROJECT_DIR}/fusion_rules/ + COMMAND mkdir -p ./makepkg/packages/${PROJECT_DIR}/op_impl/ai_core/tbe/mslite_impl + COMMAND mkdir -p ./makepkg/packages/${PROJECT_DIR}/op_impl/vector_core/tbe/mslite_impl + COMMAND mkdir -p ./makepkg/packages/${PROJECT_DIR}/op_impl/cpu/aicpu_kernel/impl + COMMAND bash ${CMAKE_SOURCE_DIR}/cmake/util/gen_impl_and_mrege_json.sh ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} + COMMAND cp ${CMAKE_SOURCE_DIR}/scripts/* ./makepkg/ + ) + +if(EXISTS ${CMAKE_SOURCE_DIR}/custom.proto) + add_custom_command(TARGET ${RUN_TARGET} + PRE_BUILD + COMMAND cp ${CMAKE_SOURCE_DIR}/custom.proto ./makepkg/packages + ) +endif() + +add_custom_command(TARGET ${RUN_TARGET} + PRE_BUILD + COMMAND chmod u+x ./makepkg/*.sh + COMMAND ${CMAKE_SOURCE_DIR}/cmake/util/makeself/makeself.sh + --gzip --complevel 4 --nomd5 --sha256 + ./makepkg ${RUN_TARGET} "version:1.0" ./install.sh + ) + diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/build.sh b/mindspore/lite/tools/kernel_builder/ascend_new/build.sh new file mode 100644 index 00000000000..dd6d5d9ff56 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/build.sh @@ -0,0 +1,195 @@ +#!/usr/bin/env bash +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +###### Environment variable settings, need to set according to your own device ###### + +# ASCEND_OPP_PATH: The installation path of the OPP package, where "/usr/local/Ascend/opp" is the +# default installation path. If user defines the installation path, please modify it. +# Uncomment and modify it when you specified installation path of OPP. +# export ASCEND_OPP_PATH=/usr/local/Ascend/opp + +# ASCEND_AICPU_PATH: The installation path of the AICPU package, where "/usr/local/Ascend" is the +# default installation path. If user defines the installation path, please modify it. +# Uncomment and modify it when you specified installation path of AICPU. +# export ASCEND_AICPU_PATH=/usr/local/Ascend + +# ASCEND_TENSOR_COMPILER_INCLUDE: The path of the header file of the Compiler package, where "/usr/local/Ascend/compiler/include" is the +# default installation path. If user defines the installation path, please modify it. +# Uncomment and modify it when you specified installation path of Compiler. +# export ASCEND_TENSOR_COMPILER_INCLUDE=/usr/local/Ascend/compiler/include + +# TOOLCHAIN_DIR: The path of the cross compilation tool, where "/usr/local/Ascend/toolkit/toolchain/hcc" is the +# default installation path. If user defines the installation path, please modify it. +# Uncomment and modify it when you specified installation path of toolkit. +# export TOOLCHAIN_DIR=/usr/local/Ascend/toolkit/toolchain/hcc + +# AICPU_KERNEL_TARGET: The name of the custom operator kernels library, which "cust_aicpu_kernels" is the +# default installation name. If user defines the installation name, please modify it. +# Uncomment and modify it when you specified the installation name of custom operator kernels library. +export AICPU_KERNEL_TARGET=cust_aicpu_kernels + +# The SYSTEM_INFO flag is the name of the form of the operator package generated by the compiler, which can be customized by the user, E.g: +# a. If the operating system version is CentOS and the architecture is aarch64, it can be set to centos_aarch64, and the operator package name generated by compilation is custom_opp_centos_aarch64.run. +# b. If the operating system version is CentOS and the architecture is x86_64, it can be set to centos_x86_64, and the name of the operator package generated by compilation is custom_opp_centos_x86_64.run. +# c. If the SYSTEM_INFO environment variable is not set, the default value is used: ubuntu_x86_64, and the operator package name generated by compilation is custom_opp_ubuntu_x86_64.run. +# Uncomment and modify it when you need to specify os and architecture. +# export SYSTEM_INFO=centos_x86_64 + +# The version of soc. +# export AICPU_SOC_VERSION=Ascend910 + +###### The following logic can be used without modification ###### + +# Indicates the name of the supplier to which the operator belongs. This field can be customized. +vendor_name=mslite +if [[ "$vendor_name" = "" ]] || [[ ! "$vendor_name" ]]; then + vendor_name=mslite +fi +export OPP_CUSTOM_VENDOR=$vendor_name + +# parse input parameters +clean=n +while true +do + case "$1" in + -h | --help) + echo " --help show the help info of using this shell" + echo " --kernel_so_name=* so name of aicpu custom operators " + echo " --toolchain_dir=* specify cross compile toolchain directory" + echo " clean clean compile result directory" + exit 0 + ;; + --so_name=*) + so_name=`echo ${1} | cut -d"=" -f2` + length=${#so_name} + aicpu_target_name=${so_name:3:($length - 6)} + export AICPU_KERNEL_TARGET=$aicpu_target_name + echo "aicpu_target_name=${aicpu_target_name}" + shift + ;; + clean) + clean=y + shift + ;; + --toolchain_dir=*) + tool_dir=`echo ${1} | cut -d"=" -f2` + export TOOLCHAIN_DIR=$tool_dir + echo "specified TOOLCHAIN_DIR=$TOOLCHAIN_DIR" + shift + ;; + -*) + echo " --help show the help info of using this shell" + echo " --toolchain_dir=* specify cross compile toolchain directory" + echo " --so_name=* so name of aicpu custom operators generated by compilation" + echo " clean clean compile result directory" + exit 0 + ;; + *) + break + ;; + esac +done + +# The following logic can be used without modification ###### +log() { + cur_date=`date +"%Y-%m-%d %H:%M:%S"` + echo "[$cur_date] "$1 +} + +project_path=$(cd "$(dirname "$0")"; pwd) +# clean compile result +if [ "x$clean" == "xy" ] 2>/dev/null; then + rm -rf $project_path/caffe.proto 2>/dev/null + rm -rf $project_path/caffe.proto.origin 2>/dev/null + rm -rf $project_path/build_out 2>/dev/null + rm -rf $project_path/framework/caffe_plugin/proto/caffe 2>/dev/null + log "[INFO] Clean successfully." + exit 0 +fi +#vendor_name output script/install.sh +vendor_name_output() { + scripts_file=$PWD/$1 + found_vendor_name_field=$(grep -e "vendor_name=" "$scripts_file") + found_vendor_name=$(grep -e "vendor_name=" "$scripts_file" | cut --only-delimited -d"=" -f2-) + if [[ $found_vendor_name_field = "" ]]; then + sed -i "1 a vendor_name=$vendor_name" $scripts_file + elif [ $found_vendor_name_field != "" ] && [ $found_vendor_name != $vendor_name ]; then + sed -i "s/$found_vendor_name_field/vendor_name=$vendor_name/g" $scripts_file + fi +} + +vendor_name_output scripts/install.sh +vendor_name_output scripts/upgrade.sh + +if [ ! "x$AICPU_SOC_VERSION" = "xLMIX" ];then + # if specified cross compile toolchain directory is not exist, log error and exit + if [[ ! -z "$TOOLCHAIN_DIR" ]] && [[ ! -d "$TOOLCHAIN_DIR" ]];then + log "[ERROR] Specified cross compile toolchain directory is not exist" + exit 1 + fi +fi + +# set aicpu kernel implement compiler target, default to be custom_cpu_kernels +if [[ -z "${aicpu_target_name}" ]] && [[ -z "${AICPU_KERNEL_TARGET}" ]]; then + log "[INFO] no so_name is specified, use default compile target: libcust_aicpu_kernels.so!" + aicpu_target_name="cust_aicpu_kernels" + export AICPU_KERNEL_TARGET=$aicpu_target_name + #exit 1 +fi + +chmod -R 755 $project_path/cmake/util/ +mkdir -p $project_path/build_out + +###### Environment variable settings, need to set according to your own device ###### + +# ASCEND_TENSOR_COMPILER_INCLUDE: The path of the header file of the Compiler package, where "/usr/local/Ascend/compiler/include" is the +# default installation path. If user defines the installation path, please modify it. +# Uncomment and modify it when you specified installation path of Compiler. +if [[ -z "${ASCEND_TENSOR_COMPILER_INCLUDE}" ]]; then + if [[ -d "/usr/local/Ascend/compiler/include" ]];then + export ASCEND_TENSOR_COMPILER_INCLUDE=/usr/local/Ascend/compiler/include + else + log "[ERROR] ENV ASCEND_TENSOR_COMPILER_INCLUDE is not set" + exit 1 + fi +else + if [[ ! -d "${ASCEND_TENSOR_COMPILER_INCLUDE}" ]];then + log "[ERROR] ENV ASCEND_TENSOR_COMPILER_INCLUDE=${ASCEND_TENSOR_COMPILER_INCLUDE} dir is not exist" + exit 1 + fi +fi + +# STEP 1, Check plugin files and proto files +# Check for caffe_plugin files, If there is no plugin file, do not compile caffe proto. +caffe_plugin_cpp_files_num=$(ls $project_path/framework/caffe_plugin/*.cc 2> /dev/null | wc -l) +if [[ "$caffe_plugin_cpp_files_num" == 0 ]];then + log "[INFO] No caffe plugin files." +fi # endif compile caffe proto + +# STEP 2, CMake and make +cd $project_path/build_out +rm -rf *.run +log "[INFO] Cmake begin." + +if [ "x$AICPU_SOC_VERSION" = "xLMIX" ];then + CMAKE_ARGS="-DLMIX=TRUE" + cmake $CMAKE_ARGS .. +else + if [ "x$AICPU_SOC_VERSION" = "xAscend310RC" ];then + CMAKE_ARGS="-DMINRC=TRUE" + cmake $CMAKE_ARGS .. + else + cmake .. + fi +fi +if [ $? -ne 0 ]; then + log "[ERROR] Please check cmake result." + exit 1 +fi + +log "[INFO] Make begin." +make -j +if [ $? -ne 0 ]; then + log "[ERROR] Please check make result." + exit 1 +fi +log "[INFO] Build successfully, the target is in $project_path/build_out." diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/config.cmake b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/config.cmake new file mode 100644 index 00000000000..1ccc2a1edb4 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/config.cmake @@ -0,0 +1,118 @@ + +# set compile option -std=c++11 +set(CMAKE_CXX_STANDARD 11) + +# set compile option -fPIC +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(OPP_CUSTOM_VENDOR "$ENV{OPP_CUSTOM_VENDOR}") +set(TOP_DIR ${CMAKE_SOURCE_DIR}/../..) + +if(NOT DEFINED ASCEND_TENSOR_COMPILER_INCLUDE) + if(NOT "x$ENV{ASCEND_TENSOR_COMPILER_INCLUDE}" STREQUAL "x") + set(ASCEND_TENSOR_COMPILER_INCLUDE $ENV{ASCEND_TENSOR_COMPILER_INCLUDE}) + else() + set(ASCEND_TENSOR_COMPILER_INCLUDE /usr/local/Ascend/compiler/include) + endif() +endif() +message(STATUS "ASCEND_TENSOR_COMPILER_INCLUDE=${ASCEND_TENSOR_COMPILER_INCLUDE}") + +set(ASCEND_INC ${ASCEND_TENSOR_COMPILER_INCLUDE}) + +if(UNIX) + if(NOT DEFINED SYSTEM_INFO) + if(NOT "x$ENV{SYSTEM_INFO}" STREQUAL "x") + set(SYSTEM_INFO $ENV{SYSTEM_INFO}) + else() + execute_process(COMMAND grep -i ^id= /etc/os-release + OUTPUT_VARIABLE SYSTEM_NAME_INFO) + string(REGEX REPLACE "\n|id=|ID=|\"" "" SYSTEM_NAME ${SYSTEM_NAME_INFO}) + message(STATUS "SYSTEM_NAME=${SYSTEM_NAME}") + set(SYSTEM_INFO ${SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR}) + endif() + endif() + + message(STATUS "SYSTEM_INFO=${SYSTEM_INFO}") +elseif(WIN32) + message(STATUS "System is Windows. Only for pre-build.") +else() + message(FATAL_ERROR "${CMAKE_SYSTEM_NAME} not support.") +endif() + +set(RUN_TARGET "custom_opp_${SYSTEM_INFO}.run") +message(STATUS "RUN_TARGET=${RUN_TARGET}") +set(PROJECT_DIR "vendors/mslite") + +set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/makepkg) +message(STATUS "OUT_DIR=${OUT_DIR}") + +set(TF_PLUGIN_TARGET "cust_tf_parsers") +set(TF_PLUGIN_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/framework/tensorflow/) + +set(ONNX_PLUGIN_TARGET "cust_onnx_parsers") +set(ONNX_PLUGIN_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/framework/onnx/) + +set(TF_SCOPE_FUSION_PASS_TARGET "cust_tf_scope_fusion") +set(TF_SCOPE_FUSION_PASS_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/framework/tensorflow/) + +set(CAFFE_PARSER_TARGET "_caffe_parser") +set(CAFFE_PLUGIN_TARGET "cust_caffe_parsers") +set(CAFFE_PLUGIN_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/framework/caffe/) + +set(OP_PROTO_TARGET "cust_op_proto") +set(OP_PROTO_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/op_proto/) + +set(OP_TILING_TARGET "optiling") +set(OP_TILING_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/op_impl/ai_core/tbe/op_tiling) + +set(AIC_FUSION_PASS_TARGET "cust_aic_fusion_pass") +set(AIC_FUSION_PASS_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/fusion_pass/ai_core) + +set(AIV_FUSION_PASS_TARGET "cust_aiv_fusion_pass") +set(AIV_FUSION_PASS_TARGET_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/fusion_pass/vector_core) + +set(AIC_OP_INFO_CFG_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/op_impl/ai_core/tbe/config) +set(AIV_OP_INFO_CFG_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/op_impl/vector_core/tbe/config/) + +set(AICPU_CONFIG_JSON_TARGET "aicpu_config_json") +set(AICPU_OP_INFO_CFG_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/op_impl/cpu/config) +set(AICPU_OP_IMPL_OUT_DIR ${OUT_DIR}/packages/${PROJECT_DIR}/op_impl/cpu/aicpu_kernel/impl/) + +set(INI_2_JSON_PY "${CMAKE_SOURCE_DIR}/cmake/util/parse_ini_to_json.py") +set(AICPU_INI_2_JSON_PY "${CMAKE_SOURCE_DIR}/cmake/util/aicpu_parser_ini.py") + +set(AICPU_KERNEL_TARGET $ENV{AICPU_KERNEL_TARGET}) + +set(CMAKE_SKIP_RPATH TRUE) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all") + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro,-z,now") +set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,relro,-z,now") + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack") +set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,noexecstack") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpie") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pie") +set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -pie") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORTIFY_SOURCE=2 -O2") + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility=hidden") +set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility=hidden") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility-inlines-hidden") +set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility-inlines-hidden") + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -ftrapv") + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -fstack-check") + +set(CMAKE_C_FLAGS_DEBUG + "-fPIC -pthread -Wfloat-equal -Wshadow -Wformat=2 -Wno-deprecated -fstack-protector-strong -Wall -Wextra") +if("x${AICPU_KERNEL_TARGET}" STREQUAL "x") + set(AICPU_KERNEL_TARGET "cust_aicpu_kernels") +endif() + +include_directories(${ASCEND_INC}) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/aicpu_parser_ini.py b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/aicpu_parser_ini.py new file mode 100755 index 00000000000..0830f518994 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/aicpu_parser_ini.py @@ -0,0 +1,274 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +aicpu ini parser +""" + +import json +import os +import stat +import sys + + +OP_INFO_ENGINE_VALUE = ["DNN_VM_AICPU", "DNN_VM_HOST_CPU"] +OP_INFO_FLAGPARTIAL_VALUE = ["False"] +OP_INFO_COMPUTECOST_VALUE = ["100"] +OP_INFO_SUBTYPE_OF_INFERSHAPE_VALUE = ["1", "2", "3", "4"] +BOOL_LIST = ["True", "False"] +TYPE_LIST = ["DT_UINT8", "DT_UINT16", "DT_INT8", "DT_INT16", "DT_INT32", "DT_INT64", "DT_UINT32", "DT_UINT64", + "DT_FLOAT16", "DT_FLOAT", "DT_DOUBLE", "DT_BOOL", "DT_COMPLEX64", "DT_COMPLEX128"] +FORMAT_LIST = ["ND", "NHWC", "NCHW"] + + +def parse_ini_files(ini_files): + ''' + init all ini files + ''' + aicpu_ops_info = {} + for ini_file in ini_files: + check_file_size(ini_file) + parse_ini_to_obj(ini_file, aicpu_ops_info) + return aicpu_ops_info + + +def check_file_size(input_file): + try: + file_size = os.path.getsize(input_file) + except OSError as os_error: + print('[ERROR] Failed to open "%s". %s' % (input_file, str(os_error))) + raise OSError from os_error + if file_size > 10*1024*1024: + print('[WARN] The size of %s exceeds 10MB, it may take more time to run, please wait.' % input_file) + + +def parse_ini_to_obj(ini_file, aicpu_ops_info): + ''' + parse all ini files to object + ''' + with open(ini_file) as ini_read_file: + lines = ini_read_file.readlines() + ops = {} + find_op_type = False + for line in lines: + line = line.rstrip() + if line.startswith("["): + if line.endswith("]"): + op_name = line[1:-1] + ops = {} + aicpu_ops_info[op_name] = ops + find_op_type = True + elif "=" in line: + key1 = line[:line.index("=")] + key2 = line[line.index("=")+1:] + key1_0, key1_1 = key1.split(".") + if key1_0 not in ops: + ops[key1_0] = {} + dic_key = ops.get(key1_0) + dic_key[key1_1] = key2 + else: + continue + if not find_op_type: + raise RuntimeError("Not find OpType in .ini file.") + + +def check_custom_op_opinfo(required_custom_op_info_keys, ops, op_key): + ''' + check custom op info + ''' + op_info = ops["opInfo"] + missing_keys = [] + for required_op_info_key in required_custom_op_info_keys: + if required_op_info_key not in op_info: + missing_keys.append(required_op_info_key) + if missing_keys: + print("op: " + op_key + " opInfo missing: " + ",".join(missing_keys)) + raise KeyError("Check opInfo failed!") + + +def check_opinfo_value(op_info): + """ + Function Description: + Check opinfo value + Parameter: op_info + """ + is_valid = True + check_key = ["engine", "flagPartial", "computeCost", "flagAsync", "subTypeOfInferShape", "flagSupportBlockDim"] + key_support = [OP_INFO_ENGINE_VALUE, OP_INFO_FLAGPARTIAL_VALUE, OP_INFO_COMPUTECOST_VALUE, BOOL_LIST, + OP_INFO_SUBTYPE_OF_INFERSHAPE_VALUE, BOOL_LIST] + for key, value_list in zip(check_key, key_support): + info_value = op_info.get(key) + if info_value is not None and info_value.strip() not in value_list: + is_valid = False + print("opInfo.{0} only support {1}.".format(key, value_list)) + return is_valid + + +def check_op_opinfo(required_op_info_keys, required_custom_op_info_keys, + ops, op_key): + ''' + check normal op info + ''' + op_info = ops["opInfo"] + missing_keys = [] + for required_op_info_key in required_op_info_keys: + if required_op_info_key not in op_info: + missing_keys.append(required_op_info_key) + if missing_keys: + print("op: " + op_key + " opInfo missing: " + ",".join(missing_keys)) + raise KeyError("Check opInfo required key failed.") + if op_info["opKernelLib"] == "CUSTAICPUKernel": + check_custom_op_opinfo(required_custom_op_info_keys, ops, op_key) + ops["opInfo"]["userDefined"] = "True" + if not check_opinfo_value(op_info): + raise KeyError("Check opInfo value failed.") + + +def check_op_input_output(info, key, ops): + ''' + check input and output infos of all ops + ''' + op_input_output = ops.get(key) + for op_sets in op_input_output: + if op_sets not in ('format', 'type', 'name'): + print(info + " should has format type or name as the key, " + + "but getting " + op_sets) + raise KeyError("Check input and output info failed.") + if not check_type_format(op_sets, op_input_output, key): + raise KeyError("Check input and output type or format failed.") + + +def check_type_format(op_key, op_dict, key_input_output): + """ + Function Description: + Check type and format + Parameter: op_key, such as name,type,format + Parameter: op_dict + Parameter: key_input_output, such as input0 + """ + is_valid = True + type_format = ["type", "format"] + type_format_value = [TYPE_LIST, FORMAT_LIST] + for key, value_list in zip(type_format, type_format_value): + if op_key == key: + op_value_str = op_dict.get(key) + is_valid = check_value_valid(is_valid, key_input_output, op_key, op_value_str, value_list) + return is_valid + + +def check_value_valid(is_valid, key_input_output, op_key, op_value_str, value_list): + """ + Function Description: + Check value valid + Parameter: is_valid, bool + Parameter: key_input_output, such as input0 + Parameter: op_key, such as name,type,format + Parameter: op_value_str,such as int8,int16 + Parameter: value_list, support value + """ + if op_value_str: + for op_value in op_value_str.split(","): + if op_value.strip() not in value_list: + is_valid = False + print("{0}.{1} not support {2}.".format(key_input_output, op_key, op_value)) + return is_valid + + +def check_op_info(aicpu_ops): + ''' + check all ops + ''' + print("==============check valid for aicpu ops info start==============") + required_op_info_keys = ["computeCost", "engine", "flagAsync", + "flagPartial", "opKernelLib", "kernelSo", "functionName"] + required_custom_op_info_keys = ["workspaceSize"] + + for op_key in aicpu_ops: + ops = aicpu_ops[op_key] + for key in ops: + if key == "opInfo": + check_op_opinfo(required_op_info_keys, + required_custom_op_info_keys, ops, op_key) + + elif (key[:5] == "input") and (key[5:].isdigit()): + check_op_input_output("input", key, ops) + elif (key[:6] == "output") and (key[6:].isdigit()): + check_op_input_output("output", key, ops) + elif (key[:13] == "dynamic_input") and (key[13:].isdigit()): + check_op_input_output("dynamic_input", key, ops) + elif (key[:14] == "dynamic_output") and (key[14:].isdigit()): + check_op_input_output("dynamic_output", key, ops) + else: + print("Only opInfo, input[0-9], output[0-9] can be used as a " + "key, but op %s has the key %s" % (op_key, key)) + raise KeyError("bad key value") + print("==============check valid for aicpu ops info end================\n") + + +def write_json_file(aicpu_ops_info, json_file_path): + ''' + write json file from ini file + ''' + flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL + modes = stat.S_IWUSR | stat.S_IRUSR + json_file_real_path = os.path.realpath(json_file_path) + with os.fdopen(os.open(json_file_real_path, flags, modes), "w") as json_file: + # Only the owner and group have rights + os.chmod(json_file_real_path, stat.S_IWGRP + stat.S_IWUSR + stat.S_IRGRP + + stat.S_IRUSR) + json.dump(aicpu_ops_info, json_file, sort_keys=True, + indent=4, separators=(',', ':')) + print("Compile aicpu op info cfg successfully.") + + +def dump_json(aicpu_ops_info, outfile_path_arg): + ''' + dump_json + ''' + check_op_info(aicpu_ops_info) + write_json_file(aicpu_ops_info, outfile_path_arg) + + +def parse_ini_to_json(ini_file_paths_arg, outfile_path_arg): + ''' + parse ini to json + ''' + aicpu_ops_info = parse_ini_files(ini_file_paths_arg) + check_flag = True + try: + dump_json(aicpu_ops_info, outfile_path_arg) + except KeyError: + check_flag = False + print("bad format key value, failed to generate json file") + return check_flag + + +if __name__ == '__main__': + get_args = sys.argv + + OUTPUT = "tf_kernel.json" + ini_file_paths = [] + + for arg in get_args: + if arg.endswith("ini"): + ini_file_paths.append(arg) + if arg.endswith("json"): + OUTPUT = arg + + if not ini_file_paths: + ini_file_paths.append("tf_kernel.ini") + + if not parse_ini_to_json(ini_file_paths, OUTPUT): + sys.exit(1) + sys.exit(0) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/gen_impl_and_mrege_json.sh b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/gen_impl_and_mrege_json.sh new file mode 100755 index 00000000000..fd7091199de --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/gen_impl_and_mrege_json.sh @@ -0,0 +1,57 @@ +#!/usr/bin/bash + +project_path=$1 +build_path=$2 +vendor_name=mslite +if [[ ! -d "$project_path" ]]; then + echo "[ERROR] No projcet path is provided" + exit 1 +fi + +if [[ ! -d "$build_path" ]]; then + echo "[ERROR] No build path is provided" + exit 1 +fi + +# copy ai_core operators implements +tbe_impl_files_num=$(ls $project_path/tbe/impl/* 2> /dev/null | wc -l) +if [[ "$tbe_impl_files_num" -gt 0 ]];then + cp -r ${project_path}/tbe/impl/* ${build_path}/makepkg/packages/vendors/$vendor_name/op_impl/ai_core/tbe/mslite_impl + cp -r ${project_path}/tbe/impl/* ${build_path}/makepkg/packages/vendors/$vendor_name/op_impl/vector_core/tbe/mslite_impl +fi + +# copy aicpu kernel so operators +if [[ -d "${project_path}/cpukernel/aicpu_kernel_lib" ]]; then + cp -f ${project_path}/cpukernel/aicpu_kernel_lib/* ${build_path}/makepkg/packages/vendors/$vendor_name/op_impl/cpu/aicpu_kernel/impl + rm -rf ${project_path}/cpukernel/aicpu_kernel_lib +fi + +# merge aicpu.ini and aicore.ini to generate npu_supported_ops.json +mkdir -p ${build_path}/framework/op_info_cfg +mkdir -p ${build_path}/framework/op_info_cfg/aicpu_kernel +mkdir -p ${build_path}/framework/op_info_cfg/ai_core + +if [[ -d "${project_path}/tbe/op_info_cfg/ai_core" ]]; then + bash ${project_path}/cmake/util/gen_ops_filter.sh ${project_path}/tbe/op_info_cfg/ai_core ${build_path}/framework/op_info_cfg/ai_core +fi + +if [[ -d "${project_path}/cpukernel/op_info_cfg/aicpu_kernel" ]]; then + bash ${project_path}/cmake/util/gen_ops_filter.sh ${project_path}/cpukernel/op_info_cfg/aicpu_kernel ${build_path}/framework/op_info_cfg/aicpu_kernel +fi + +aicpu_filter_file=${build_path}/framework/op_info_cfg/aicpu_kernel/npu_supported_ops.json +aicore_filter_file=${build_path}/framework/op_info_cfg/ai_core/npu_supported_ops.json +if [[ -f "${aicpu_filter_file}" ]] && [[ ! -f "${aicore_filter_file}" ]]; then + cp $aicpu_filter_file ${build_path}/makepkg/packages/vendors/$vendor_name/framework/tensorflow +fi +if [[ -f "${aicore_filter_file}" ]] && [[ ! -f "${aicpu_filter_file}" ]]; then + cp $aicore_filter_file ${build_path}/makepkg/packages/vendors/$vendor_name/framework/tensorflow +fi + +if [[ -f "${aicore_filter_file}" ]] && [[ -f "${aicpu_filter_file}" ]]; then + chmod u+w ${aicpu_filter_file} + python3 ${project_path}/cmake/util/insert_op_info.py ${aicore_filter_file} ${aicpu_filter_file} + chmod u-w ${aicpu_filter_file} + cp $aicpu_filter_file ${build_path}/makepkg/packages/vendors/$vendor_name/framework/tensorflow +fi + diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/gen_ops_filter.sh b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/gen_ops_filter.sh new file mode 100755 index 00000000000..5989bdeef77 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/gen_ops_filter.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +# Description: Generate npu_supported_ops.json +# ============================================================================== + +if [[ -z "$1" ]]; then + echo -e "[ERROR] No source dir provided" + exit 1 +fi + +if [[ -z "$2" ]]; then + echo -e "[ERROR] No destination dir provided" + exit 1 +fi + +src=$1 +dest_file=$2/npu_supported_ops.json + +if [ -f "$dest_file" ];then + chmod u+w $dest_file +fi + +add_ops() { + name=$1 + isHeavy=$2 + file=$3 + grep -w "\"$name\"" ${file} >/dev/null + if [ $? == 0 ];then + return + fi + echo " \"${name}\": {" >> ${file} + echo " \"isGray\": false," >> ${file} + echo " \"isHeavy\": ${isHeavy}" >> ${file} + echo " }," >> ${file} +} + +echo "{" > ${dest_file} +ini_files=$(find ${src} -name "*.ini") +for file in ${ini_files} ; do + name=$(grep '^\[' ${file} | sed 's/\[//g' | sed 's/]//g' | sed 's/\r//g') + grep 'heavyOp.flag' ${file} >/dev/null + if [ $? == 0 ];then + isHeavy=$(grep 'heavyOp.flag' ${file} | awk -F= '{print $2}') + else + isHeavy="false" + fi + add_ops ${name} ${isHeavy} ${dest_file} +done +echo "}" >> ${dest_file} +file_count=$(cat ${dest_file} | wc -l) +line=$(($file_count-1)) +sed -i "${line}{s/,//g}" ${dest_file} + +chmod 640 "${dest_file}" +echo -e "[INFO] Succeed generated ${dest_file}" + +exit 0 diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/insert_op_info.py b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/insert_op_info.py new file mode 100755 index 00000000000..467d0ad4c50 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/insert_op_info.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +Created on Feb 28 20:56:45 2020 +Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +""" +import json +import os +import stat +import sys + +if __name__ == '__main__': + if len(sys.argv) != 3: + print(sys.argv) + print('argv error, inert_op_info.py your_op_file lib_op_file') + sys.exit(2) + + with open(sys.argv[1], 'r') as load_f: + insert_operator = json.load(load_f) + + all_operators = {} + if os.path.exists(sys.argv[2]): + if os.path.getsize(sys.argv[2]) != 0: + with open(sys.argv[2], 'r') as load_f: + all_operators = json.load(load_f) + + for k in insert_operator.keys(): + if k in all_operators.keys(): + print('replace op:[', k, '] success') + else: + print('insert op:[', k, '] success') + all_operators[k] = insert_operator[k] + + flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(sys.argv[2], flags, modes), 'w') as json_file: + json_file.write(json.dumps(all_operators, indent=4)) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/merge_aicpu_info_json.sh b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/merge_aicpu_info_json.sh new file mode 100755 index 00000000000..d4e82c26ae0 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/merge_aicpu_info_json.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +project_path=$1 +build_path=$2 +vendor_name=mslite + +if [[ ! -d "$project_path" ]]; then + echo "[ERROR] No projcet path is provided" + exit 1 +fi + +if [[ ! -d "$build_path" ]]; then + echo "[ERROR] No build path is provided" + exit 1 +fi + +if [[ ! -d "$ASCEND_OPP_PATH" ]]; then + echo "[ERROR] No opp install path is provided" + exit 1 +fi +custom_exist_info_json=$ASCEND_OPP_PATH/vendors/$vendor_name/op_impl/cpu/config/cust_aicpu_kernel.json +custom_new_info_json=$build_path/makepkg/packages/vendors/$vendor_name/op_impl/cpu/config/cust_aicpu_kernel.json +temp_info_json=$build_path/makepkg/packages/vendors/$vendor_name/op_impl/cpu/config/temp_cust_aicpu_kernel.json + +if [[ -f "$custom_exist_info_json" ]] && [[ -f "$custom_new_info_json" ]]; then + cp -f $custom_exist_info_json $temp_info_json + chmod +w $temp_info_json + python3 ${project_path}/cmake/util/insert_op_info.py ${custom_new_info_json} ${temp_info_json} + cp -f $temp_info_json $custom_new_info_json + rm -f $temp_info_json +fi diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/parse_ini_to_json.py b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/parse_ini_to_json.py new file mode 100755 index 00000000000..c602d5e5fe8 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cmake/util/parse_ini_to_json.py @@ -0,0 +1,345 @@ +# Copyright 2020-2021 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +parser ini to json +""" + +import json +import os +import stat +import sys + + +ATTR_TYPE_LIST = ["int", "float", "bool", "str", "listInt", "listFloat", "listBool", "listStr", "listListInt", + "type", "listType", "tensor", "listTensor"] +ATTR_PARAMTYPE_LIST = ["optional", "required"] +BOOL_FLAG_KEY = ["dynamicFormat", "dynamicShapeSupport", "dynamicRankSupport", "precision_reduce", "heavyOp", + "needCheckSupport"] +BOOL_LIST = ["true", "false"] +DTYPE_LIST = ["float16", "float", "float32", "int8", "int16", "int32", "uint8", "uint16", "uint32", "bool", + "int64", "uint64", "qint8", "qint16", "qint32", "quint8", "quint16", "double", "complex64", + "complex128", "string", "resource"] +FORMAT_LIST = ["NCHW", "NHWC", "ND", "NC1HWC0", "FRACTAL_Z", "NC1C0HWPAD", "NHWC1C0", "FSR_NCHW", "FRACTAL_DECONV", + "C1HWNC0", "FRACTAL_DECONV_TRANSPOSE", "FRACTAL_DECONV_SP_STRIDE_TRANS", "NC1HWC0_C04", + "FRACTAL_Z_C04", "CHWN", "FRACTAL_DECONV_SP_STRIDE8_TRANS", "HWCN", "NC1KHKWHWC0", "BN_WEIGHT", + "FILTER_HWCK", "HASHTABLE_LOOKUP_LOOKUPS", "HASHTABLE_LOOKUP_KEYS", "HASHTABLE_LOOKUP_VALUE", + "HASHTABLE_LOOKUP_OUTPUT", "HASHTABLE_LOOKUP_HITS", "C1HWNCoC0", "MD", "NDHWC", "FRACTAL_ZZ", + "FRACTAL_NZ", "NCDHW", "DHWCN", "NDC1HWC0", "FRACTAL_Z_3D", "CN", "NC", "DHWNC", + "FRACTAL_Z_3D_TRANSPOSE", "FRACTAL_ZN_LSTM", "FRACTAL_ZN_RNN", "FRACTAL_Z_G", "NULL"] + + +def parse_ini_files(ini_files): + """ + parse ini files to json + Parameters: + ---------------- + ini_files:input file list + return:ops_info + ---------------- + """ + tbe_ops_info = {} + for ini_file in ini_files: + check_file_size(ini_file) + parse_ini_to_obj(ini_file, tbe_ops_info) + return tbe_ops_info + + +def check_file_size(input_file): + try: + file_size = os.path.getsize(input_file) + except OSError as os_error: + print('[ERROR] Failed to open "%s". %s' % (input_file, str(os_error))) + raise OSError from os_error + if file_size > 10*1024*1024: + print('[WARN] The size of %s exceeds 10MB, it may take more time to run, please wait.' % input_file) + + +def parse_ini_to_obj(ini_file_path, tbe_ops_info): + """ + parse ini file to json obj + Parameters: + ---------------- + ini_file_path:ini file path + tbe_ops_info:ops_info + ---------------- + """ + with open(ini_file_path) as ini_file: + lines = ini_file.readlines() + op_dict = {} + op_name = "" + find_op_type = False + for line in lines: + line = line.rstrip() + if line == "": + continue + if line.startswith("["): + if line.endswith("]"): + op_name = line[1:-1] + op_dict = {} + tbe_ops_info[op_name] = op_dict + find_op_type = True + elif "=" in line: + key1 = line[:line.index("=")] + key2 = line[line.index("=")+1:] + key1_0, key1_1 = key1.split(".") + if not key1_0 in op_dict: + op_dict[key1_0] = {} + if key1_1 in op_dict.get(key1_0): + raise RuntimeError("Op:" + op_name + " " + key1_0 + " " + + key1_1 + " is repeated!") + dic_key = op_dict.get(key1_0) + dic_key[key1_1] = key2 + else: + continue + if not find_op_type: + raise RuntimeError("Not find OpType in .ini file.") + + +def check_output_exist(op_dict, is_valid): + """ + Function Description: + Check output is exist + Parameter: op_dict + Parameter: is_valid + """ + if "output0" in op_dict: + output0_dict = op_dict.get("output0") + if output0_dict.get("name", None) is None: + is_valid = False + print("output0.name is required in .ini file!") + else: + is_valid = False + print("output0 is required in .ini file!") + return is_valid + + +def check_attr_dict(attr_dict, is_valid, attr): + """ + Function Description: + Check attr_dict + Parameter: attr_dict + Parameter: is_valid + Parameter: attr + """ + attr_type = attr_dict.get("type") + value = attr_dict.get("value") + param_type = attr_dict.get("paramType") + if attr_type is None or value is None: + is_valid = False + print( + "If attr.list is exist, {0}.type and {0}.value is required".format(attr)) + if param_type and param_type not in ATTR_PARAMTYPE_LIST: + is_valid = False + print("{0}.paramType only support {1}.".format( + attr, ATTR_PARAMTYPE_LIST)) + if attr_type and attr_type not in ATTR_TYPE_LIST: + is_valid = False + print("{0}.type only support {1}.".format(attr, ATTR_TYPE_LIST)) + return is_valid + + +def check_attr(op_dict, is_valid): + """ + Function Description: + Check attr + Parameter: op_dict + Parameter: is_valid + """ + if "attr" in op_dict: + attr_dict = op_dict.get("attr") + attr_list_str = attr_dict.get("list", None) + if attr_list_str is None: + is_valid = False + print("attr.list is required in .ini file!") + else: + attr_list = attr_list_str.split(",") + for attr_name in attr_list: + attr = "attr_" + attr_name.strip() + attr_dict = op_dict.get(attr) + if attr_dict: + is_valid = check_attr_dict(attr_dict, is_valid, attr) + else: + is_valid = False + print("%s is required in .ini file, when attr.list is %s!" % ( + attr, attr_list_str)) + return is_valid + + +def check_bool_flag(op_dict, is_valid): + """ + Function Description: + check_bool_flag + Parameter: op_dict + Parameter: is_valid + """ + for key in BOOL_FLAG_KEY: + if key in op_dict: + op_bool_key = op_dict.get(key) + if op_bool_key.get("flag").strip() not in BOOL_LIST: + is_valid = False + print("{0}.flag only support {1}.".format(key, BOOL_LIST)) + return is_valid + + +def check_type_format(op_info, is_valid, op_info_key): + """ + Function Description: + Check type and format + Parameter: op_info + Parameter: is_valid + Parameter: op_info_key + """ + op_info_dtype_str = op_info.get("dtype") + op_info_dtype_num = 0 + op_info_format_num = 0 + if op_info_dtype_str: + op_info_dtype = op_info_dtype_str.split(",") + op_info_dtype_num = len(op_info_dtype) + for dtype in op_info_dtype: + if dtype.strip() not in DTYPE_LIST: + is_valid = False + print("{0}.dtype not support {1}.".format(op_info_key, dtype)) + op_info_format_str = op_info.get("format") + if op_info_format_str: + op_info_format = op_info_format_str.split(",") + op_info_format_num = len(op_info_format) + for op_format in op_info_format: + if op_format.strip() not in FORMAT_LIST: + is_valid = False + print("{0}.format not support {1}.".format( + op_info_key, op_format)) + if op_info_dtype_num > 0 and op_info_format_num > 0: + if op_info_dtype_num != op_info_format_num: + is_valid = False + print("The number of {0}.dtype not match the number of {0}.format.".format( + op_info_key)) + return is_valid + + +def check_op_info(tbe_ops): + """ + Function Description: + Check info. + Parameter: tbe_ops + Return Value: is_valid + """ + print("\n\n==============check valid for ops info start==============") + required_op_input_info_keys = ["paramType", "name"] + required_op_output_info_keys = ["paramType", "name"] + param_type_valid_value = ["dynamic", "optional", "required"] + is_valid = True + for op_key in tbe_ops: + op_dict = tbe_ops[op_key] + is_valid = check_output_exist(op_dict, is_valid) + for op_info_key in op_dict: + if op_info_key.startswith("input"): + op_input_info = op_dict[op_info_key] + missing_keys = [] + for required_op_input_info_key in required_op_input_info_keys: + if not required_op_input_info_key in op_input_info: + missing_keys.append(required_op_input_info_key) + if missing_keys: + print("op: " + op_key + " " + op_info_key + " missing: " + + ",".join(missing_keys)) + is_valid = False + else: + if not op_input_info["paramType"] in param_type_valid_value: + print("op: " + op_key + " " + op_info_key + + " paramType not valid, valid key:[dynamic, " + "optional, required]") + is_valid = False + is_valid = check_type_format( + op_input_info, is_valid, op_info_key) + if op_info_key.startswith("output"): + op_input_info = op_dict[op_info_key] + missing_keys = [] + for required_op_input_info_key in required_op_output_info_keys: + if not required_op_input_info_key in op_input_info: + missing_keys.append(required_op_input_info_key) + if missing_keys: + print("op: " + op_key + " " + op_info_key + " missing: " + + ",".join(missing_keys)) + is_valid = False + else: + if not op_input_info["paramType"] in param_type_valid_value: + print("op: " + op_key + " " + op_info_key + + " paramType not valid, valid key:[dynamic, " + "optional, required]") + is_valid = False + is_valid = check_type_format( + op_input_info, is_valid, op_info_key) + is_valid = check_attr(op_dict, is_valid) + is_valid = check_bool_flag(op_dict, is_valid) + print("==============check valid for ops info end================\n\n") + return is_valid + + +def write_json_file(tbe_ops_info, json_file_path): + """ + Save info to json file + Parameters: + ---------------- + tbe_ops_info: ops_info + json_file_path: json file path + ---------------- + """ + flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL + modes = stat.S_IWUSR | stat.S_IRUSR + json_file_real_path = os.path.realpath(json_file_path) + with os.fdopen(os.open(json_file_real_path, flags, modes), "w") as file_path: + # Only the owner and group have rights + os.chmod(json_file_real_path, stat.S_IWGRP + stat.S_IWUSR + stat.S_IRGRP + + stat.S_IRUSR) + json.dump(tbe_ops_info, file_path, sort_keys=True, indent=4, + separators=(',', ':')) + print("Compile op info cfg successfully.") + + +def parse_ini_to_json(ini_file_paths, outfile_path): + """ + parse ini files to json file + Parameters: + ---------------- + ini_file_paths: list of ini file path + outfile_path: output file path + ---------------- + """ + tbe_ops_info = parse_ini_files(ini_file_paths) + if not check_op_info(tbe_ops_info): + print("Compile op info cfg failed.") + return False + write_json_file(tbe_ops_info, outfile_path) + return True + + +if __name__ == '__main__': + args = sys.argv + + output_file_path = "tbe_ops_info.json" + ini_file_path_list = [] + + for arg in args: + if arg.endswith("ini"): + ini_file_path_list.append(arg) + output_file_path = arg.replace(".ini", ".json") + if arg.endswith("json"): + output_file_path = arg + + if not ini_file_path_list: + ini_file_path_list.append("tbe_ops_info.ini") + + if not parse_ini_to_json(ini_file_path_list, output_file_path): + sys.exit(1) + sys.exit(0) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/CMakeLists.txt new file mode 100644 index 00000000000..a020bf2cc34 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/CMakeLists.txt @@ -0,0 +1,190 @@ +# CMake minimum version number requirements +cmake_minimum_required(VERSION 3.5) +project(kernel) +set(TOOLCHAIN_DIR $ENV{TOOLCHAIN_DIR}) +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall -s") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CAMKE_SKIP_RPATH TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") +add_compile_options( + -fstack-protector-all + -D_FORTIFY_SOURCE=2 -O2 + ) + +#Specify cross compiler +if(LMIX) + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}-g++) + set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}-gcc) +else() + if(NOT "x${TOOLCHAIN_DIR}" STREQUAL "x") + if(NOT IS_DIRECTORY ${TOOLCHAIN_DIR}) + message(FATAL_ERROR "specify cross compile toolchain directory(${TOOLCHAIN_DIR}) is not exist") + endif() + endif() + message(STATUS "TOOLCHAIN_DIR=${TOOLCHAIN_DIR}") + if(MINRC) + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) + set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++) + else() + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-target-linux-gnu-g++) + set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-target-linux-gnu-gcc) + endif() +endif() +# =========================config json compile============================ +macro(GEN_OPS_INFO_FILE op_type output_dir output_file_name_prefix) + + SET(INI_PATH ${CMAKE_CURRENT_SOURCE_DIR}/op_info_cfg) + message(STATUS "ini file directory: ${CMAKE_CURRENT_SOURCE_DIR}/op_info_cfg") + if(NOT EXISTS ${INI_PATH}) + set(INI_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + execute_process(COMMAND ls -1 ${INI_PATH} + OUTPUT_VARIABLE SUB_DIRS) + string(REPLACE "\n" ";" SUB_DIRS ${SUB_DIRS}) + foreach(SUB_DIR ${SUB_DIRS}) + if(IS_DIRECTORY ${INI_PATH}/${SUB_DIR}) + execute_process(COMMAND find ${INI_PATH}/${SUB_DIR} -name "*.ini" + OUTPUT_VARIABLE INI_FILES) + if(NOT "x${INI_FILES}" STREQUAL "x") + string(REPLACE "\n" "\t" INI_FILES ${INI_FILES}) + endif() + #string(REPLACE "\n" "\t" INI_FILES ${INI_FILES}) + set(output_file_name ${output_file_name_prefix}_aicpu_kernel.json) + if(NOT "x${INI_FILES}" STREQUAL "x") + add_custom_command(OUTPUT ${output_file_name} + COMMAND echo "python3 ${AICPU_INI_2_JSON_PY} ${INI_FILES} ${output_dir}/${output_file_name}" + COMMAND mkdir -p ${output_dir} + COMMAND python3 ${AICPU_INI_2_JSON_PY} ${INI_FILES} ${output_dir}/${output_file_name} + COMMENT "generate configure json file") + set(OUTPUT_FILES ${OUTPUT_FILES} ${output_file_name}) + else() + message(STATUS "ini file not exists.") + execute_process(COMMAND mkdir -p ${output_dir}) + endif() + endif() + endforeach() +endmacro() + +if(NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/op_info_cfg/aicpu_kernel) + add_custom_target(${AICPU_CONFIG_JSON_TARGET} + COMMAND echo "can not find directory ${CMAKE_CURRENT_SOURCE_DIR}/op_info_cfg/aicpu_kernel") + return(0) +endif() + +set(OUTPUT_FILES "") + +if(UNIX) + GEN_OPS_INFO_FILE("" ${AICPU_OP_INFO_CFG_OUT_DIR} cust) + + if("x${OUTPUT_FILES}" STREQUAL "x") + add_custom_target(${AICPU_CONFIG_JSON_TARGET} + COMMAND echo "can not find ini file in ${CMAKE_CURRENT_SOURCE_DIR}/aicpu.") + return(0) + endif() +endif() + +add_custom_target(${AICPU_CONFIG_JSON_TARGET} ALL DEPENDS ${OUTPUT_FILES} + COMMAND mkdir -p ${TF_PLUGIN_TARGET_OUT_DIR} + COMMAND bash ${CMAKE_SOURCE_DIR}/cmake/util/merge_aicpu_info_json.sh ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}) + +# =========================kernel compile============================ +macro(SUBDIRLIST current_dir) + file(GLOB children RELATIVE ${current_dir} ${current_dir}/*) + set(SUB_DIR_LIST "") + foreach(child ${children}) + if(IS_DIRECTORY ${current_dir}/${child}) + LIST(APPEND SUB_DIR_LIST ${child}) + endif() + endforeach() +endmacro() + +# set compile option -std=c++11 +set(CMAKE_CXX_STANDARD 11) + +# set compile option -fPIC +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +aux_source_directory(./impl/ KERNELS_SRCS) + +if("x${KERNELS_SRCS}" STREQUAL "x") + add_custom_target(${AICPU_KERNEL_TARGET} + COMMAND echo "no source to make lib${AICPU_KERNEL_TARGET}.so") + return(0) +endif() + +set(ASCEND_OPP_PATH $ENV{ASCEND_OPP_PATH}) +if("x${ASCEND_OPP_PATH}" STREQUAL "x") + message(FATAL_ERROR "ENV ASCEND_OPP_PATH is not set") +endif() + +if(UNIX) + set(ASCEND_AICPU_PATH $ENV{ASCEND_AICPU_PATH}) + if("x${ASCEND_AICPU_PATH}" STREQUAL "x") + message(FATAL_ERROR "ENV ASCEND_AICPU_PATH is not set") + endif() +endif() + +include_directories(${ASCEND_OPP_PATH}/built-in/op_impl/aicpu/aicpu_kernel/inc) + +# travers subdirectory +SUBDIRLIST(${CMAKE_CURRENT_SOURCE_DIR}/impl/third_party) +include_directories(./impl/third_party/${SUB_DIR_LIST}) + +set(LIBRARY_OUTPUT_PATH ${AICPU_OP_IMPL_OUT_DIR}) +set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") +add_library(${AICPU_KERNEL_TARGET} SHARED ${KERNELS_SRCS}) + +set(AICPU_SOC_VERSION $ENV{AICPU_SOC_VERSION}) +message(STATUS "AICPU_SOC_VERSION=${AICPU_SOC_VERSION}") + +set(AICPU_OPP_PATH Ascend) +if((AICPU_SOC_VERSION STREQUAL Ascend310) OR (AICPU_SOC_VERSION STREQUAL Ascend310P) OR + (AICPU_SOC_VERSION STREQUAL Ascend310RC) OR (AICPU_SOC_VERSION STREQUAL Ascend910)) +set(AICPU_OPP_PATH ${AICPU_SOC_VERSION}) +endif() + +if(EXISTS "${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_OPP_PATH}/libascend_protobuf.a") + target_link_libraries(${AICPU_KERNEL_TARGET} PRIVATE + -Wl,--whole-archive + ${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_OPP_PATH}/libascend_protobuf.a + -Wl,--no-whole-archive + -s + -Wl,-Bsymbolic + -Wl,--exclude-libs=libascend_protobuf.a + ) +else() + message(FATAL_ERROR "Can not find libascend_protobuf.a in environment. + Please check whether the path of libascend_protobuf.a is correct or not") +endif() + +if(EXISTS "${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_OPP_PATH}/libcpu_kernels_context.a") + target_link_libraries(${AICPU_KERNEL_TARGET} PRIVATE + -Wl,--whole-archive + ${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_OPP_PATH}/libcpu_kernels_context.a + -Wl,--no-whole-archive + ) +else() + if(EXISTS "${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/libcpu_kernels_context.a") + target_link_libraries(${AICPU_KERNEL_TARGET} PRIVATE + -Wl,--whole-archive + ${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/libcpu_kernels_context.a + -Wl,--no-whole-archive + ) + elseif(EXISTS "${ASCEND_OPP_PATH}/built-in/op_impl/aicpu/aicpu_kernel/lib/device/libcpu_kernels_context.so") + target_link_libraries(${AICPU_KERNEL_TARGET} PRIVATE + -Wl,--whole-archive + ${ASCEND_OPP_PATH}/built-in/op_impl/aicpu/aicpu_kernel/lib/device/libcpu_kernels_context.so + -Wl,--no-whole-archive + ) + else() + message(FATAL_ERROR "Can not find libcpu_kernels_context.a + or libcpu_kernels_context.so in environment. + Please check whether the path of libcpu_kernels_context.a + or libcpu_kernels_context.so is correct or not") + endif() +endif() + diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/acos_cpu_kernels.cc b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/acos_cpu_kernels.cc new file mode 100644 index 00000000000..c187877c353 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/acos_cpu_kernels.cc @@ -0,0 +1,45 @@ + +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. + * Description: implement of AcosCpu + */ +#include "./acos_cpu_kernels.h" +#include + +namespace { +const char *ACOS_CPU = "AcosCpu"; +} + +namespace aicpu { +uint32_t AcosCpuCpuKernel::Compute(CpuKernelContext &ctx) { + Tensor *input = ctx.Input(0); + Tensor *output = ctx.Output(0); + + if (input == nullptr || output == nullptr) { + return 1; + } + + auto inputData = static_cast(input->GetData()); + auto outputData = static_cast(output->GetData()); + if (inputData == nullptr || outputData == nullptr) { + return 1; + } + + DataType inputType = input->GetDataType(); + switch (inputType) { + case DT_DOUBLE: + break; + default: + return 1; + } + + auto num = input->NumElements(); + for (int64_t i = 0; i < num; i++) { + outputData[i] = std::acos(inputData[i]); + } + + return 0; +} + +REGISTER_CPU_KERNEL(ACOS_CPU, AcosCpuCpuKernel); +} // namespace aicpu diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/acos_cpu_kernels.h b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/acos_cpu_kernels.h new file mode 100644 index 00000000000..6c49239d8c0 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/impl/acos_cpu_kernels.h @@ -0,0 +1,19 @@ + +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. + * Description: api of AcosCpu + */ + +#ifndef _ACOS_CPU_KERNELS_H_ +#define _ACOS_CPU_KERNELS_H_ + +#include "./cpu_kernel.h" + +namespace aicpu { +class AcosCpuCpuKernel : public CpuKernel { + public: + ~AcosCpuCpuKernel() = default; + uint32_t Compute(CpuKernelContext &ctx) override; +}; +} // namespace aicpu +#endif diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/op_info_cfg/aicpu_kernel/acos_cpu.ini b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/op_info_cfg/aicpu_kernel/acos_cpu.ini new file mode 100644 index 00000000000..ef5294ab3ef --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/op_info_cfg/aicpu_kernel/acos_cpu.ini @@ -0,0 +1,9 @@ +[AcosCpu] +opInfo.engine=DNN_VM_AICPU +opInfo.flagPartial=False +opInfo.computeCost=100 +opInfo.flagAsync=False +opInfo.opKernelLib=CUSTAICPUKernel +opInfo.kernelSo=libcust_aicpu_kernels.so +opInfo.functionName=RunCpuKernel +opInfo.workspaceSize=1024 diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/toolchain.cmake b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/toolchain.cmake new file mode 100644 index 00000000000..163036b84fc --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/cpukernel/toolchain.cmake @@ -0,0 +1,37 @@ +#this is required, only this variable is set, CMAKE recognize this is cross compilation +#in addition, CMAKE_CROSSCOMPILING is set true when CMAKE_SYSTEM_NAME is set +set(CMAKE_SYSTEM_NAME Linux) + +#Change the path to the absolute path of the cross compilation tool after the toolkit package is decompressed +# set cross compile toolchain dir +set(TOOLCHAIN_DIR $ENV{TOOLCHAIN_DIR}) +#Specify cross compiler +if(LMIX) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}-g++) + set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}-gcc) +else() + if(NOT "x${TOOLCHAIN_DIR}" STREQUAL "x") + if(NOT IS_DIRECTORY ${TOOLCHAIN_DIR}) + message(FATAL_ERROR "specify cross compile toolchain directory(${TOOLCHAIN_DIR}) is not exist") + endif() + endif() + message(STATUS "TOOLCHAIN_DIR=${TOOLCHAIN_DIR}") + if(MINRC) + set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++) + else() + set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-target-linux-gnu-gcc) + set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-target-linux-gnu-g++) + endif() +endif() +#For FIND_PROGRAM(), there are three values, NEVER, ONLY, BOTH +#the first means not to search under your CMAKE_FIND_ROOT_PATH +#the second means to search only under this path +#the third means to find this path first, then Find the global path. +#For this variable, it is usually a program that calls the host, so it is generally set to NEVER +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +#The following three options indicate that only libraries and header files are found in the cross environment +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/framework/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/framework/CMakeLists.txt new file mode 100755 index 00000000000..1edf02fe45e --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/framework/CMakeLists.txt @@ -0,0 +1,29 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +if("x${CMAKE_CXX_COMPILER}" STREQUAL "x") + set(CMAKE_CXX_COMPILER g++) +endif() +if("x${CMAKE_C_COMPILER}" STREQUAL "x") + set(CMAKE_C_COMPILER gcc) +endif() + +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall -s") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CAMKE_SKIP_RPATH TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") +add_compile_options( + -fstack-protector-all + -D_FORTIFY_SOURCE=2 -O2 + ) +if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/caffe_plugin") + add_subdirectory(caffe_plugin) +endif() +if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/tf_plugin") + add_subdirectory(tf_plugin) +endif() +if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/tf_scope_fusion_pass") + add_subdirectory(tf_scope_fusion_pass) +endif() +if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/onnx_plugin") + add_subdirectory(onnx_plugin) +endif() diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/CMakeLists.txt new file mode 100644 index 00000000000..1c106d7dd6f --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +aux_source_directory(. SRCS) +message(STATUS "SRCS = ${SRCS}") + +if("x${SRCS}" STREQUAL "x") + add_custom_target(${TF_PLUGIN_TARGET} + COMMAND mkdir -p ${TF_PLUGIN_TARGET_OUT_DIR} + COMMAND echo "no source to make lib${TF_PLUGIN_TARGET}.so") + return(0) +endif() + +set(LIBRARY_OUTPUT_PATH ${TF_PLUGIN_TARGET_OUT_DIR}) + +add_library(${TF_PLUGIN_TARGET} SHARED ${SRCS}) + +target_compile_definitions(${TF_PLUGIN_TARGET} PRIVATE + google=ascend_private +) + +target_link_libraries(${TF_PLUGIN_TARGET} ${ASCEND_INC}/../lib64/libgraph.so) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_acos_cpu_plugin.cc b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_acos_cpu_plugin.cc new file mode 100644 index 00000000000..4183a27003e --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_acos_cpu_plugin.cc @@ -0,0 +1,23 @@ +/* Copyright (C) 2020-2021. Huawei Technologies Co., Ltd. All +rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the Apache License Version 2.0. + * You may not use this file except in compliance with the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Apache License for more details at + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#include "register/register.h" + +namespace domi { +// register op info to GE +REGISTER_CUSTOM_OP("AcosCpu") + .FrameworkType(TENSORFLOW) // type: CAFFE, TENSORFLOW + .OriginOpType("AcosCpu") // name in tf module + .ParseParamsByOperatorFn(AutoMappingByOpFn); +} // namespace domi diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_add_dsl_plugin.cc b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_add_dsl_plugin.cc new file mode 100644 index 00000000000..668b2236825 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_add_dsl_plugin.cc @@ -0,0 +1,23 @@ +/* Copyright (C) 2020-2021. Huawei Technologies Co., Ltd. All +rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the Apache License Version 2.0. + * You may not use this file except in compliance with the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Apache License for more details at + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#include "register/register.h" + +namespace domi { +// register op info to GE +REGISTER_CUSTOM_OP("AddDSL") + .FrameworkType(TENSORFLOW) // type: CAFFE, TENSORFLOW + .OriginOpType("AddDSL") // name in tf module + .ParseParamsByOperatorFn(AutoMappingByOpFn); +} // namespace domi diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_add_tik_plugin.cc b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_add_tik_plugin.cc new file mode 100644 index 00000000000..89d2a380043 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/framework/tf_plugin/tensorflow_add_tik_plugin.cc @@ -0,0 +1,23 @@ +/* Copyright (C) 2020-2021. Huawei Technologies Co., Ltd. All +rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the Apache License Version 2.0. + * You may not use this file except in compliance with the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Apache License for more details at + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +#include "register/register.h" + +namespace domi { +// register op info to GE +REGISTER_CUSTOM_OP("AddTik") + .FrameworkType(TENSORFLOW) // type: CAFFE, TENSORFLOW + .OriginOpType("AddTik") // name in tf module + .ParseParamsByOperatorFn(AutoMappingByOpFn); +} // namespace domi diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/CMakeLists.txt new file mode 100755 index 00000000000..6d1efea2735 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +if("x${CMAKE_CXX_COMPILER}" STREQUAL "x") + set(CMAKE_CXX_COMPILER g++) +endif() +if("x${CMAKE_C_COMPILER}" STREQUAL "x") + set(CMAKE_C_COMPILER gcc) +endif() + +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall -s") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CAMKE_SKIP_RPATH TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") +add_compile_options( + -fstack-protector-all + -D_FORTIFY_SOURCE=2 -O2 + ) +# add source files +aux_source_directory(. SRCS) + +if("x${SRCS}" STREQUAL "x") + add_custom_target(${OP_PROTO_TARGET} + COMMAND mkdir -p ${OP_PROTO_TARGET_OUT_DIR} + COMMAND echo "no source to make lib${OP_PROTO_TARGET}.so") + return(0) +endif() + +set(LIBRARY_OUTPUT_PATH ${OP_PROTO_TARGET_OUT_DIR}) + +message(STATUS "OP_PROTO_TARGET=${OP_PROTO_TARGET}") +add_library(${OP_PROTO_TARGET} SHARED ${SRCS}) + +target_link_libraries(${OP_PROTO_TARGET} ${ASCEND_INC}/../lib64/libgraph.so) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/acos_cpu.cc b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/acos_cpu.cc new file mode 100644 index 00000000000..0a14c0d183b --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/acos_cpu.cc @@ -0,0 +1,26 @@ +/** + * Copyright 2022 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "./acos_cpu.h" +namespace ge { +IMPLEMT_COMMON_INFERFUNC(AcosCpuInferShape) { return GRAPH_SUCCESS; } + +IMPLEMT_VERIFIER(AcosCpu, AcosCpuVerify) { return GRAPH_SUCCESS; } + +COMMON_INFER_FUNC_REG(AcosCpu, AcosCpuInferShape); +VERIFY_FUNC_REG(AcosCpu, AcosCpuVerify); + +} // namespace ge diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/acos_cpu.h b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/acos_cpu.h new file mode 100644 index 00000000000..ae60bb5a7dd --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/acos_cpu.h @@ -0,0 +1,23 @@ +/** + * Copyright 2022 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GE_OP_ACOS_CPU_H +#define GE_OP_ACOS_CPU_H +#include "graph/operator_reg.h" +namespace ge { +REG_OP(AcosCpu).INPUT(x, TensorType({DT_DOUBLE})).OUTPUT(y, TensorType({DT_DOUBLE})).OP_END_FACTORY_REG(AcosCpu) +} +#endif // GE_OP_ACOS_CPU_H diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_dsl.cc b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_dsl.cc new file mode 100644 index 00000000000..a1faec01b03 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_dsl.cc @@ -0,0 +1,26 @@ +/** + * Copyright 2022 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "./add_dsl.h" +namespace ge { +IMPLEMT_COMMON_INFERFUNC(AddDSLInferShape) { return GRAPH_SUCCESS; } + +IMPLEMT_VERIFIER(AddDSL, AddDSLVerify) { return GRAPH_SUCCESS; } + +COMMON_INFER_FUNC_REG(AddDSL, AddDSLInferShape); +VERIFY_FUNC_REG(AddDSL, AddDSLVerify); + +} // namespace ge diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_dsl.h b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_dsl.h new file mode 100644 index 00000000000..16e708a3f02 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_dsl.h @@ -0,0 +1,27 @@ +/** + * Copyright 2022 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GE_OP_ADD_DSL_H +#define GE_OP_ADD_DSL_H +#include "graph/operator_reg.h" +namespace ge { +REG_OP(AddDSL) + .INPUT(x1, TensorType({DT_FLOAT16})) + .INPUT(x2, TensorType({DT_FLOAT16})) + .OUTPUT(y, TensorType({DT_FLOAT16})) + .OP_END_FACTORY_REG(AddDSL) +} +#endif // GE_OP_ADD_DSL_H diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_tik.cc b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_tik.cc new file mode 100644 index 00000000000..a110a9f3e8c --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_tik.cc @@ -0,0 +1,26 @@ +/** + * Copyright 2022 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "./add_tik.h" +namespace ge { +IMPLEMT_COMMON_INFERFUNC(AddTikInferShape) { return GRAPH_SUCCESS; } + +IMPLEMT_VERIFIER(AddTik, AddTikVerify) { return GRAPH_SUCCESS; } + +COMMON_INFER_FUNC_REG(AddTik, AddTikInferShape); +VERIFY_FUNC_REG(AddTik, AddTikVerify); + +} // namespace ge diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_tik.h b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_tik.h new file mode 100644 index 00000000000..8163e325d6b --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_proto/add_tik.h @@ -0,0 +1,27 @@ +/** + * Copyright 2022 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GE_OP_ADD_TIK_H +#define GE_OP_ADD_TIK_H +#include "graph/operator_reg.h" +namespace ge { +REG_OP(AddTik) + .INPUT(x1, TensorType({DT_FLOAT16})) + .INPUT(x2, TensorType({DT_FLOAT16})) + .OUTPUT(y, TensorType({DT_FLOAT16})) + .OP_END_FACTORY_REG(AddTik) +} +#endif // GE_OP_ADD_TIK_H diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/op_tiling/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/op_tiling/CMakeLists.txt new file mode 100755 index 00000000000..124074aa673 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/op_tiling/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +if("x${CMAKE_CXX_COMPILER}" STREQUAL "x") + set(CMAKE_CXX_COMPILER g++) +endif() +if("x${CMAKE_C_COMPILER}" STREQUAL "x") + set(CMAKE_C_COMPILER gcc) +endif() + +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall -s") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CAMKE_SKIP_RPATH TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") +add_compile_options( + -fstack-protector-all + -D_FORTIFY_SOURCE=2 -O2 + ) +# add source files +aux_source_directory(. SRCS) + +if("x${SRCS}" STREQUAL "x") + add_custom_target(${OP_TILING_TARGET} + COMMAND mkdir -p ${OP_TILING_TARGET_OUT_DIR} + COMMAND echo "no source to make lib${OP_TILING_TARGET}.so") + return(0) +endif() + +set(LIBRARY_OUTPUT_PATH ${OP_TILING_TARGET_OUT_DIR}) + +message(STATUS "OP_TILING_TARGET=${OP_TILING_TARGET}") +add_library(${OP_TILING_TARGET} SHARED ${SRCS}) + +target_link_libraries(${OP_TILING_TARGET} ${ASCEND_INC}/../lib64/libgraph.so) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/scripts/install.sh b/mindspore/lite/tools/kernel_builder/ascend_new/scripts/install.sh new file mode 100755 index 00000000000..cac69bd3df1 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/scripts/install.sh @@ -0,0 +1,215 @@ +#!/bin/bash +vendor_name=mslite +targetdir=/usr/local/Ascend/opp + +sourcedir=$PWD/packages +vendordir=vendors/$vendor_name + +QUIET="y" + +for i in "$@" +do + echo $i + if test $i = "--quiet"; then + QUIET="y" + break + fi +done + +log() { + cur_date=`date +"%Y-%m-%d %H:%M:%S"` + echo "[runtime] [$cur_date] "$1 +} + +if [[ "x${ASCEND_OPP_PATH}" == "x" ]];then + log "[ERROR] env ASCEND_OPP_PATH no exist" + exit 1 +fi + +targetdir=${ASCEND_OPP_PATH} + +if [ ! -d $targetdir ];then + log "[ERROR] $targetdir no exist" + exit 1 +fi + +upgrade() +{ + if [ ! -d ${sourcedir}/$vendordir/$1 ]; then + log "[INFO] no need to upgrade ops $1 files" + return 0 + fi + + if [ ! -d ${targetdir}/$vendordir/$1 ];then + log "[INFO] create ${targetdir}/$vendordir/$1." + mkdir -p ${targetdir}/$vendordir/$1 + if [ $? -ne 0 ];then + log "[ERROR] create ${targetdir}/$vendordir/$1 failed" + return 1 + fi + else + has_same_file=-1 + for file_a in ${sourcedir}/$vendordir/$1/*; do + file_b=${file_a##*/}; + if [ "`ls ${targetdir}/${vendordir}/$1`" = "" ]; then + log "[INFO] ${targetdir}/$vendordir/$1 is empty !!" + return 1 + fi + ls_val=`ls "${targetdir}/${vendordir}/$1"` + grep -q $file_b <<< $ls_val; + if [[ $? -eq 0 ]]; then + echo -n "${file_b} " + has_same_file=0 + fi + done + if [ 0 -eq $has_same_file ]; then + if test $QUIET = "n"; then + echo "[INFO]: has old version in ${targetdir}/$vendordir/$1, \ + you want to Overlay Installation , please enter:[o]; \ + or replace directory installation , please enter: [r]; \ + or not install , please enter:[n]." + + while true + do + read orn + if [ "$orn" = n ]; then + return 0 + elif [ "$orn" = m ]; then + break; + elif [ "$orn" = r ]; then + rm_target="${targetdir}/${vendordir}/$1/*" + rm -rf $rm_target + break; + else + echo "[ERROR] input error, please input again!" + fi + done + fi + fi + log "[INFO] replace or merge old ops $1 files .g....." + fi + + log "copy new ops $1 files ......" + if [ -d ${targetdir}/$vendordir/$1/ ]; then + chmod -R +w "$targetdir/$vendordir/$1/" >/dev/null 2>&1 + fi + cp -rf ${sourcedir}/$vendordir/$1/* $targetdir/$vendordir/$1/ + if [ $? -ne 0 ];then + log "[ERROR] copy new $1 files failed" + return 1 + fi + + return 0 +} +upgrade_proto() +{ + if [ ! -f ${sourcedir}/$vendordir/custom.proto ]; then + log "[INFO] no need to upgrade custom.proto files" + return 0 + fi + if [ ! -d ${targetdir}/$vendordir/framework/caffe ];then + log "[INFO] create ${targetdir}/$vendordir/framework/caffe." + mkdir -p ${targetdir}/$vendordir/framework/caffe + if [ $? -ne 0 ];then + log "[ERROR] create ${targetdir}/$vendordir/framework/caffe failed" + return 1 + fi + else + if [ -f ${targetdir}/$vendordir/framework/caffe/custom.proto ]; then + # 有老版本,判断是否要覆盖式安装 + if test $QUIET = "n"; then + echo "[INFO] ${targetdir}/$vendordir/framework/caffe has old version"\ + "custom.proto file. Do you want to replace? [y/n] " + + while true + do + read yn + if [ "$yn" = n ]; then + return 0 + elif [ "$yn" = y ]; then + break; + else + echo "[ERROR] input error, please input again!" + fi + done + fi + fi + log "[INFO] replace old caffe.proto files ......" + fi + chmod -R +w "$targetdir/$vendordir/framework/caffe/" >/dev/null 2>&1 + cp -rf ${sourcedir}/$vendordir/custom.proto ${targetdir}/$vendordir/framework/caffe/ + if [ $? -ne 0 ];then + log "[ERROR] copy new custom.proto failed" + return 1 + fi + log "[INFO] copy custom.proto success" + + return 0 +} + +log "[INFO] copy uninstall sh success" + +if [ ! -d ${targetdir}/vendors ];then + log "[INFO] create ${targetdir}/vendors." + mkdir -p ${targetdir}/vendors + if [ $? -ne 0 ];then + log "[ERROR] create ${targetdir}/vendors failed" + return 1 + fi +fi +chmod u+w ${targetdir}/vendors + +echo "[ops_custom]upgrade framework" +upgrade framework +if [ $? -ne 0 ];then + exit 1 +fi + +echo "[ops_custom]upgrade op proto" +upgrade op_proto +if [ $? -ne 0 ];then + exit 1 +fi + +echo "[ops_custom]upgrade op impl" +upgrade op_impl +if [ $? -ne 0 ];then + exit 1 +fi + +upgrade_proto +if [ $? -ne 0 ];then + exit 1 +fi + +config_file=${targetdir}/vendors/config.ini +if [ ! -f ${config_file} ]; then + touch ${config_file} + chmod 550 ${config_file} +fi + +found_vendors="$(grep -w "load_priority" "$config_file" | cut --only-delimited -d"=" -f2-)" +found_vendor=$(echo $found_vendors | sed "s/$vendor_name//g" | tr ',' ' ') +vendor=$(echo $found_vendor | tr -s ' ' ',') +if [ "$vendor" != "" ]; then + sed -i "/load_priority=$found_vendors/s@load_priority=$found_vendors@load_priority=$vendor_name,$vendor@g" "$config_file" +fi + +chmod u-w ${targetdir}/vendors + +if [ -d ${targetdir}/$vendordir/op_impl/cpu/aicpu_kernel/impl/ ]; then + chmod -R 440 ${targetdir}/$vendordir/op_impl/cpu/aicpu_kernel/impl/* >/dev/null 2>&1 +fi +if [ -f ${targetdir}/ascend_install.info ]; then + chmod -R 440 ${targetdir}/ascend_install.info +fi +if [ -f ${targetdir}/scene.info ]; then + chmod -R 440 ${targetdir}/scene.info +fi +if [ -f ${targetdir}/version.info ]; then + chmod -R 440 ${targetdir}/version.info +fi + +echo "SUCCESS" +exit 0 + diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/scripts/upgrade.sh b/mindspore/lite/tools/kernel_builder/ascend_new/scripts/upgrade.sh new file mode 100755 index 00000000000..d96276ad9d8 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/scripts/upgrade.sh @@ -0,0 +1,120 @@ +#!/bin/bash +vendor_name=mslite +targetdir=/usr/local/Ascend/opp + +sourcedir=$PWD/packages +vendordir=vendors/$vendor_name + +log() { + cur_date=`date +"%Y-%m-%d %H:%M:%S"` + echo "[runtime] [$cur_date] "$1 +} + +if [[ "x${ASCEND_OPP_PATH}" == "x" ]];then + log "[ERROR] env ASCEND_OPP_PATH no exist" + exit 1 +fi + +targetdir=${ASCEND_OPP_PATH} + +if [ ! -d $targetdir ];then + log "[ERROR] $targetdir no exist" + exit 1 +fi + +upgrade() +{ + if [ ! -d ${sourcedir}/$vendordir/$1 ]; then + log "[INFO] no need to upgrade ops $1 files" + return 0 + fi + + if [ ! -d ${targetdir}/$vendordir/$1 ]; then + log "[INFO] create ${targetdir}/$vendordir/$1." + mkdir -p ${targetdir}/$vendordir/$1 + if [ $? -ne 0 ];then + log "[ERROR] create ${targetdir}/$vendordir/$1 failed" + return 1 + fi + else + vendor_installed_dir=$(ls "$targetdir/vendors" 2> /dev/null) + for i in $vendor_installed_dir;do + vendor_installed_file=$(ls "$vendor_installed_dir/$vendor_name/$i" 2> /dev/null) + if [ "$i" = "$vendor_name" ] && [ "$vendor_installed_file" != "" ]; then + echo "[INFO]: $vendor_name custom opp package has been installed on the path $vendor_installed_dir, \ + you want to Overlay Installation , please enter:[o]; \ + or replace directory installation , please enter: [r]; \ + or not install , please enter:[n]." + fi + while true + do + read mrn + if [ "$mrn" = m ]; then + break + elif [ "$mrn" = r ]; then + [ -n "$vendor_installed_file" ] && rm -rf "$vendor_installed_file" + break + elif [ "$mrn" = n ]; then + return 0 + else + echo "[WARNING]: Input error, please input m or r or n to choose!" + fi + done + done + log "[INFO] replace old ops $1 files ......" + fi + + log "copy new ops $1 files ......" + cp -rf ${sourcedir}/$vendordir/$1/* $targetdir/$vendordir/$1/ + if [ $? -ne 0 ];then + log "[ERROR] copy new $1 files failed" + return 1 + fi + + return 0 +} +log "[INFO] copy uninstall sh success" + +echo "[ops_custom]upgrade framework" +upgrade framework +if [ $? -ne 0 ];then + exit 1 +fi + +echo "[ops_custom]upgrade op proto" +upgrade op_proto +if [ $? -ne 0 ];then + exit 1 +fi + +echo "[ops_custom]upgrade op impl" +upgrade op_impl +if [ $? -ne 0 ];then + exit 1 +fi + +config_file=${targetdir}/vendors/config.ini +found_vendors="$(grep -w "load_priority" "$config_file" | cut --only-delimited -d"=" -f2-)" +found_vendor=$(echo $found_vendors | sed "s/$vendor_name//g" | tr ',' ' ') +vendor=$(echo $found_vendor | tr -s ' ' ',') +if [ "$vendor" != "" ]; then + sed -i "/load_priority=$found_vendors/s@load_priority=$found_vendors@load_priority=$vendor_name,$vendor@g" "$config_file" +fi + +changemode() +{ + if [ -d ${targetdir} ];then + chmod -R 550 ${targetdir}>/dev/null 2>&1 + fi + + return 0 +} +echo "[ops_custom]changemode..." +#changemode +if [ $? -ne 0 ];then + exit 1 +fi + +echo "SUCCESS" +exit 0 + diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/CMakeLists.txt b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/CMakeLists.txt new file mode 100755 index 00000000000..f5ee84940ef --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/CMakeLists.txt @@ -0,0 +1,77 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall -s") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CAMKE_SKIP_RPATH TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") +add_compile_options( + -fstack-protector-all + -D_FORTIFY_SOURCE=2 -O2 + ) + +macro(GEN_OPS_INFO_FILE op_type output_dir output_file_name_prefix) + + SET(INI_PATH ${CMAKE_CURRENT_SOURCE_DIR}/op_info_cfg/${op_type}) + if(NOT EXISTS ${INI_PATH}) + set(INI_PATH ${CMAKE_CURRENT_SOURCE_DIR}/op_info_cfg.${op_type}) + endif() + execute_process(COMMAND ls -1 ${INI_PATH} + OUTPUT_VARIABLE SUB_DIRS) + string(REPLACE "\n" ";" SUB_DIRS ${SUB_DIRS}) + foreach(SUB_DIR ${SUB_DIRS}) + if(IS_DIRECTORY ${INI_PATH}/${SUB_DIR}) + execute_process(COMMAND find ${INI_PATH}/${SUB_DIR} -name "*.ini" + OUTPUT_VARIABLE INI_FILES) + string(REPLACE "\n" "\t" INI_FILES ${INI_FILES}) + set(output_file_name ${output_file_name_prefix}-${SUB_DIR}-ops-info.json) + if(NOT "x${INI_FILES}" STREQUAL "x") + add_custom_command(OUTPUT ${output_file_name} + COMMAND echo "python3 ${INI_2_JSON_PY} ${INI_FILES} ${output_dir}/${output_file_name}" + COMMAND mkdir -p ${output_dir}/${SUB_DIR} + COMMAND python3 ${INI_2_JSON_PY} ${INI_FILES} ${output_dir}/${SUB_DIR}/${output_file_name} + COMMENT "generate configure json file") + set(OUTPUT_FILES ${OUTPUT_FILES} ${output_file_name}) + else() + message(STATUS "ini file not exists.") + execute_process(COMMAND mkdir -p ${output_dir}) + endif() + endif() + endforeach() +endmacro() + +set(OUTPUT_FILES "") + +if(UNIX) + GEN_OPS_INFO_FILE(ai_core ${AIC_OP_INFO_CFG_OUT_DIR} aic) +endif() + +message(STATUS "OUTPUT_FILES=${OUTPUT_FILES}") +if "x${OUTPUT_FILES}" STREQUAL "x") + add_custom_target(config_json + COMMAND echo "tbe_aic_ops_info.ini and tbe_aiv_ops_info.ini not exist.") + return(0) +endif() + +add_custom_target(config_json ALL DEPENDS ${OUTPUT_FILES} + COMMAND mkdir -p ${TF_PLUGIN_TARGET_OUT_DIR} + COMMAND bash ${CMAKE_SOURCE_DIR}/cmake/util/gen_ops_filter.sh ${INI_PATH} ${TF_PLUGIN_TARGET_OUT_DIR}) + +if(NOT "x$ENV{ADD_TESTCASE}" STREQUAL "x") + # add testcases subdirectory + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/testcases/bbit") + add_subdirectory(testcases/bbit) + endif() + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/testcases/st") + add_subdirectory(testcases/st) + endif() + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/testcases/acl_op/src") + add_subdirectory(testcases/acl_op/src) + endif() + file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/testcases/st_cases/out/*") + foreach(file ${files}) + message(STATUS ${file}) + if(IS_DIRECTORY ${file}) + add_subdirectory(${file}) + endif() + endforeach() +endif() diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/impl/add_dsl.py b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/impl/add_dsl.py new file mode 100644 index 00000000000..7eeb98ad544 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/impl/add_dsl.py @@ -0,0 +1,46 @@ +# Copyright 2022 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""ascend custom op: add by dsl""" +import tbe.dsl as tbe +from tbe import tvm +from tbe.common.register import register_op_compute +from tbe.common.utils import para_check + + +@register_op_compute("add_dsl") +def add_dsl_compute(x1, x2, y, kernel_name="add_dsl"): + res = tbe.vadd(x1, x2) + return res + + +@para_check.check_op_params(para_check.REQUIRED_INPUT, para_check.REQUIRED_INPUT, + para_check.REQUIRED_OUTPUT, para_check.KERNEL_NAME) +def add_dsl(x1, x2, y, kernel_name="add_dsl"): + """add dsl impl function""" + data_x1 = tvm.placeholder( + x1.get("shape"), dtype=x1.get("dtype"), name="data_x1") + data_x2 = tvm.placeholder( + x2.get("shape"), dtype=x2.get("dtype"), name="data_x2") + + res = add_dsl_compute(data_x1, data_x2, y, kernel_name) + + # auto schedule + with tvm.target.cce(): + schedule = tbe.auto_schedule(res) + + # operator build + config = {"name": kernel_name, + "tensor_list": [data_x1, data_x2, res]} + tbe.build(schedule, config) diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/impl/add_tik.py b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/impl/add_tik.py new file mode 100644 index 00000000000..3c63612b754 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/impl/add_tik.py @@ -0,0 +1,51 @@ +# Copyright 2022 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""ascend custom op: add by tik""" +from tbe.common.register import register_op_compute +from tbe.common.utils import para_check +from tbe import tik + + +@register_op_compute("AddTik") +@para_check.check_op_params(para_check.REQUIRED_INPUT, para_check.REQUIRED_INPUT, + para_check.REQUIRED_OUTPUT, para_check.KERNEL_NAME) +def add_tik(x1, x2, y, kernel_name="add_tik"): + """add dsl impl function""" + tik_instance = tik.Tik() + x1_shape = x1.get("shape") + x2_shape = x2.get("shape") + y_shape = y.get("shape") + + data_a = tik_instance.Tensor( + "float16", x1_shape, name="x1", scope=tik.scope_gm) + data_b = tik_instance.Tensor( + "float16", x2_shape, name="x2", scope=tik.scope_gm) + data_c = tik_instance.Tensor( + "float16", y_shape, name="y", scope=tik.scope_gm) + data_a_ub = tik_instance.Tensor( + "float16", x1_shape, name="data_A_ub", scope=tik.scope_ubuf) + data_b_ub = tik_instance.Tensor( + "float16", x2_shape, name="data_B_ub", scope=tik.scope_ubuf) + data_c_ub = tik_instance.Tensor( + "float16", y_shape, name="data_C_ub", scope=tik.scope_ubuf) + + tik_instance.data_move(data_a_ub, data_a, 0, 1, 128 // 16, 0, 0) + tik_instance.data_move(data_b_ub, data_b, 0, 1, 128 // 16, 0, 0) + tik_instance.vec_add( + 128, data_c_ub[0], data_a_ub[0], data_b_ub[0], 1, 8, 8, 8) + tik_instance.data_move(data_c, data_c_ub, 0, 1, 128 // 16, 0, 0) + tik_instance.BuildCCE(kernel_name=kernel_name, inputs=[data_a, data_b], outputs=[data_c]) + + return tik_instance diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310/add_dsl.ini b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310/add_dsl.ini new file mode 100644 index 00000000000..10cfa0c7420 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310/add_dsl.ini @@ -0,0 +1,15 @@ +[AddDSL] +input0.name=x1 +input0.dtype=float16 +input0.paramType=required +input0.format=NCHW +input1.name=x2 +input1.dtype=float16 +input1.paramType=required +input1.format=NCHW +output0.name=y +output0.dtype=float16 +output0.paramType=required +output0.format=NCHW +opFile.value=add_dsl +opInterface.value=add_dsl diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310/add_tik.ini b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310/add_tik.ini new file mode 100644 index 00000000000..95c7b70704f --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310/add_tik.ini @@ -0,0 +1,15 @@ +[AddTik] +input0.name=x1 +input0.dtype=float16 +input0.paramType=required +input0.format=ND +input1.name=x2 +input1.dtype=float16 +input1.paramType=required +input1.format=ND +output0.name=y +output0.dtype=float16 +output0.paramType=required +output0.format=ND +opFile.value=add_tik +opInterface.value=add_tik diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310p/add_dsl.ini b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310p/add_dsl.ini new file mode 100644 index 00000000000..10cfa0c7420 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310p/add_dsl.ini @@ -0,0 +1,15 @@ +[AddDSL] +input0.name=x1 +input0.dtype=float16 +input0.paramType=required +input0.format=NCHW +input1.name=x2 +input1.dtype=float16 +input1.paramType=required +input1.format=NCHW +output0.name=y +output0.dtype=float16 +output0.paramType=required +output0.format=NCHW +opFile.value=add_dsl +opInterface.value=add_dsl diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310p/add_tik.ini b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310p/add_tik.ini new file mode 100644 index 00000000000..95c7b70704f --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend310p/add_tik.ini @@ -0,0 +1,15 @@ +[AddTik] +input0.name=x1 +input0.dtype=float16 +input0.paramType=required +input0.format=ND +input1.name=x2 +input1.dtype=float16 +input1.paramType=required +input1.format=ND +output0.name=y +output0.dtype=float16 +output0.paramType=required +output0.format=ND +opFile.value=add_tik +opInterface.value=add_tik diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend910/add_dsl.ini b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend910/add_dsl.ini new file mode 100644 index 00000000000..10cfa0c7420 --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend910/add_dsl.ini @@ -0,0 +1,15 @@ +[AddDSL] +input0.name=x1 +input0.dtype=float16 +input0.paramType=required +input0.format=NCHW +input1.name=x2 +input1.dtype=float16 +input1.paramType=required +input1.format=NCHW +output0.name=y +output0.dtype=float16 +output0.paramType=required +output0.format=NCHW +opFile.value=add_dsl +opInterface.value=add_dsl diff --git a/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend910/add_tik.ini b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend910/add_tik.ini new file mode 100644 index 00000000000..95c7b70704f --- /dev/null +++ b/mindspore/lite/tools/kernel_builder/ascend_new/tbe/op_info_cfg/ai_core/ascend910/add_tik.ini @@ -0,0 +1,15 @@ +[AddTik] +input0.name=x1 +input0.dtype=float16 +input0.paramType=required +input0.format=ND +input1.name=x2 +input1.dtype=float16 +input1.paramType=required +input1.format=ND +output0.name=y +output0.dtype=float16 +output0.paramType=required +output0.format=ND +opFile.value=add_tik +opInterface.value=add_tik