Aupera

VMSS (Aupera 实现)— 视频机器学习流媒体服务器

视频机器学习流媒体服务器 (VMSS) 是一款软件应用,旨在作为一个“服务器”进程,为多个视频流提供视频分析服务并高效利用一个服务器系统上的多个 FPGA 资源。Aupera 与 Xilinx 联合开发了 VMSS 框架,以在 Alveo U30 及 U50LV 加速卡上实现,使 VMSS 更适合那些想不事先掌握 FPGA 知识便使用 FPGA 平台的开发者。该解决方案包含 VMSS 框架、预处理、机器学习推断及后处理插件。

如果您有其它问题和/或想要报告一个用户体验问题,请将相关信息发送至 vmss@auperatech.comvmss@xilinx.com

供应商: Aupera

更新日期:2021 年 3 月 31 日

大小:4.3G

容器版本: general_vmss_v1.2

试用或购买

获得评估或购买此产品的权利。


您可免费使用本产品部署以下应用。


部署选项

该应用是容器化的,可以在几分钟内轻松地在云中或本地运行。

本地
Alveo U30
查看 & 购买产品
  • Xilinx Runtime: 202010.2.6.655 and 202020.2.8.726
  • 目标平台:
    U30 - U30_Rel_v0.9 or RC5_5
Alveo U50LV
查看 & 购买产品
  • Xilinx Runtime:
    202010.2.6.655 and 202020.2.8.726
  • 目标平台: U50LV - xilinx_u50lv_gen3x4_xdma_base_2

 


开始设计

请按照部署方法进行操作。

Alveo U30/U50

1.

VMSS Docker 及驱动程序安装:

1.1 先决条件

  1. Aupera 发布包只包含一个 docker 映像文件:xilinxpartners/aupera_general_vmss:v1.2
  2. 一块支持 2 款 xcu30 设备的 U30 开发板。卫星控制器固件版本为 6.3.2 或更高。
  3. 一块 U50LV 开发板
  4. 一台 x86 Ubuntu 16.04/18.04 机器可将 U50LV 的一个 PCIe x16 和一个 PCIe x8 作为两个 x4 分叉点用于 U30,该文件会将这台计算机命名为“x86_host”
  5. X86_Host 的英特网访问

1.2 VMSS 驱动和 docker 安装流程

1.在 X86_Host 准备必要的软件:

    $sudo apt update 
$sudo apt install make build-essential nfs-kernel-server docker docker-containerd docker.io 
$sudo docker pull mongo:latest

2.编辑 /etc/sysctl.conf,为转发 ip 启用 net.ipv4.ip_forward=1:

    $sudo vim /etc/sysctl.conf 
$sudo service networking restart

3.加载 docker 映像并进入 docker:

    $sudo docker pull xilinxpartners/aupera_general_vmss:v1.2
$docker run --cap-add sys_admin --cap-add NET_ADMIN --cap-add NET_RAW --privileged=true --network=bridge --hostname=general -it -v $(pwd):$(pwd) -w $(pwd) -e NFS_ABS_PATH=$(pwd) --name=<CONTAINER_NAME> <REPOSITORY>:<TAG>  bash

在这里, REPOSITORY:TAG 是存储库名称,例如:general_vmss:v1.0,可输入‘sudo docker images’命令获得; CONTAINER_NAME 是一个用户定义的容器名称,例如:test;而 NFS_ABS_PATH 则是 nfs 共享目录,也是 docker 容器的工作空间,我们将当前目录用作 nfs 目录。

下次 x86_host 重启时,该 shell 不需要执行,只需运行以下命令进入 docker 容器即可:

    $sudo docker container  <CONTAINER NAME> start
$sudo docker container exec -it <CONTAINER NAME> /bin/bash

4.启动 nfs 服务并提取 nfs 文件(在 docker 中):

    /root/nfs.sh

然后将在 ${NFS_ABS_PATH} 中获得以下文件/目录:

├── BOOT_full_RC5_5.bin
├── EasyDarwin
├── U30
├── VMSS_APP
├── vmss_drivers.tar.gz
├── xrt_202010.2.6.655-amd64.deb
└── xu30-qspi-burn-58553330_10120113-2.9.3-build111.bin

:每次 x86_host 重启时,都需要执行该 shell。

5.安装 VMSS 驱动(在 docker 外):

    $tar -xzvf vmss_drivers.tar.gz 
      $cd vmss_drivers 
      $sudo ./install.sh

6.确认 VMSS 驱动已加载(在 docker 外)

    $lsmod | grep xocl 
$lsmod | grep xdma

:x86_host 重启时,VMSS 驱动程序将自动加载。

7.启动 MongoDB docker(如果不存在,请下载)

    $sudo docker run --name mongo --rm -d -p 27017:27017 mongo

:您必须通过修改 VMSS docker 容器中的 VMSS_APP/server/conf/plugin.cfg 文件来修改 mongo_url,以匹配主机 ip 地址。
:每次 x86_host 重启时,都需要执行该步骤。


2.

获取评估许可证

2.1 Xilinx 应用商城账户

  1. 设置一个 Xilinx 应用商城帐户(https://appstore.xilinx.com/ -> -> 管理帐户)。
  2. 从 Xilinx 应用商店申请 VMSS 产品的评估许可证。此外,该产品还可按浮动许可证或节点锁定许可证购买。

    请注意
    :每一款 U30 开发板都有 2 个设备,全面使用需要 2 个节点。

  3. 至少要为您的帐户创建一个 cred.json 文件(访问密钥)(Manage Account -> Access Key -> Create an Access Key -> Download JSON)。 该文件在 FPGA 运行时为应用商店识别帐户,其必须放在 ${NFS_PATH}U30/drm/cred.json 目录下,其中 NFS_PATH 是指定的共享目录用户,用于 docker 与 x86_host 通信。

2.2 节点锁定许可证

  1. ${NFS_PATH}U30/drm/license_conf/nodelocked/conf.json 位置位于 docker 映像文件中的节点锁定许可证配置文件必须拷贝到 ${NFS_PATH}U30/drm/conf.json 中。
  2. 要使用从应用商店购买的节点锁定许可证,U30 必须在运行时连接因特网,才能生成许可证文件。在第一次生成许可证文件后,它不仅可离线解锁 DRM 保护,而且只对为之生成的特定 FPGA DNA 有效。

2.3 浮动许可证 / 免费试用

  1. 浮动许可证/免费试用配置文件为 license_conf/floating。${NFS_PATH}U30/drm/license_conf/floating/conf.json 位置位于 docker 映像文件中的浮动许可证配置文件必须拷贝到 ${NFS_PATH}U30/drm/conf.json 中。
  2. 可立即使用从应用商店购买的浮动许可证。浮动许可证不能离线使用。

3.

VMSS 通用版本固件和 Shell 安装

3.1 U30 固件安装

3.1.1 前提条件

  • 一个 Aupera U30 固件 QSPI 闪存转储文件。固件文件命名为 xu30-qspi-burn.bin。
  • 一款带两个 xcu30 设备的 U30 开发板。
  • 一台 x86 Ubuntu 16.04/18.04 机器通过所安装的 Xilinx XRT-2.6.655(在该主机中运行“sudo dpkg -i xrt_202010.2.6.655-xxx.deb”)支持 PCIe×8 分叉点,xrt 软件包 v2.6.655 可通过{链接下载。 

3.1.2 U30 固件安装过程

1.获得 XRT 环境:

    $cd /opt/xilinx/xrt/  
$source setup.sh

2.检查卫星控制器 (SC) 固件版本:

    $sudo /opt/xilinx/xrt/bin/xbmgmt flash --scan

它将显示如下内容:

    Card [0000:07:00.0]
    Card type:          u30
    Flash type:         QSPI_PS
    Flashable partition running on FPGA:
        xilinx_U30_xdma_1_1,[ID=0x5ea44206],[SC=6.3.2]
    Flashable partitions installed in system:   (None)

Card [0000:08:00.0]
    Card type:          u30
    Flash type:         QSPI_PS
    Flashable partition running on FPGA:
        xilinx_U30_xdma_1_1,[ID=0x5ea44206],[SC=6.3.2]
    Flashable partitions installed in system:   (None)

如果 SC 固件版本低于 6.3.2,请联系 Xilinx 或 Aupera 支持,升级 SC 固件


3.读取开发板的 PCIe 总线

    $sudo lspci -d 10ee:

它将显示如下内容:

    07:00.0 Processing accelerators: Xilinx Corporation Device 503d (rev 02)
07:00.1 Processing accelerators: Xilinx Corporation Device 503c (rev 02)
08:00.0 Processing accelerators: Xilinx Corporation Device 503d (rev 02)
08:00.1 Processing accelerators: Xilinx Corporation Device 503c (rev 02)

BDF ID、07:00.1 和 08:00.1 是下一步使用的 card_id。一块 U30 开发板有两个 FPGA 器件(PCIe 端点)。


4.使用 XRT xbmgmt 实用程序闪存 U30 开发板

    $sudo /opt/xilinx/xrt/bin/xbmgmt flash --shell --card <card_id> --path <binfile>.bin

其中,card_id 是第 2 步读取的 ID,如 07:00.0,而 binfile 则是 Aupera 固件 QSPI 闪存转储文件的文件名。
它将显示如下过程:

    Idcode byte[0]=20 
Idcode byte[1]=bb 
Idcode byte[2]=21 
Idcode byte[3]=10 
Idcode byte[4]=44 
Idcode byte[5]=0 
Erasing flash.............................  
Programming flash........................ 
Verifying........................ 
Shell is updated successfully 
Cold reboot machine to load new shell on card

完成后,用相同的闪存转储文件闪存第 2 步读取的第二个 card_id(如 07:00:1)。


4.下电和上电(冷重启)主机,以更新闪存的 FPGA 映像。


3.2 U50LV Shell 安装

3.2.1 前提条件

  • 一台安装了 Xilinx XRT-2.8.726 的 x86 Ubuntu 16.04/18.04 机器(在步骤 3.1.1 中运行“sudo apt remove xrt”,卸载 XRT 2.6.655,然后在主机中运行“sudo dpkg -i xrt_202020.2.8.726-xxx.deb”,安装 XRT 2.8.726),xrt 软件包 v2.6.655 可通过 链接下载
  • 安装在 PCIe x16 插槽中的 U50LV 开发板

3.2.2 U50LV Shell 安装过程

1.获得 XRT 环境:

    $cd /opt/xilinx/xrt/ 
$source setup.sh

2.读取 U50LV 开发板的 PCIe 总线

    $sudo lspci -d 10ee

屏幕将显示如下信息:

    07:00.0 Processing accelerators: Xilinx Corporation Device 5060 
07:00.1 Processing accelerators: Xilinx Corporation Device 5061

07:00.1 Processing accelerators: Xilinx Corporation Device 5061
BDF ID、07:00.1 是下一步使用的 card_id。U50LV 开发板只有 1 个 FPGA 器件(PCIe 端点)。


3.对于 U50LV 卡,DPUCAHX8H 使用的目标平台是 gen3x4 版本,而不是标准的 gen3x16 版本。请下载并安装所需的 gen3x4 目标平台文件。

CentOS/Redhat 7.4-7.7: Xilinx-u50lv-gen3x4-xdma-2-202010.1-2902115-noarch_rpm.tar.gz
Ubuntu 16.04: Xilinx-u50lv-gen3x4-xdma-2-202010.1-2902115-16.04_deb.tar.gz
Ubuntu 18.04: Xilinx-u50lv-gen3x4-xdma-2-202010.1-2902115-18.04_deb.tar.gz


4.使用 Alveo XRT xbmgmt 实用程序闪存 U50 开发板

    $sudo /opt/xilinx/xrt/bin/xbmgmt flash --shell --path <firmware_file> --card <card_id>

其中,card_id 是第 2 步读取的 ID,如 07:00.0,而 firmware_file 则是文件名 xilinx_u50lv_gen3x4_xdma_base_2


5.冷重启主机,从闪存加载 FPGA 映像并验证是否检测到 FPGA 电路板。

    $sudo lspci -d 10ee:

更多 U50LV Shell 安装步骤,请参见 Xilinx github 文档


4.

VMSS 应用

4.1 先决条件

  1. 在安装了 U30 和 U50 开发板的 x86_host 中准备好 U30 和 U50LV 的固件和驱动。
  2. 有一个 RTSP 流媒体来源(如摄像头),格式为:encode=h264/h265、resolution=1080p、fps=30、gop=3。
  3. 从 IP 摄像头获取 RTSP URL,如"rtsp://admin:admin123@172.16.1.15:554",作为输入,或将本地文件以所需格式或本地 mp4 文件形式传输至 RTSP 服务器。

    温馨提示:VMSS docker 包含一个 rtsp 传输工具,可用来将本地文件传输至 rtsp 服务器,步骤如下:
    请确保在 VMSS docker 中。
    进入 docker 中的 $NFS_ABS_PATH/EasyDarwin 目录。
    运行“nohup ./easydarwin -c easydarwin.xml -d 1>/dev/null 2>/dev/null &”,使用默认 rtsp 端口 554 启动 rtsp 服务器。
    稍等一会儿。
    使用 ffmpeg 传输本地文件,如“ffmpeg -stream_loop -1 -re -i test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://localhost:554/vmss-in”。

  4. VMSS docker 运行在 x86_host。(查看 1.2 步骤 3 和 4)
  5. MongoDB docker 运行在 x86_host。(查看 1.2 步骤 7)

4.2 安装 U30 软件(在 docker 内):

注:一个名为 cred.json 的证书文件和一个名为 conf.json 的配置文件必须放在 U30/drm 目录下。请参考本文档的第 2 部分,生成这些文件并将其复制到 U30/drm 中,以替换一个现有的示例文件,并确保这两款 U30 器件都可编程为正确的固件,然后执行以下命令:

    $cd U30 && ./start

如果这个步骤出现了一些 DRM 激活失败的错误消息,请检查 conf.json 和 cred.json 是否正确。如果该步骤长时间挂起,没有任何响应,常见原因如下:

  • 检查 VMSS 驱动程序是否已准备就绪。如果缺少 VMMS 驱动程序(xocl 和 xdma),请重新安装,因为有时在系统更新时重启机器,可能会导致驱动程序加载不正确。 重新安装驱动程序后,请重启 VMSS docker 容器。
  • 运行 U30 启动脚本前,nfs 服务未启动。nfs 服务可通过运行“root/nfs.sh”脚本启动。

如果启动脚本运行正确,最后应该会有以下消息:

    ntpdate -u ntp.api.bz
22 Apr 08:15:06 ntpdate[2804]: step time server 114.118.7.161 offset -1530581455.452152 sec

4.3 在 Docker 容器中运行 VMSS 客户端

1.进入 VMSS docker 容器:

    $docker container exec -it <CONTAINER NAME> /bin/bash

2.运行 VMSS 服务器:

    $cd VMSS_APP/server
     $source set_env.sh
     $./vmss_server

4.4 在 docker 容器中运行 VMSS 客户端

1.进入 VMSS docker 容器

    $docker container exec -it <CONTAINER NAME> /bin/bash

2.启动 VMSS 客户端,打开一个会话:

    $cd VMSS_APP/client 
$./vmss_client -c open -p 8001 -f open_stream.json

3.关闭一个会话的命令:

    $../vmss_client -c close -p 8001 -s 5fcdebd24e4aff0693054073

4.关闭一个会话的命令:

    $./vmss_client -c clear -p 8001

如欲了解有关 vmss 客户端的使用详情,请在 VMSS_APP/client 目录下参阅 README.md。


4.5 检查检测或分类结果

1. 登录 MongoDB docker(在主机上):

    $docker exec -it mongo mongo

2.打开数据库 vmss_db:

    打开数据库 vmss_db:

3. 在数据库 vmss_db 中浏览结果:

    db.retail.find({ session_uuid: ObjectId("5fc8b1306dedf93052684a49")})

其中“retail”是网络名, 5fc8b1306dedf93052684a49 是会话 id 字符串。该命令将显示指定会话的结果。


5.

结果

检查检测或分类结果。

1.登录 MongoDB docker(在主机上):

    $docker exec -it mongo mongo

2.打开数据库 vmss_db:

    $use vmss_db

3.在数据库 vmss_db 中浏览结果:

    db.retail.find({ session_uuid: ObjectId("5fc8b1306dedf93052684a49")})

其中“零售”是网络名,5fc8b1306dedf93052684a49 是会话 id 字符串。该命令将显示指定会话的结果。