Elastic Algorithm Service (EAS) では、暗号化モデルの安全なデプロイと推論を可能にする安全な暗号化環境をセットアップできます。この環境は、データとモデルのライフサイクル全体にわたって多層セキュリティを提供し、金融サービス、政府、企業アプリケーションなど、機密性の高いデータを含むシナリオに適しています。このトピックでは、暗号化モデルを準備し、暗号化デプロイと推論を実行する方法について説明します。
概要
暗号化デプロイと推論を行うには、次の手順を実行します。
モデルの暗号化: Gocryptfs または Sam を使用してモデルを暗号化し、暗号化されたモデルをデータソース ( Object Storage Service (OSS) など) にアップロードして、EAS でのマウントとデプロイを後続で行います。
復号鍵の保存: 現在、EAS は Alibaba Cloud がホストする自己構築の Trustee リモート構成証明サービスをサポートしています。 Alibaba Cloud Container Service for Kubernetes (ACK) Serverless に Trustee リモート構成証明サービスをデプロイして、デプロイと推論環境を検証し、Key Management Service (KMS) を復号鍵のストレージバックエンドとして使用します。
PAI-EAS を使用して暗号化モデルをデプロイすると、システムは自動的に Trustee リモート構成証明サービスに接続してデプロイ環境を検証します。検証後、システムは KMS の鍵を使用してモデルを復号化およびマウントし、EAS サービスとしてデプロイします。
デプロイ後、ユーザーは推論サービスにアクセスして推論リクエストを開始できます。
ステップ 1:暗号化モデルを準備する
モデルをデプロイする前に、モデルを暗号化してクラウドストレージにアップロードする必要があります。モデルの復号化に使用される鍵は、リモート構成証明サービスによって制御される KMS によってホストされます。モデルの暗号化操作は、ローカルまたは信頼できる環境で実行します。このソリューションでは、ローカルの Alibaba Cloud Linux 3.2104 LTS 64 環境 (インターネットアクセスあり) に基づいて Qwen2.5-3B-Instruct をデプロイする方法を示します。
1. モデルを準備する (オプション)
独自のモデルが既にある場合は、このセクションをスキップして、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. モデルを暗号化する
PAI-EAS は、次の暗号化方式をサポートしています。このソリューションでは、例として Sam を使用します。
Gocryptfs:オープンソースの Gocryptfs 標準に準拠した AES256-GCM ベースの暗号化モード。
Sam:Alibaba Cloud の信頼できる AI モデル暗号化フォーマット。モデルの機密性を保護し、ライセンスコンテンツの改ざんや不正使用を防ぎます。
オプション 1:Sam 暗号化
Sam 暗号化モジュール 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 <model_directory> <plaintext_key> <key_ID>
ここで:
<model_directory>:暗号化するモデルが配置されているディレクトリ。相対パスまたは絶対パスを使用できます (例:
~/.cache/modelscope/hub/models/Qwen/Qwen2.5-3B-Instruct/
)。<plaintext_key>:4 ~ 128 バイトの長さのカスタム暗号鍵 (例:
alibaba@1688
)。プレーンテキストキーは、Trustee にアップロードされるモデル復号鍵です。<key_ID>:8 ~ 48 バイトの長さのカスタム鍵識別子 (例:
LD_Demo_0001
)。
暗号化後、モデルは現在のパスの
<key_ID>
ディレクトリに暗号化形式で保存されます。
オプション 2:Gocryptfs 暗号化
Gocryptfs ツールをインストールします (現在、デフォルトパラメータを使用する Gocryptfs v2.4.0 バージョンのみをサポートしています)。次のいずれかのインストール方法を選択します。
方法 1:(推奨) yum ソースからインストールする
Alinux3 または AnolisOS 23 オペレーティングシステムを使用している場合は、yum ソースを使用して gocryptfs を直接インストールできます。
Alinux 3
sudo yum install gocryptfs -y
AnolisOS 23
sudo yum install anolis-epao-release -y sudo yum install gocryptfs -y
方法 2:プリコンパイル済みバイナリを直接ダウンロードする
# プリコンパイル済み 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 鍵ファイルを作成します。後続の手順で、この鍵を 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 # gocryptfs を初期化する cat ~/cachefs-password | gocryptfs -init cipher # plain にマウントする cat ~/cachefs-password | gocryptfs cipher plain # AI モデルを ~/mount/plain に移動する cp -r ${PLAINTEXT_MODEL_PATH} ~/mount/plain
3. モデルをアップロードする
EAS は、暗号化モデルの複数のストレージサービスをサポートしており、デプロイ時にマウントすることで、復号化されたモデルをサービスインスタンスにロードできます。詳細については、「ストレージをサービスにマウントする」をご参照ください。
OSS を例に挙げると、バケットと qwen-encrypted
という名前のディレクトリを作成します (例: oss://examplebucket/qwen-encrypted/
)。次に、ossutil ツール を使用して、暗号化されたモデルをこのディレクトリにアップロードし、推論サービスがマウントできるようにします (独自のメソッドを使用して暗号化されたモデルをアップロードすることもできます)。次のスクリーンショットは、Sam 暗号化を使用してアップロードされたモデルを示しています。Gocryptfs 暗号化を使用する場合、ファイル名は文字化けとして暗号化されます。
4. リモート構成証明サービスをセットアップして鍵をアップロードする
リモート構成証明サービスで鍵をホストします。リモート構成証明サービスは、ユーザーが管理する検証サービスであり、モデルと推論サービスの実行環境を検証する役割を担います。EAS デプロイ環境の信頼性が期待される条件を満たしている場合、鍵が挿入されてモデルが復号化およびマウントされます。
現在、EAS は Alibaba Cloud がホストする自己構築の Trustee リモート構成証明サービスをサポートしています。ACK Serverless を使用して Trustee をデプロイし、モデルのデプロイと推論環境を検証できます。また、KMS を使用して、モデル復号鍵を専門的に保護することもできます。次の手順を実行します。
ACK クラスタのリージョンは、EAS サービスをデプロイするリージョンと同じである必要はありません。
KMS インスタンスは、Trustee がデプロイされている ACK クラスタと同じリージョンに配置する必要があります。
KMS インスタンスと ACK クラスタを作成する前に、仮想プライベートネットワーク (VPC) と 2 つの vSwitch を作成します。詳細については、「VPC の作成と管理」をご参照ください。
まず、鍵を保存する KMS インスタンスを作成します。
KMS コンソールに移動し、左側のナビゲーションウィンドウで を選択します。 次に、[ソフトウェアキー管理] タブでインスタンスを作成して起動します。 インスタンスを起動する際は、ACK クラスターと同じ VPC を選択します。 詳細については、「KMS インスタンスを購入して有効化する」をご参照ください。
インスタンスが起動するまで約 10 分待ちます。
インスタンスが起動したら、左側のナビゲーションウィンドウで ステップ 1:ソフトウェアで保護された鍵を作成する」をご参照ください。
を選択します。次に、[鍵] ページでインスタンスのカスタマーマスターキーを作成します。詳細については、「左側のナビゲーションウィンドウで、モード 1: クイック作成」をご参照ください。
を選択します。 次に、[AAP] ページでインスタンス用のアプリケーションアクセスポイント (AAP) を作成します。 [スコープ] を、作成した KMS インスタンスに設定します。 詳細については、「AAP が作成されると、ブラウザは自動的に ClientKey***.zip ファイルをダウンロードします。この zip ファイルには、展開後に次のファイルが含まれています。
ClientKeyContent:デフォルトのファイル名は
clientKey_****.json
です。ClientKeyPassword:デフォルトのファイル名は
clientKey_****_Password.txt
です。
に移動し、KMS インスタンス名をクリックします。次に、[基本情報] セクションで、[インスタンス CA 証明書] の横にある [ダウンロード] をクリックして、KMS インスタンスの公開鍵証明書ファイルPrivateKmsCA_***.pem
をエクスポートします。
ACK サービスクラスタを作成し、csi-provisioner コンポーネントをインストールします。
[クラスターの作成] ページで ACK Serverless クラスターを作成する際は、次のパラメーターにご注意ください。パラメーター設定の詳細については、「ACK Serverless クラスターの作成」をご参照ください。
[クラスター設定] では、以下のパラメーターを設定し、[次へ: コンポーネント設定] をクリックします。
キー項目
説明
VPC
[既存のものを使用] を選択し、[VPC の SNAT を構成] を選択します。そうしないと、Trustee イメージをプルできません。
vSwitch
既存の VPC に少なくとも 2 つの vSwitch が作成されていることを確認します。そうしないと、パブリック ALB を公開できません。
[コンポーネント構成]:次のパラメータを設定し、[次へ:確認] をクリックします。
キー項目
説明
サービスディスカバリ
[CoreNDS] を選択します。
Ingress
[ALB Ingress] を選択します。 Gateway Source には、[新規] を選択し、2 つの vSwitch を選択します。
[確認]:構成情報と利用規約を確認し、[クラスタの作成] をクリックします。
クラスターが作成されたら、csi-provisioner (Managed) コンポーネントをインストールします。詳細については、「コンポーネントの管理」をご参照ください。
ACK クラスタに Trustee をデプロイします。
まず、インターネットまたは内部ネットワーク経由でクラスタに接続します。詳細については、「クラスタへの接続」をご参照ください。
ダウンロードしたクライアント鍵コンテンツ (
clientKey_****.json
)、鍵パスワード (clientKey_****_Password.txt
)、および CA 証明書 (PrivateKmsCA_***.pem
) を ACK Serverless クラスタに接続されている環境にアップロードし、次のコマンドを実行して、Alibaba Cloud KMS を鍵ストレージバックエンドとして使用して Trustee をデプロイします。# プラグインをインストールする 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 インスタンスアプリケーション ID シークレットへのパスに置き換える 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":""}
Trustee ネットワークホワイトリストを設定します。
説明目的は、PAI-EAS デプロイ環境がリモート構成証明サービスにアクティブにアクセスしてセキュリティチェックを実行できるようにすることです。
ALB コンソールに移動し、アクセス制御リスト (ACL) を作成し、Trustee アクセス権限を持つアドレス/アドレスセグメントを IP エントリとして追加します。 詳細については、「アクセス制御」をご参照ください。 追加するアドレスセグメント:
EAS サービスにバインドされている VPC のパブリック 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 をクリックして、インスタンス詳細ページに移動します。次に、ページ下部にある [インスタンス情報] セクションで、[構成の読み取り専用モードを無効にする] をクリックします。
[リスナー] タブに切り替え、ターゲットリスナーインスタンスの [アクセス制御] 列の [有効] をクリックし、前の手順で作成した ACL をホワイトリストとして設定します。
モデル復号鍵を保存するシークレットを作成します。
trustee によってホストされるモデル復号鍵は、KMS に保存されます。リモート構成証明サービスが宛先環境を検証した後でのみ、鍵にアクセスできます。
KMS コンソール に移動し、左側のナビゲーションウィンドウで を選択します。次に、[汎用シークレット] を選択し、[シークレットの作成] をクリックします。次のパラメータに注意してください。
シークレット名: キーをインデックスするためのカスタムシークレット名です (
model-decryption-key
など)。シークレット値: モデルの暗号化に使用するキーを入力します。 例:
alibaba@1688
。 実際のキーを使用してください。CMK: 前のステップで作成したマスターキーを選択します。
ステップ 2:PAI-EAS に暗号化モデルをデプロイする
PAI コンソール にログオンします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS) に入る] をクリックします。
[Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。次に、[カスタムモデルデプロイメント] セクションの [カスタムデプロイメント] をクリックします。
[カスタムデプロイメント] ページで、次の主要パラメータを設定します。パラメータの詳細については、「コンソールでのカスタムデプロイメントのパラメータ」をご参照ください。
パラメータ
説明
環境情報
デプロイ方法
[イメージベースのデプロイメント] を選択します。
イメージ構成
イメージを選択します。このソリューションでは、[Alibaba Cloud イメージ] > [chat-llm-webui:3.0-vllm] を選択します。
モデル設定
[+ OSS] をクリックし、次のパラメータを設定します。
OSS:暗号化モデルが配置されているディレクトリを選択します。例:
oss://examplebucket/qwen-encrypted/
。実際のパスを使用してください。マウントパス:プレーンテキストモデルがマウントされるディレクトリを設定します (例:
/mnt/model
)。
コマンド
構成例:
python webui/webui_server.py --port=8000 --model-path=/mnt/model --backend=vllm
。--model-path
は、復号化されたモデルを読み取るマウントパスと同じである必要があります。ポート番号
このソリューションでは、8000 に設定します。
環境変数
Trustee 検証のための環境変数を追加できます。このソリューションでは、鍵
eas-test
:値123
を設定します。リソース情報
デプロイリソース
このソリューションでは、ml.gu7i.c32m188.1-gu30 を使用します。
VPC
VPC
VPC を構成し、VPC の SNAT パブリックネットワーク出口 IP を設定する ことで、EAS のパブリックネットワークアクセスを有効にし、リモート構成証明サービスにアクセスして環境セキュリティチェックを実行できるようにします。
vSwitch
セキュリティグループ名
機能
安全な暗号化環境の構成
[安全な暗号化環境の構成] スイッチをオンにし、次のパラメータを設定します。
暗号化方法:モデルの暗号化に使用される暗号化方法。 [Sam] と [Gocryptfs] をサポートしています。このソリューションでは、Sam を選択します。
システム信頼管理サービスアドレス:デプロイされた Trustee サービスのアドレス。例:
http://alb-ppams74szbwg2f****.cn-shanghai.alb.aliyuncsslb.com/trustee
。復号鍵の KBS URI:使用されるモデル復号鍵の KBS URI 。
kbs:///default/aliyun/<secret_name_of_the_key>
の形式です。<secret_name_of_the_key>
を前の手順で作成したシークレット名に置き換えます。
最終的な JSON 構成の例は次のとおりです。
[デプロイ] をクリックします。
[サービスステータス] が [実行中] の場合、サービスは正常にデプロイされています。この時点で、[クラスター] ページに移動し、クラスター名をクリックします。次に、[Pods] ページで、以下のスクリーンショットの操作ガイドに従って
attestation-service-*
コンテナログを表示します。ログには、Trustee がモデルデプロイメント環境を検証したかどうか、および実行環境の詳細情報が表示されます。
ステップ 3:サービスを呼び出して安全な推論を行う
1. サービスエンドポイントを表示する
[モデルオンラインサービス (EAS)] ページで、ターゲットサービスの [サービスタイプ] 列の [呼び出し方法] をクリックして、サービスエンドポイントとトークンを取得します。
2. サービスを呼び出す
次の cURL コマンドを実行して、推論リクエストをサービスに送信できます。
curl <Service_URL> \
-H "Content-type: application/json" \
--data-binary @openai_chat_body.json \
-v \
-H "Connection: close" \
-H "Authorization: <Token>"
ここで、
<Service_URL>:EAS サービスエンドポイント。
<Token>:EAS サービストークン。
openai_chat_body.json は元の推論リクエストです。リクエストコンテンツの例は次のとおりです。
{ "max_new_tokens": 4096, "use_stream_chat": false, "prompt": "What is the capital of Canada?", "system_prompt": "Act like you are a knowledgeable assistant who can provide information on geography and related topics.", "history": [ [ "Can you tell me what's the capital of France?", "The capital of France is Paris." ] ], "temperature": 0.8, "top_k": 10, "top_p": 0.8, "do_sample": true, "use_cache": true }
上記の例では、次の応答が返されます。
{
"response": "The capital of Canada is Ottawa.",
"history": [
[
"Can you tell me what's the capital of France?",
"The capital of France is Paris."
],
[
"What is the capital of Canada?",
"The capital of Canada is Ottawa."
]
]
}