教程:为 GPU 配置、连接和验证 IoT Edge 模块

本教程介绍如何生成支持 GPU 的虚拟机 (VM)。 在 VM 中,你将了解如何运行 IoT Edge 设备,该设备将工作从其某个模块分配给 GPU。

我们将使用 Azure 门户、Azure Power Shell 和 VM 的命令行执行以下操作:

  • 构建支持 GPU 的 VM
  • 在 VM 上安装 NVIDIA 驱动程序扩展
  • 配置 IoT Edge 设备上的模块以将工作分配给 GPU

先决条件

  • Azure 帐户 - 创建试用版订阅

  • Azure IoT 中心 - 创建 IoT 中心

  • Azure IoT Edge 设备

    如果还没有 IoT Edge 设备并且需要快速创建一个,请运行以下命令。 使用 Azure Power Shell。 为 <DEVICE-NAME> 创建新设备名称,并将 IoT <IOT-HUB-NAME> 替换为自己的设备名称。

    az iot hub device-identity create --device-id <YOUR-DEVICE-NAME> --edge-enabled --hub-name <YOUR-IOT-HUB-NAME>
    

    有关创建 IoT Edge 设备的详细信息,请参阅快速入门:将第一个 IoT Edge 模块部署到虚拟 Linux 设备。 在本教程的后面部分,我们将向 IoT Edge 设备添加 NVIDIA 模块。

创建 GPU 优化虚拟机

若要创建 GPU 优化虚拟机 (VM),选择合适的大小很重要。 并非所有 VM 大小都能满足 GPU 处理的要求。 此外,对于不同的工作负载,VM 大小也不同。 有关详细信息,请参阅 GPU 优化虚拟机大小或尝试使用虚拟机选择器

让我们使用 GitHub 中的 Azure 资源管理器 (ARM) 模板创建一个 IoT Edge VM,然后将其配置为 GPU 优化。

  1. 转到 GitHub 中的 IoT Edge VM 部署模板:Azure/iotedge-vm-deploy

  2. 选择“部署到 Azure”按钮,开始在 Azure 门户中创建自定义 VM。

  3. 在“自定义部署”字段中填写 Azure 凭据和资源:

    Property 说明或示例值
    订阅 选择 Azure 帐户订阅。
    资源组 添加 Azure 资源组。
    区域 China East
    GPU VM 并非在所有区域都可用。
    DNS 标签前缀 为 VM 创建一个名称。
    管理员用户名 adminUser
    或者,创建你自己的用户名。
    设备连接字符串 从 IoT Edge 设备复制连接字符串,然后粘贴到此处。
    VM 大小 Standard_NV6
    身份验证类型 选择“密码”或“SSH 公钥”,然后根据需要创建密码或密钥对名称。

    提示

    检查每个区域支持哪些 GPU VM:可用产品(按区域)

    若要检查 Azure 订阅允许的区域,请从 Azure 门户尝试运行此 Azure 命令。 Standard_N 中的 N 表示它是支持 GPU 的 VM。

    az vm list-skus --location <YOUR-REGION> --size Standard_N --all --output table
    
  4. 选择底部的“查看 + 创建”按钮,然后选择“创建”按钮。 部署过程可能需要一分钟才能完成。

安装 NVIDIA 扩展

我们已经有了 GPU 优化 VM,接下来使用 Azure 门户在 VM 上安装 NVIDIA 扩展

  1. 在 Azure 门户中打开 VM,然后从左侧菜单中选择“扩展 + 应用程序”。

  2. 选择“添加”并从列表中选择“NVIDIA GPU 驱动程序扩展”,然后选择“下一步”。

  3. 选择“查看 + 创建”,然后选择“创建”。 部署过程可能需要 30 分钟才能完成。

  4. 若要在 Azure 门户中确认安装,请返回 VM 中的“扩展 + 应用程序”菜单。 名为 NvidiaGpuDriverLinux 的新扩展应位于扩展列表中,并在“状态”下显示“预配成功”。

  5. 若要使用 Azure Power Shell 确认安装,请运行此命令以列出扩展。 将 <> 占位符替换成自己的值:

    az vm extension list --resource-group <YOUR-RESOURCE-GROUP> --vm-name <YOUR-VM-NAME> -o table
    
  6. 对于 NVIDIA 模块,我们将使用 NVIDIA 系统管理接口程序,也称为 nvidia-smi

    在设备上根据 Ubuntu 版本安装 nvidia-smi 包。 在本教程中,我们将为 Ubuntu 20.04 安装 nvidia-utils-515。 在安装中出现提示时选择 Y

    sudo apt install nvidia-utils-515
    

    下面列出了所有 nvidia-smi 版本。 如果在未事先安装的情况下运行 nvidia-smi,此列表将打印在控制台中。

    所有“nvidia-smi”版本的屏幕截图。

  7. 安装后,运行以下命令以确认其已安装:

    nvidia-smi
    

    将显示一个确认表,与下表类似。

    NVIDIA 驱动程序表的屏幕截图。

注意

NVIDIA 扩展是安装 NVIDIA 驱动程序的一种简化方式,但你可能需要更多自定义。 有关在 N 系列 VM 上进行自定义安装的详细信息,请参阅在运行 Linux 的 N 系列 VM 上安装 NVIDIA GPU 驱动程序

启用具有 GPU 加速的模块

可以通过不同的方法来启用 IoT Edge 模块,以便它使用 GPU 进行处理。 一种方法是将设备上现有的 IoT Edge 模块配置为 GPU 加速模块。 另一种方法是使用预制容器模块,例如,已优化 GPU 的 NVIDIA DIGITS 中的模块。 让我们看看这两种方法的工作原理。

使用 DeviceRequests 在现有模块中启用 GPU

如果 IoT Edge 设备上已有模块,使用部署清单的 createOptions 中的 DeviceRequests 添加配置会使模块变成 GPU 优化模块。 按照以下步骤配置现有模块。

  1. 转到 Azure 门户中的 IoT 中心,然后在“设备管理”菜单下选择“设备”。

  2. 选择 IoT Edge 设备将其打开。

  3. 选择顶部的“设置模块”选项卡。

  4. 在“IoT Edge 模块”列表中选择要启用以供 GPU 使用的模块。

  5. 侧面板打开,选择“容器创建选项”选项卡。

  6. 复制此 HostConfig JSON 字符串并粘贴到“创建选项”框中。

     {
         "HostConfig": {
             "DeviceRequests": 
             [
                 {
                     "Count": -1,
                     "Capabilities": [
                         [
                             "gpu"
                         ]
                     ]
                 }
             ]
         }
     }
    
  7. 选择“更新”。

  8. 选择“查看 + 创建”。 新的 HostConfig 对象现在显示在模块的 settings 中。

  9. 选择“创建”。

  10. 若要确认新配置有效,请在 VM 中运行以下命令:

    sudo docker inspect <YOUR-MODULE-NAME>
    

    你应该会在控制台的 JSON 打印输出中看到为 DeviceRequests 指定的参数。

注意

若要更好地了解 DeviceRequests 参数,请查看源代码:moby/host_config.go

在预制 NVIDIA 模块中启用 GPU

让我们将 NVIDIA DIGITS 模块添加到 IoT Edge 设备中,然后通过设置模块的环境变量为其分配 GPU。 此 NVIDIA 模块已在 Docker 容器中。

  1. 在 Azure 门户中,从 IoT 中心的“设备”菜单中选择 IoT Edge 设备。

  2. 选择顶部的“设置模块”选项卡。

  3. 在 IoT Edge 模块标题下选择“+ 添加”,然后选择“IoT Edge 模块”。

  4. 在“IoT Edge 模块名称”字段中提供名称。

  5. 在“模块设置”选项卡下,将 nvidia/digits:6.0 添加到“映像 URI”字段。

  6. 选择“环境变量”选项卡。

  7. 添加值为 0 的环境变量名称 NVIDIA_VISIBLE_DEVICES。 此变量控制哪些 GPU 对边缘设备上运行的容器化应用程序可见。 可将 NVIDIA_VISIBLE_DEVICES 环境变量设置为以逗号分隔的设备 ID 列表,该列表对应于系统中的物理 GPU。 例如,如果系统中有两个设备 ID 为 0 和 1 的 GPU,则可以将变量设置为“NVIDIA_VISIBLE_DEVICES=0,1”以使这两个 GPU 都对容器可见。 在本文中,由于 VM 只有一个 GPU,因此我们将使用第一个也是唯一一个 GPU。

    名称 类型
    NVIDIA_VISIBLE_DEVICES 文本 0
  8. 选择 添加

  9. 选择“查看 + 创建” 。 随即显示部署清单属性。

  10. 选择“创建”以创建模块。

  11. 选择“刷新”以更新模块列表。 该模块需要几分钟的时间才能在“运行时状态”中显示“正在运行”,因此请不断刷新设备。

  12. 在设备上运行以下命令,确认新的 NVIDIA 模块存在并且正在运行。

    iotedge list
    

    你应该会在 IoT Edge 设备上的模块列表中看到 NVIDIA 模块,其状态为 running

    “iotedge list”命令结果的屏幕截图。

注意

有关 NVIDIA DIGITS 容器模块的详细信息,请参阅深度学习数字文档

清理资源

若要继续学习其他 IoT Edge 教程,可以使用为本教程创建的设备。 否则,可删除已创建的 Azure 资源,避免产生费用。

如果是在新资源组中创建的虚拟机和 IoT 中心,则可以删除该组,该操作会删除所有关联的资源。 仔细检查资源组的内容,确保没有要保留的内容。 如果不想删除整个组,可以改为删除单个资源(虚拟机、设备或 GPU 模块)。

重要

删除资源组的操作不可逆。

使用以下命令删除 Azure 资源组。 可能需要花费几分钟来删除资源组。

az group delete --name <YOUR-RESOURCE-GROUP> --yes

可以通过查看资源组列表来确认已删除该资源组。

az group list

后续步骤

本文帮助你将虚拟机和 IoT Edge 设备设置为 GPU 加速。 若要运行具有类似设置的应用程序,请尝试使用 Azure 进行 NVIDIA DeepStream 开发的学习路径。 此 Learn 教程介绍了如何开发可使用多个视频、图像和音频源的优化智能视频应用程序。