随着大语言模型技术的普及,越来越多的企业开始尝试利用该技术来提升业务能力。因此,如何构建安全的大模型推理服务,确保推理过程中的数据安全,已成为企业关注的热点话题。本文将介绍如何基于阿里云异构机密计算实例及Confidential AI方案(以下简称CAI),快速构建安全的大语言模型推理环境。
背景说明
阿里云异构机密计算实例(gn8v-tee)在CPU TDX机密计算实例的基础上,额外将GPU引入到TEE(Trusted Execution Environment)中,可以保护CPU和GPU之间的数据传输及GPU中的数据计算。结合阿里云KMS服务作为密钥存储后端,并在ACK集群内部署Trustee远程证明服务,经过简单配置后,您的推理服务无需修改即可无缝实现机密计算的安全推理保护。该方案旨在帮助您在阿里云上迅速构建安全的大语言模型推理环境,从而为您的业务提供支持。
方案架构
上述方案的整体架构如下图所示。
前提条件
该方案中使用的异构机密计算实例目前正处于邀测阶段。如需使用,请单击邀测链接进行申请。
操作步骤
步骤一:准备加密的模型数据
该步骤包括下载模型、加密模型和上传模型三个环节。由于模型文件较大,整个过程耗时较长。
如果您希望快速体验此方案,可以使用我们为您准备的加密模型文件进行试用。选择我们已加密的模型文件后,您将能够跳过该步骤。直接进行步骤二:搭建Trustee远程证明服务。点击下方以获取加密模型文件信息。
1.下载模型
在模型正式上云部署之前,您需要先对模型进行加密,然后将其上传到云存储。解密模型的密钥将由远程证明服务控制的KMS(密钥管理服务)负责托管。请在本地或可信环境中执行模型的加密操作。以部署Qwen2.5-3B-Instruct大模型为例,基于本地环境Alibaba Cloud Linux 3.2104 LTS 64(可访问公网),提供如下指导。
如果您已经拥有自己的模型,请跳过本章节,直接进入2.加密模型章节。
以使用modelscope工具下载Qwen2.5-3B-Instruct模型为例,在终端中执行如下命令下载模型。
pip3 install modelscope importlib-metadata
modelscope download --model Qwen/Qwen2.5-3B-Instruct
成功执行命令后,模型将被下载到~/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct/
目录下。
2.加密模型
目前支持如下两种加密方式,本方案以Gocryptfs为例。
Gocryptfs:基于AES256-GCM,符合开源Gocryptfs标准的加密模式。
Sam:阿里云可信AI模型加密格式,保护模型机密性和License内容不被篡改和非法使用。
执行Gocryptfs加密
安装用于加密模型的工具Gocryptfs (目前只支持使用默认参数进行加密的Gocryptfs v2.4.0 版本)。您可以选择以下任意一种方式进行安装:
(推荐)方式一:直接下载预编译binary
# 下载预编译Gocryptfs压缩包 wget https://github.jobcher.com/gh/https://github.com/rfjakob/gocryptfs/releases/download/v2.4.0/gocryptfs_v2.4.0_linux-static_amd64.tar.gz # 解压并安装 tar xf gocryptfs_v2.4.0_linux-static_amd64.tar.gz sudo install -m 0755 ./gocryptfs /usr/local/bin
方式二:编译安装Gocryptfs
## 安装golang yum install go -y go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct ## 安装 Gocryptfs git clone https://github.com/rfjakob/gocryptfs.git cd gocryptfs git checkout -b v2.4.0 v2.4.0 ./build-without-openssl.bash sudo install -m 0755 ./gocryptfs /usr/local/bin
创建Gocryptfs密钥文件,作为模型加密的密钥。在后续步骤中,您需要将该密钥上传到远程证明服务(Trustee)进行托管。
在本方案中,使用
alibaba@1688
作为加密模型使用的密钥,密钥内容将存储在cachefs-password
文件中。您也可以自定义密钥。cat << EOF > ~/cachefs-password alibaba@1688 EOF
使用已创建的密钥对模型进行加密。
配置明文模型的路径。
说明在此处配置您刚才下载的明文模型所在路径,如果您有其他模型,请将其替换为目标模型的实际路径。
PLAINTEXT_MODEL_PATH=~/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct/
使用Gocryptfs对模型目录树进行加密。
加密完成后,模型将以密文形式存储在
./cipher
目录中。mkdir -p ~/mount cd ~/mount mkdir -p cipher plain # 安装Gocryptfs运行时依赖 sudo yum install -y fuse # initialize gocryptfs cat ~/cachefs-password | gocryptfs -init cipher # mount to plain cat ~/cachefs-password | gocryptfs cipher plain # move AI model to ~/mount/plain cp -r ${PLAINTEXT_MODEL_PATH} ~/mount/plain
执行Sam加密
首先下载并解压Sam加密模块。
# 下载Sam加密模块压缩包 wget https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/rai/RAI_SAM_SDK_2.1.0-20240731.tgz # 解压Sam加密模块 tar xvf RAI_SAM_SDK_2.1.0-20240731.tgz
使用Sam加密模块加密模型。
# 进入Sam加密模块的加密目录 cd RAI_SAM_SDK_2.1.0-20240731/tools # 加密模型 ./do_content_packager.sh <模型目录> <明文密钥> <密钥ID>
其中:
<模型目录>:待加密模型所在的目录,可以使用相对路径或绝对路径,例如
~/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct/
。<明文密钥>:自定义的加密密钥,有效长度为4 ~ 128字节,例如
alibaba@1688
。明文密钥是需要上传到远程证明服务(Trustee)的模型解密密钥。<密钥ID>:自定义的密钥标识,有效长度为8 ~ 48字节,例如
LD_Demo_0001
。
加密结束后,模型将以密文形式存储在当前路径的
<密钥ID>
目录中。
3.上传模型
您需要准备一个与即将部署的异构实例相同地域的OSS Bucket,并将加密模型上传到阿里云OSS对象存储,以便后续从异构实例拉取并部署。
以对象存储OSS为例,请参考控制台快速入门创建一个存储空间(Bucket)和一个名为qwen-encrypted
的目录(例如oss://examplebucket/qwen-encrypted/
),然后使用ossutil工具将加密模型上传到该目录(您也可以使用自己的方法上传加密模型),以供推理服务挂载。以Sam加密为例,密文模型上传后的结果如下图所示。若采用Gocryptfs加密方式,模型文件的密文文件名将全部变成加密后的乱码。
步骤二:搭建Trustee远程证明服务
远程证明服务是由用户管理的验证服务,负责对模型及推理服务的运行环境进行验证。仅在确认异构模型部署环境的可信度符合预期条件时,才会注入模型解密密钥以实现模型的解密挂载。
您可以使用阿里云ACK Serverless部署远程证明服务,以验证模型部署环境和推理环境。同时,借助阿里云KMS为模型解密密钥提供专业的安全保障。具体操作步骤如下:
ACK集群的地域不必与异构部署服务的目标地域相同。
阿里云KMS实例必须和准备部署的阿里云Trustee远程证明服务所在的ACK集群处于相同地域。
在创建KMS实例和ACK集群之前,请先创建专有网络和2个交换机。具体操作,请参见创建和管理专有网络。
1.创建一台阿里云KMS实例作为密钥存储后端
前往密钥管理服务控制台,在左侧导航栏选择 ,然后在软件密钥管理页签创建并启动实例。在启动实例时,请选择与ACK集群相同的专有网络。具体操作,请参见购买和启用KMS实例。
等待大约10分钟,即可启动完毕。
实例启动完成后,在左侧导航栏选择步骤一:创建软件密钥。
,然后在密钥管理页面为该实例创建一个用户主密钥。具体操作,请参见在左侧导航栏选择方式一:快速创建。
,然后在接入点页面为该实例创建应用接入点。其中作用域选择已创建的KMS实例。更多配置说明,请参见应用接入点创建成功后,浏览器会自动下载ClientKey***.zip文件,该zip文件解压后包含:
应用身份凭证内容(ClientKeyContent):文件名默认为
clientKey_****.json
。凭证口令(ClientKeyPassword):文件名默认为
clientKey_****_Password.txt
。
在
页面,单击KMS实例名称,然后在基础信息区域,单击实例CA证书后的下载,导出KMS实例的公钥证书文件PrivateKmsCA_***.pem
。
2.创建ACK服务集群并安装csi-provisioner组件
前往创建集群页面,创建ACK Serverless集群,其中关键参数配置说明如下,更多配置说明,请参见创建集群。
集群配置:配置以下参数,完成后单击下一步:组件配置。
关键配置
描述
专有网络
选择使用已有,并勾选为专有网络配置SNAT,否则无法拉取Trustee镜像。
交换机
请确保在已有专有网络中创建至少两个虚拟交换机,否则无法暴露公网ALB。
组件配置:配置以下参数,完成后单击下一步:确认配置。
关键配置
描述
服务发现
选择CoreNDS。
Ingress
选择ALB Ingress,ALB云原生网关实例来源选择新建,并选择两个虚拟交换机。
确认配置:确认配置信息和使用须知,然后单击创建集群。
集群创建成功后,安装csi-provisioner(托管)组件。具体操作,请参见管理组件。
3.在ACK集群中部署Trustee远程证明服务
首先通过公网或内网连接集群。具体操作,请参见连接集群。
将已下载的KMS实例的应用身份凭证(
clientKey_****.json
)、凭证口令(clientKey_****_Password.txt
)和CA证书(PrivateKmsCA_***.pem
),上传到连接ACK Serverless集群的环境中,并执行以下命令部署Trustee远程证明服务,使用阿里云KMS作为密钥存储后端。# 安装插件 helm plugin install https://github.com/AliyunContainerService/helm-acr helm repo add trustee acr://trustee-chart.cn-hangzhou.cr.aliyuncs.com/trustee/trustee helm repo update export DEPLOY_RELEASE_NAME=trustee export DEPLOY_NAMESPACE=default export TRUSTEE_CHART_VERSION=1.0.0 # 设置ACK集群所在的地域信息,比如cn-hangzhou export REGION_ID=cn-hangzhou # 刚才导出的KMS实例相关信息 # 替换为您的KMS实例ID export KMS_INSTANCE_ID=kst-hzz66a0*******e16pckc # 替换为您的KMS实例应用身份凭证所在路径 export KMS_CLIENT_KEY_FILE=/path/to/clientKey_KAAP.***.json # 替换为您的KMS实例凭证口令所在路径 export KMS_PASSWORD_FILE=/path/to/clientKey_KAAP.***_Password.txt # 替换为您的KMS实例CA证书所在路径 export KMS_CERT_FILE=/path/to/PrivateKmsCA_kst-***.pem helm install ${DEPLOY_RELEASE_NAME} trustee/trustee \ --version ${TRUSTEE_CHART_VERSION} \ --set regionId=${REGION_ID} \ --set kbs.aliyunKms.enabled=true \ --set kbs.aliyunKms.kmsIntanceId=${KMS_INSTANCE_ID} \ --set-file kbs.aliyunKms.clientKey=${KMS_CLIENT_KEY_FILE} \ --set-file kbs.aliyunKms.password=${KMS_PASSWORD_FILE} \ --set-file kbs.aliyunKms.certPem=${KMS_CERT_FILE} \ --namespace ${DEPLOY_NAMESPACE}
说明执行代码中第一条安装插件命令(
helm plugin install...
)可能需要较长时间。如果安装失败,可以先通过helm plugin uninstall cm-push
命令卸载该插件,然后重新执行插件安装命令。返回结果示例为:
NAME: trustee LAST DEPLOYED: Tue Feb 25 18:55:33 2025 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None
在连接ACK Serverless集群的环境中执行如下命令,来获取Trustee的访问地址。
export TRUSTEE_URL=http://$(kubectl get AlbConfig alb -o jsonpath='{.status.loadBalancer.dnsname}')/${DEPLOY_RELEASE_NAME} echo ${TRUSTEE_URL}
返回结果示例为
http://alb-ppams74szbwg2f****.cn-shanghai.alb.aliyuncsslb.com/trustee
。在连接ACK Serverless集群的环境中执行以下命令,测试Trustee服务的连通性。
cat << EOF | curl -k -X POST ${TRUSTEE_URL}/kbs/v0/auth -H 'Content-Type: application/json' -d @- { "version":"0.1.0", "tee": "tdx", "extra-params": "foo" } EOF
若Trustee服务运行状态正常,预期输出如下:
{"nonce":"PIDUjUxQdBMIXz***********IEysXFfUKgSwk=","extra-params":""}
4.创建凭据来存储模型解密密钥
Trustee托管的模型解密密钥实际上存储在KMS中,只有在远程证明服务验证目标环境后,密钥才能被访问。
前往密钥管理服务控制台,在左侧导航栏选择 ,然后在通用凭据页签,单击创建凭据。其中关键配置说明如下:
凭据名称:自定义凭据名称,用于索引该密钥,例如
model-decryption-key
。设置凭据值:填写加密模型时使用的密钥。例如
alibaba@1688
,您的密钥以实际为准。加密主密钥:选择上述步骤创建的主密钥。
步骤三:创建异构机密计算实例
在控制台创建具备异构机密计算特性的实例步骤与创建普通实例类似,但需要注意一些特定选项。以下步骤将为您详细介绍如何使用包含异构机密计算环境和CAI环境的云市场镜像,创建异构机密计算实例。关于异构机密计算环境的更多信息,请参见构建异构机密计算环境。
前往实例购买页。
选择自定义购买页签。
选择付费类型、地域、实例规格、镜像等配置。
各配置项详细说明如下:
配置项名称
配置项说明
实例规格族
必须选择gn8v-tee实例规格族中的如下两种规格之一:
ecs.gn8v-tee.4xlarge
ecs.gn8v-tee.6xlarge
重要当前异构机密计算实例处于邀测状态,如需使用,请单击邀测链接进行申请。
镜像
单击云市场镜像页签,输入
Confidential AI
进行搜索,选择Alibaba Cloud Linux 3.2104 LTS 64位单卡Confidential AI
镜像。说明关于该镜像的更多信息,请参见Alibaba Cloud Linux 3.2104 LTS 64位单卡Confidential AI镜像。您可以在镜像介绍页面完成异构机密计算实例的创建。
系统盘
系统盘容量建议选择不低于1 TiB,具体大小应根据您需要运行的模型文件大小进行合理评估。一般建议容量大于模型大小的两倍。请您根据实际情况进行设置。
在最终创建实例前,请在页面右侧检查实例的整体配置并配置使用时长等选项,确保符合您的要求。
阅读并签署《云服务器ECS服务条款》等服务协议(若已签署,则无需重复签署,请以页面提示为准),然后单击确认下单。
在实例创建过程中,请您耐心等待。您可前往控制台的实例列表页面查看实例的状态,当实例状态变为运行中时,表示实例创建完成。
步骤四:配置异构实例对OSS和Trustee的访问权限
1.配置异构实例对OSS的访问权限
在部署过程中,实例需要访问存储模型密文的OSS bucket,并访问Trustee获得模型解密密钥,因此需要配置实例对相关OSS和Trustee的访问权限。
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择 。
在Bucket 授权策略页签,单击新增授权,在新增授权页面中,为异构机密计算实例的公网IP增加
Bucket
授权。单击保存。
2.配置实例对Trustee的访问权限
前往阿里云ALB负载均衡控制台,创建访问控制策略组,并将访问Trustee权限的地址/地址段添加为IP条目。具体操作,请参见访问控制。
其中,需要添加的地址或地址段如下:
部署异构服务时绑定的专有网络的公网IP地址。
推理客户端的出口IP地址。
使用如下命令获得集群上Trustee实例使用的ALB负载均衡实例ID。
kubectl get ing --namespace ${DEPLOY_NAMESPACE} kbs-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' | cut -d'.' -f1 | sed 's/[^a-zA-Z0-9-]//g'
预期输出如下结果:
alb-llcdzbw0qivhk0****
在阿里云ALB负载均衡控制台左侧导航栏,选择 ,在集群所在地域下搜索上一步获得的ALB实例,并单击实例ID进入实例详情页面。然后在页面最下方实例属性区域,单击关闭配置修改保护。
切换到监听页面,单击目标监听实例访问控制列下的启用,并配置白名单为上述步骤创建的访问控制策略组。
步骤五:在异构机密计算实例中部署vLLM大模型推理服务
在异构机密计算实例中部署vLLM大模型推理服务,您可以通过docker
或者docker compose
两种方式来完成部署。具体操作步骤如下:
1.准备配置文件
远程连接异构实例,具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
运行如下命令,以打开
~/cai.env
配置文件。vi ~/cai.env
按
i
键进入插入模式,将准备好的配置信息粘贴到配置文件中。# Trustee服务url TRUSTEE_URL="http://alb-xxxxxxxxx.cn-beijing.alb.aliyuncsslb.com/xxxx/" # Trustee上配置的policy名称,用于模型密钥获取、多节点模型共享时的RA过程 TRUSTEE_POLICY="default" # Trustee上配置的模型解密密钥对应的resource id,对应的在下面小节中填写解密密钥KBS URI时将写作kbs:///default/aliyun/model-decryption-key。这里对于凭据名称<凭据名称>,对应的KBS URI是kbs:///default/aliyun/<凭据名称> MODEL_KEY_ID="kbs:///default/test/model_key" # 加密模式使用的加密方法,取值为"gocryptfs"或"sam",默认值为"gocryptfs" MODEL_ENCRYPTION_METHOD="gocryptfs" # 存放在阿里云OSS上的模型密文路径,格式为"${bucket}:/${path}" MODEL_OSS_BUCKET_PATH="bucket_name:/path_of_model_ciphertext" # 存放模型密文的OSS URL MODEL_OSS_ENDPOINT="https://oss-cn-beijing-internal.aliyuncs.com" # 用于访问OSS bucket的access key MODEL_OSS_ACCESS_KEY_ID="<oss access key id>" # 用于访问OSS bucket的access key secret MODEL_OSS_SECRET_ACCESS_KEY="<oss access key secret>" # 用于访问OSS bucket的session token,仅在通过STS凭据访问OSS时需要 MODEL_OSS_SESSION_TOKEN= # 加入的模型P2P共享群组中节点的IP(可选。需指定群组中至少一个节点的IP,如不指定该项则或指定空值,表示禁用模型共享) # MODEL_SHARING_PEER="172.30.xxx.xxx 172.30.xxx.xxx" # 业务部署模型推理服务使用的端口号,该端口上的通信将被透明加密保护 MODEL_SERVICE_PORT=8080 # 解密后模型明文的挂载位置,模型推理服务可以从该路径加载模型 MODEL_MOUNT_POINT=/tmp/model
按
:wq
键后按回车键
,保存并退出编辑器。
2.部署推理服务
通过docker部署推理服务
使用配置文件启动CAI服务
您需要通过上一步中配置的文件,启动CAI服务,用于完成对加密模型的解密。这将会在host环境中
MODEL_MOUNT_POINT
指定的路径/tmp/model
处挂载解密后的明文模型数据,您的推理服务程序(如vLLM)可以从该路径加载模型。运行如下命令,以启动CAI服务。
cd ~ docker compose -f /opt/alibaba/cai-docker/docker-compose.yml --env-file ./cai.env up -d --wait
回显结果示例如下,说明CAI服务启动成功。
[+] Running 5/5 ✔ Container cai-docker-oss-1 Healthy 44.7s ✔ Container cai-docker-attestation-agent-1 Healthy 44.7s ✔ Container cai-docker-tng-1 Healthy 44.7s ✔ Container cai-docker-confidential-data-hub-1 Healthy 44.7s ✔ Container cai-docker-cachefs-1 Healthy
查看解密后的模型文件
如需查看解密后的模型文件,您可以运行如下命令。
ls -la -R /tmp/model
回显结果示例如下,说明模型文件解密成功。
运行如下命令,启动vLLM推理服务。
docker run --rm \ --net host \ -v /tmp/model:/tmp/model \ --gpus all \ egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/llm-inference:vllm0.5.4-deepgpu-llm24.7-pytorch2.4.0-cuda12.4-ubuntu22.04 \ python3 -m vllm.entrypoints.openai.api_server --model=/tmp/model --trust-remote-code --port 8080
回显信息示例如下,说明推理服务启动成功。
Loading safetensors checkpoint shards: 0% Completed | 0/2 [00:00<?, ?it/s] Loading safetensors checkpoint shards: 50% Completed | 1/2 [00:01<00:01, 1.07s/it] Loading safetensors checkpoint shards: 100% Completed | 2/2 [00:01<00:00, 1.21it/s] Loading safetensors checkpoint shards: 100% Completed | 2/2 [00:01<00:00, 1.16it/s] INFO 03-04 07:49:06 model_runner.py:732] Loading model weights took 5.7915 GB INFO 03-04 07:49:08 gpu_executor.py:102] # GPU blocks: 139032, # CPU blocks: 7281 INFO 03-04 07:49:08 model_runner.py:1024] Capturing the model for CUDA graphs. This may lead to unexpected consequences if the model is not static. To run the model in eager mode, set 'enforce_eager=True' or use '--enforce-eager' in the CLI. INFO 03-04 07:49:08 model_runner.py:1028] CUDA graphs can take additional 1~3 GiB memory per GPU. If you are running out of memory, consider decreasing `gpu_memory_utilization` or enforcing eager mode. You can also reduce the `max_num_seqs` as needed to decrease memory usage. INFO 03-04 07:49:18 model_runner.py:1225] Graph capturing finished in 9 secs. WARNING 03-04 07:49:18 serving_embedding.py:171] embedding_mode is False. Embedding API will not work. INFO 03-04 07:49:18 launcher.py:14] Available routes are: INFO 03-04 07:49:18 launcher.py:22] Route: /openapi.json, Methods: HEAD, GET INFO 03-04 07:49:18 launcher.py:22] Route: /docs, Methods: HEAD, GET INFO 03-04 07:49:18 launcher.py:22] Route: /docs/oauth2-redirect, Methods: HEAD, GET INFO 03-04 07:49:18 launcher.py:22] Route: /redoc, Methods: HEAD, GET INFO 03-04 07:49:18 launcher.py:22] Route: /health, Methods: GET INFO 03-04 07:49:18 launcher.py:22] Route: /tokenize, Methods: POST INFO 03-04 07:49:18 launcher.py:22] Route: /detokenize, Methods: POST INFO 03-04 07:49:18 launcher.py:22] Route: /v1/models, Methods: GET INFO 03-04 07:49:18 launcher.py:22] Route: /version, Methods: GET INFO 03-04 07:49:18 launcher.py:22] Route: /v1/chat/completions, Methods: POST INFO 03-04 07:49:18 launcher.py:22] Route: /v1/completions, Methods: POST INFO 03-04 07:49:18 launcher.py:22] Route: /v1/embeddings, Methods: POST INFO: Started server process [1] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
通过docker compose部署推理服务
准备docker-compose.yml文件。
运行如下命令,打开docker-compose.yml文件。
vi ~/docker-compose.yml
按
i
键进入插入模式,粘贴如下内容到docker-compose.yml文件中。include: - path: /opt/alibaba/cai-docker/docker-compose.yml env_file: ./cai.env services: inference: image: egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/llm-inference:vllm0.5.4-deepgpu-llm24.7-pytorch2.4.0-cuda12.4-ubuntu22.04 volumes: - /tmp/model:/tmp/model:shared deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] network_mode: host init: true command: "python3 -m vllm.entrypoints.openai.api_server --model=/tmp/model/ --trust-remote-code --port 8080" depends_on: cachefs: condition: service_healthy restart: true
按
:wq
键后按回车键
,保存并退出编辑器。重要如果您打算修改docker-compose.yml来部署本文所介绍其他负载,您需要注意如下额外调整:
使用
include
语句引入镜像中预装的CAI docker-compose.yml文件,且使用env_file
指定CAI配置文件路径。您需要为vLLM服务容器添加
depends_on
条件,确保其在cachefs容器之后启动。解密后到模型目录将被挂载到host环境中
MODEL_MOUNT_POINT
指定的路径,因此需对vLLM服务容器添加对应的volumes条目,从而将模型目录共享到推理服务容器内
运行vLLM推理服务
运行如下命令,以运行vLLM推理服务。
docker compose up -d
回显结果示例如下,说明推理服务启动成功。
[+] Running 6/6 ✔ Container root-attestation-agent-1 Healthy 3.6s ✔ Container root-oss-1 Healthy 10.2s ✔ Container root-tng-1 Healthy 44.2s ✔ Container root-confidential-data-hub-1 Healthy 34.2s ✔ Container root-cachefs-1 Healthy 54.7s ✔ Container root-inference-1 Started
步骤六:访问异构机密计算实例中的推理服务
为了访问机密计算实例中的推理服务,您需要准备一个客户端环境,并安装可信网关客户端(Trusted Network Gateway)。下面演示将一台普通的ECS实例作为客户端,访问异构实例中部署的vLLM推理服务的步骤。
1.配置客户端环境对异构机密计算实例和Trustee的访问权限
本文中,客户端环境需通过异构机密计算实例的公网IP来访问实例中部署的推理服务,因此必须为异构机密计算实例所在的安全组添加客户端的放行规则,以允许客户端环境访问异构机密计算实例。同时,在与服务端建立安全信道的过程中,需依赖Trustee对异构机密计算实例进行远程证明。因此,还需在Trustee的访问控制中添加客户端环境的公网IP地址。具体操作如下。
为异构机密计算实例所属安全组添加客户端的放行规则。具体操作,请参见管理安全组规则。
在Trustee的访问控制中添加客户端环境的公网IP地址。
因为在步骤四:配置异构实例对OSS和Trustee的访问权限中已经创建了访问控制策略组并加入了白名单,所以此时不需要新建访问控制策略组,只需将客户端公网IP加入访问控制策略组中即可。
2.为客户端实例部署可信网关客户端
可信网关 (Trusted Network Gateway,TNG) 是针对机密计算场景设计的网络组件。它可作为一个守护进程,负责建立安全通信信道,对进出机密实例的网络流量请求进行透明加解密,实现端到端的数据安全。此外,它允许您在无需修改已有应用程序的同时,根据自己的需求灵活地控制流量的加密和解密过程。
远程连接客户端实例,
关于在客户端实例中安装Docker的具体操作,请参见安装Docker。
运行如下命令,使用Docker部署可信网关客户端。
重要注意:用户需要根据前面部署的Trustee服务,对应修改
as_addr
字段的值为${trsutee_url}/as/
。docker run --rm \ --network=host \ confidential-ai-registry.cn-shanghai.cr.aliyuncs.com/product/tng:1.0.3 \ tng launch --config-content ' { "add_ingress": [ { "http_proxy": { "proxy_listen": { "host": "127.0.0.1", "port": 41000 } }, "verify": { "as_addr": "http://alb-xxxxxxxxxxxxxxxxxx.cn-shanghai.alb.aliyuncsslb.com/cai-test/as/", "policy_ids": [ "default" ] } } ] } '
3.为客户端实例上的进程配置HTTP代理服务
部署成功后,可信网关客户端将保持在前台运行,并在 127.0.0.1:41000
上创建了一个基于HTTP CONNECT协议的HTTP代理服务。将应用程序接入该代理,流量将被可信网关客户端加密处理并通过可信信道发送给vLLM服务。
您可以通过如下两种方式为客户端实例上的进程配置HTTP代理服务。
按照协议类型配置代理
export http_proxy=http://127.0.0.1:41000
export https_proxy=http://127.0.0.1:41000
export ftp_proxy=http://127.0.0.1:41000
export rsync_proxy=http://127.0.0.1:41000
为所有协议配置代理
export all_proxy=http://127.0.0.1:41000
4.通过客户端实例访问推理服务
通过在客户端环境中运行curl
命令访问异构机密计算实例中的推理服务。
为客户端实例重新打开一个终端窗口。
运行如下命令,访问推理服务。
说明您需要将下述命令中的
<异构机密计算实例公网IP>
替换为步骤三:创建异构机密计算实例中创建的异构机密计算实例公网IP。下述命令在执行
curl
命令之前设置了环境变量all_proxy='http://127.0.0.1:41000/'
,从而使得curl
命令发出的请求能够通过可信网关客户端进行加密,并通过安全信道发送。
env all_proxy='http://127.0.0.1:41000/' \ curl http://<异构机密计算实例公网IP>:8080/v1/completions \ -X POST \ -H "Content-Type: application/json" \ -d '{"model": "/tmp/model", "prompt": "Do you know the book Traction by Gino Wickman", "temperature": 0.0, "best_of": 1, "max_tokens": 132, "stream": false}'
回显结果示例如下,表示客户端通过curl命令发出的请求能够被可信网关客户端加密,再通过安全信道发送。最终成功访问异构中部署的大模型服务。
常见问题
启动CAI服务时,cai-docker-oss容器启动失败。
启动CAI服务时,cai-docker-confidential-data-hub容器启动失败。
启动CAI服务时,cai-docker-tng容器启动失败。
启动CAI服务时,cai-docker-cachefs容器启动失败。
启动CAI服务时报错后,如何使用工具收集错误信息。
相关文档
关于如何构建异构机密计算环境,请参见构建异构机密计算环境。