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 17be7a0af26c6543969095d077b702359a5fca09..f497a163f9989af0b4db8e61154dddf82aa8207d 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,69 +1,445 @@ 测试之前,请参考[2-1-安装CSV软件](https://openanolis.cn/sig/Hygon-Arch/doc/865622260278236994?lang=zh)准备软件环境。 ## 功能描述 + 某些应用场景需要在CSV虚拟机中运行图像识别、机器学习等算法,这些场景下使用DCU加速卡可以极大地提高计算性能,CSV虚拟机支持设备直通,可以将DCU卡直通给CSV虚拟机使用。 -## 测试CSV虚拟机使用DCU卡 +我们使用qemu启动CSV虚拟机,借助vfio将DCU直通给CSV虚拟机,就可以在CSV虚拟机中直接使用DCU设备。 + +> **注意:** 如果在Host上运行DCU,当SMEE内存加密使能、且使能iommu,请确保iommu处于pt模式。如果iommu没有处于pt模式,那么在host的kernel cmdline中添加"iommu=pt",然后更新grub,重启生效。 + + + +## 启动DCU直通CSV虚拟机 + +* Host上安装DCU的fixup header插件 -### 运行CSV虚拟机 +从`光合开发社区`主页的`工具包`页面,下载DCU的fixup header插件,文件名为`hycu_pci_fixup_header_{version}.bin`,并在Host上安装。 + +以`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 ``` -$ sudo qemu-system-x86_64 -name csv-vm --enable-kvm -cpu host -m 6114 -hda /opt/hygon/csv/vm.qcow2 -drive if=pflash,format=raw,unit=0,file=/opt/hygon/csv/OVMF_CODE.fd,readonly=on -qmp tcp:127.0.0.1:2222,server,nowait -vnc 0.0.0.0:1 -object sev-guest,id=sev0,policy=0x1,cbitpos=47,reduced-phys-bits=5 -machine memory-encryption=sev0 -netdev bridge,br=virbr0,id=net0 -device virtio-net-pci,netdev=net0,romfile= -nographic + +安装完成后,验证当前fixup header版本,显示为0.4.4: + +```sh +$ cat /sys/module/hycu_pci_fixup_header/version +0.4.4 ``` -### 在虚拟机中安装DCU软件栈 +> **注意:** +> +> 1. 老版本的fixup header名为hydcu_pci_fixup_header_{version}.bin,可以从`光合开发社区->DCU直通插件->previous_tool`中下载到。 +> +> 2. 如果更改host kernel,如使用其他版本的Kernel,或者重新编译host kernel,必须要重新安装fixup header插件。 +> 3. fixup header 0.4.4版本安装后,**重启host后系统不会自动加载该插件**,每次重启host后需要手动执行`sudo modprobe hycu_pci_fixup_header`。 + +* 查看DCU设备的Vendor ID和Device 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) ``` -# dhclient -# scp host@hostip:/opt/hygon/csv/dcu/vm_dcu_sw_deploy.sh ./ -# ./vm_dcu_sw_deploy.sh -# poweroff + +可以看到,示例设备的VendorID为**1d94**,Device Id为**53b7**。 + +> 注意:不同的DCU卡的Device ID不同,以实际为准。下面操作中用DCU实际的Device Id替换53b7。 + +* Host加载VFIO驱动 + +执行下面命令,在Host加载VFIO驱动: + +```sh +$ sudo modprobe vfio_virqfd +$ sudo modprobe vfio_pci +$ sudo modprobe vfio_iommu_type1 +$ sudo modprobe vfio ``` -### 将DCU卡分配给VFIO -找到DCU设备的设备标识、Device Id和Vendor Id +> **注意**:每次重启host后,启动虚拟机前,需要加载vfio驱动。 + +* 将DCU绑定到VFIO驱动 + +对于DCU直通虚拟机,在Host上,DCU使用VFIO驱动,我们需要将DCU绑定到VFIO驱动。 + +如果在Host上已经加载的DCU驱动,那么在将DCU绑定VFIO驱动之前,还需要将DCU和DCU驱动解绑。 + +可以通过下面命令查看DCU当前绑定的驱动: ``` -$ lspci -nn | grep -e "Display" -e "Co-processor" | grep "Haiguang" +$ lspci -s 03:00.0 -v | grep "Kernel driver" + ``` -命令的执行效果如下图,该设备的VendorID为1d94, Device Id为53b7。 - ![](../../../assets/csv8-1.png) +如果输出位空,那么表明当前Host上DCU没有绑定到到任何驱动,可以直接将DCU绑定到VFIO驱动。 -> 注意:不同的DCU卡的Device ID可能和图中显示不同,以实际为准。 +如果DCU已经绑定到DCU驱动,上面命令的输出为: -将DCU设备与VFIO模块关联 +```sh +$ lspci -s 03:00.0 -v | grep "Kernel driver" + Kernel driver in use: hydcu ``` -$ sudo modprobe vfio -$ sudo modprobe vfio-pci -$ sudo echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind -$ sudo -s -# echo 1d94 53b7 > /sys/bus/pci/drivers/vfio-pci/new_id + +表明DCU当前在使用`hydcu`驱动。我们将DCU和`hydcu`驱动解绑: + +```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"`验证,此时该命令输出为空。 + +可以使用命令` sudo systemctl disable hymgr.service`永久禁止Host自动加载DCU驱动,需重启host才能生效。 + +最后,执行下面命令将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 +``` + +同时也可以看到,在目录`/dev/vfio`下会产生名为DCU设备所在iommu group的ID文件,例如,本机上DCU的iommu group为16,显示如下: + +```sh +$ ls /dev/vfio +16 vfio ``` -命令说明:示例中用到的设备标识、VendorID、DeviceID,请替换成上一步自己获取到的信息。对于第三条命令(unbind),如果PCI设备已经与宿主机绑定,则需要执行;如未绑定,将不存在unbind文件,则无需执行。 -### 运行直通DCU卡的CSV虚拟机 +> **注意**:每次重启host后,启动虚拟机前,需要重新绑定DCU到VFIO驱动。 + +* 启动CSV虚拟机 + +经过前面的准备工作,我们在Host上将DCU设备绑定到VFIO驱动,现在可以通过qemu启动CSV虚拟机,将DCU直通到虚拟机中。 +执行下面命令启动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 ``` -$ sudo qemu-system-x86_64 -name csv-vm --enable-kvm -cpu host -m 10240 -hda /opt/hygon/csv/vm.qcow2 -drive if=pflash,format=raw,unit=0,file=/opt/hygon/csv/OVMF_CODE.fd,readonly=on -qmp tcp:127.0.0.1:2222,server,nowait -vnc 0.0.0.0:1 -object sev-guest,id=sev0,policy=0x1,cbitpos=47,reduced-phys-bits=5 -machine memory-encryption=sev0 -device vfio-pci,host=03:00.0 -fw_cfg name=opt/ovmf/X-PciMmio64Mb,string=65536 -netdev bridge,br=virbr0,id=net0 -device virtio-net-pci,netdev=net0,romfile= -nographic + +其中,`-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卡的设备地址。 + +虚拟机启动后,登录虚拟机,可以通过命令`lspci`查看到DCU设备,说明DCU直通CSV虚拟机成功。 + + + +### 在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`为例。 + +进入`光合开发者社区->驱动->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 +``` + +安装完成后,禁止虚拟机的selinux。打开`/etc/selinux/config`文件,修改`SELINUX`为`SELINUX=disabled`。 + +最后重启虚拟机: + +```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 =================================== +``` + + +* 安装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解压到/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安装后生成的文件。 + + +* 配置环境 + +在CSV虚拟机上,需要使能CSV虚拟机相关的环境变量。执行下面命令: + +```sh +$ echo "hy-virtual -enable-encrypted" | sudo tee -a /opt/dtk-24.04.3/env.sh +``` + +最后使能dtk的环境变量,执行: + +```sh +source /opt/dtk-24.04.3/env.sh +``` + +可以将上面使能dtk环境变量的命令添加的shell的初始化文件。例如,对于bash: + +```sh +echo "source /opt/dtk-24.04.3/env.sh" >> ~/.bashrc +source ~/.bashrc ``` ->注意:上述命令中`string=65536`对应的是32G VRAM的DCU,如果实际DCU的VRAM为64G,需要将string改为131072。 +其他的shell,如zsh, csh请自行添加到对应的shell初始化文件中。 + + ### 在CSV虚拟机中运行DCU测试程序 +这里使用一个简单的向量加法示例演示DCU并行计算。 + +```sh +$ 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 +hip Device prop succeeded +PASSED! ``` -# git clone https://github.com/ROCm-Developer-Tools/HIP-Examples.git -# source /opt/dtk/env.sh -# cd HIP-Examples/vectorAdd -# make clean;make -# ./vectoradd_hip.exe + +显示`agent prop name`因卡不同会有差异。 + + + +### 在CSV虚拟机中运行基于Ollama运行qwen大模型 + +本小节演示在CSV虚拟机中基于ollama运行qwen大模型,内容包括安装安装go、安装gcc-10、python3.10、安装torch、编译ollama、运行qwen大模型。 + +要求: + +1. 虚拟机OS:ubuntu20.04 +2. 在虚拟机中已经安装了DCU的驱动和DTK + +* 安装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 +``` + +* 安装gcc-10 + +```sh +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 +``` + +验证默认gcc为gcc-10 + +```sh +gcc --version +gcc (Ubuntu 10.5.0-1ubuntu1~20.04) 10.5.0 +``` + +* 安装python3.10 + +如果系统中已经安装了Python3.10或者python3.11,可以跳过安装python3.10。 + +此处我们使用python venv环境,和主机的python环境隔离开来。 + +```sh +sudo add-apt-repository ppa:deadsnakes/ppa +sudo apt-get update +sudo apt-get -y install python3.10 python3.10-venv +mkdir ~/py_venv +python3.10 -m venv ~/py_venv +``` + +激活python3.10 venv环境 + +```sh +source ~/py_venv/bin/activate +``` + +> 注意: 如果使用python venv环境,每次需要在bash中激活venv环境。可以将`source ~/py_venv/bin/activate`放在~/.bashrc中,新开终端自动激活。 + +* 安装torch + +在`光合开发者社区->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.11,请选择对应python3.11版本的pytorch,并使用python3.11命令替换python3.10。 + +安装其他依赖库 + +```sh +sudo apt-get -y install libgl1 +python3.10 -m pip install --force-reinstall -v "numpy==1.25.2" +``` + +测试torch可以识别到DCU卡 + +```python +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 +>>> torch.cuda.is_available() +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 . +``` + +> 注意:LIBRARY_PATH调整为实际的dtk的路径。 + +编译时间比较久,请耐心等待。 + +* 单卡运行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卡编号。此处以单卡为例,多卡请继续往下看 +./ollama serve +``` + +另外再开启一个终端,运行qwen大模型。此处以qwen:7b为例。 + +```sh +./ollama pull qwen:7b +``` + +> 提示:ollama支持的其他模型,可以在`https://ollama.com/search`页面查找。 + +下载完成后,可以通过`ollama list`命令查看到: + +```sh +./ollama list +NAME ID SIZE MODIFIED +qwen:7b 2091ee8c8d8f 4.5 GB 4 days ago +``` + +最后运行模型: + +```sh +./ollama run qwen:7b +>>> hello +Hello! How can I assist you today? + +>>> Send a message (/? for help) +``` + +通过查看DCU的VRAM显存占用率,确认qwen模型已经在DCU上运行起来了。 + +```sh +hy-smi +============================ System Management Interface ============================= +====================================================================================== +DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode +0 44.0C 15.0W auto 450.0W 28% 0% Normal +====================================================================================== +=================================== End of SMI Log =================================== +``` + +* 多卡运行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,1 # DCU卡的编号,可以通过hy-smi命令查看DCU卡编号。选择编号为0和1的DCU卡 +export OLLAMA_SCHED_SPREAD=True # 允许ollama在多卡之间调度 +./ollama serve +``` + +另外再开启一个终端,运行qwen大模型: + +```sh +./ollama run qwen:7b +``` + +通过查看DCU的VRAM显存占用率,确认qwen模型已经在DCU上运行起来了。 + +```sh +hy-smi +============================ System Management Interface ============================= +====================================================================================== +DCU Temp AvgPwr Perf PwrCap VRAM% DCU% Mode +0 45.0C 15.0W auto 450.0W 16% 0% Normal +1 42.0C 14.0W auto 450.0W 15% 0% Normal +====================================================================================== +=================================== End of SMI Log =================================== +``` + + + ## 测试 DCU Attestation 功能 (DCU远程身份认证功能) + ### 背景 + 从深算二号(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中计算,无需担心数据被恶意的加速器窃取。 + ### 机制 ![](../../../assets/dcu_attestation_arch.png)