3. 环境配置常见问题

3.1. 开发环境配置常见问题

3.1.1. 如何安装和使用SDK?

答:

  1. 确认准备Ubuntu主机,安装好docker

  2. 【宿主机】加载docker开发镜像:

    docker load -i bmnnsdk_ubuntu_docker.tar.gz
    
  3. 【宿主机】打开终端,执行如下命令解压缩文件:

    tar zxf bmnnsdk2-bm1684_v2.4.0.tar.gz
    
  4. 【宿主机】如果是SC5 PCIe加速卡,需要在宿主机安装驱动(如果为x86平台环境,请使用docker;其他平台环境无需使用docker):

    1. 打开终端执行 lspci | grep 1684 检查卡是否能够识别,正常情况应该输出如下信息:

      01:00.0 Processing accelerators: Bitmain Technologies Inc. BM1684, Sophon Series Deep Learning Accelerator (rev 01)
      
    2. 根据平台类型执行不同脚本安装驱动程序,注意使用sudo root权限安装

      cd {$SDK_PATH}/scripts
      x86平台:    sudo ./install_pcie_driver.sh
      Mips64平台:     sudo ./install_driver_mips64.sh
      Arm_pcie平台:     sudo ./install_driver_arm_pcie.sh
      
    3. 检查是否安装成功 执行ls /dev/bm* 看看是否有/dev/bm-sohponX (X表示0-N),如果有表示安装成功。 正常情况下输出如下信息:

      /dev/bmdev-ctl  /dev/bm-sophon0
      
  5. 【宿主机】进入解压缩后的文件夹,执行脚本启动docker:

    ./docker_run_bmnnsdk.sh
    
  6. 【docker容器内】安装库:

    cd bmnnsdk2-bm1684_v2.4.0/scripts
    ./install_lib.sh nntc
    
  7. 【docker容器内】设置环境变量:

    source envsetup_pcie.sh(有SC5卡) 或source envsetup_cmodel.sh(没有SC5卡)
    
  8. 按照用户手册和文档操作即可

3.1.2. 如何在docker容器内使用宿主机上的显示设备显示图像?

解决方案1:启动容器时添加配置选项,使用宿主机显示器显示画面 目前的主流图像界面服务X11支持客户端/服务端(Client/Server)的工作模式,只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给docker,docker 就可以通过端口找到显示输出的地方,和linux系统共用显示设备:

  1. 宿主机安装x11-server:

    sudo apt-get install x11-xserver-utils
    
  2. 开放权限,允许所有用户,当然包括docker,访问X11 的显示接口:

    xhost +
    
  3. 修改启动docker容器脚本,增加选项:

    -v /tmp/.X11-unix:/tmp/.X11-unix \     #共享本地unix端口
    -e DISPLAY=unix$DISPLAY \              # 修改环境变量DISPLAY
    -e GDK_SCALE \                         # 与显示效果相关的环境变量
    -e GDK_DPI_SCALE
    
  4. 重新启动docker容器

解决方案2:已经启动的容器,通过网络IP连接到x11 server显示图像(本地或局域网内其他主机都可以) 若不想重新启动容器,可以通过IP地址来映射显示设备从而显示图像:

  1. 查询x11 server主机IP:假设为192.168.150.100

  2. 设置x11 server权限:

    sudo gedit /etc/lightdm/lightdm.conf #增加一行 xserver-allow-tcp=true
    sudo systemctl restart lightdm
    xhost + #注意加号前应有空格
    

    注解

    如果您使用的系统的桌面管理器不是lightdm,那么配置文件可能会不一样。比如ubuntu18.04以上默认使用gdm3,其配置文件为/etc/gdm/custom.conf,您需要在[security]下增加AllowRemoteAutoLogin=true,[xhmcp]下增加Enable=true, Port=177。重启gdm服务的命令为:service gdm restart

  3. 在docker容器中设置DSIPLAY变量:

    export DISPLAY= 192.168.150.100:0.0
    

测试是否成功

您可以在docker中安装以下显示时钟的小程序来验证显示设备已被正确配置
sudo apt-get install xarclock # 安装这个小程序
xarclock # 运行,如果配置成功,会显示出一个小钟表动画

说明:以上操作主要针对Linux,若您想使用windows或者Mac主机作为显示设备,原理是相似的,请查找类似解决方案配置即可。

3.1.3. 关于ABI0和ABI1版本的问题?

答:每个操作系统都会为运行在该系统下的应用程序提供应用程序二进制接口(Application Binary Interface,ABI)。ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。ABI总是包含一系列的系统调用和使用这些系统调用的方法,以及关于程序可以使用的内存地址和使用机器寄存器的规定。ABI的版本与操作系统、硬件设备有相关。BMNNSDK原始包中提供了ABI0和ABI1两个版本的so库,在执行./install_lib.sh nntc时,脚本会根据当前系统环境保留相应ABI版本的so库。

3.1.4. 关于CentOS与程序ABI版本的问题?

3.1.4.1. 在CentOS7.6上使用gcc 6.5编译程序链接BM-OpenCV库时报找不到符号链接的错误

_images/dev_env_gcc_bm_opencv_undefined_ref.png

答:Centos下直接安装的编译器,所有版本下默认都是使用D_GLIBCXX_USE_CXX11_ABI=0,与我们的BM-OpenCV编译时使用的ABI版本(ABI=1)不兼容,因此,需要使用我们提供的x86-linux-gcc编译器,以确保ABI兼容,编译器请联系技术支持获取。

3.1.4.2. BM-OpenCV的abi和客户的其他库的abi不一样,是否可以提供各种abi版本的BM-OpenCV, 或者BM-OpenCV的源码,自行进行编译?

答:BM-OpenCV目前没有源码开放的计划;BMNNSDK中其他C++的库比较小,都提供了双份(ABI0和ABI1),BM-OpenCV目前只有ABI1版本的。由于涉及BMNNSDK整个全家桶的发布,为了控制BMNNSDK的体积,暂时不提供ABI0版本的BM-OpenCV;建议客户还是使用我们提供的编译器将自己的程序重新编译一遍。(那如果客户的依赖是直接apt安装的,客户不想都下载源码重新编译,应该怎么办?)

3.1.5. 在ARM主机上编译SDK/examples/SSD_object中的示例,程序编译最后阶段输出local symbol的信息,是否是编译成功?

_images/dev_env_ssd_object.png _images/dev_env_ssd_local_symbol.png

答:这主要是由于arm主机上g++版本过高导致的,不影响运行。

3.1.6. 如何在开发环境中的Python环境下使用我们提供的BM-OpenCV?

答:只需设置好PYTHONPATH环境变量。不同的架构平台,请注意修改对应的路径。

export PYTHONPATH=$PYTHONPATH:/workspace/lib/opencv/x86/opencv-python

3.1.7. CentOS宿主机上在官方ubuntu开发docker中使用sail模块报找不到符号错误?

_images/dev_env_centos_ubuntu_docker_sail_symbol_error.png

答:

  1. 排查是否环境变量没有设置好,是否有执行source envsetup_xxx.sh;

  2. 环境要求的ABI版本和so文件的ABI版本不匹配:具体来说,SDK里原始会存放ABI0 和ABI1 2个版本的库,./install_lib.sh nntc这个脚本,会根据现场环境,去选择一个合适的版本,然后把多余的删掉,并重命名相关库。centos和ubuntu用的ABI版本不一样,如果在centos的宿主机上执行过这个脚本,那么SDK中的库就变成只适用于centos了,这个时候在ubuntu的docker中就无法使用这个库了。请重新解压原始的SDK文件,挂载到docker内部后重新执行环境配置命令(./install_lib.sh nntc和source envsetup_xxx.sh以及SAIL的安装)。

3.2. 常用工具有哪些?

3.2.1. bm-smi等设备管理工具

答:

我们提供bm-smi工具、proc文件系统接口和sysfs文件系统接口用于获取设备状态信息。

  • bm-smi以界面或者文本的形式显示设备状态信息,如设备的温度、风扇转速等信息;也可使能、禁用或者设置设备的某些功能,如led、ecc等。

  • proc文件系统接口:在/proc 节点下创建设备信息节点,用户通过cat或者编程的方式读取相关节点获取设备温度、版本等信息。

  • sysfs 文件系统接口:用来获取 TPU 的利用率等信息。

注解

bm-smi侧重于以界面的形式直观显示设备信息,proc文件系统接口侧重于为用户提供编程获取设备信息的接口。

3.2.2. bm_model.bin

答:通过bm_model.bin工具,可以查看bmodel文件的参数信息,可以将多个网络bmodel分解成多个单网络的bmodel,也可以将多个网络的bmodel合并成一个bmodel,具体请查看:https://doc.sophgo.com/docs/docs_latest_release/nntc/html/usage/bmodel.html

3.2.3. bmrt_test

答:bmrt_test是基于bmruntime接口实现的对bmodel的正确性和实际运行性能的测试工具,具体请查看:https://doc.sophgo.com/docs/docs_latest_release/nntc/html/usage/bmrt_test.html

3.2.4. view_demo

答:使用view demo,可以通过calibration可视化分析工具查看网络量化误差,此工具通过运行fp32和int8网络, 并对其每层的输出进行比较,以图形化界面形式直观显示每层数据的量化损失。具体请查看:https://doc.sophgo.com/docs/docs_latest_release/calibration-tools/html/module/chapter4.html#id17

3.2.5. BMProfile

答:BMProfile是将用户产生的profile信息以可视化的方式展示出来。主要作用是辅助用户进行网络的性能分析,查看Graph、SubGraph、layer、算子、指令等各个级别的性能数据和Memory使用情况。此外,还可以对静态网络的指令进行分析过滤,以分析出越界读写等问题。具体使用请查看:https://doc.sophgo.com/docs/docs_latest_release/nntc/html/usage/bmprofile.html

3.3. 如何查看版本信息?

答:

SDK版本:${SDK_PATH}/release_version.txt;
PCIe模式固件版本:cat /proc/bmsophon/card0/versions;
SOC模式固件版本:cat /system/data/buildinfo.txt。

3.4. 使用bm-smi查看信息时发现,没有程序运行,但是设备内存被占用?

_images/tool_usages_bm_smi_occupied.png

答:这是正常的。从BMNNSDK2.6.0开始bm-smi中显示的设备内存增加了VPU对设备内存的使用,这里的178MB是安装完驱动以后就分配了的空间,即使没有程序在运行,也会一直存在。