本文介绍如何在阿里云异构机密计算实例(gn8v-tee)中构建异构机密计算环境,并演示如何运行示例代码以验证GPU机密计算功能。
背景信息
阿里云异构机密计算实例(gn8v-tee)在CPU TDX机密计算实例的基础上,额外将GPU引入到TEE(Trusted Execution Environment)中,可以保护CPU和GPU之间的数据传输及GPU中的数据计算。本文重点介绍GPU机密计算相关的功能验证,关于CPU TDX机密计算环境的构建及其远程证明能力验证,请参见构建TDX机密计算环境。如您希望在异构机密计算实例中部署大语言模型推理环境,请参见基于异构机密计算实例构建支持安全度量的大语言模型推理环境。
如上图所示,在异构机密计算实例上,GPU以机密计算模式启动,机密计算实例的机密性由以下几点来保证:
-
TDX特性保证Hypervisor/Host OS无法访问实例的敏感寄存器信息以及实例的内存数据。
-
PCIe防火墙可以阻止CPU访问GPU的关键寄存器和GPU中受保护的显存,Hypervisor/Host OS对GPU只能执行有限的访问和操作(比如重置GPU),而无法访问GPU中的敏感数据,保证了GPU中数据的机密性。
-
GPU的NVLink Firewall阻止其他GPU直接访问GPU的显存。
-
CPU TEE中的GPU驱动以及库函数,初始化时会通过SPDM(Security Protocol and Data Model)协议与GPU建立加密通道。密钥协商完成后,CPU与GPU间仅通过PCIe传输密文形态数据,保证了CPU与GPU之间的数据传输链路的机密性。
-
通过GPU的远程证明能力确认GPU是否处于安全状态。
具体而言,机密计算实例中的应用可以通过Attestation SDK调用GPU驱动,从GPU硬件获取其安全状态的密码学报告。该报告中包含由密码学签名的GPU硬件信息、VBIOS及硬件状态度量值。依赖方(Relying party)可以通过将获取到的度量值与GPU厂商提供的参考度量值进行比对,以确认GPU是否处于机密计算的安全状态。
适用范围
异构机密计算仅支持Alibaba Cloud Linux 3镜像。若使用基于Alibaba Cloud Linux 3构建的自定义镜像创建实例,请确保其内核版本不低于5.10.134-18。
创建异构机密计算实例(gn8v-tee)
通过控制台创建
在控制台创建具备异构机密计算特性的实例步骤与创建普通实例类似,但需要注意一些特定选项。本步骤重点介绍异构机密计算实例相关的特定配置,如果您想了解其他通用配置,请参见自定义购买实例。
访问ECS控制台-实例。
在页面左侧顶部,选择目标资源所在的资源组和地域。
-
单击创建实例,按照以下配置创建对应实例。
配置项
说明
地域与可用区
华北2(北京)可用区L
实例规格
仅支持ecs.gn8v-tee.4xlarge及以上实例规格。
镜像
选择Alibaba Cloud Linux 3.2104 LTS 64位镜像。
公网IP
分配公网IPv4地址。保证后续可以从NVIDIA官网下载驱动程序。
重要创建8 GPU卡机密实例时,请勿添加额外的辅助弹性网卡,此操作可能导致实例启动失败。
-
根据界面提示,完成创建实例。
通过OpenAPI或阿里云CLI创建
您可以调用RunInstances或阿里云CLI创建支持TDX安全特性的ECS实例,需要注意的参数如下表所示。
|
参数 |
说明 |
示例 |
|
RegionId |
华北2(北京) |
cn-beijing |
|
ZoneId |
可用区L |
cn-beijing-l |
|
InstanceType |
选择ecs.gn8v-tee.4xlarge及以上实例规格 |
ecs.gn8v-tee.4xlarge |
|
ImageId |
指定支持异构机密的镜像ID,当前仅内核版本大于等于5.10.134-18.al8.x86_64的Alibaba Cloud Linux 3.2104 LTS 64位镜像支持。 |
aliyun_3_x64_20G_alibase_20250117.vhd |
CLI示例:
命令中<SECURITY_GROUP_ID>为安全组ID、<VSWITCH_ID>为交换机ID、<KEY_PAIR_NAME>为SSH密钥对名称。
aliyun ecs RunInstances \
--RegionId cn-beijing \
--ZoneId cn-beijing-l \
--SystemDisk.Category cloud_essd \
--ImageId 'aliyun_3_x64_20G_alibase_20250117.vhd' \
--InstanceType 'ecs.gn8v-tee.4xlarge' \
--SecurityGroupId '<SECURITY_GROUP_ID>' \
--VSwitchId '<VSWITCH_ID>' \
--KeyPairName <KEY_PAIR_NAME>
构建异构机密计算环境
步骤一:安装NVIDIA驱动和CUDA工具包
异构机密计算实例初始化较慢,当实例状态为运行中,并且实例操作系统启动完成以后再执行以下操作。
不同实例规格的安装步骤有所不同:
-
单GPU卡机密实例:ecs.gn8v-tee.4xlarge和ecs.gn8v-tee.6xlarge规格
-
8 GPU卡机密实例:ecs.gn8v-tee-8x.16xlarge和ecs.gn8v-tee-8x.48xlarge规格
单GPU卡机密实例
-
远程连接机密计算实例。
具体操作,请参见使用Workbench登录Linux实例。
-
调整内核参数,设置SWIOTLB buffer为8GB。
sudo grubby --update-kernel=ALL --args="swiotlb=4194304,any" -
重启实例,使以上配置生效。
具体操作,请参见重启实例。
-
下载NVIDIA驱动和CUDA工具包。
单GPU卡机密实例需使用
550.144.03(或更高)版本的驱动,本文以550.144.03版本为例。wget --referer=https://www.nvidia.cn/ https://cn.download.nvidia.cn/tesla/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.run -
安装依赖并禁用cloudmonitor服务。
sudo yum install -y openssl3 sudo systemctl disable cloudmonitor sudo systemctl stop cloudmonitor -
创建并配置
nvidia-persistenced.service。cat > nvidia-persistenced.service << EOF [Unit] Description=NVIDIA Persistence Daemon Wants=syslog.target Before=cloudmonitor.service [Service] Type=forking ExecStart=/usr/bin/nvidia-persistenced --user root ExecStartPost=/usr/bin/nvidia-smi conf-compute -srs 1 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced [Install] WantedBy=multi-user.target EOF sudo cp nvidia-persistenced.service /usr/lib/systemd/system/nvidia-persistenced.service -
安装NVIDIA驱动和CUDA Toolkit。
sudo bash NVIDIA-Linux-x86_64-550.144.03.run --ui=none --no-questions --accept-license --disable-nouveau --no-cc-version-check --install-libglvnd --kernel-module-build-directory=kernel-open --rebuild-initramfs sudo bash cuda_12.4.1_550.54.15_linux.run --silent --toolkit -
启动nvidia-persistenced和cloudmonitor服务。
sudo systemctl start nvidia-persistenced.service sudo systemctl enable nvidia-persistenced.service sudo systemctl start cloudmonitor sudo systemctl enable cloudmonitor
8 GPU卡机密实例
-
远程连接机密计算实例。
具体操作,请参见使用Workbench登录Linux实例。
重要机密计算实例初始化较慢,请耐心等待。
-
调整内核参数,设置SWIOTLB buffer为8GB。
sudo grubby --update-kernel=ALL --args="swiotlb=4194304,any" -
配置NVIDIA驱动程序的加载行为,并重新生成initramfs。
sudo bash -c 'cat > /etc/modprobe.d/nvidia-lkca.conf << EOF install nvidia /sbin/modprobe ecdsa_generic; /sbin/modprobe ecdh; /sbin/modprobe --ignore-install nvidia options nvidia NVreg_RegistryDwords="RmEnableProtectedPcie=0x1" EOF' sudo dracut --regenerate-all -f -
重启实例,使以上配置生效。
具体操作,请参见重启实例。
-
下载NVIDIA驱动和CUDA工具包。
8 GPU卡的机密计算实例需使用
570.148.08(或更高)版本的驱动,以及与之对应版本的Fabric Manager,本文以570.148.08版本为例。wget --referer=https://www.nvidia.cn/ https://cn.download.nvidia.cn/tesla/570.148.08/NVIDIA-Linux-x86_64-570.148.08.run wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda_12.8.1_570.124.06_linux.run wget https://developer.download.nvidia.cn/compute/cuda/repos/rhel8/x86_64/nvidia-fabric-manager-570.148.08-1.x86_64.rpm -
安装依赖并禁用cloudmonitor服务。
sudo yum install -y openssl3 sudo systemctl disable cloudmonitor sudo systemctl stop cloudmonitor -
创建并配置
nvidia-persistenced.service。cat > nvidia-persistenced.service << EOF [Unit] Description=NVIDIA Persistence Daemon Wants=syslog.target Before=cloudmonitor.service After=nvidia-fabricmanager.service [Service] Type=forking ExecStart=/usr/bin/nvidia-persistenced --user root --uvm-persistence-mode --verbose ExecStartPost=/usr/bin/nvidia-smi conf-compute -srs 1 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced TimeoutStartSec=900 TimeoutStopSec=60 [Install] WantedBy=multi-user.target EOF sudo cp nvidia-persistenced.service /usr/lib/systemd/system/nvidia-persistenced.service -
安装FabricManager、NVIDIA驱动和CUDA Toolkit。
sudo rpm -ivh nvidia-fabric-manager-570.148.08-1.x86_64.rpm sudo bash NVIDIA-Linux-x86_64-570.148.08.run --ui=none --no-questions --accept-license --disable-nouveau --no-cc-version-check --install-libglvnd --kernel-module-build-directory=kernel-open --rebuild-initramfs sudo bash cuda_12.8.1_570.124.06_linux.run --silent --toolkit -
启动nvidia-persistenced和cloudmonitor服务。
sudo systemctl start nvidia-fabricmanager.service sudo systemctl enable nvidia-fabricmanager.service sudo systemctl start nvidia-persistenced.service sudo systemctl enable nvidia-persistenced.service sudo systemctl start cloudmonitor sudo systemctl enable cloudmonitor
步骤二:检查TDX的启用状态
异构机密计算特性基于TDX构建,建议您先检查对应实例的TDX的启用状态,以确保该实例处于安全保护中。
-
检查TDX的启用状态。
lscpu |grep -i tdx_guest如以下命令输出所示,Flags 列表中包含
tdx_guest则表示 TDX 已被正确启用。[root@iZwzxxxxxxxx:~]# lscpu |grep -i tdx_guest Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc bts rep_good nopl xtopology tsc_known_freq pni pclmulqdq dtes64 ds_cpl ssse3 sdbg fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single sbd ibrs ibpb stibp ibrs_enhanced tdx_guest fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm avx512f avx512dq rdseed adx smap avx512ifma clflushopts clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx_vnni avx512_bf16 wbnoinvd avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid bus_lock_detect cldemote movdiri movdir64b _vp2intersect md_clear serialize tsxldtrk amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities -
检查TDX相关驱动安装情况。
ls -l /dev/tdx_guest以下输出表示已经安装TDX相关驱动:
[ ~@iz2ze ~]# ls -l /dev/tdx_guest crw------- 1 root root 10, 125 Jan 30 16:51 /dev/tdx_guest
步骤三:检查GPU机密计算特性状态
单GPU卡机密实例
执行以下命令,查看机密计算特性状态。
nvidia-smi conf-compute -f
返回结果CC status: ON表示机密计算特性开启;返回结果CC status: OFF表示机密计算特性关闭,说明实例出现异常,请提交工单。
8 GPU卡机密实例
执行以下命令,查看机密计算特性状态。
nvidia-smi conf-compute -mgm
返回结果Multi-GPU Mode: Protected PCIe表示多卡机密计算特性开启;返回结果Multi-GPU Mode: None表示多卡机密计算特性关闭,说明实例出现异常,请提交工单。
8 GPU卡机密实例中,nvidia-smi conf-compute -f命令返回CC status: OFF是正常结果。
步骤四:通过本地证明验证GPU/NVSwitch可信
单GPU卡机密实例
-
安装GPU可信所需依赖。
sudo yum install -y python3.11 python3.11-devel python3.11-pip sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 60 sudo alternatives --set python3 /usr/bin/python3.11 sudo python3 -m ensurepip --upgrade sudo python3 -m pip install --upgrade pip sudo python3 -m pip install nv_attestation_sdk==2.5.0.post6914366 nv_local_gpu_verifier==2.5.0.post6914366 nv_ppcie_verifier==1.5.0.post6914366 -f https://attest-public-cn-beijing.oss-cn-beijing.aliyuncs.com/repo/pip/attest.html -
执行以下命令,验证GPU可信状态。
python3 -m verifier.cc_admin --user_mode回显结果表示GPU处于机密计算状态,且Driver、VBIOS等度量值与预期相符合:
8 GPU卡机密实例
-
安装GPU可信所需依赖。
sudo yum install -y python3.11 python3.11-devel python3.11-pip sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 60 sudo alternatives --set python3 /usr/bin/python3.11 sudo python3 -m ensurepip --upgrade sudo python3 -m pip install --upgrade pip sudo python3 -m pip install nv_attestation_sdk==2.5.0.post6914366 nv_local_gpu_verifier==2.5.0.post6914366 nv_ppcie_verifier==1.5.0.post6914366 -f https://attest-public-cn-beijing.oss-cn-beijing.aliyuncs.com/repo/pip/attest.html -
安装NVSwitch相关依赖组件。
wget https://developer.download.nvidia.cn/compute/cuda/repos/rhel8/x86_64/libnvidia-nscq-570-570.148.08-1.x86_64.rpm sudo rpm -ivh libnvidia-nscq-570-570.148.08-1.x86_64.rpm -
执行以下命令,验证GPU/NVSwitch可信状态。
python3 -m ppcie.verifier.verification --gpu-attestation-mode=LOCAL --switch-attestation-mode=LOCAL示例代码会分别验证8个GPU和4个NVSwitch,最终输出为SUCCESS表示验证成功:
All nvSwitches Attested Successfully **************************************************** * PPCIE: Switch attestation result is True * **************************************************** **************************************************** * PPCIE: Switch Attestation Completed * **************************************************** **************************************************** * PPCIE: GPU state is READY * **************************************************** +-------------------------+----------+ | STAGE | STATUS | +-------------------------+----------+ | GPU Pre-checks | SUCCESS | | Switch Pre-checks | SUCCESS | | GPU Attestation | SUCCESS | | Switch Attestation | SUCCESS | | Topology checks | SUCCESS | +-------------------------+----------+ **************************************************** * PPCIE: End of PPCIE Verification Tool * ****************************************************
已知功能限制
-
由于异构机密计算特性基于TDX构建,TDX机密计算实例的功能限制对异构机密计算实例均适用,更多信息,请参见TDX实例已知功能限制。
-
开启GPU机密计算特性后,CPU与GPU之间的数据传输需要加解密,因此GPU相关的性能相较异构非机密计算实例存在一定损失。
使用异构机密计算注意事项
-
单GPU卡实例使用CUDA 12.4,NVIDIA的cuBLAS库存在已知问题,运行CUDA任务或大语言模型任务的时候可能会出错,需要安装特定版本的cuBLAS。
pip3 install nvidia-cublas-cu12==12.4.5.8 -
GPU开启机密计算特性后,初始化比较慢(特别是8 GPU卡机密实例),Guest OS启动后,请务必确认nvidia-persistenced服务已经启动完成,再执行nvidia-smi或者其他命令使用GPU,检查nvidia-persistenced服务状态的命令为:
systemctl status nvidia-persistenced | grep "Active: "-
activating (start)表示服务正在启动。Active: activating (start) since Wed 2025-02-19 10:07:54 CST; 2min 20s ago -
active (running)表示服务运行中。
Active: active (running) since Wed 2025-02-19 10:10:28 CST; 22s ago
-
-
任何会使用GPU的自启动服务(例如cloudmonitor.service、nvidia-cdi-refresh.service(来自于软件包nvidia-container-toolkit-base)、ollama.service),都需要在nvidia-persistenced.service之后启动。
/usr/lib/systemd/system/nvidia-persistenced.service设置示例如下:[Unit] Description=NVIDIA Persistence Daemon Wants=syslog.target Before=cloudmonitor.service nvidia-cdi-refresh.service ollama.service After=nvidia-fabricmanager.service [Service] Type=forking ExecStart=/usr/bin/nvidia-persistenced --user root --uvm-persistence-mode --verbose ExecStartPost=/usr/bin/nvidia-smi conf-compute -srs 1 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced TimeoutStartSec=900 TimeoutStopSec=60 [Install] WantedBy=multi-user.target