写在最前面,本人是研究生萌新,第一次尝试AI开发板上的部署,因此本文比较适合初级开发者想要快速体验CSK6开发板。高段位的大佬们请移步聆思的其他高级开箱文档~
0. CSK6开发板简介
CSK6是聆思科技推出的新一代AI芯片SoC产品系列,采用多核异构架构,集成了ARM Star MCU,HiFi4 DSP,以及聆思全新设计的AI神经网络处理内核NPU,算力达到128GOPS。多核异构的设计使芯片能以较低功耗满足音频及图像视频的AI应用需求。
这个系列的芯片集成了SRAM与PSRAM,支持内置或外接Flash,可提供最高4入2出的Audio Codec,VGA像素的DVP摄像头接口,多达6路的触控检测以及SPI、UART、USB、SDIO、I2C、I2S等各类外设接口,丰富接口支持各类应用方案的开发。
特别感谢聆思科技的信任,寄来开发板以便于体验AI芯片的算力加速效果。这次分享内容主要是围绕服务器上的环境配置、官网检测demo的示例和一些相关的问题与建议。
1. autodl服务器上的环境配置
对于绝大多数工程师而言,使用NVIDIA GPU几乎成了标配,然而像我这样笔记本购入已是多年前,尚未意识到训练神经网络需要GPU资源,在迷迷糊糊中购入带AMD GPU的笔记本。市场上已有平价如0.78rmb/h的Tesla云训练平台供应商,因此这些云平台成了大多数学生研究AI的依赖。由于聆思CSK6软件部署尚未在云平台上做详细介绍,其中存在若干问题,本文就此以autodl展开介绍。
1.0 安装linger和thinker需要的硬件环境
选择依据:https://docs2.listenai.com/x/...中的通过 nvdim-smi 查看显卡驱动版本,确认支持的 cuda 版本 >= 10.2,自行安装 cuda/10.2-cudnn-7.6.5(该版本不支持Ampere架构及之后的NVIDIA显卡)。
硬件环境:
此处不再赘述
1.1 修改thinker的./scripts/x86_linux.sh和./test/auto_test.sh
首先参考https://aijishu.com/a/1060000...安装linger,且在安装thinker之前,我们可以先观察x86_linux.sh和auto_test.sh的内容:
其中x86_linux.sh的内容如下:
set -e
CMAKE_ROOT=/home/bitbrain/bzcai/anaconda3/bin
pushd ./
rm -rf build && mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE="Debug" \
-DTHINKER_SHARED_LIB=ON \
-DTHINKER_PROFILE=OFF \
-DTHINKER_DUMP=OFF \
-DTHINKER_USE_VENUS=ON \
..
# make VERBOSE=1 -j16
make -j16
popd
pushd ./
rm -rf dist/*
python setup.py sdist
pip install dist/pythinker*.tar.gz
popd
auto_test.sh的内容如下:
set -e
test_dir=./model.test
function download_onnx_thinker_models()
{
set +e
dir_name=$1
file1_name=$2
file2_name=$3
file3_name=$4
mkdir -p "$test_dir/${dir_name}"
cp /data/user/thinker/models/${dir_name}/${file1_name} $test_dir/${dir_name}/${file1_name}
cp /data/user/thinker/models/${dir_name}/${file2_name} $test_dir/${dir_name}/${file2_name}
cp /data/user/thinker/models/${dir_name}/${file3_name} $test_dir/${dir_name}/${file3_name}
}
#################### fetch onnx graph and config file ####################
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
# module load gcc/5.4.0-os7.2
if [ -d "$test_dir" ]; then
rm -rf $test_dir
fi
mkdir -p $test_dir
pushd ./
download_onnx_thinker_models "test_conv1d" "conv1d.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_conv2d" "net.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_gru" "gru_int.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_batchnorm" "batchnormInt.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_softmaxint" "softmaxint.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_logsoftmax" "logsoftmaxint.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_iqsigmoid" "iqsigmoid.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_layernorm" "layernorm_int.onnx" "input.bin" "output.bin"
download_onnx_thinker_models "test_shufflechannel" "shuffle_net_10_09.onnx" "input.bin" "output.bin"
popd
###################### compile thinker.so ######################
CMAKE_ROOT=/home/bitbrain/bzcai/anaconda3/bin
pushd ./
pwdn
rm -rf lib
rm -rf bin
rm -rf build
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE="Release" \
-DTHINKER_SHARED_LIB=ON \
-DTHINKER_PROFILE=OFF \
-DTHINKER_DUMP=OFF \
..
make -j4
popd
pushd ./
rm -rf dist/*
python setup.py sdist
pip install dist/pythinker*.tar.gz
popd
###################### compile test.cpp ######################
pushd ./
tpacker -g $test_dir/test_conv2d/net.onnx -s Remove_QuantDequant -o $test_dir/test_conv2d/model.bin
tpacker -g $test_dir/test_conv1d/conv1d.onnx -s Remove_QuantDequant -o $test_dir/test_conv1d/model.bin
tpacker -g $test_dir/test_batchnorm/batchnormInt.onnx -s Remove_QuantDequant -o $test_dir/test_batchnorm/model.bin
tpacker -g $test_dir/test_softmaxint/softmaxint.onnx -s Remove_QuantDequant -o $test_dir/test_softmaxint/model.bin
tpacker -g $test_dir/test_logsoftmax/logsoftmaxint.onnx -s Remove_QuantDequant -o $test_dir/test_logsoftmax/model.bin
tpacker -g $test_dir/test_iqsigmoid/iqsigmoid.onnx -s Remove_QuantDequant -o $test_dir/test_iqsigmoid/model.bin
tpacker -g $test_dir/test_layernorm/layernorm_int.onnx -s Remove_QuantDequant -o $test_dir/test_layernorm/model.bin
tpacker -g $test_dir/test_shufflechannel/shuffle_net_10_09.onnx -s Remove_QuantDequant -o $test_dir/test_shufflechannel/model.bin
tpacker -g $test_dir/test_gru/gru_int.onnx -s Remove_QuantDequant -o $test_dir/test_gru/model.bin
cd test/linux_x86 && rm -rf build && rm -rf bin && mkdir -p build && cd build && cmake -DCMAKE_BUILD_TYPE="Release" ../
make
popd
######################## run the engine ######################
export LD_LIBRARY_PATH=./bin/:$LD_LIBRARY_PATH
./test/linux_x86/bin/test_x86
rm -rf $test_dir
其中有两个问题需要解决:1、CMAKE_ROOT的内容,我们需要回到autodl上默认配置的anaconda进行修改;2、autodl并不支持pushd和popd操作,因此我们需要修改为等价的cd命令。
针对问题1:可以通过vim ~/.bashrc来确定路径,如下:
针对问题2:由于本机不具备popd、pushd功能,因此需要在thinker安装时修改x86_linux.sh和auto_test.sh。修改路径入栈出栈命令pushd、popd为CURRENT_DIR=$(pwd)、cd "$CURRENT_DIR",综合路径修改,并无技巧,在x86_linux.sh和auto_test.sh中逐行将pushd替换为CURRENT_DIR=$(pwd)、popd替换为cd "$CURRENT_DIR"。
随后根据https://aijishu.com/a/1060000...安装好thinker。
1.2 安装好thinker后的2个问题
问题1——承接1.1的内容,在python中import thinker出现如下问题:
出现了缩进错误。修改完Pool.py的174行缩进以后不再报错,完美安装thinker。如下:
问题2——最后修改os.login():这是因为在之后复现官方resnet的demo中,使用thinker离线工具 tpacker 对步骤3(https://aijishu.com/a/1060000...)中生成的 onnx 计算图打包过程中出现bug,如下:
解决方案是:因为我没有权限获取服务器的os.getlogin(),然而这段代码对功能并不影响,因此我们选择vim打开对应文件后删除os.getlogin()及其相关。随后我们再次打包,顺利通过。
以上我们结合安谋科技和聆思科技联合提供的技术文档,将环境移植到平价autodl云服务器上,由于后者提供给用户的权限远远不如本地高,因此本工作对大多数需要在平价云服务器上训练、推理listenai工作的开发者而言十分有必要。
2. 使用官方demo启动摄像头检测人脸
参考:https://cloud.listenai.com/ze...
开发环境:vmware workstation pro + ubuntu-18.04.6-desktop-amd64.iso(具体安装直接参考网上教程,采用简易开发即可)
该项目是聆思开发的针对Head-Shoulder-Detect的检测,即头肩检测,该算法能力涵盖头肩、人脸、手势等多种检测、识别方法。然而仅仅依靠本文档不足以完成初级开发者的复现。因此本文的作用是在该文档的基础上补充更多细节以便于初级开发者使用CSK6开发板体验官方demo。
首先安装ubuntu版本的串口工具:cutecom。cutecom有界面,和Windows的mobaxterm,可以选择串口,设置波特率、数据位、停止位等。中间是接收窗口,下面是发送窗口。
# 安装 sudo apt install cutecom # 启动 sudo cutecom
以下是界面示例(参考聆思开发者文档中的helloworld例程)
但在此之前,我们需要确定串口号,具体方法是在串口之前获取所有的串口号,采用命令行ls -a /dev/tty按下tab键打印所有可显示的串口,如下:
在插入usb后,同样方式获取所有可利用的串口,如下:
可以发现多出来一个ttyACM0,这就是usb对应的串口。为了后续使用DPALink烧录,需要在ubuntu上安装下载pyocd,步骤如下:
# 下载 git clone https://github.com/pyocd/pyOCD.git # 复制文件到 /etc/udev/rules.d/ 目录下 cd pyOCD sudo cp udev/*.rules /etc/udev/rules.d/ # 强制udev重新加载 sudo udevadm control --reload sudo udevadm trigger
接下来本地建立项目:
lisa zep create --from-git https://cloud.listenai.com/zephyr/applications/app_algo_hsd_sample_for_csk6.git #下载并创建
开启本地图像预览功能:
cd app_algo_hsd_sample_for_csk6/ sudo vim prj.conf # 将CONFIG_WEBUSB=n改为CONFIG_WEBUSB=y
进行编译:
lisa zep build -b csk6011a_nano
插上USB后下载应用程序:
lisa zep flash
下载资源:
#使用DAPLink烧录 lisa zep exec pyocd flash -e sector -a 0x18000000 -t csk6001 --base-address=0x18400000 resource/cp.bin --frequency=30000000 lisa zep exec pyocd flash -e sector -a 0x18000000 -t csk6001 --base-address=0x18500000 resource/res.bin --frequency=30000000
之后启动cutecom,观察一下串口输出:
使用PC查看工具
安装工具git clone https://cloud.listenai.com/zephyr/applications/csk_view_finder_spd.git
使用 Type-C数据线连接 CSK6 USB 接口至电脑
打开 index.html 文件,参考该html文件即可一步步完成安装。
最后的显示效果如下:
利用开发板上的镜头投射到网页并追踪人物。3. 启发和建议
这款开发板的优势在于丰富的技术文档,尤其是Zephyr嵌入式操作系统的介绍和使用上非常详尽,十分适合想要入手该实时操作系统的技术发烧友。
该技术文档还有改进空间,我将详细阐述我遇到的各个开发问题:
1、其实在开始之初打算把自己优化设计好的无人机场景下的小目标模型部署到聆思开发板上,以便于完成和Jetson系列上部署模型的对比,尽管我已经把模型参数压缩到0.5M以内,还是因为各种各样的算子问题、版本问题无法成功部署。聆思提供了大量算子替代方法,还是不够用且灵活性有待提高。期待聆思开发出跟进现有pytorch版本、现有大量流行算子的支持性~(最后本人尝试了聆思已支持的模型,简简单单体验了一把,步骤几乎与安谋科技、聆思科技联合推出的resnet部署类似,因此本文不带入介绍)
2、十分建议聆思可以在工具链上增加待量化模型的算子支持性测试、算子模型大小的提示,这一点将对开发者十分友好~可以大大减轻开发者的工作量,减少开发迭代周期~期待后续大作~
3、最后,超级感谢聆思提供的试用机会,这款板子价格不菲,也算是第一次尝试市面上出色的AI芯片开发板。内部的存储资源分配在工具链阶段都已经规划好,就这一点对于我下一个阶段的paper工作提供了很大的启发。超级感谢~