Qualcomm Cloud AI SDK 用户指南(4)
2.4 虚拟机管理程序 - Cloud AI 100
管理程序
KVM
基于内核的虚拟机 (KVM) 是 Linux 内核中的一个模块,允许 Linux 操作系统作为虚拟机管理程序运行。这使得 Linux 的本机安装能够充当虚拟机的主机。结合 QEMU 和 libVirt,KVM 虚拟机模拟一个完全独立的系统,该系统可以限制为主机硬件的子集,并且还可以运行与主机完全不同的操作系统。
KVM 的概述位于https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine。
虚拟机的好处是隔离性强。虚拟机与其他虚拟机以及主机隔离。这种隔离提供了高级别的安全性,因为虚拟机中的一个应用程序可能不知道它位于虚拟机中,更不用说可能存在具有其他应用程序的其他虚拟机。此外,虚拟机还提供与主机的分离。
即使虚拟机中的驱动程序使整个虚拟机崩溃,该崩溃也不会导致主机崩溃,因此将允许其他虚拟机中的其他服务继续运行。
这些好处的成本是设置系统的额外开销。此外,在运行时虚拟机和本机硬件之间可能需要额外的处理。
AIC100 仅支持 PCIe 直通虚拟机。这意味着虚拟机完全拥有AIC100设备。AIC100 设备无法在虚拟机之间或虚拟机与本机主机之间共享。
KVM 虚拟机的通用设置和操作不在本文档的讨论范围之内。本文档假设读者熟悉这些操作,因此仅解释与将 AIC100 设备分配给 KVM 虚拟机直接相关的元素。
AIC100 仅支持此处列出的操作系统作为在虚拟机中作为来宾操作系统运行的操作系统。
在虚拟机内,AIC100仍然需要分配32个消息信号中断(MSI)才能运行,这需要虚拟机模拟IOMMU。在创建虚拟机期间,必须将虚拟机配置为模拟可模拟 IOMMU 的系统。
“q35”系统就是这样的系统之一。如果使用“virt-install”,则可以通过在 virt-install 命令中添加“—machine=q35”来创建基于 q35 的虚拟机。
本节的其余部分假设虚拟机是使用 virt-install 和 –machine=q35 选项创建的。其他系统可能需要与所描述的配置不同的配置才能获得相同的最终效果。
创建虚拟机后,必须对其进行配置。这可以在虚拟机未运行时使用“virsh edit”命令来完成。有关更多详细信息,请参阅virsh 手册页。
虚拟机配置必须将模拟的 IOMMU 呈现给虚拟机中的来宾操作系统,并且虚拟机必须传入 AIC100 设备。
首先,要将 IOMMU 呈现给来宾操作系统,请将以下元素添加到配置 XML:
- 在拆分模式下配置 ioapic 驱动程序以进行中断重新映射。这是通过添加“” 在 XML 的“功能”部分下。
- 将模拟 IOMMU 配置为启用中断重新映射功能。这是通过在 XML 的“features”部分下添加以下代码片段来完成的:
<iommu model='intel'>
<driver caching_mode='on' intremap='on'/>
</iommu>
其次,配置通过什么设备传递给虚拟机来宾操作系统。
- 在主机中使用“lspci”获取AIC100设备的PCIe SBDF地址。
- 将步骤 1 中获取的设备地址添加到 XML 的“设备”部分,如下所示,但更改地址标记值以匹配您的特定系统的地址标记值。
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0' bus='0x0' slot='0x19' function='0x0'/>
</source>
</hostdev>
进行这些编辑后,保存配置。下次启动虚拟机时,您将在虚拟机中的 lspci 输出中观察到 AIC100 设备。它将具有与主机不同的 PCIE SBDF 地址。按照与操作本机系统相同的方式安装 AIC100 Platform SDK 和 Apps SDK。
Hyper-V
Hyper-V 是一种通常与 Microsoft Windows Server 一起使用的虚拟化管理程序。这使得 Windows Server 的本机安装能够充当虚拟机的主机。虚拟机模拟一个完全独立的系统,可以限制为主机硬件的一个子集,也可以运行与主机完全不同的操作系统。
Hyper-V 的概述位于https://en.wikipedia.org/wiki/Hyper-V。
虚拟机的好处是隔离性强。虚拟机与其他虚拟机以及主机隔离。这种隔离提供了高级别的安全性,因为虚拟机中的一个应用程序可能不知道它位于虚拟机中,更不用说可能存在具有其他应用程序的其他虚拟机。此外,虚拟机还提供与主机的分离。即使虚拟机中的驱动程序使整个虚拟机崩溃,该崩溃也不会导致主机崩溃,因此将允许其他虚拟机中的其他服务继续运行。
这些好处的成本是设置系统的额外开销。此外,在运行时虚拟机和本机硬件之间可能需要额外的处理。
AIC100 仅支持 PCIe 直通虚拟机,这意味着虚拟机完全拥有 AIC100 设备。AIC100 设备无法在虚拟机之间或虚拟机与本机主机之间共享。
Hyper-V 虚拟机的一般设置和操作不在本文档的讨论范围之内。本文档假设读者熟悉这些操作,因此仅解释与将 AIC100 设备分配给 Hyper-V 虚拟机直接相关的元素。
AIC100 仅支持此表中列出的操作系统作为在虚拟机中作为来宾操作系统运行的操作系统。
在虚拟机内,AIC100 仍需要分配 32 个消息信号中断 (MSI) 才能运行。Hyper-V 不支持在虚拟机的来宾操作系统中模拟 IOMMU。
但是,Hyper-V 支持半虚拟化 PCIe 根控制器,该控制器在 Linux 内核中具有驱动程序。该驱动程序使用 Hyper-V 虚拟机管理程序来配置主机 IOMMU,以便为 AIC100 等设备提供 MSI。
AIC100 需要对 Linux 内核中的 Hyper-V PCIe 根控制器驱动程序进行以下修复才能正常运行:
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.19-rc7&id=08e61e861a0e47e5e1a3fb78406afd6b0cea6b6d
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.19-rc7&id=455880dfe292a2bdd3b4ad6a107299fce610e64b
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.19-rc7&id=b4b77778ecc5bfbd4e77de1b2fd5c1dd3c655f1f
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.19-rc7&id=a2bad844a67b1c7740bda63e87453baf63c3a7f7
请咨询您的 Linux 发行版的提供商,以确认您的 Linux 发行版所使用的 Linux 内核中存在这些修复程序。创建 Hyper-V 虚拟机后,必须将 AIC100 设备分配给该虚拟机。Hyper-V 将此称为直接设备分配 (DDA),它与 PCIe 直通相同。将 AIC100 设备分配给 Hyper-V 虚拟机,如下所示:
- 配置虚拟机停止操作。
- 在 Windows 中禁用该设备。
- 从 Windows 卸载设备。此步骤需要使用“-force”选项。AIC100目前没有分区驱动程序。这可能会在将来提供。
- 将设备添加到虚拟机。
有关这些步骤的详细信息可以在以下 DDA 资源中找到:
- https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/deploy/deploying-graphics-devices-using-dda
- https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/deploy/deploying-storage-devices-using-dda
要识别要禁用和卸载的 AIC100 设备,请查找“硬件 ID”属性中具有以下内容的设备:
PCI\VEN_17CB&DEV_A100&SUBSYS_A10017CB&REV_00
将 AIC100 设备分配给虚拟机后,下次启动虚拟机时,它应该出现在虚拟机的 lspci 输出中。它将具有与主机不同的 PCIE SBDF 地址。按照与操作本机系统相同的方式安装 AIC100 软件。
ESXi
ESXi 是 VMWare 的虚拟化管理程序。有关如何创建虚拟机 (VM) 的说明,请参阅 ESXi 文档。
在打开虚拟机电源并安装来宾操作系统之前,需要更改一些设置以将一张或多张 AI 100 卡分配给虚拟机。要激活直通,请按照以下步骤操作。
- 转到左侧栏上的“主机”->“管理”选项卡。然后单击“硬件”选项卡。
- 搜索“高通”。所有已安装的 AI 100 卡都应该显示。
- 检查卡片并单击“切换直通”。然后,每张卡的 Passthrough 属性下都应列出“Active”。
- 按照 ESXi 文档中的说明创建虚拟机。在“虚拟硬件”下,“添加其他设备”,然后选择“pci 设备”。这将为 PCI 设备添加一个新条目。验证此处选择的 AI 100 卡是否正确。对应分配给 VM 的每张 AI 100 卡重复此过程。
- 设置现已完成,VM 可以启动。它应该自动引导来宾操作系统 ISO 并启动安装程序。选择相关虚拟机后,控制台预览将显示在虚拟机选项卡中。可以单击预览来展开并用作虚拟机的界面。像任何其他系统一样浏览操作系统安装程序。
2.5 Docker - Cloud AI 100
介绍
Docker是一款允许用户通过软件容器构建、测试和部署应用程序的产品。Docker for Cloud AI 100 打包了 Platform SDK、Apps SDK(仅限 x86-64)、库、系统工具等,使用户能够无缝导航推理工作流程。
笔记
Docker 容器需要 Cloud AI 设备驱动程序才能与设备进行通信。在主机裸机操作系统或虚拟机上安装 Platform SDK。
Docker 脚本位于 Apps SDK 文件夹中tools/docker-build。构建 QAic Docker 镜像的脚本由以下结构组成。
├── build_image.sh
├── caffe
│ ├── detection-output.patch
│ ├── Dockerfile.ubuntu18
│ ├── makefile.config.patch
│ └── mkldnn.patch
├── config
│ ├── aarch64
│ │ ├── Dockerfile.centos8
| | ├── Dockerfile.triton
│ │ └── Dockerfile.ubuntu18
│ ├── qaic_pytools
│ │ └── pytools.dockerfile
│ ├── qms_agent
│ │ └── qms_agent.dockerfile
│ └── x86_64
│ | ├── Dockerfile.centos8
│ | ├── Dockerfile.triton
│ | ├── Dockerfile.ubuntu18
| | ├── Dockerfile.centos7
| | ├── Dockerfile.ubuntu20
| | └── Dockerfile.ubuntu22
| └── qinf
| | └── qinf.dockerfile
| └── aimet
| └── aimet.dockerfile
├── README.md
构建 Docker 镜像
从 Qualcomm 网站下载 Apps SDK 和 Platform SDK。请参见平台SDK下载和应用SDK下载。解压 Apps SDK 和构建脚本位于/tools/docker-build/
unzip qaic-apps-1.10.0.193.zip
cd qaic-apps-1.10.0.193/tools/docker-build/
QAic docker 构建脚本用于使用 Cloud AI 100 Apps SDK 和 Cloud AI 100 Platform SDK 以及受支持的操作系统创建新的 docker 映像。
构建docker镜像的命令是:
build_image.sh [ --mirror (Optional) <docker-registry-mirror-location> ] [ --apps-sdk (Optional) <apps-sdk-zip-file-path> ] [ --platform-sdk <platform-sdk-zip-file-path> ] [ --install-pkgs <install-pkgs-zip-file-path> ] [ --tag <tag for the created image> ][ --os <centos8/centos7/ubuntu18> ] [--arch (Optional) <aarch64/x86_64>] [--install-qaic-pytools] [--install-caffe] [--install-aimet] [--install-qms-agent] [--install-python-sdk]
用法:
apps-sdk: specifies path to the zip file of apps sdk (Optional argument)
platform-sdk: specifies path to the zip file of platform sdk
install-pkgs: specifies path to the zip file of install-pkgs (Required for aarch64 based systems)
tag: specifies the tag name to build the image with. (Default: “latest”).
os: centos8/centos7/ubuntu18. (Default: centos8)
arch: aarch64/x86_64. (Default: host arch)
install-qaic-pytools: Option to install qaic-pytools
install-caffe: whether to install caffe along with pytools
例如:
./build_image.sh --apps-sdk ~/qaic-apps-1.10.0.193.zip --platform-sdk ~/qaic-platform-sdk-1.10.0.193.zip --tag "1.10.0.193" --os ubuntu20 --install-qaic-pytools
要检查使用上述脚本创建的 docker 映像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qaic-ubuntu20-x86_64  1.10.0.193 64a78fa17164 About a minute ago 13GB
创建容器
使用上面创建的 docker 镜像创建容器:
$ docker run -dit --name <container name> --device=<AIC device that want to pass to the container> <docker image name>:<tag>
例如:
$ docker run -dit --name qaic-ubuntu20-x86_64 --device=/dev/qaic_aic100_0 qaic-ubuntu20-x86_64:1.10.0.193
要传递多个 Cloud AI 设备,请使用–device与要传递到容器的设备数量相同的次数。
例如:
$ docker run -dit --name qaic-ubuntu20-x86_64 --device=/dev/qaic_aic100_0 --device=/dev/qaic_aic100_1 qaic-ubuntu20-x86_64:1.10.0.193
检查创建的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae6a9e34c519 qaic-ubuntu20-x86_64:1.10.0.193 "/bin/bash" 8 seconds ago Up 6 seconds qaic-ubuntu20-x86_64
执行容器
使用容器 ID 执行在上述步骤中创建的容器:
$ docker exec -it <container ID> /bin/bash
例如:
$ docker exec -it ae6a9e34c519 /bin/bash
这会将 bash shell 带入容器内。
从容器中查询Cloud AI设备:
$ /opt/qti-aic/tools/qaic-util -q
这应该只显示一个处于就绪状态的设备“QID 0”,因为我们只将一个设备传递给容器。
从 x86_64 构建适用于 aarch64 的 Docker
当传递 --arch 选项时,主机操作系统与请求的架构不同,
请使用 qemu 设置 docker multiarch 的主机。
- Ubuntu主机
[user@localhost qaic-docker]$ sudo apt install qemu binfmt-support qemu-user-static
[user@localhost qaic-docker]$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
// Check the setup
[user@localhost qaic-docker]$ docker run --rm -t --platform=linux/arm64 <image name> uname -m
The above should give the architecture as aarch64
- CentOS主机
[user@localhost qaic-docker]$ sudo apt install qemu qemu-kvm
[user@localhost qaic-docker]$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
// Check the setup
[user@localhost qaic-docker]$ docker run --rm -t --platform=linux/arm64 <image name> uname -m
The above should give the architecture as aarch64