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 によってホストされます。モデルの暗号化操作は、ローカルまたは信頼できる環境で実行してください。このソリューションでは、Qwen2.5-3B-Instruct を例としてデプロイする方法を示します。
1. モデルの準備 (オプション)
独自のモデルが既にある場合は、このセクションをスキップして、2. モデルの暗号化 に直接進んでください。
ターミナルで次のコマンドを実行し、ModelScope ツールを使用して Qwen2.5-3B-Instruct をダウンロードします (Python 3.9 以降が必要です)。
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.tgzSam 暗号化モジュールを使用してモデルを暗号化します。
# 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 バイトのカスタム暗号キーです。例:
0Bn4Q1wwY9fN3P。平文キーは、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 -yAnolisOS 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 にアップロードする必要があります。
このソリューションでは、
0Bn4Q1wwY9fN3Pが暗号化のキーであり、cachefs-passwordファイルに格納されます。キーをカスタマイズすることもできますが、実際にはランダムに生成された強力なキーを使用してください。cat << EOF > ~/cachefs-password 0Bn4Q1wwY9fN3P 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 は、暗号化モデルに対して複数のストレージサービスをサポートしており、デプロイ時にマウントを通じて復号されたモデルをサービスインスタンスにロードできます。詳細については、「ストレージのマウント」をご参照ください。
Object Storage Service (OSS) を例にとると、「コンソールのクイックスタート」を参照して、ストレージスペース (バケット) と qwen-encrypted という名前のディレクトリを作成します (例:oss://examplebucket/qwen-encrypted/)。モデルファイルはサイズが大きいため、ossbrowser を使用して暗号化モデルをこのディレクトリにアップロードすることを推奨します。
コマンドラインツール 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: ソフトウェアで保護されたキーを作成する」をご参照ください。
左側のナビゲーションウィンドウで を選択します。次に、[AAPs] ページでインスタンスのアプリケーションアクセスポイント (AAP) を作成します。[Scope] を作成された KMS インスタンスに設定します。詳細については、「モード 1: クイック作成」をご参照ください。
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] を選択します。ゲートウェイソースには [新規] を選択し、2 つの vSwitch を選択します。
確認:設定情報とサービス利用規約を確認し、[クラスターの作成] をクリックします。
クラスターが作成されたら、csi-provisioner (マネージド) コンポーネントをインストールします。詳細については、「コンポーネントの管理」をご参照ください。
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: NoneACK 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" } EOFTrustee が正常に実行されている場合、期待される出力は次のとおりです。
{"nonce":"PIDUjUxQdBMIXz***********IEysXFfUKgSwk=","extra-params":""}
Trustee ネットワークホワイトリストを設定します。
説明目的は、PAI-EAS デプロイ環境がリモート認証サービスにアクティブにアクセスしてセキュリティチェックを実行できるようにすることです。
ALB コンソールに移動し、アクセス制御リスト (ACL) を作成し、Trustee アクセス権限を持つアドレス/アドレスセグメントを IP エントリとして追加します。詳細については、「アクセス制御」をご参照ください。追加するアドレスセグメント:
EAS サービスにバインドされた VPC のパブリック IP アドレス。
推論クライアントの Egress 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。シークレット値:モデルの暗号化に使用したキーを入力します。例:
0Bn4Q1wwY9fN3P。実際のキーを使用してください。CMK:前のステップで作成したマスターキーを選択します。
ステップ 2:PAI-EAS での暗号化モデルのデプロイ
PAI コンソールにログインします。ページ上部でリージョンを選択します。次に、目的のワークスペースを選択し、[Elastic Algorithm Service (EAS)] をクリックします。
[Elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。次に、[カスタムモデルのデプロイ] セクションの [カスタムデプロイ] をクリックします。
[カスタムデプロイ] ページで、次の主要なパラメーターを設定します。その他のパラメーター情報については、「カスタムデプロイ」をご参照ください。
パラメーター
説明
環境情報
デプロイ方式
[イメージベースのデプロイ] を選択します。
イメージ設定
イメージを選択します。このソリューションでは、[Alibaba Cloud イメージ] > [chat-llm-webui:3.0-vllm] を選択します。
ストレージのマウント
[+ OSS] をクリックし、次のパラメーターを設定します。
Uri:暗号化モデルが配置されているディレクトリを選択します。例:
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 パブリックネットワーク Egress 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 設定例は次のとおりです。
[デプロイ] をクリックします。
サービスステータスが「実行中」になると、サービスは正常にデプロイされています。この時点で、[クラスター] ページに移動し、クラスター名をクリックし、[Pod] ページで、下のスクリーンショットの操作ガイドに従って
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."
]
]
}