EFLOW 用户指南

描述如何在支持EFLOW的Windows设备上部署CUDA和NVIDIA GPU加速的云原生应用程序。

1. EFLOW 用户指南

1.1. 简介

Azure IoT Edge For Linux on Windows(简称EFLOW)是一项微软技术,用于在Windows边缘设备上部署Linux人工智能容器。本文档详细介绍了如何在支持EFLOW的Windows设备上部署NVIDIA® CUDA®和NVIDIA GPU加速的云原生应用程序。

EFLOW包含以下组件:

  • 启用虚拟化的Windows主机操作系统

  • 一台Linux虚拟机

  • 物联网边缘运行时

  • 物联网边缘模块,或其他任何兼容docker的容器化应用(可在moby/containerd上运行)

GeForce RTX GPU对GPU加速的物联网边缘模块的支持基于GPU半虚拟化技术,该技术是Linux上的Windows子系统(WSL)中CUDA的基础。因此,EFLOW对CUDA和计算的支持得益于WSL 2上现有的CUDA支持。

CUDA on WSL 2通过让开发者能够在Windows桌面电脑上构建、开发和容器化基于GPU加速的NVIDIA AI/ML Linux应用程序(之后可部署到云端的Linux实例),显著提升了CUDA开发者的工作效率。而EFLOW则专注于边缘AI部署。无论是托管在Azure IoT Hub还是NGC注册表中的容器化NVIDIA GPU加速Linux应用,都可以无缝部署到零售服务中心或医院等边缘场景。这类边缘部署通常是IT管理的设备,出于可管理性考虑会与Windows设备深度集成。但随着该领域AI/ML应用场景的出现,需要实现Linux和Windows应用不仅能在同一设备上共存,还能无缝通信的融合方案。

由于EFLOW上的CUDA支持主要基于WSL 2,请参阅《WSL 2上的CUDA》文档中的"软件支持"、"限制"和"已知问题"部分,以了解EFLOW上可用的NVIDIA软件支持范围。本文档还涵盖了EFLOW的任何其他先决条件。

以下部分详细介绍了EFLOW的安装步骤、开箱即用CUDA支持的前提条件,以及如何在EFLOW上运行现有GPU加速容器的示例说明。

1.2. 安装与配置

请参阅Microsoft EFLOW文档页面,选择适合您需求的各种安装选项:

为快速设置,我们已在以下部分包含通过Powershell安装的步骤。

1.2.1. 驱动安装

在目标Windows设备上,首先安装与设备NVIDIA GPU兼容的NVIDIA GeForce或NVIDIA RTX GPU Windows驱动程序。EFLOW虚拟机支持部署容器化的CUDA应用程序,因此只需在主机系统上安装驱动程序。CUDA工具包无法直接在EFLOW中安装。

可以直接部署来自NGC注册表的NVIDIA提供的CUDA容器。如果您正在准备CUDA docker容器,请确保已安装必要的工具链。

由于EFLOW基于WSL,适用于Windows混合Linux环境的软件堆栈限制同样适用,并非所有NVIDIA软件堆栈都受支持。请参考您感兴趣的SDK用户指南以确定支持情况。

1.2.2. EFLOW安装指南

在提升权限的PowerShell提示符下执行以下操作:

  1. 启用HyperV。 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

    Path          :
    Online        : True
    RestartNeeded : False
    
  2. 设置执行策略并验证。

    Set-ExecutionPolicy -ExecutionPolicy AllSigned -Force
    
    Get-ExecutionPolicy
    AllSigned
    
  3. 下载并安装EFLOW。

    $msiPath = $([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))
    $ProgressPreference = 'SilentlyContinue'
    Invoke-WebRequest "https://aka.ms/AzEFLOWMSI_1_4_LTS_X64" -OutFile $msiPath
    
    Start-Process -Wait msiexec -ArgumentList "/i","$([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))","/qn"
    
  4. 确定主机操作系统配置。

    >Get-EflowHostConfiguration | format-list
    
    FreePhysicalMemoryInMB    : 35502
    NumberOfLogicalProcessors : {64, 64}
    DiskInfo                  : @{Drive=C:; FreeSizeInGB=798}
    GpuInfo                   : @{Count=1; SupportedPassthroughTypes=System.Object[]; Name=NVIDIA RTX A2000}
    
  5. Deploy EFLOW.

    Deploying EFLOW will set up the EFLOW runtime and virtual machine.

    By default, EFLOW only reserves 1024MB of system memory for use for the workloads and that is insufficient to support GPU accelerated configurations. For GPU acceleration, you will have to reserve system memory explicitly at EFLOW deployment; otherwise there will not be sufficient system memory for your containerized applications to run. In order to prevent out of memory errors, reserve memory explicitly as required; see example below. (Refer to command line argument options available for deploying EFLOW in the official documentation for more details).

1.2.3. CUDA支持的先决条件

平台特定的其他先决条件也适用。请参阅https://learn.microsoft.com/en-us/azure/iot-edge/gpu-acceleration?view=iotedge-1.4

1.3. 连接EFLOW虚拟机

Get-EflowVmAddr

[10/13/2022 11:41:16] Querying IP and MAC addresses from virtual machine (IPP1-1490-EFLOW)

 - Virtual machine MAC: 00:15:5d:b2:40:c7
 - Virtual machine IP : 172.24.14.242 retrieved directly from virtual machine
00:15:5d:b2:40:c7
172.24.14.242

Connect-EflowVm

1.4. 运行nvidia-smi

nvidia-smi

1.5. 运行GPU加速容器

让我们运行一个来自NGC的容器化CUDA示例——N体模拟,但这次是在EFLOW环境中进行。

iotedge-user@IPP1-1490-EFLOW [ ~ ]$ sudo docker run --gpus all --env NVIDIA_DISABLE_REQUIRE=1 nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

Unable to find image 'nvcr.io/nvidia/k8s/cuda-sample:nbody' locally
nbody: Pulling from nvidia/k8s/cuda-sample
22c5ef60a68e: Pull complete
1939e4248814: Pull complete
548afb82c856: Pull complete
a424d45fd86f: Pull complete
207b64ab7ce6: Pull complete
f65423f1b49b: Pull complete
2b60900a3ea5: Pull complete
e9bff09d04df: Pull complete
edc14edf1b04: Pull complete
1f37f461c076: Pull complete
9026fb14bf88: Pull complete
Digest: sha256:59261e419d6d48a772aad5bb213f9f1588fcdb042b115ceb7166c89a51f03363
Status: Downloaded newer image for nvcr.io/nvidia/k8s/cuda-sample:nbody
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
        -fullscreen       (run n-body simulation in fullscreen mode)
        -fp64             (use double precision floating point values for simulation)
        -hostmem          (stores simulation data in host memory)
        -benchmark        (run benchmark to measure performance)
        -numbodies=<N>    (number of bodies (>= 1) to run in simulation)
        -device=<d>       (where d=0,1,2.... for the CUDA device to use)
        -numdevices=<i>   (where i=(number of CUDA devices > 0) to use for simulation)
        -compare          (compares simulation results running once on the default GPU and once on the CPU)
        -cpu              (run n-body simulation on the CPU)
        -tipsy=<file.bin> (load a tipsy model file for simulation)

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
GPU Device 0: "Ampere" with compute capability 8.6

> Compute 8.6 CUDA device: [NVIDIA RTX A2000]
26624 bodies, total time for 10 iterations: 31.984 ms
= 221.625 billion interactions per second
= 4432.503 single-precision GFLOP/s at 20 flops per interaction
iotedge-user@IPP1-1490-EFLOW [ ~ ]$

1.6. 故障排除

nvidia-container-cli: 需求错误: 不满足条件: cuda>=11.7", 需要添加 "--env NVIDIA_DISABLE_REQUIRE=1"

在启动容器时,无法从主机上的驱动程序正确确定CUDA版本。

Out of memory

In case of out of memory errors, increase the system memory reserved by EFLOW. Refer to https://learn.microsoft.com/en-us/azure/iot-edge/reference-iot-edge-for-linux-on-windows-functions#deploy-eflow.

2. 通知

2.1. 注意事项

本文档仅供信息参考之用,不应视为对产品功能、状态或质量的保证。NVIDIA公司(“NVIDIA”)对本文件所含信息的准确性或完整性不作任何明示或暗示的陈述或保证,并对其中可能存在的错误不承担任何责任。NVIDIA对于因使用此类信息而产生的后果、或因使用该信息导致的第三方专利或其他权利侵权概不负责。本文件不构成对开发、发布或交付任何材料(定义见下文)、代码或功能的承诺。

NVIDIA保留随时对本文件进行更正、修改、增强、改进以及任何其他变更的权利,恕不另行通知。

客户在下单前应获取最新的相关信息,并确认这些信息是最新且完整的。

除非NVIDIA与客户授权代表签署的单独销售协议中另有约定,否则NVIDIA产品的销售均以订单确认时提供的NVIDIA标准销售条款和条件为准(以下简称"销售条款")。NVIDIA特此明确反对将任何客户通用条款适用于本文件所述NVIDIA产品的采购。本文件不直接或间接构成任何合同义务。

NVIDIA产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于那些可以合理预期NVIDIA产品故障或失灵会导致人身伤害、死亡、财产或环境损害的应用场景。NVIDIA对于在此类设备或应用中使用和/或包含NVIDIA产品不承担任何责任,因此客户需自行承担相关风险。

NVIDIA不声明或保证基于本文档的产品适用于任何特定用途。NVIDIA未必会对每个产品的所有参数进行测试。客户应全权负责评估和确定本文档所含信息的适用性,确保产品适合并满足客户计划的应用需求,并执行必要的应用测试以避免应用或产品出现故障。客户产品设计中的缺陷可能会影响NVIDIA产品的质量和可靠性,并可能导致超出本文档范围的其他或不同的条件和/或要求。对于任何因以下原因导致的故障、损坏、成本或问题,NVIDIA不承担任何责任:(i) 以违反本文档的任何方式使用NVIDIA产品或(ii) 客户产品设计。

本文档不授予任何NVIDIA专利权、版权或其他NVIDIA知识产权的明示或暗示许可。NVIDIA发布的关于第三方产品或服务的信息,不构成NVIDIA对这些产品或服务的使用许可或担保认可。使用此类信息可能需要获得第三方基于其专利或其他知识产权的许可,或需要获得NVIDIA基于其专利或其他知识产权的许可。

本文件中的信息仅可在获得NVIDIA事先书面批准、未经改动完整复制且完全符合所有适用的出口法律法规,并附带所有相关条件、限制和声明的情况下进行复制。

本文件及所有NVIDIA设计规格、参考板、文件、图纸、诊断工具、清单和其他文档(统称及单独称为"材料")均以"现状"提供。NVIDIA不对材料作出任何明示或默示的保证,包括但不限于对不侵权、适销性和特定用途适用性的默示保证免责。在法律允许的最大范围内,NVIDIA不就因使用本文件导致的任何损害承担责任,包括但不限于任何直接、间接、特殊、附带、惩罚性或后果性损害,无论损害成因如何,也无论责任理论为何,即使NVIDIA已被告知发生此类损害的可能性。不论客户因任何原因可能遭受的任何损害,NVIDIA对客户就本文所述产品的全部及累计责任应受产品销售条款的限制。

2.2. OpenCL

OpenCL是苹果公司的商标,经Khronos Group Inc.授权使用。

2.3. 商标

NVIDIA和NVIDIA标识是美国及其他国家NVIDIA公司的商标或注册商标。其他公司及产品名称可能是其各自关联公司的商标。