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。
- 
+如果输出位空,那么表明当前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中计算,无需担心数据被恶意的加速器窃取。
+
### 机制
