基于异构机密计算实例构建安全大语言模型推理环境

随着大语言模型技术的普及,越来越多的企业开始尝试利用该技术来提升业务能力。因此,如何构建安全的大模型推理服务,确保推理过程中的数据安全,已成为企业关注的热点话题。本文将介绍如何基于阿里云异构机密计算实例及Confidential AI方案(以下简称CAI),快速构建安全的大语言模型推理环境。

背景说明

阿里云异构机密计算实例(gn8v-tee)在CPU TDX机密计算实例的基础上,额外将GPU引入到TEE(Trusted Execution Environment)中,可以保护CPUGPU之间的数据传输及GPU中的数据计算。结合阿里云KMS服务作为密钥存储后端,并在ACK集群内部署Trustee远程证明服务,经过简单配置后,您的推理服务无需修改即可无缝实现机密计算的安全推理保护。该方案旨在帮助您在阿里云上迅速构建安全的大语言模型推理环境,从而为您的业务提供支持。

方案架构

上述方案的整体架构如下图所示。

image

前提条件

该方案中使用的异构机密计算实例目前正处于邀测阶段。如需使用,请单击邀测链接进行申请。

操作步骤

步骤一:准备加密的模型数据

该步骤包括下载模型、加密模型和上传模型三个环节。由于模型文件较大,整个过程耗时较长。

说明

如果您希望快速体验此方案,可以使用我们为您准备的加密模型文件进行试用。选择我们已加密的模型文件后,您将能够跳过该步骤。直接进行步骤二:搭建Trustee远程证明服务。点击下方以获取加密模型文件信息。

点此获取加密模型文件信息

模型名称

加密方式

加密密码

公共读OSS地域

OSS Endpoint

模型存储位置

Qwen2.5-3B-Instruct

Gocryptfs

alibaba@1688

cn-beijing

oss-cn-beijing-internal.aliyuncs.com

conf-ai:/qwen2.5-3b-gocryptfs/

SAM

conf-ai:/qwen2.5-3b-sam/

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加密

  1. 安装用于加密模型的工具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
  2. 创建Gocryptfs密钥文件,作为模型加密的密钥。在后续步骤中,您需要将该密钥上传到远程证明服务(Trustee)进行托管。

    在本方案中,使用alibaba@1688作为加密模型使用的密钥,密钥内容将存储在cachefs-password文件中。您也可以自定义密钥。

    cat << EOF > ~/cachefs-password
    alibaba@1688
    EOF
  3. 使用已创建的密钥对模型进行加密。

    1. 配置明文模型的路径。

      说明

      在此处配置您刚才下载的明文模型所在路径,如果您有其他模型,请将其替换为目标模型的实际路径。

      PLAINTEXT_MODEL_PATH=~/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct/
    2. 使用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加密

  1. 首先下载并解压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
  2. 使用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>目录中。image

3.上传模型

您需要准备一个与即将部署的异构实例相同地域的OSS Bucket,并将加密模型上传到阿里云OSS对象存储,以便后续从异构实例拉取并部署。

以对象存储OSS为例,请参考控制台快速入门创建一个存储空间(Bucket)和一个名为qwen-encrypted的目录(例如oss://examplebucket/qwen-encrypted/),然后使用ossutil工具将加密模型上传到该目录(您也可以使用自己的方法上传加密模型),以供推理服务挂载。以Sam加密为例,密文模型上传后的结果如下图所示。若采用Gocryptfs加密方式,模型文件的密文文件名将全部变成加密后的乱码。image

步骤二:搭建Trustee远程证明服务

远程证明服务是由用户管理的验证服务,负责对模型及推理服务的运行环境进行验证。仅在确认异构模型部署环境的可信度符合预期条件时,才会注入模型解密密钥以实现模型的解密挂载。

您可以使用阿里云ACK Serverless部署远程证明服务,以验证模型部署环境和推理环境。同时,借助阿里云KMS为模型解密密钥提供专业的安全保障。具体操作步骤如下:

重要
  • ACK集群的地域不必与异构部署服务的目标地域相同。

  • 阿里云KMS实例必须和准备部署的阿里云Trustee远程证明服务所在的ACK集群处于相同地域

  • 在创建KMS实例和ACK集群之前,请先创建专有网络和2个交换机。具体操作,请参见创建和管理专有网络

1.创建一台阿里云KMS实例作为密钥存储后端

  1. 前往密钥管理服务控制台,在左侧导航栏选择资源 > 实例管理,然后在软件密钥管理页签创建并启动实例。在启动实例时,请选择与ACK集群相同的专有网络。具体操作,请参见购买和启用KMS实例

    等待大约10分钟,即可启动完毕。

  2. 实例启动完成后,在左侧导航栏选择资源 > 密钥管理,然后在密钥管理页面为该实例创建一个用户主密钥。具体操作,请参见步骤一:创建软件密钥

  3. 在左侧导航栏选择应用接入 > 接入点,然后在接入点页面为该实例创建应用接入点。其中作用域选择已创建的KMS实例。更多配置说明,请参见方式一:快速创建

    应用接入点创建成功后,浏览器会自动下载ClientKey***.zip文件,该zip文件解压后包含:

    • 应用身份凭证内容(ClientKeyContent):文件名默认为clientKey_****.json

    • 凭证口令(ClientKeyPassword):文件名默认为clientKey_****_Password.txt

  4. 资源 > 实例管理页面,单击KMS实例名称,然后在基础信息区域,单击实例CA证书后的下载,导出KMS实例的公钥证书文件PrivateKmsCA_***.pem

2.创建ACK服务集群并安装csi-provisioner组件

  1. 前往创建集群页面,创建ACK Serverless集群,其中关键参数配置说明如下,更多配置说明,请参见创建集群

    1. 集群配置:配置以下参数,完成后单击下一步:组件配置

      关键配置

      描述

      专有网络

      选择使用已有,并勾选为专有网络配置SNAT,否则无法拉取Trustee镜像。

      交换机

      请确保在已有专有网络中创建至少两个虚拟交换机,否则无法暴露公网ALB。

    2. 组件配置:配置以下参数,完成后单击下一步:确认配置

      关键配置

      描述

      服务发现

      选择CoreNDS

      Ingress

      选择ALB Ingress,ALB云原生网关实例来源选择新建,并选择两个虚拟交换机。

    3. 确认配置:确认配置信息和使用须知,然后单击创建集群

  2. 集群创建成功后,安装csi-provisioner(托管)组件。具体操作,请参见管理组件

3.在ACK集群中部署Trustee远程证明服务

  1. 首先通过公网或内网连接集群。具体操作,请参见连接集群

  2. 将已下载的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
  3. 在连接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

  4. 在连接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环境的云市场镜像,创建异构机密计算实例。关于异构机密计算环境的更多信息,请参见构建异构机密计算环境

  1. 前往实例购买页

  2. 选择自定义购买页签。

  3. 选择付费类型、地域、实例规格、镜像等配置。

    各配置项详细说明如下:

    配置项名称

    配置项说明

    实例规格族

    必须选择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,具体大小应根据您需要运行的模型文件大小进行合理评估。一般建议容量大于模型大小的两倍。请您根据实际情况进行设置。

  4. 在最终创建实例前,请在页面右侧检查实例的整体配置并配置使用时长等选项,确保符合您的要求。

  5. 阅读并签署《云服务器ECS服务条款》等服务协议(若已签署,则无需重复签署,请以页面提示为准),然后单击确认下单

    在实例创建过程中,请您耐心等待。您可前往控制台的实例列表页面查看实例的状态,当实例状态变为运行中时,表示实例创建完成。

步骤四:配置异构实例对OSSTrustee的访问权限

1.配置异构实例对OSS的访问权限

在部署过程中,实例需要访问存储模型密文的OSS bucket,并访问Trustee获得模型解密密钥,因此需要配置实例对相关OSSTrustee的访问权限。

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择权限控制 > Bucket 授权策略

  4. Bucket 授权策略页签,单击新增授权,在新增授权页面中,为异构机密计算实例的公网IP增加Bucket授权。

  5. 单击保存

2.配置实例对Trustee的访问权限

  1. 前往阿里云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 > 实例,在集群所在地域下搜索上一步获得的ALB实例,并单击实例ID进入实例详情页面。然后在页面最下方实例属性区域,单击关闭配置修改保护

  • 切换到监听页面,单击目标监听实例访问控制列下的启用,并配置白名单为上述步骤创建的访问控制策略组。

步骤五:在异构机密计算实例中部署vLLM大模型推理服务

在异构机密计算实例中部署vLLM大模型推理服务,您可以通过docker或者docker compose两种方式来完成部署。具体操作步骤如下:

1.准备配置文件

  1. 远程连接异构实例,具体操作,请参见使用Workbench工具以SSH协议登录Linux实例

  2. 运行如下命令,以打开~/cai.env配置文件。

    vi ~/cai.env
  3. 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 URIkbs:///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 bucketaccess key
    MODEL_OSS_ACCESS_KEY_ID="<oss access key id>"
    # 用于访问OSS bucketaccess key secret
    MODEL_OSS_SECRET_ACCESS_KEY="<oss access key secret>"
    # 用于访问OSS bucketsession 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
  4. :wq键后按回车键,保存并退出编辑器。

2.部署推理服务

通过docker部署推理服务

  1. 使用配置文件启动CAI服务

    您需要通过上一步中配置的文件,启动CAI服务,用于完成对加密模型的解密。这将会在host环境中MODEL_MOUNT_POINT指定的路径/tmp/model处挂载解密后的明文模型数据,您的推理服务程序(如vLLM)可以从该路径加载模型。

    1. 运行如下命令,以启动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
    2. 查看解密后的模型文件

      如需查看解密后的模型文件,您可以运行如下命令。

      ls -la -R /tmp/model

      回显结果示例如下,说明模型文件解密成功。

      image

  2. 运行如下命令,启动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部署推理服务

  1. 准备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条目,从而将模型目录共享到推理服务容器内

  2. 运行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地址。具体操作如下。

  1. 为异构机密计算实例所属安全组添加客户端的放行规则。具体操作,请参见管理安全组规则

  2. Trustee的访问控制中添加客户端环境的公网IP地址。

    因为在步骤四:配置异构实例对OSSTrustee的访问权限中已经创建了访问控制策略组并加入了白名单,所以此时不需要新建访问控制策略组,只需将客户端公网IP加入访问控制策略组中即可。

2.为客户端实例部署可信网关客户端

可信网关 (Trusted Network Gateway,TNG) 是针对机密计算场景设计的网络组件。它可作为一个守护进程,负责建立安全通信信道,对进出机密实例的网络流量请求进行透明加解密,实现端到端的数据安全。此外,它允许您在无需修改已有应用程序的同时,根据自己的需求灵活地控制流量的加密和解密过程。

  1. 远程连接客户端实例,

  2. 关于在客户端实例中安装Docker的具体操作,请参见安装Docker

  3. 运行如下命令,使用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命令访问异构机密计算实例中的推理服务。

  1. 为客户端实例重新打开一个终端窗口。

  2. 运行如下命令,访问推理服务。

    说明
    • 您需要将下述命令中的<异构机密计算实例公网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命令发出的请求能够被可信网关客户端加密,再通过安全信道发送。最终成功访问异构中部署的大模型服务。

    image

常见问题

启动CAI服务时,cai-docker-oss容器启动失败。

  • 问题现象:启动CAI服务时,cai-docker-oss容器启动失败。

    image

  • 问题原因:此问题通常是因为该异构实例无法访问模型密文所在的OSS。

  • 解决方案:请检查OSS访问控制策略是否配置正确。

启动CAI服务时,cai-docker-confidential-data-hub容器启动失败。

  • 问题现象:启动CAI服务时,cai-docker-confidential-data-hub容器启动失败。

    image

  • 问题原因:此报错说明在获取模型解密密钥时出现问题,通常是因为该异构实例无法正常访问Trustee实例,或者配置的密钥不存在。

  • 解决方案:可以参考如下步骤进行问题排查。

    • 检查您在cai.env中配置的密钥ID是否正确,并重新部署。

    • 检查cai.env中的Trustee实例的URL是否配置正确,

    • 检查Trustee实例访问控制策略是否配置正确。

启动CAI服务时,cai-docker-tng容器启动失败。

  • 问题现象:启动CAI服务时,cai-docker-tng容器启动失败。

  • 问题原因:此问题通常是因为该异构实例无法正常访问Trustee。

  • 解决方案:可以参考如下步骤进行问题排查。

    • 检查cai.env中的Trustee实例的URL是否配置正确。

    • 检查Trustee实例访问控制策略是否配置正确。

启动CAI服务时,cai-docker-cachefs容器启动失败。

  • 问题现象:启动CAI服务时,cai-docker-cachefs容器启动失败。

    image

  • 问题原因:通常是因为模型解密失败。

  • 解决方案:可以参考如下步骤进行问题排查。

    • 检查是否在TrusteeKMS后端中上传了正确的密码凭据。

    • 检查cai.env中配置的MODEL_ENCRYPTION_METHOD字段的值是否与模型加密时使用的加密方法匹配。

启动CAI服务时报错后,如何使用工具收集错误信息。

  • 问题现象:启动CAI服务时报错,且通过常见问题中的处理思路无法解决问题。

  • 解决方案:运行如下命令,使用工具收集错误信息。

    cai-bug-reporter.sh

    运行上述命令后,将在当前目录下生成名为./cai-diagnostic.tar.gz 的日志文件。随后,您可以提交工单以进行问题处理。在提交工单时,请务必上传该日志,以便我们更有效地进行排查并解决问题。

相关文档

关于如何构建异构机密计算环境,请参见构建异构机密计算环境