由于昇腾Atlas 200I DK A2进行开发时存在以下问题:
编译速度慢;存储空间有限;vscode插件安装较多时启动缓慢,特别是使用GitHub Copilot经常会出现插件重启,断连等问题(现在GitHub Copilot越来越好用了,已经离不开了)。| 项目 | 开发环境 | 运行环境 |
|---|---|---|
| 架构 | x86-64 工作站 | aarch64 Atlas 200I DK A2 开发套件 |
| 操作系统 | Ubuntu 24.04 | Ubuntu 22.04 |
| 说明 | 用于代码开发、编译和调试的环境 | 用于部署和实际运行的嵌入式设备环境 |
| 软件依赖 | vscode、build-essential、cmake、 gdb-multiarch、gcc-11-aarch64-linux-gnu g+±11-aarch64-linux-gnu | CANN7.0.RC1、openssh-server、gdbserver |
注: 实际代码编写可以在Windows,通过vscode的远程开发插件连接到开发环境进行开发和编译。
CANN安装在默认路径:
/usr/local/Ascend/下,并安装官方要求配置环境变量,具体安装教程可以参考官方教程。
其他依赖软件比如opencv、ffmpeg等无论通过apt安装还是通过源码make install安装,相关的库和头文件都应该在
/usr/lib/、
/usr/include/下。或者根据官方要求,第三方软件也可以安装在
/usr/local/Ascend/thirdpart/aarch64/路径下。
调试是使用gdbserver因此需要安装
openssh-server、gdbserver
sudo apt install openssh-server gdbserver
sudo apt update
sudo apt instll build-essential
cmake
gdb-multiarch
gcc-11-aarch64-linux-gnu
g++-11-aarch64-linux-gnu
创建一个路径来同步运行环境的库和头文件,比如我这里创建
/opt/ascend/sysroot。
sudo mkdir -p /opt/ascend/sysroot
export SYSROOT=/opt/ascend/sysroot
同步环境,这里同步了所有的库,第一次同步会花一些时间,如果你明确需要哪些库也可以只同步指定的库,但如果不知道还是推荐同步所有的库和头文件。
rsync -a root@200DK_IP:/usr/lib/ $SYSROOT/usr/lib/
rsync -a root@200DK_IP:/usr/include/ $SYSROOT/usr/include/
rsync -a root@200DK_IP:/usr/local/Ascend/ $SYSROOT/usr/local/Ascend/
注: 1. 这里运行环境我用了root,也可以用其他用户比如HwHiAiUser等;2. 200DK_IP为运行环境的IP地址,请确保可以和开发环境ping通,并安装ssh
export CPU_ARCH=aarch64
export SYSROOT=/opt/ascend/sysroot
export INSTALL_DIR=$SYSROOT/usr/local/Ascend/ascend-toolkit/latest
export THIRDPART_PATH=$SYSROOT/usr/local/Ascend/thirdpart/aarch64
以官方例子,中的
YOLOV3_coco_detection_multi_thread_VENC为例。
在开发环境端下载源码,
git clone https://gitee.com/ascend/samples.git
cd samples-master/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/YOLOV3_coco_detection_multi_thread_VEN
在项目根目录下创建一个文件
cmake/toolchain-aarch64-ascend.cmake:
# 目标系统
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# sysroot
set(CMAKE_SYSROOT $ENV{SYSROOT})
# 交叉编译器 - 使用 GCC 11 以匹配目标系统
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc-11)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++-11)
# 基本编译与链接参数(关键:--sysroot)
set(COMMON_FLAGS "--sysroot=${CMAKE_SYSROOT} -fPIC")
set(CMAKE_C_FLAGS "${COMMON_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "${COMMON_FLAGS}" CACHE STRING "" FORCE)
# 帮助链接器在 sysroot 内解析二/三级依赖
set(RPATH_LINKS "${CMAKE_SYSROOT}/lib/aarch64-linux-gnu:${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu")
# 如 CANN 路径不同,请据实调整
set(CANN_HOME "${CMAKE_SYSROOT}/usr/local/Ascend/ascend-toolkit/latest")
list(APPEND RPATH_LINKS "${CANN_HOME}/acllib/lib64")
# 添加 BLAS/LAPACK 库路径,以解决 armadillo/arpack/superlu 的依赖
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/lib/aarch64-linux-gnu/blas")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/lib/aarch64-linux-gnu/lapack")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/blas")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/lapack")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/lib")
# 将 CMake 列表转换为冒号分隔的字符串
string(REPLACE ";" ":" RPATH_LINKS_STR "${RPATH_LINKS}")
set(CMAKE_EXE_LINKER_FLAGS
"--sysroot=${CMAKE_SYSROOT}
-Wl,-rpath-link,${RPATH_LINKS_STR}
-Wl,-dynamic-linker,${CMAKE_SYSROOT}/lib/ld-linux-aarch64.so.1"
CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "" FORCE)
# 仅在 sysroot 内查找库/头/包
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# OpenCV(若存在 CMake 配置)
set(OpenCV_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4 CACHE PATH "")
find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR} NO_DEFAULT_PATH)
# CANN 根(按实际版本路径修正)
set(ASCEND_TOOLKIT_HOME ${CANN_HOME} CACHE PATH "")
修改
src/CMakeLists.txt,主要是能让CMake能从前面同步的
$SYSROOT中找到依赖的库和头文件。
# CMake lowest version requirement
cmake_minimum_required(VERSION 3.5.1)
# project information
project(YOLOV3_coco_detection_multi_thread_VENC)
# Compile options
add_compile_options(-std=c++11)
add_definitions(-DENABLE_DVPP_INTERFACE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "out")
set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall")
if (NOT DEFINED ENV{INSTALL_DIR})
MESSAGE(FATAL_ERROR "Not Defined INSTALL_DIR")
endif()
if (NOT DEFINED ENV{THIRDPART_PATH})
message(FATAL_ERROR "Not Defined THIRDPART_PATH")
endif()
if (NOT DEFINED ENV{CPU_ARCH})
message(FATAL_ERROR "Not Defined CPU_ARCH")
endif()
list(APPEND COMMON_DEPEND_LIB acllite avcodec avformat avdevice avutil swresample avfilter swscale)
# Header path
include_directories(
../inc/
$ENV{INSTALL_DIR}/runtime/include/
$ENV{THIRDPART_PATH}/include/
${OpenCV_INCLUDE_DIRS}
)
# add host lib path
link_directories(
$ENV{INSTALL_DIR}/runtime/lib64/stub
$ENV{THIRDPART_PATH}/lib/
$ENV{INSTALL_DIR}/driver
)
add_executable(main
object_detect.cpp
main.cpp)
target_link_libraries(main
ascendcl
acl_dvpp
stdc++
${COMMON_DEPEND_LIB}
${OpenCV_LIBS}
pthread)
install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
在根目录下创建
.vscode/settings.json和
.vscode/launch.json文件。
其中
.vscode/settings.json内容如下:
{
"cmake.configureArgs": [
"-DCMAKE_TOOLCHAIN_FILE=${workspaceFolder}/cmake/toolchain-aarch64-ascend.cmake",
]
}
.vscode/launch.json的内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote Debug (gdbserver)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/src/out/main",
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb-multiarch",
"miDebuggerServerAddress": "192.168.1.198:1234",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"logging": {
"engineLogging": false
},
"linux": {
"MIMode": "gdb"
}
},
]
}
注:1. 这里的192.168.1.198:1234是我运行端的ip地址和gdbserver启动的端口,请根据实际情况修改;2. “miDebuggerPath"一定要写成”/usr/bin/gdb-multiarch",而不是默认的gdb。
可以使用命令也可以使用vscode的cmake-tools插件进行编译。
mkdir build
cd build
cmake ..
cmake --build .
样例中编译完的可执行文件路径在
build/src/out/main相对目录下,运行端已创建运行当前项目的文件夹,假设运行文件夹为
/root/work/yolov11_cann_video,在开发端执行:
rsync -avz build/src/out/main root@192.168.1.198:/root/work/yolov11_cann_video
在确认编程可执行文件已传输到指定路径后,启动gdbserver:
cd /root/work/yolov11_cann_video
gdbserver :1234 main
注:1. 程序依赖的其他文件,比如模型文件,视频文件等也要放到运行环境的文件夹下,和源码中的路径要匹配;2. 模型文件如何生成请参考官方例子中的说明,om模型转换操作(从onnx、caffemodel等格式转换为om格式)需要在运行端执行。
因为前面已经写了
.vscode/launch.json,因此只要使用vscode的debug,默认按F5进行调试即可进入远程调试。
¥17.80
PC中文正版Steam 文明6 Civilization VI 文明六 典藏版新纪元季票领袖季票白金版 全dlc国区激活码key
¥14.00
PC中文正版 仙剑奇侠传7 STEAM 仙剑七激活码 人间如梦拓展DLC CDKey 数字版 仙剑7 steam游戏
¥8.50
正版激活码 监狱建筑师 PC中文steam 激活码CDKEY 全面封锁捆绑包 国区 Prison Architect
¥11.00
正版steam游戏 群星 群星全DLC Stellaris 群星key群星steam 四海皆臣dlc CDKEY 激活码 复仇女神DLC
¥14.80
PC中文正版 steam平台 国区 联机游戏 北境之地 北加尔 Northgard 激活码 全DLC 阵营 氏族 部族 维达尔十字
¥23.88
steam赛博朋克2077 激活码key兑换码2027正版入库中文CDK游戏Cyberpunk