安装和运行空间分析容器(预览版)

借助空间分析容器可以分析实时流视频,以理解人员之间的空间关系、他们的动作以及与物理环境中对象的交互。 容器可帮助你满足特定的安全性和数据管理要求。

先决条件

  • Azure 订阅 - 创建试用订阅
  • 拥有 Azure 订阅后,在 Azure 门户中为标准 S1 层创建计算机视觉资源,以获取密钥和终结点。 部署后,选择”转到资源”。
    • 需要使用所创建资源的密钥和终结点来运行空间分析容器。 稍后你将使用该密钥和终结点。

空间分析容器要求

若要运行空间分析容器,需要一台搭载支持 NVIDIA CUDA 计算的 GPU 6.0 或更高的计算设备(例如 NVIDIA Tesla T4、A2、1080Ti 或 2080Ti)。容器可在满足最低要求的任何其他桌面计算机上运行。 我们将此设备称为主计算机。

最低硬件需求

  • 4 GB 系统 RAM
  • 4 GB GPU RAM
  • 8 核 CPU
  • 1 个支持 NVIDIA CUDA 计算的 GPU 6.0 或更高版本(例如,NVIDIA Tesla T4、A2、1080Ti 或 2080Ti)
  • 20 GB 机械硬盘 (HDD) 空间
  • 32 GB 系统 RAM
  • 16 GB GPU RAM
  • 8 核 CPU
  • 两个支持 NVIDIA CUDA 计算的 GPU 6.0 或更高版本(例如,NVIDIA Tesla T4、A2、1080Ti 或 2080Ti)
  • 50 GB 固态硬盘 (SSD) 空间

在本文中,你将下载并安装以下软件包。 主计算机必须能够运行以下各项(请参阅后面的说明):

要求 说明
照相机 空间分析容器并非仅限用于特定的相机品牌。 相机设备需要:支持实时流式处理协议 (RTSP) 和 H.264 编码、可供主机计算机访问,并能够以 15FPS 和 1080p 的分辨率进行流式处理。
Linux OS 必须在主计算机上安装 Ubuntu Desktop 18.04 LTS

设置主计算机

如果要配置其他设备,请选择“台式机”;如果要使用 VM,请选择“虚拟机”。

按照以下说明操作。

在主计算机上安装 NVIDIA CUDA 工具包和 Nvidia 图形驱动程序

使用以下 bash 脚本安装所需的 Nvidia 图形驱动程序及 CUDA 工具包。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

重新启动计算机并运行以下命令。

nvidia-smi

你会看到以下输出。

NVIDIA 驱动程序输出

在主计算机上安装 Docker CE 和 nvidia-docker2

在主计算机上安装 Docker CE。

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

安装 nvidia-docker-2 软件包。

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y docker-ce nvidia-docker2
sudo systemctl restart docker

在主计算机上启用 NVIDIA MPS

提示

  • 如果 GPU 计算功能低于 7.x(Volta 之前的产品),请不要安装 MPS。 有关参考信息,请参阅 CUDA 兼容性
  • 在主计算机上的终端窗口中运行 MPS 指令。 不要在 Docker 容器实例内部执行此操作。

为获得最佳性能和利用率,请为 NVIDIA 多进程服务 (MPS) 配置主计算机的 GPU。 在主计算机上的终端窗口中运行 MPS 指令。

# Set GPU(s) compute mode to EXCLUSIVE_PROCESS
sudo nvidia-smi --compute-mode=EXCLUSIVE_PROCESS

# Cronjob for setting GPU(s) compute mode to EXCLUSIVE_PROCESS on boot
echo "SHELL=/bin/bash" > /tmp/nvidia-mps-cronjob
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" >> /tmp/nvidia-mps-cronjob
echo "@reboot   root    nvidia-smi --compute-mode=EXCLUSIVE_PROCESS" >> /tmp/nvidia-mps-cronjob

sudo chown root:root /tmp/nvidia-mps-cronjob
sudo mv /tmp/nvidia-mps-cronjob /etc/cron.d/

# Service entry for automatically starting MPS control daemon
echo "[Unit]" > /tmp/nvidia-mps.service
echo "Description=NVIDIA MPS control service" >> /tmp/nvidia-mps.service
echo "After=cron.service" >> /tmp/nvidia-mps.service
echo "" >> /tmp/nvidia-mps.service
echo "[Service]" >> /tmp/nvidia-mps.service
echo "Restart=on-failure" >> /tmp/nvidia-mps.service
echo "ExecStart=/usr/bin/nvidia-cuda-mps-control -f" >> /tmp/nvidia-mps.service
echo "" >> /tmp/nvidia-mps.service
echo "[Install]" >> /tmp/nvidia-mps.service
echo "WantedBy=multi-user.target" >> /tmp/nvidia-mps.service

sudo chown root:root /tmp/nvidia-mps.service
sudo mv /tmp/nvidia-mps.service /etc/systemd/system/

sudo systemctl --now enable nvidia-mps.service

在主计算机上配置 Azure IoT Edge

若要在主计算机上部署空间分析容器,请使用标准 (S1) 或免费 (F0) 定价层创建 Azure IoT 中心服务的实例。

使用 Azure CLI 创建 Azure IoT 中心的实例。 请视情况替换参数。 或者,也可以在 Azure 门户中创建 Azure IoT 中心。

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
sudo az login
sudo az account set --subscription "<name or ID of Azure Subscription>"
sudo az group create --name "<resource-group-name>" --location "<your-region>"

有关可用区域,请参阅区域支持

sudo az iot hub create --name "<iothub-group-name>" --sku S1 --resource-group "<resource-group-name>"
sudo az iot hub device-identity create --hub-name "<iothub-name>" --device-id "<device-name>" --edge-enabled

需要安装 Azure IoT Edge 版本 1.0.9。 遵循以下步骤下载正确的版本:

Ubuntu Server 18.04:

curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list

复制生成的列表。

sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/

安装 Microsoft GPG 公钥。

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/

更新设备上的包列表。

sudo apt-get update

安装版本 1.0.9:

sudo apt-get install iotedge=1.1* libiothsm-std=1.1*

接下来,使用连接字符串将主计算机注册为 IoT 中心实例中的 IoT Edge 设备。

需将 IoT Edge 设备连接到 Azure IoT 中心。 需要从前面创建的 IoT Edge 设备中复制该连接字符串。 或者,可以在 Azure CLI 中运行以下命令。

sudo az iot hub device-identity connection-string show --device-id my-edge-device --hub-name test-iot-hub-123

在主计算机上打开 /etc/iotedge/config.yaml 进行编辑。 请将 ADD DEVICE CONNECTION STRING HERE 替换为连接字符串。 保存并关闭该文件。 运行此命令以重启主计算机上的 IoT Edge 服务。

sudo systemctl restart iotedge

通过 Azure 门户Azure CLI 将空间分析容器部署为主计算机上的 IoT 模块。 如果使用门户,请将映像 URI 设置为 Azure 容器注册表的位置。

如果使用 Azure CLI,请执行以下步骤来部署容器。

IoT 部署清单

若要简化多台主计算机上的容器部署,可以创建一个部署清单文件来指定容器创建选项和环境变量。 可在 GitHub 上找到其他台式机带 GPU 的 Azure VM 的部署清单示例。

下表显示了 IoT Edge 模块使用的各个环境变量。 也可以在 spatialanalysis 中使用 env 特性,在上面链接的部署清单中设置这些变量:

设置名称 “值” 说明
ARCHON_LOG_LEVEL Info;Verbose 日志记录级别,选择两个值中的一个
ARCHON_SHARED_BUFFER_LIMIT 377487360 请勿修改
ARCHON_PERF_MARKER false 要进行性能日志记录,请将此变量设置为 true,否则应设置为 false
ARCHON_NODES_LOG_LEVEL Info;Verbose 日志记录级别,选择两个值中的一个
OMP_WAIT_POLICY PASSIVE 请勿修改
QT_X11_NO_MITSHM 1 请勿修改
APIKEY 你的 API 密钥 在 Azure 门户中从视觉资源收集此值。 可以在资源的“密钥和终结点”部分找到它。
账单 你的终结点 URI 在 Azure 门户中从视觉资源收集此值。 可以在资源的“密钥和终结点”部分找到它。
EULA accept 需将此值设置为 accept 才能运行容器
DISPLAY :1 此值需与主计算机上 echo $DISPLAY 的输出相同。 Azure Stack Edge 设备没有显示器。 此项设置不适用
KEY_ENV ASE 加密密钥 如果 Video_URL 是经过模糊处理的字符串,请添加此环境变量
IV_ENV 初始化向量 如果 Video_URL 是经过模糊处理的字符串,请添加此环境变量

重要

必须指定 EulaBillingApiKey 选项运行容器;否则,该容器不会启动。 有关详细信息,请参阅计费

使用自己的设置和所选操作更新台式机带有 GPU 的 Azure VM 的部署清单后,可使用以下 Azure CLI 命令在主计算机上将容器部署为 IoT Edge 模块。

sudo az login
sudo az extension add --name azure-iot
sudo az iot edge set-modules --hub-name "<iothub-name>" --device-id "<device-name>" --content DeploymentManifest.json --subscription "<name or ID of Azure Subscription>"
参数 说明
--hub-name 你的 Azure IoT 中心名称。
--content 部署文件的名称。
--target-condition 主计算机的 IoT Edge 设备名称。
--subscription 订阅 ID 或名称。

此命令将启动部署。 在 Azure 门户中导航到 Azure IoT 中心实例的页面,以查看部署状态。 在设备下载完容器映像并开始运行映像之前,状态可能显示为“417 - 未设置设备的部署配置”。

验证部署是否成功

有几种方法可用于验证容器是否正在运行。 在 Azure 门户上 Azure IoT 中心实例的空间分析模块的“IoT Edge 模块设置”中,找到“运行时状态”。 验证“运行时状态”的“所需值”和“报告的值”是否为“正在运行”。

示例部署验证

部署完成并且容器运行后,主计算机会开始将事件发送到 Azure IoT 中心。 如果使用了操作的 .debug 版本,对于在部署清单中配置的每个相机,你将看到一个可视化工具窗口。 现在,可以定义要在部署清单中监视的视线和区域,然后按照说明重新部署。

配置由空间分析执行的操作

需使用空间分析操作将容器配置为使用连接的相机、配置操作,等等。 对于配置的每个相机设备,空间分析的操作会生成发送到 Azure IoT 中心实例的 JSON 消息输出流。

使用容器生成的输出

若要开始使用容器生成的输出,请参阅以下文章:

  • 使用适用于所选编程语言的 Azure 事件中心 SDK 连接到 Azure IoT 中心终结点,并接收事件。 有关详细信息,请参阅从内置终结点读取设备到云的消息
  • 在 Azure IoT 中心设置消息路由,以将事件发送到其他终结点,或者将事件保存到 Azure Blob 存储,等等。

疑难解答

如果在启动或运行容器时遇到问题,请参阅遥测和故障排除,了解常见问题的解决步骤。 此文还包含了有关生成和收集日志以及收集系统运行状况的信息。

如果在运行 Azure AI 服务容器时遇到问题,可以尝试使用 Microsoft 诊断容器。 使用此容器可以诊断部署环境中可能阻止 Azure AI 容器按预期运行的常见错误。

若要获取容器,请使用以下 docker pull 命令:

docker pull mcr.microsoft.com/azure-cognitive-services/diagnostic

然后运行容器。 将 {ENDPOINT_URI} 替换为你的终结点,将 {API_KEY} 替换为你的资源的密钥:

docker run --rm mcr.microsoft.com/azure-cognitive-services/diagnostic \
eula=accept \
Billing={ENDPOINT_URI} \
ApiKey={API_KEY}

容器会测试与计费终结点之间的网络连接性。

计费

空间分析容器使用 Azure 帐户中的视觉资源向 Azure 发送账单信息。 空间分析公共预览版目前供免费使用。

Azure AI 容器在未连接到计量/计费终结点的情况下无权运行。 必须始终让容器可以向计费终结点传送计费信息。 Azure AI 容器不会将客户数据(例如正在分析的视频或图像)发送给 Microsoft。

总结

在本文中,你已学习相关的概念,以及下载、安装和运行空间分析容器的工作流。 综上所述:

  • 空间分析是适用于 Docker 的 Linux 容器。
  • 从 Microsoft 容器注册表下载容器映像。
  • 容器映像作为 Azure IoT Edge 中的 IoT 模块运行。
  • 配置容器并将其部署在主计算机上。

后续步骤