diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/4-\346\265\213\350\257\225CSV\350\231\232\346\213\237\346\234\272\347\233\264\351\200\232DCU.md" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/4-\346\265\213\350\257\225CSV\350\231\232\346\213\237\346\234\272\347\233\264\351\200\232DCU.md" index d8d862bd6e23dff6e893fe8cd0a9d4bbb342eee4..f50d04374c8c54314c688664b12e1ddc4276838a 100644 --- "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/4-\346\265\213\350\257\225CSV\350\231\232\346\213\237\346\234\272\347\233\264\351\200\232DCU.md" +++ "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/4-\346\265\213\350\257\225CSV\350\231\232\346\213\237\346\234\272\347\233\264\351\200\232DCU.md" @@ -1,11 +1,22 @@ 测试之前,请参考[2-1-安装CSV软件](https://openanolis.cn/sig/Hygon-Arch/doc/865622260278236994?lang=zh)准备软件环境。 -## 功能描述 -某些应用场景需要在CSV虚拟机中运行图像识别、机器学习等算法,这些场景下使用DCU加速卡可以极大地提高计算性能,CSV虚拟机支持设备直通,可以将DCU卡直通给CSV虚拟机使用。CSV虚拟机和DCU卡之间通过PCIE总线传输数据,传输的数据被DCU软件栈加密,密钥由安全处理器管理。DCU支持显存隔离功能,用户数据放在隔离显存中处理,SDMA无法访问。 +# 功能描述 +某些应用场景需要在CSV虚拟机中运行图像识别、机器学习等算法,这些场景下使用DCU加速卡可以极大地提高计算性能,CSV虚拟机支持设备直通,可以将DCU卡直通给CSV虚拟机使用。 +本文档包含三部分内容: -## 测试CSV虚拟机使用DCU卡 +* DCU直通CSV虚拟机 + + 将DCU直通到CSV虚拟机,在CSV的机密环境中运行DCU。 + +* 全机密模式 + + 作为DCU直通CSV的增强版,CSV虚拟机和DCU卡之间通过PCIE总线传输数据,传输的数据被DCU软件栈加密,密钥由安全处理器管理。DCU支持显存隔离功能,用户数据放在隔离显存中处理,SDMA无法访问。 + +* DCU attestation + + DCU attestation用来向CSV用户证明DCU卡是真实的海光DCU,而不是伪造的DCU。 我们使用qemu启动CSV虚拟机,借助vfio将DCU直通给CSV虚拟机,就可以在CSV虚拟机中直接使用DCU设备。 @@ -13,238 +24,236 @@ -### 启动DCU直通CSV虚拟机 +# 测试DCU直通CSV虚拟机 + +## 搭建测试环境 + +### Host启动CSV虚拟机 * Host上安装DCU的fixup header插件 -请确认Host上是否已安装DCU fixup header插件。 + 请确认Host上是否已安装DCU fixup header插件。 -```sh -cat /sys/module/hycu_pci_fixup_header/version -0.4.4 -``` + ```sh + $ cat /sys/module/hycu_pci_fixup_header/version + 0.4.4 + ``` -如果上面命令有打印输出,表明Host已经安装了,就不用再次安装了。 + 如果上面命令有打印输出,表明Host已经安装了,就不用再次安装了。 -从`光合开发社区`主页的`工具包`页面,下载DCU的fixup header插件,文件名为`hycu_pci_fixup_header_{version}.bin`,并在Host上安装。 + 从`光合开发社区`主页的`工具包`页面,下载DCU的fixup header插件,文件名为`hycu_pci_fixup_header_{version}.bin`,并在Host上安装。 -以`hycu_pci_fixup_header_0.4.4.bin`为例: + 以`hycu_pci_fixup_header_0.4.4.bin`为例: -```sh -chmod +x hycu_pci_fixup_header_0.4.4.bin -sudo ./hycu_pci_fixup_header_0.4.4.bin -``` + ```sh + $ chmod +x hycu_pci_fixup_header_0.4.4.bin + $ sudo ./hycu_pci_fixup_header_0.4.4.bin + ``` -安装完成后,验证当前fixup header版本,显示为0.4.4: + 安装完成后,验证当前fixup header版本,显示为0.4.4: -```sh -cat /sys/module/hycu_pci_fixup_header/version -0.4.4 -``` + ```sh + $ cat /sys/module/hycu_pci_fixup_header/version + 0.4.4 + ``` -> **注意:** -> -> 1. 老版本的fixup header名为hydcu_pci_fixup_header_{version}.bin,可以从`光合开发社区->DCU直通插件->previous_tool`中下载到。 ->2. 如果更改host kernel,如使用其他版本的Kernel,或者重新编译host kernel,必须要重新安装fixup header插件才能生效。 + > **注意:** + > + > 1. 老版本的fixup header名为hydcu_pci_fixup_header_{version}.bin,可以从`光合开发社区->DCU直通插件->previous_tool`中下载到。 + > 2. 如果更改host kernel,如使用其他版本的Kernel,或者重新编译host kernel,必须要重新安装fixup header插件才能生效。 * 查看DCU设备的Vendor ID和Device ID -通过下面命令找到DCU设备的Device ID和Vendor ID: + 通过下面命令找到DCU设备的Device ID和Vendor ID: -```sh -lspci -nn | grep -e "Display" -e "Co-processor" | grep "Haiguang" -03:00.0 Display controller [0380]: Chengdu Haiguang IC Design Co., Ltd. Device [1d94:53b7] (rev 01) -``` + ```sh + $ lspci -nn | grep -e "Display" -e "Co-processor" | grep "Haiguang" + 03:00.0 Display controller [0380]: Chengdu Haiguang IC Design Co., Ltd. Device [1d94:53b7] (rev 01) + ``` -可以看到,示例设备的VendorID为**1d94**,Device Id为**53b7**。 + 可以看到,示例设备的VendorID为**1d94**,Device Id为**53b7**。 -> 注意:不同的DCU卡的Device ID不同,以实际为准。下面操作中用DCU实际的Device Id替换53b7。 + > 注意:不同的DCU卡的Device ID不同,以实际为准。下面操作中用DCU实际的Device Id替换53b7。 * Host加载VFIO驱动 -执行下面命令,在Host加载VFIO驱动: + 执行下面命令,在Host加载VFIO驱动: -```sh -sudo modprobe vfio_virqfd -sudo modprobe vfio_pci -sudo modprobe vfio_iommu_type1 -sudo modprobe vfio -``` + ```sh + $ sudo modprobe vfio_virqfd + $ sudo modprobe vfio_pci + $ sudo modprobe vfio_iommu_type1 + $ sudo modprobe vfio + ``` -> **注意**:每次重启host后,启动虚拟机前,需要加载vfio驱动。 + > **注意**:每次重启host后,启动虚拟机前,需要加载vfio驱动。 * 将DCU绑定到VFIO驱动 -对于DCU直通虚拟机,在Host上,DCU使用VFIO驱动,我们需要将DCU绑定到VFIO驱动。 + 对于DCU直通虚拟机,在Host上,DCU使用VFIO驱动,我们需要将DCU绑定到VFIO驱动。 -如果在Host上已经加载的DCU驱动,那么在将DCU绑定VFIO驱动之前,还需要将DCU和DCU驱动解绑。 + 如果在Host上已经加载的DCU驱动,那么在将DCU绑定VFIO驱动之前,还需要将DCU和DCU驱动解绑。 -可以通过下面命令查看DCU当前绑定的驱动: + 可以通过下面命令查看DCU当前绑定的驱动: -``` -$ lspci -s 03:00.0 -v | grep "Kernel driver" + ```sh + $ lspci -s 03:00.0 -v | grep "Kernel driver" + ``` -``` + 如果输出位空,那么表明当前Host上DCU没有绑定到到任何驱动,可以直接将DCU绑定到VFIO驱动。 -如果输出位空,那么表明当前Host上DCU没有绑定到到任何驱动,可以直接将DCU绑定到VFIO驱动。 + 如果DCU已经绑定到DCU驱动,上面命令的输出为: -如果DCU已经绑定到DCU驱动,上面命令的输出为: + ```sh + $ lspci -s 03:00.0 -v | grep "Kernel driver" + Kernel driver in use: hydcu + ``` -```sh -lspci -s 03:00.0 -v | grep "Kernel driver" - Kernel driver in use: hydcu -``` + 表明DCU当前在使用`hydcu`驱动。我们将DCU和`hydcu`驱动解绑: -表明DCU当前在使用`hydcu`驱动。我们将DCU和`hydcu`驱动解绑: + ```sh + $ echo 0000:03:00.0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver/unbind + ``` -```sh -echo 0000:03:00.0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/driver/unbind -``` + 执行命令后,可以再次通过命令`lspci -s 03:00.0 -v | grep "Kernel driver"`验证,此时该命令输出为空。 -执行命令后,可以再次通过命令`lspci -s 03:00.0 -v | grep "Kernel driver"`验证,此时该命令输出为空。 + 可以使用命令` sudo systemctl disable hymgr.service`永久禁止Host自动加载DCU驱动,需重启host才能生效。 -可以使用命令` sudo systemctl disable hymgr.service`永久禁止Host自动加载DCU驱动,需重启host才能生效。 + 最后,执行下面命令将DCU绑定到VFIO驱动,再次查看DCU的当前驱动为`vfio-pci`: -最后,执行下面命令将DCU绑定到VFIO驱动,再次查看DCU的当前驱动为`vfio-pci`: + ```sh + $ echo 1d94 53b7 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id + $ lspci -s 03:00.0 -v | grep "Kernel driver" + Kernel driver in use: vfio-pci + ``` -```sh -echo 1d94 53b7 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id -lspci -s 03:00.0 -v | grep "Kernel driver" - Kernel driver in use: vfio-pci -``` + 同时也可以看到,在目录`/dev/vfio`下会产生名为DCU设备所在iommu group的ID文件,例如,本机上DCU的iommu group为16,显示如下: -同时也可以看到,在目录`/dev/vfio`下会产生名为DCU设备所在iommu group的ID文件,例如,本机上DCU的iommu group为16,显示如下: + ```sh + $ ls /dev/vfio + 16 vfio + ``` -```sh -ls /dev/vfio -16 vfio -``` - -> **注意**:每次重启host后,启动虚拟机前,需要重新绑定DCU到VFIO驱动。 + > **注意**:每次重启host后,启动虚拟机前,需要重新绑定DCU到VFIO驱动。 * 启动CSV虚拟机 -经过前面的准备工作,我们在Host上将DCU设备绑定到VFIO驱动,现在可以通过qemu启动CSV虚拟机,将DCU直通到虚拟机中。 + 经过前面的准备工作,我们在Host上将DCU设备绑定到VFIO驱动,现在可以通过qemu启动CSV虚拟机,将DCU直通到虚拟机中。 -执行下面命令启动CSV虚拟机: + 执行下面命令启动CSV虚拟机: -```sh -sudo qemu-system-x86_64 -name csv-vm --enable-kvm -cpu host -m 6G -nographic \ - -hda /opt/hygon/csv/vm.qcow2 \ - -drive if=pflash,format=raw,unit=0,file=/opt/hygon/csv/OVMF_CODE.fd,readonly=on \ - -object sev-guest,id=sev0,policy=0x1,cbitpos=47,reduced-phys-bits=5 \ - -machine memory-encryption=sev0 \ - -qmp tcp:127.0.0.1:2222,server,nowait -vnc 0.0.0.0:1 \ - -netdev bridge,br=virbr0,id=net0 -device virtio-net-pci,netdev=net0,romfile= \ - -device vfio-pci,host=03:00.0 \ - -fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=131072 -``` + ```sh + $ sudo qemu-system-x86_64 -name csv-vm --enable-kvm -cpu host -m 6G -nographic \ + -hda /opt/hygon/csv/vm.qcow2 \ + -drive if=pflash,format=raw,unit=0,file=/opt/hygon/csv/OVMF_CODE.fd,readonly=on \ + -object sev-guest,id=sev0,policy=0x1,cbitpos=47,reduced-phys-bits=5 \ + -machine memory-encryption=sev0 \ + -qmp tcp:127.0.0.1:2222,server,nowait -vnc 0.0.0.0:1 \ + -netdev bridge,br=virbr0,id=net0 -device virtio-net-pci,netdev=net0,romfile= \ + -device vfio-pci,host=03:00.0 \ + -fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=131072 + ``` -其中,`-device vfio-pci,host=03:00.0` 指定DCU的PCI地址,例程中为`03:00.0`,用户需要更改自己DCU的实际PCI地址。 `-fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=131072`指定vfio mmio bar的大小。 + 其中: -> **注意**: -> -> 1. 不同的DCU的VRAM大小可能不同,此处对于64G的VRAM的DCU,指定`sring=131072`;32G的VRAM的DCU,需要指定更改为`string=65536`。 -> -> 2. 如果有多个DCU卡需要直通到CSV虚拟机,在上述命令中添加一行`-device vfio-pci,host=xx:yy.z` ,xx:yy.z为新增DCU卡的设备地址。 + * `-device vfio-pci,host=03:00.0` 指定DCU的PCI地址,例程中为`03:00.0`,用户需要更改自己DCU的实际PCI地址 + * `-fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=131072`指定vfio mmio bar的大小。 -虚拟机启动后,登录虚拟机,可以通过命令`lspci`查看到DCU设备,说明DCU直通CSV虚拟机成功。 + > **注意**: + > + > 1. 不同的DCU的VRAM大小可能不同,此处对于64G的VRAM的DCU,指定`sring=131072`;32G的VRAM的DCU,需要指定更改为`string=65536`。 + > 2. 如果有多个DCU卡需要直通到CSV虚拟机,在上述命令中添加一行`-device vfio-pci,host=xx:yy.z` ,xx:yy.z为新增DCU卡的设备地址。同时将参数`-fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=131072`按照线性比例调整。 + 虚拟机启动后,登录虚拟机,可以通过命令`lspci`查看到DCU设备,说明DCU直通CSV虚拟机成功。 -### 在CSV虚拟机中安装DCU环境 +### 在CSV虚拟机中安装DCU环境 这一小节说明如何在虚拟机中安装DCU的运行环境,包括安装驱动、DTK软件栈和环境配置。 进入虚拟机终端,确保虚拟机网络畅通。 - - * 安装驱动 -参考光合组织`https://cancon.hpccube.com:65024/6/main/`页面`README.md`文件指导安装驱动。这里以安装`rock-5.7.1-6.2.31-V1.6.3.aio.run`为例。 + 参考光合组织`https://cancon.hpccube.com:65024/6/main/`页面`README.md`文件指导安装驱动。这里以安装`rock-5.7.1-6.2.31-V1.6.3.aio.run`为例。 -进入`光合开发者社区->驱动->dtk-24.04驱动`,下载`rock-5.7.1-6.2.31-V1.6.3.aio.run`。 + 进入`光合开发者社区->驱动->dtk-24.04驱动`,下载`rock-5.7.1-6.2.31-V1.6.3.aio.run`。 -进行安装: + 进行安装: -```sh -chmod +x rock-5.7.1-6.2.31-V1.6.3.aio.run -sudo ./rock-5.7.1-6.2.31-V1.6.3.aio.run -``` + ```sh + $ chmod +x rock-5.7.1-6.2.31-V1.6.3.aio.run + $ sudo ./rock-5.7.1-6.2.31-V1.6.3.aio.run + ``` -安装完成后,禁止虚拟机的selinux。打开`/etc/selinux/config`文件,修改`SELINUX`为`SELINUX=disabled`。 + 安装完成后,禁止虚拟机的selinux。打开`/etc/selinux/config`文件,修改`SELINUX`为`SELINUX=disabled`。 -最后重启虚拟机: + 最后在虚拟机中执行`reboot`,重启虚拟机。 -```sh -reboot -``` + 虚拟机重启后,在虚拟中执行命令验证驱动正确加载: -重启后,在虚拟中执行命令验证驱动正确加载: - -```sh -/opt/hyhal/bin/hy-smi - -============================ System Management Interface ============================= -====================================================================================== -DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode -0 47.0C 15.0W auto 450.0W 0% 0.0% Normal -====================================================================================== -=================================== End of SMI Log =================================== -``` + ```sh + $ /opt/hyhal/bin/hy-smi + + ============================ System Management Interface ============================= + ====================================================================================== + DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode + 0 47.0C 15.0W auto 450.0W 0% 0.0% Normal + ====================================================================================== + =================================== End of SMI Log =================================== + ``` * 安装DTK软件栈 -在光合组织DTK下载页面`https://cancon.hpccube.com:65024/1/main`下载DTK软件。 + 在光合组织DTK下载页面`https://cancon.hpccube.com:65024/1/main`下载DTK软件。 -这里我们选择与上面驱动`dtk-24.04驱动/rock-5.7.1-6.2.31-V1.6.3.aio.run`对应的DTK版本`DTK-24.04.3`为例进行演示。如果要安装其他版本的DTK,请确保DTK和驱动rock的版本匹配。 -在`https://cancon.hpccube.com:65024/1/main/DTK-24.04.3`页面选择适合虚拟机OS的DTK软件。如虚拟机的OS为ubuntu20.04,选择`Ubuntu20.04.1`,进入下载页面下载。 + 这里我们选择与上面驱动`dtk-24.04驱动/rock-5.7.1-6.2.31-V1.6.3.aio.run`对应的DTK版本`DTK-24.04.3`为例进行演示。如果要安装其他版本的DTK,请确保DTK和驱动rock的版本匹配。 + 在`https://cancon.hpccube.com:65024/1/main/DTK-24.04.3`页面选择适合虚拟机OS的DTK软件。如虚拟机的OS为ubuntu20.04,选择`Ubuntu20.04.1`,进入下载页面下载。 -将DTK解压到/opt目录: + 将DTK解压到/opt目录: -```sh -sudo tar zxvf DTK-24.04.3-Ubuntu20.04.1-x86_64.tar.gz -C /opt -``` + ```sh + $ sudo tar zxvf DTK-24.04.3-Ubuntu20.04.1-x86_64.tar.gz -C /opt + ``` -安装完成后,在虚拟机的`/opt`目录下生成`/opt/dtk-24.04.3`目录,其中的文件就是DTK安装后生成的文件。 + 安装完成后,在虚拟机的`/opt`目录下生成`/opt/dtk-24.04.3`目录,其中的文件就是DTK安装后生成的文件。 * 配置环境 -在CSV虚拟机上,需要使能CSV虚拟机相关的环境变量。执行下面命令: + 在CSV虚拟机上,需要使能CSV虚拟机相关的环境变量。执行下面命令: -```sh -echo "hy-virtual -enable-encrypted" | sudo tee -a /opt/dtk-24.04.3/env.sh -``` + ```sh + $ echo "hy-virtual -enable-encrypted" | sudo tee -a /opt/dtk-24.04.3/env.sh + ``` -最后使能dtk的环境变量,执行: + 最后使能dtk的环境变量,执行: -```sh -source /opt/dtk-24.04.3/env.sh -``` + ```sh + $ source /opt/dtk-24.04.3/env.sh + ``` -可以将上面使能dtk环境变量的命令添加的shell的初始化文件。例如,对于bash: + 可以将上面使能dtk环境变量的命令添加的shell的初始化文件。例如,对于bash: -```sh -echo "source /opt/dtk-24.04.3/env.sh" >> ~/.bashrc -source ~/.bashrc -``` + ```sh + $ echo "source /opt/dtk-24.04.3/env.sh" >> ~/.bashrc + $ source ~/.bashrc + ``` -其他的shell,如zsh, csh请自行添加到对应的shell初始化文件中。 + 其他的shell,如zsh, csh请自行添加到对应的shell初始化文件中。 -### 在CSV虚拟机中运行DCU测试程序 +## 在CSV虚拟机中运行DCU测试程序 -这里使用一个简单的向量加法示例演示DCU并行计算。 +这里使用一个简单的向量加法示例演示DCU并行计算。在CSV虚拟机中下载`HIP-Examples`仓库,编译、运行其中的`vectorAdd`测试程序。 ```sh -git clone https://github.com/ROCm-Developer-Tools/HIP-Examples.git -cd HIP-Examples/vectorAdd -make -./vectoradd_hip.exe +$ git clone https://github.com/ROCm-Developer-Tools/HIP-Examples.git +$ cd HIP-Examples/vectorAdd +$ make +$ ./vectoradd_hip.exe System minor 1 System major 9 agent prop name Z200SM_71 @@ -256,9 +265,9 @@ PASSED! -### 在CSV虚拟机中运行基于Ollama运行qwen大模型 +## 在CSV虚拟机中运行Qwen大模型 -本小节演示在CSV虚拟机中基于ollama运行qwen大模型,内容包括安装安装go、安装gcc-10、python3.10、安装pytorch、编译ollama、运行qwen大模型。 +本节演示在CSV虚拟机中基于ollama运行Qwen大模型,内容包括安装安装go、安装gcc-10、python3.10、安装pytorch、编译ollama、运行Qwen大模型。 要求: @@ -268,30 +277,30 @@ PASSED! * 安装go ```sh -wget https://golang.google.cn/dl/go1.23.4.linux-amd64.tar.gz -tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz -export PATH=$PATH:/usr/local/go/bin +$ wget https://golang.google.cn/dl/go1.23.4.linux-amd64.tar.gz +$ tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz +$ export PATH=$PATH:/usr/local/go/bin ``` * 安装gcc-10 ```sh -sudo apt-get update -sudo apt-get -y install gcc-10 g++-10 +$ sudo apt-get update +$ sudo apt-get -y install gcc-10 g++-10 ``` 安装完成后,需要设置默认的gcc、g++为gcc-10、g++-10。 ```sh -sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 -sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 +$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 +$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 ``` 验证默认gcc为gcc-10 ```sh -gcc --version -gcc (Ubuntu 10.5.0-1ubuntu1~20.04) 10.5.0 +$ gcc --version +$ gcc (Ubuntu 10.5.0-1ubuntu1~20.04) 10.5.0 ``` * 安装python3.10 @@ -311,7 +320,7 @@ python3.10 -m venv ~/py_venv 激活python3.10 venv环境 ```sh -source ~/py_venv/bin/activate +$ source ~/py_venv/bin/activate ``` > 注意: 如果使用python venv环境,每次需要在bash中激活venv环境。可以将`source ~/py_venv/bin/activate`放在~/.bashrc中,新开终端自动激活。 @@ -321,7 +330,7 @@ source ~/py_venv/bin/activate 在`光合开发者社区->AI生态包`页面`https://cancon.hpccube.com:65024/4/main`选择与DTK、python版本一直的`pytorch`,此处我们选择适合我们Python3.10的版本`torch-2.1.0+das.opt2.dtk24043-cp310-cp310-manylinux_2_28_x86_64.whl`,在`DAS1.3`中。 ```sh -python3.10 -m pip install https://download.sourcefind.cn:65024/directlink/4/pytorch/DAS1.3/torch-2.1.0+das.opt2.dtk24043-cp310-cp310-manylinux_2_28_x86_64.whl +$ python3.10 -m pip install https://download.sourcefind.cn:65024/directlink/4/pytorch/DAS1.3/torch-2.1.0+das.opt2.dtk24043-cp310-cp310-manylinux_2_28_x86_64.whl ``` > 注意: @@ -333,14 +342,14 @@ python3.10 -m pip install https://download.sourcefind.cn:65024/directlink/4/pyto 安装其他依赖库 ```sh -sudo apt-get -y install libgl1 -python3.10 -m pip install --force-reinstall -v "numpy==1.25.2" +$ sudo apt-get -y install libgl1 +$ python3.10 -m pip install --force-reinstall -v "numpy==1.25.2" ``` 测试torch可以识别到DCU卡 -```python -python3.10 # Enter +```sh +$ python3.10 # Enter Python 3.10.17 (main, Apr 9 2025, 08:54:15) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torch @@ -351,32 +360,32 @@ True * 编译ollama ```sh -git clone http://developer.sourcefind.cn/codes/OpenDAS/ollama.git -b 0.5.7+dtk24.03 --depth 1 -cd ollama -export LIBRARY_PATH=/opt/dtk-24.04.3/lib:$LIBRARY_PATH -make -j${nproc} -go build . +$ git clone http://developer.sourcefind.cn/codes/OpenDAS/ollama.git -b 0.5.7+dtk24.03 --depth 1 +$ cd ollama +$ export LIBRARY_PATH=/opt/dtk-24.04.3/lib:$LIBRARY_PATH +$ make -j${nproc} +$ go build . ``` > 注意:LIBRARY_PATH调整为实际的dtk的路径。 编译时间比较久,请耐心等待。 -* 单卡运行qwen大模型 +* 单卡运行Qwen大模型 在ollama目录中,运行ollama serve ```sh -cd ollama -export HSA_OVERRIDE_GFX_VERSION=9.0.6 # Z100 gfx906对应9.0.6, K100 gfx926对应9.2.6, K100AI gfx928对应9.2.8 -export ROCR_VISIBLE_DEVICES=0 # DCU卡的编号,可以通过hy-smi命令查看DCU卡编号。此处以单卡为例,多卡请看多卡运行qwen大模型小节 -./ollama serve +$ cd ollama +$ export HSA_OVERRIDE_GFX_VERSION=9.0.6 # Z100 gfx906对应9.0.6, K100 gfx926对应9.2.6, K100AI gfx928对应9.2.8 +$ export ROCR_VISIBLE_DEVICES=0 # DCU卡的编号,可以通过hy-smi命令查看DCU卡编号。此处以单卡为例,多卡请看多卡运行Qwen大模型一节 +$ ./ollama serve ``` -另外再开启一个终端,拉取qwen大模型。此处以qwen:7b为例。 +另外再开启一个终端,拉取Qwen大模型。此处以qwen:7b为例。 ```sh -./ollama pull qwen:7b +$ ./ollama pull qwen:7b ``` > 提示:ollama支持的其他模型,可以在`https://ollama.com/search`页面查找。 @@ -384,7 +393,7 @@ export ROCR_VISIBLE_DEVICES=0 # DCU卡的编号,可以通过hy-smi命令查 下载完成后,可以通过`ollama list`命令查看到: ```sh -./ollama list +$ ./ollama list NAME ID SIZE MODIFIED qwen:7b 2091ee8c8d8f 4.5 GB 4 days ago ``` @@ -392,7 +401,7 @@ qwen:7b 2091ee8c8d8f 4.5 GB 4 days ago 最后运行模型: ```sh -./ollama run qwen:7b +$ ./ollama run qwen:7b >>> hello Hello! How can I assist you today? @@ -402,7 +411,7 @@ Hello! How can I assist you today? 通过查看DCU的VRAM显存占用率,确认qwen模型已经在DCU上运行起来了。 ```sh -hy-smi +$ hy-smi ============================ System Management Interface ============================= ====================================================================================== DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode @@ -416,24 +425,24 @@ DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode 在ollama目录中,运行ollama serve ```sh -cd ollama -export HSA_OVERRIDE_GFX_VERSION=9.0.6 # Z100 gfx906对应9.0.6, K100 gfx926对应9.2.6, K100AI gfx928对应9.2.8 -export ROCR_VISIBLE_DEVICES=0,1 # DCU卡的编号,可以通过hy-smi命令查看DCU卡编号。选择编号为0和1的DCU卡 -export OLLAMA_SCHED_SPREAD=True # 允许ollama在多卡之间调度 -./ollama serve +$ cd ollama +$ export HSA_OVERRIDE_GFX_VERSION=9.0.6 # Z100 gfx906对应9.0.6, K100 gfx926对应9.2.6, K100AI gfx928对应9.2.8 +$ export ROCR_VISIBLE_DEVICES=0,1 # DCU卡的编号,可以通过hy-smi命令查看DCU卡编号。选择编号为0和1的DCU卡 +$ export OLLAMA_SCHED_SPREAD=True # 允许ollama在多卡之间调度 +$ ./ollama serve ``` 另外再开启一个终端,运行qwen大模型: ```sh -./ollama run qwen:7b +$ ./ollama run qwen:7b >>> ``` 通过查看DCU的VRAM显存占用率,确认qwen模型已经在DCU上运行起来了。 ```sh -hy-smi +$ hy-smi ============================ System Management Interface ============================= ====================================================================================== DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode @@ -445,47 +454,63 @@ DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode -## 在CSV虚拟机中测试DCU传输加密和显存隔离 +# 测试全机密模式 -**测试以K100 DCU卡为例,如果使用其他型号的DCU卡请联系海光获取对应的软件栈。** +本节在CSV虚拟机中测试DCU传输加密和显存隔离功能。要求在CSV中安装了DCU的软件栈,参考**2.1节搭建测试环境**。 -### 更新DCU驱动 +> 提示:**测试以K100 DCU卡为例,如果使用其他型号的DCU卡请联系海光securitytech@hygon.cn获取对应的软件栈。** -``` -# scp host@hostip:/opt/hygon/csv/dcu/k100_update_driver.sh /root/ -# scp host@hostip:/opt/hygon/csv/dcu/k100_update_dtk.sh /root/ -# chmod +x /root/k100_update_driver.sh -# chmod +x /root/k100_update_dtk.sh -# cd /root -# ./k100_update_driver.sh -``` +## 更新DCU驱动 -### 更新VBIOS +将host上的文件`k100_update_driver.sh`传输到CSV,更新CSV中的DCU驱动。 +```sh +$ scp host@hostip:/opt/hygon/csv/dcu/k100_update_driver.sh /root/ +$ chmod +x /root/k100_update_driver.sh +$ cd /root +$ ./k100_update_driver.sh ``` -# cd /opt/hyhal/vbios -# ./hyflash --index 0 --update ./KM/ai-k100-8275-5.715.001200k.618009-dcurom.bin -# reboot -``` -### 部署大模型 +## 更新DCU的vBIOS + +全机密模式依赖DCU的vBIOS,需要使用支持全机密的vBIOS。 +```sh +$ cd /opt/hyhal/vbios +$ ./hyflash --index 0 --update ./KM/ai-k100-8275-5.715.001200k.618009-dcurom.bin ``` -# systemctl start docker -# docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:vllm0.5.0-dtk24.04.1-ubuntu20.04-py310-20250225 -# docker run --name dcu_vllm -it --privileged --shm-size=8G --device=/dev/kfd --device=/dev/dri/ --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --ulimit memlock=-1:-1 --ipc=host --network host --group-add video -v /opt/hyhal:/opt/hyhal -v /root:/root image.sourcefind.cn:5000/dcu/admin/base/custom:vllm0.5.0-dtk24.04.1-ubuntu20.04-py310-20250225 /bin/bash -# cd /root/ -# ./k100_update_dtk.sh -# python3 -m vllm.entrypoints.api_server --model Qwen/Qwen2.5-3B --tensor-parallel-size 1 --gpu-memory-utilization 0.9 --trust-remote-code --dtype auto --enforce-eager + +更新完成DCU的vBIOS,最好给机器下电,再上电,使得新的vBIOS生效。 + +## 更新DTK + +将host上的文件`k100_update_dtk.sh`传输到CSV,更新CSV中的DTK。 + +```sh +$ scp host@hostip:/opt/hygon/csv/dcu/k100_update_dtk.sh /root/ +$ chmod +x /root/k100_update_dtk.sh +$ cd /root +$ ./k100_update_dtk.sh ``` -### 调用大模型 +## 部署大模型 + +```sh +$ systemctl start docker +$ docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:vllm0.5.0-dtk24.04.1-ubuntu20.04-py310-20250225 +$ docker run --name dcu_vllm -it --privileged --shm-size=8G --device=/dev/kfd --device=/dev/dri/ --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --ulimit memlock=-1:-1 --ipc=host --network host --group-add video -v /opt/hyhal:/opt/hyhal -v /root:/root image.sourcefind.cn:5000/dcu/admin/base/custom:vllm0.5.0-dtk24.04.1-ubuntu20.04-py310-20250225 /bin/bash +$ cd /root/ +$ python3 -m vllm.entrypoints.api_server --model Qwen/Qwen2.5-3B --tensor-parallel-size 1 --gpu-memory-utilization 0.9 --trust-remote-code --dtype auto --enforce-eager ``` -# docker exec -it dcu_vllm /bin/bash -# curl http://localhost:8000/generate -H "Content-Type: application/json" -d '{"prompt": "hello","max_tokens": 128,"temperature": 0.7}' + +## 调用大模型 + +```sh +$ docker exec -it dcu_vllm /bin/bash +$ curl http://localhost:8000/generate -H "Content-Type: application/json" -d '{"prompt": "hello","max_tokens": 128,"temperature": 0.7}' ``` -### 检查软件栈中的加密日志 +## 检查软件栈中的加密日志 CPU和DCU之间传输的数据被软件栈加密,可以看到如下的日志输出。 @@ -496,69 +521,85 @@ Transfer data from DCU to CPU, Data size: 0x800, Encrypt using SM4 -## 测试 DCU Attestation 功能 (DCU远程身份认证功能) +# 测试 DCU Attestation -### 背景 +## 背景 -从深算二号(K100-AI)开始,海光DCU开始支持Attestation(身份认证)功能。
-(DCU驱动版本 rock-kernel-refactory-rock-5.7.1-6.2.26-V1.5.aio.run -https://cancon.hpccube.com:65024/6/main/latest%E9%A9%B1%E5%8A%A8),
-DCU Attestation的目的是向DCU加速器的使用者证明,正在使用中的DCU设备具有真实身份,
-其芯片ID、固件版本、硬件环境等相关数据皆为真实可信,用户可将机密数据下发到DCU中计算,无需担心数据被恶意的加速器窃取。 +从深算二号(K100-AI)开始,海光DCU开始支持Attestation(身份认证)功能,DCU Attestation的目的是向DCU加速器的使用者证明,正在使用中的DCU设备具有真实身份,其芯片ID、固件版本、硬件环境等相关数据皆为真实可信,用户可将机密数据下发到DCU中计算,无需担心数据被恶意的加速器窃取。 -### 机制 +DCU驱动从 rock-kernel-refactory-rock-5.7.1-6.2.26-V1.5.aio.run 开始支持Attestation功能,对应的驱动可以从 [光合组织]( https://cancon.hpccube.com:65024/6/main)下载。 + +## 认证机制 + + 每一颗DCU芯片拥有唯一的芯片ID(ChipID),在芯片生产时烧入,以后无法更改。芯片内置一SM2密钥对(DCEK, DCU Chip Endorsement Key),私钥作为DCU芯片的身份象征,只保存在DCU芯片,永不外泄。公钥被HDSK(海光DCU签名密钥)/HRK(海光根密钥)签名后,存放于海光证书系统中,可公开下载。 ![](../../../assets/dcu_attestation_arch.png) - 每一颗DCU芯片拥有唯一的芯片ID(ChipID),在芯片生产时烧入,以后无法更改。
-芯片内置一SM2密钥对(DCEK, DCU Chip Endorsement Key),私钥作为DCU芯片的身份象征,只保存在DCU芯片,永不外泄。
-公钥被HDSK(海光DCU签名密钥)/HRK(海光根密钥)签名后,存放于海光证书系统中,可公开下载。
+如上图所示,认证过程如下: -步骤一:当CSV虚拟机启动完毕后,用户加载DCU驱动识别DCU卡。用户运行Attestation App通过DCU驱动向DCU卡请求远程认证报告。
-DCU卡生成远程认证报告,内容包含DCU芯片ID,固件版本等信息,并使用DCEK私钥签名,返回给用户。
-步骤二:用户从远程认证报告中取出DCU芯片ID,向海光证书系统请求该芯片的DCEK/HDSK/HRK公钥证书。
-步骤三:用户依次验证HRK->HDSK->DCEK证书链的签名,并使用DCEK证书中的公钥验证远程认证报告的签名。
-全部验证过程正确可认为该DCU芯片为真实的海光芯片,报告中的数据真实可信。
-验证过程中任一步失败,则验证过程失败。 +1. CSV虚拟机启动完毕后,用户加载DCU驱动识别DCU卡。用户运行Attestation App通过DCU驱动向DCU卡请求远程认证报告。DCU卡生成远程认证报告,内容包含DCU芯片ID,固件版本等信息,并使用DCEK私钥签名,返回给用户。 +2. 用户从远程认证报告中取出DCU芯片ID,向海光证书系统请求该芯片的DCEK/HDSK/HRK公钥证书。 +3. 用户依次验证HRK->HDSK->DCEK证书链的签名,并使用DCEK证书中的公钥验证远程认证报告的签名。 -海光提供了Attestation App demo,演示了CSV虚拟机用户向DCU请求认证报告、获取认证报告、下载证书链、
-验证远程报告、验证证书链的全过程。该demo程序仅做展示,用户可根据需要修改或重新编写。
+上述第3步全部验证通过,可认为该DCU芯片为真实的海光芯片,报告中的数据真实可信。验证过程中任一步失败,则验证过程失败。 -### 测试过程 -假设CSV中直通DCU的环境已经搭建完毕,CSV虚拟机能够访问DCU。
-(请依据[4-测试CSV虚拟机直通DCU](https://openanolis.cn/sig/Hygon-Arch/doc/865622222638552866?lang=zh) 搭建环境 ) +海光提供了Attestation demo,演示了CSV虚拟机用户向DCU请求认证报告、获取认证报告、下载证书链、验证远程报告、验证证书链的全过程。该demo程序仅做展示,用户可根据需要修改或重新编写。 -拷贝主机中的测试程序(/opt/hygon/csv/attestation/)到CSV虚拟机中
-目录中的dcu_attestation_demo文件为演示DCU远程证明的示例程序。 +## 测试 -1)如果您的CSV虚拟机能够直接连接海光证书服务器(https://cert.hygon.cn/)
请直接运行 -``` -$./dcu_attestation_demo -``` -示例程序将自动完成DCU认证过程。 +请依据[4-测试CSV虚拟机直通DCU](https://openanolis.cn/sig/Hygon-Arch/doc/865622222638552866?lang=zh) 搭建环境。 -2)如果您的CSV虚拟机无法连接海光证书服务器,则需要手动下载证书后,放置于dcu_attestation_demo程序的所在的目录下,步骤如下:
-2.1)运行demo程序,获取DCU ChipID -``` -$./dcu_attestation_demo -``` -该程序会打印出DCU ChipID,并打印证书下载失败的日志后退出。 -
![](../../../assets/dcu_attestation_chip.png)
-该DCU的ChipID为”T6N6980002080601” +假设CSV中直通DCU的环境已经搭建完毕,CSV虚拟机能够访问DCU。拷贝主机中目录`/opt/hygon/csv/attestation`到CSV虚拟机中,其中的`dcu_attestation_demo.c`为演示DCU远程证明的示例程序。 -2.2)在相同目录下,手动下载该芯片的HSK_CEK证书 -``` -$ curl -s -f -o hsk_cek.cert https://cert.hygon.cn/hsk_cek?snumber=T6N6980002080601 -``` -完成后,在运行程序的目录下,生成hsk_cek.cert文件,文件包含HSK证书和CEK证书
+* 在线远程认证 -2.3)在相同目录下,手动下载HRK证书 -``` -curl -s -f -o ./hrk.cert https://cert.hygon.cn/hrk -``` -完成后,在运行程序的目录下,生成hrk.cert
+ 如果您的CSV虚拟机能够直接连接海光证书服务器(https://cert.hygon.cn/),请直接编运行,示例程序将自动完成DCU认证过程。 -2.4)再次运行attestation demo程序,完成DCU身份验证过程 -``` -$./dcu_attestation_demo -``` + ```sh + $ cd attestation + $ make + $./dcu_attestation_demo + ``` + +* 手动认证 + + 如果您的CSV虚拟机无法连接海光证书服务器,则需要手动下载证书。将下载的证书放置于dcu_attestation_demo程序的所在的目录下,执行下面步骤: + + 1. 运行demo程序,获取DCU ChipID + + ```sh + $ ./dcu_attestation_demo + ``` + + 该程序会打印出DCU ChipID,并打印证书下载失败的日志,然后退出。 + + ```sh + chip_id + T6N69800002080601 + ``` + + 如上日志所示,该DCU的ChipID为”T6N6980002080601”。 + + 2. 在attestation下,手动下载该芯片的HSK_CEK证书 + + ```sh + $ curl -s -f -o hsk_cek.cert https://cert.hygon.cn/hsk_cek?snumber=T6N6980002080601 + ``` + + 命令完成后,在当前目录下生成hsk_cek.cert文件,文件包含HSK证书和CEK证书。 + + 3. 在attestation下,手动下载HRK证书 + + ```sh + $ curl -s -f -o ./hrk.cert https://cert.hygon.cn/hrk + ``` + + 命令完成后,在当前目录下生成hrk.cert。 + + 4. 再次运行attestation demo程序,完成DCU身份验证 + + ```sh + $ ./dcu_attestation_demo + ``` + + diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/4-KATA-3/4-\346\265\213\350\257\225\347\233\264\351\200\232DCU.md" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/4-KATA-3/4-\346\265\213\350\257\225\347\233\264\351\200\232DCU.md" index ee366fe3415f1b3ad650487ed00e90d94ac4bc4a..cd30774b5fec0a82cd8d76973f5eac135c3a5cca 100644 --- "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/4-KATA-3/4-\346\265\213\350\257\225\347\233\264\351\200\232DCU.md" +++ "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/4-KATA-3/4-\346\265\213\350\257\225\347\233\264\351\200\232DCU.md" @@ -17,8 +17,8 @@ #### 2. 检查IOMMU设置成功 -``` -dmesg | grep -i IOMMU +```sh +$ dmesg | grep -i IOMMU ``` 得到类似如下的输出,表示IOMMU设置成功: @@ -47,61 +47,62 @@ dmesg | grep -i IOMMU - 关闭pre-attestation - ``` - sudo sed -i -e 's/^\(guest_pre_attestation =\).*$/\1 false/g' /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml + ```sh + $ sudo sed -i -e 's/^\(guest_pre_attestation =\).*$/\1 false/g' /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml ``` - initrd指向支持offline_fs_kbc模式的initrd(其他initrd为社区增强特性准备) - ``` - sudo sed -i -e 's#^\(initrd\).*=.*$#\1 = \"/opt/confidential-containers/share/kata-containers/kata-containers-initrd-csv-hygon-gpu.img.offline_fs_kbc\"#g' /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml + ```sh + $ sudo sed -i -e 's#^\(initrd\).*=.*$#\1 = \"/opt/confidential-containers/share/kata-containers/kata-containers-initrd-csv-hygon-gpu.img.offline_fs_kbc\"#g' /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml ``` - 禁用sev_kbc模式 由于国内网络目前访问不了dockerhub 需要使用代理,代理参数agent.https_proxy=http://ip:port agent.no_proxy=10.*.*.*,172.*.*.* http://ip:port 为代理地址 - ``` - sudo sed -i -e 's#^\(kernel_params\).*=.*$#\1 = \"agent.https_proxy=http://ip:port agent.no_proxy=10.*.*.*,172.*.*.* agent.aa_kbc_params=offline_fs_kbc::null agent.enable_signature_verification=false \"#g' /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml + ```sh + $ sudo sed -i -e 's#^\(kernel_params\).*=.*$#\1 = \"agent.https_proxy=http://ip:port agent.no_proxy=10.*.*.*,172.*.*.* agent.aa_kbc_params=offline_fs_kbc::null agent.enable_signature_verification=false \"#g' /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml ``` - 设置内存 - ``` - sudo sed -i "s/^default_memory *=.*\$/default_memory = 10240/g" /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml + ```sh + $ sudo sed -i "s/^default_memory *=.*\$/default_memory = 10240/g" /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml ``` ### 部署DCU直通环境 #### 1. 查找DCU设备 +找到DCU设备的PCI 设备标识地址,后面会用到。 + - 找到DCU设备 - ``` - lspci -nn | grep -e "Display" -e "Co-processor" | grep "Haiguang" + ```sh + $ lspci -nn | grep -e "Display" -e "Co-processor" | grep "Haiguang" ``` - 结果如下: 如果是Z100卡,那么显示的是Display,如果是K100/K100-AI卡,显示的是Co-processor” - ``` + ```sh $ lspci -nn | grep -e "Display" -e "Co-processor" | grep "Haiguang" 03:00.0 Display controller: Chengdu Haiguang IC Design Co., Ltd. Device [1d94:53b7] (rev 01) ``` `03:00.0`为该设备的设备标识,其完整信息为: `0000:03:00.0` - #### 2. 使用一键部署脚本,部署DCU环境 -``` -cd /opt/hygon/csv/confidential-containers/scripts +```sh +$ cd /opt/hygon/csv/confidential-containers/scripts # 参数请替换为上一步实际得到的id -sudo ./setup_dcu_passthrough.sh -d 0000:03:00.0 +$ sudo ./setup_dcu_passthrough.sh -d 0000:03:00.0 ``` 该脚本主要实现以下功能: 1. 把指定的DCU设备绑定到VFIO -2. 安装vfio-device-plugin,该插件负责与k8s交互,将vfio device直通进CSV机密容器 +2. 安装`vfio-device-plugin`,该插件负责与k8s交互,将vfio device直通进CSV机密容器 3. 下载DTK,DTK文件较大,直接安装进容器镜像中,会导致镜像太大,本测试中,通过将DTK mount到容器中的方式,来使用 -4. 下载DCU驱动,安装到host上。这个步骤的目的是将/opt/hyhal目录挂载到容器中。 +4. 下载DCU驱动,安装到host上。这个步骤的目的是后面将`/opt/hyhal`目录挂载到容器中。 > 注意: 第4步安装驱动的过程中,如果询问是否更新rock、hyhal、vbios,一律选择'Y'或者'y'。 @@ -109,159 +110,168 @@ sudo ./setup_dcu_passthrough.sh -d 0000:03:00.0 > 注意:示例中的1d94:53b7为第一步lspci -nn中打印出的值,请更新为自己设备的实际值。 +```sh +$ sudo su root +$ sed -i 's!\(^GRUB_CMDLINE_LINUX=.*\)"$!\1 vfio-pci.ids=1d94:53b7"!' /etc/default/grub ``` -sudo su root -sed -i 's!\(^GRUB_CMDLINE_LINUX=.*\)"$!\1 vfio-pci.ids=1d94:53b7"!' /etc/default/grub -``` -### 启动DCU直通的容器 +### 启动DCU直通容器 + +机密容器的DCU的驱动版本为` rock-5.7.1-6.2.31-V1.6.3.aio.run`,对应的DTK版本为`24.04.3`。如果需要改变DCU驱动版本,需要手动编译Kata机密容器的kernel。 - 启动容器 -``` -cat <<-EOF | kubectl apply -f - -apiVersion: v1 -kind: Pod -metadata: - name: ubuntu-dcu -spec: - runtimeClassName: kata-qemu-csv-dcu - containers: - - name: ubuntu-dcu - image: docker.io/pawsonfang/ubuntu-dcu:latest - command: ["tail", "-f", "/dev/null"] - resources: - limits: - dcu/a100: "1" - volumeMounts: - - mountPath: /opt/dtk - name: dtk - - mountPath: /opt/hyhal - name: hyhal - - mountPath: /dev - name: dev - securityContext: - privileged: true - volumes: - - name: dtk - hostPath: - path: /opt/dtk-24.04.1 - - name: hyhal - hostPath: - path: /opt/hyhal - - name: dev - hostPath: - path: /dev -EOF -``` + 我们将host上的`/opt/dtk-24.04.3`目录挂载到容器的`/opt/dtk`目录,将host上的`/opt/hyhal`目录挂载到容器的`opt/hyhal`目录,并给容器分配一个`dcu/k100`卡。 -- 进入容器中,使用DCU之前,需要配置环境变量: + ``` + $ cat <<-EOF | kubectl apply -f - + apiVersion: v1 + kind: Pod + metadata: + name: ubuntu-dcu + spec: + runtimeClassName: kata-qemu-csv-dcu + containers: + - name: ubuntu-dcu + image: haigon.cn/test/ubuntu-dcu:latest + command: ["tail", "-f", "/dev/null"] + resources: + limits: + dcu/k100: "1" + volumeMounts: + - mountPath: /opt/dtk + name: dtk + - mountPath: /opt/hyhal + name: hyhal + - mountPath: /dev + name: dev + securityContext: + privileged: true + volumes: + - name: dtk + hostPath: + path: /opt/dtk-24.04.3 + - name: hyhal + hostPath: + path: /opt/hyhal + - name: dev + hostPath: + path: /dev + EOF + ``` -``` -kubectl exec -it ubuntu-dcu -- bash -HYCONTAINER_ENV=0 /opt/hyhal/bin/hymgr & -source /opt/dtk/env.sh -rocminfo -``` +- 进入容器中,使用DCU之前,需要启动hymgr和使能dtk环境变量 + + ```sh + $ kubectl exec -it ubuntu-dcu -- bash + # ------------- below is container terminal output ------------- + root@ubuntu-dcu:/# HYCONTAINER_ENV=0 HYDISABLE_DRIVEROP=1 /opt/hyhal/bin/hymgr & + root@ubuntu-dcu:/# source /opt/dtk/env.sh + root@ubuntu-dcu:/# rocminfo + ``` - 期望结果(能看到CPU和DCU两个设备): -``` -hygon module is loaded -===================== -HSA System Attributes -===================== -Runtime Version: 1.1 -System Timestamp Freq.: 1000.000000MHz -Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count) -Machine Model: LARGE -System Endianness: LITTLE - -========== -HSA Agents -========== -******* -Agent 1 -******* - Name: Hygon C86 3250 8-core Processor - Uuid: CPU-XX - Marketing Name: Hygon C86 3250 8-core Processor - Vendor Name: HygonGenuine - Feature: None specified - Profile: FULL_PROFILE - Float Round Mode: NEAR - . - . - . -******* -Agent 2 -******* - Name: ZIFANG - Uuid: GPU-XX - Marketing Name: C878186 - Vendor Name: HYGON - Feature: KERNEL_DISPATCH - Profile: BASE_PROFILE - Float Round Mode: NEAR - Max Queue Number: 128(0x80) - Queue Min Size: 4096(0x1000) - Queue Max Size: 131072(0x20000) - Queue Type: MULTI - Node: 1 - Device Type: DCU -. -. -. -*** Done *** -``` + ```sh + hygon module is loaded + ===================== + HSA System Attributes + ===================== + Runtime Version: 1.1 + System Timestamp Freq.: 1000.000000MHz + Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count) + Machine Model: LARGE + System Endianness: LITTLE + + ========== + HSA Agents + ========== + ******* + Agent 1 + ******* + Name: Hygon C86 3250 8-core Processor + Uuid: CPU-XX + Marketing Name: Hygon C86 3250 8-core Processor + Vendor Name: HygonGenuine + Feature: None specified + Profile: FULL_PROFILE + Float Round Mode: NEAR + . + . + . + ******* + Agent 2 + ******* + Name: ZIFANG + Uuid: GPU-XX + Marketing Name: C878186 + Vendor Name: HYGON + Feature: KERNEL_DISPATCH + Profile: BASE_PROFILE + Float Round Mode: NEAR + Max Queue Number: 128(0x80) + Queue Min Size: 4096(0x1000) + Queue Max Size: 131072(0x20000) + Queue Type: MULTI + Node: 1 + Device Type: DCU + . + . + . + *** Done *** + ``` -- 测试完恢复内存设置 +* 测试完恢复内存设置 - ``` - sudo sed -i "s/^default_memory *=.*\$/default_memory = 2048/g" /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml - ``` + ```sh + $ sudo sed -i "s/^default_memory *=.*\$/default_memory = 2048/g" /opt/confidential-containers/share/defaults/kata-containers/configuration-qemu-csv-dcu.toml + ``` ## 常见问题总结 -* 查看pod状态,出现Insufficient dcu/a100 +* 查看pod状态,出现Insufficient dcu/k100 - ``` - Warning Failedscheduling 14s default-scheduler 0/1 nodes are available: 1 Insufficient dcu/a100. preemption: 0/1 nodes are available: 1 NO preemption victim found for incming pod.. - ``` + ``` + Warning Failedscheduling 14s default-scheduler 0/1 nodes are available: 1 Insufficient dcu/k100. preemption: 0/1 nodes are available: 1 NO preemption victim found for incming pod.. + ``` - 该问题产生的直接原因是,DCU直通到kata容器过程中,从vfio device plugin中获取不到DCU资源,导致kata容器启动失败。 + 该问题产生的直接原因是,DCU直通到kata容器过程中,从vfio device plugin中获取不到DCU资源,导致kata容器启动失败。 - 可能的原因是: + 可能的原因是: - * DCU绑定到vfio驱动失败 + * DCU绑定到vfio驱动失败 - 正常情况下,经过执行`./setup_dcu_passthrough.sh -d 0000:bb:dd.ff`之后,在host上的/dev/vfio/目录,会存在设备的group id文件。如下图`/dev/vfio`目录下存在一个group id为16的文件: + 正常情况下,经过执行`./setup_dcu_passthrough.sh -d 0000:bb:dd.ff`之后,在host上的/dev/vfio/目录,会存在设备的group id文件。如下图`/dev/vfio`目录下存在一个group id为16的文件: - ```sh - ls /dev/vfio - 16 vfio - ``` + ```sh + $ ls /dev/vfio + 16 vfio + ``` - 如果该目录下不存在设备的group id文件,那么,需要在host上检查设备绑定vfio驱动是否成功。如过设备正常绑定到vfio驱动,那么lspci会显示设备当前的驱动为`Kernel driver in use: vfio-pci`。 + 如果该目录下不存在设备的group id文件,那么,需要在host上检查设备绑定vfio驱动是否成功。如过设备正常绑定到vfio驱动,那么lspci会显示设备当前的驱动为`Kernel driver in use: vfio-pci`。 - ```sh - lspci -s 0a:00.0 -v - 0a:00.0 Co-processor: Chengdu Haiguang IC Design Co., Ltd. KONGMING (rev 01) - Subsystem: Chengdu Haiguang IC Design Co., Ltd. K100 - Flags: fast devsel, IRQ 38 - Memory at 10000000000 (64-bit, prefetchable) [size=64G] - Memory at 11000000000 (64-bit, prefetchable) [size=2M] - Memory at a7700000 (32-bit, non-prefetchable) [size=512K] - Expansion ROM at a7780000 [disabled] [size=128K] - Capabilities: - Kernel driver in use: vfio-pci - ``` + ```sh + $ lspci -s 0a:00.0 -v + 0a:00.0 Co-processor: Chengdu Haiguang IC Design Co., Ltd. KONGMING (rev 01) + Subsystem: Chengdu Haiguang IC Design Co., Ltd. K100 + Flags: fast devsel, IRQ 38 + Memory at 10000000000 (64-bit, prefetchable) [size=64G] + Memory at 11000000000 (64-bit, prefetchable) [size=2M] + Memory at a7700000 (32-bit, non-prefetchable) [size=512K] + Expansion ROM at a7780000 [disabled] [size=128K] + Capabilities: + Kernel driver in use: vfio-pci + ``` - * 直通到容器的设备数超过vfio device plugin资源池中的DCU设备数量,导致无法分配资源 + * 直通到容器的设备数超过vfio device plugin资源池中的DCU设备数量,导致无法分配资源 - 检查直通到容器的DCU个数是否超过了绑定到vfio的DCU个数。 + 检查直通到容器的DCU个数是否超过了绑定到vfio的DCU个数。 + + * DCU卡状态异常。在host上通过`dmesg`命令查看 + +* 磁盘不足。当磁盘可用空间不足时,容器就会启动失败。通过kubectl describe pods查看,可以发现其中包含磁盘压力的日志。 * 容器中设备驱动加载失败 @@ -278,6 +288,7 @@ Agent 2 * 确保在容器中执行了`source /opt/dtk/env.sh` * 确保容器中dmesg中包含dcu驱动加载正常,没有出现错误 + ## 附录 ### 制作DCU容器镜像的Dockerfile