AI モデル資産や、金融や医療記録などの機密データを保護するために、Alibaba Cloud TDX 機密コンピューティングインスタンスを使用できます。これらのインスタンスは、リモートアテステーションを使用して復号鍵を取得します。その後、Qwen モデルを安全にデプロイできます。このプロセスは、AI 推論中にハードウェアレベルのデータ保護を提供し、コア資産を保護します。
ユースケース
金融およびヘルスケア向けのコンプライアント AI: 個人識別用情報 (PII) や保護医療情報を含むテキストを処理する場合、機密コンピューティングを使用して、推論中にデータが公開されないようにすることができます。これにより、コンプライアンス要件を満たすことができます。
プライベートなエンタープライズナレッジベース: 企業が、財務レポートや研究開発資料などの内部の機密ドキュメントで大規模言語モデルを強化したいと考えています。しかし、このコアデータがクラウド上でプレーンテキストとして公開されることは望んでいません。このソリューションは、ナレッジベースのデータとファインチューニングされたモデルの両方がハードウェアによって保護されることを保証します。
商用モデル資産の保護: AI サービスプロバイダー (SP) にとって、慎重にトレーニングされた独自のモデルは、中核となる商用資産です。このソリューションは、クラウド上でモデルが不正にコピーされたり盗まれたりするのを防ぐことができます。
ソリューションの概要
Confidential AI ソリューションの紹介
Confidential AI は、信頼できないクラウド環境で AI タスクを安全に実行できる Alibaba Cloud のソリューションです。Intel TDX などの機密コンピューティングハードウェアを使用して、AI モデルと機密データのための「ハードウェアセーフボックス」(機密環境) を作成します。これにより、エンドツーエンドのセキュリティとプライバシー保護が提供されます。
コアコンポーネントの説明
Trustee: これは「キーセーフボックス」と考えてください。その主な役割は、AI モデルの復号に使用されるキーを安全に保存および管理することです。厳格なリモートアテステーションに合格した信頼できるリクエストのみが Trustee からキーを取得できます。
Trustiflux: これは「クラウド内の信頼できるゲートキーパー」と考えてください。TDX インスタンス内にデプロイされます。そのコアタスクは、リモートアテステーションプロセスを使用して、現在のランタイムが本物で改ざんされていない TDX 機密環境であることを Trustee に証明することです。その完全性を証明した後にのみ、Trustiflux は Trustee からキーを取得できます。
全体のフロー

信頼できる環境で: 元の AI モデルをダウンロードし、モデルを暗号化してから、キーを Trustee に保存します。
機密コンピューティング環境 (TDX インスタンス) で:
TDX インスタンス内の Trustiflux がリモートアテステーションを開始します。Trustee がアテステーションを検証します。検証が成功すると、Trustee はキーを Trustiflux に送信します。
Trustiflux は暗号化されたモデルを取得し、受け取ったキーを使用して復号します。
復号されたモデルをロードし、機密環境で AI 推論サービスを開始します。
準備
ECS リソースの準備: 次の主要な構成で TDX 機密コンピューティングインスタンスを作成します。
リージョンとゾーン: 中国 (北京) ゾーン I。
インスタンスタイプ: Qwen-7B-Chat モデルを実行するには、約 30 GiB のメモリが必要です。安定性を確保するため、
ecs.g8i.4xlarge(16 vCPU、64 GiB メモリ) またはそれ以上のインスタンスタイプを選択してください。イメージ:
Alibaba Cloud Linux 3.2104 LTS 64 ビットを選択し、[Confidential VM] オプションを選択します。パブリック IP アドレス: [パブリック IPv4 アドレスの割り当て] を選択します。帯域幅については、[トラフィック課金] を選択し、モデルのダウンロードを高速化するためにピーク帯域幅を 100 Mbps に設定します。
データディスク: モデルと関連ファイルには大量のスペースが必要です。システムディスクは少なくとも
100 GiBである必要があります。
セキュリティグループの構成: 次のポートでのインバウンドトラフィックを許可するようにセキュリティグループを構成します。詳細については、「セキュリティグループルールの管理」をご参照ください。
22: Secure Shell (SSH) リモートログイン用。9090: 後のステップでクラウドから暗号化されたモデルを取得するための一時的な HTTP サービス用。7860: 最終的にデプロイされた Qwen Web UI または API サービスにアクセスするため。50005: (オプション) Trusted Network Gateway (TNG) が推論プロンプトと応答のチャネルセキュリティを確保するため。
ステップ 1: 信頼できる環境で暗号化されたモデルとキーを準備する
まず、モデルをダウンロードして暗号化し、次に Trustee を構成してキーを保存します。このデモでは、次のステップは同じ TDX インスタンスで実行されます。実際のデプロイメントでは、これらのステップをローカル環境または別の信頼できる環境で実行する必要があります。
基本的なツールのインストール
root ユーザーとしてインスタンスにログオンし、Trustee、gocryptfs、およびその他の依存関係をインストールします。
yum install -y trustee gocryptfs tmux git git-lfs wget && git lfs install # trustee サービスを開始します systemctl start trustee
Qwen-7B-Chatモデルのダウンロードモデルファイルは大きく、ダウンロードには時間がかかります (約 15〜20 分)。ダウンロードは
tmuxセッションで実行して、SSH 接続が切断されてダウンロードが中断されるのを防ぎます。# 作業ディレクトリを作成します mkdir -p /cai/trustee && cd /cai/trustee # qwen_clone という名前の tmux セッションを作成して入ります # 注: tmux を使用すると、ネットワークの問題や SSH クライアントの切断によるダウンロードの中断を防ぐことができます。 tmux new-session -d -s qwen_clone "git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git qwen-7b-chat --depth=1" # ダウンロードの進行状況を監視します # 注: ダウンロードが完了すると、プロセスは終了し、[exited] と表示されます。 tmux attach -t qwen_clone
モデルファイルの暗号化
gocryptfsツールを使用して暗号化されたディレクトリを作成します。次に、モデルファイルをそのディレクトリに移動して自動的に暗号化します。# 暗号化データ (cipher) とプレーンテキストマウントポイント (plain) のディレクトリを準備します mkdir -p /cai/trustee/mount/{cipher,plain} # 暗号化用のパスワードファイルを作成します。本番環境では、より安全なランダムなパスワードを使用してください。 printf '123456' > /cai/trustee/sample_password # パスワードファイルを使用して gocryptfs 暗号化ディレクトリを初期化します cat /cai/trustee/sample_password | gocryptfs -init /cai/trustee/mount/cipher # 暗号化されたディレクトリをバックグラウンドプロセスとしてプレーンテキストマウントポイントにマウントします (cat /cai/trustee/sample_password | gocryptfs /cai/trustee/mount/cipher /cai/trustee/mount/plain &) && sleep 2 # モデルファイルをプレーンテキストマウントポイントに移動します。gocryptfs は自動的に暗号化を処理し、暗号化されたデータを cipher ディレクトリに書き込みます。ファイルが大きいため、このプロセスには約 5 分かかります。 mv /cai/trustee/qwen-7b-chat/ /cai/trustee/mount/plain # 操作が完了したら、プレーンテキストマウントポイントをアンマウントします fusermount -u /cai/trustee/mount/plain期待される結果
コマンドを実行した後、
ls /cai/trustee/mount/cipherを実行します。qwen-7b-chatの代わりに、いくつかの暗号化されたファイル名が表示されるはずです。次に、ls /cai/trusteeを実行して、qwen-7b-chatディレクトリが存在しないことを確認します。
Trustee にキーを保存する
前のステップのパスワードファイルを
Trusteeキーリポジトリに安全に保存します。mkdir -p /opt/trustee/kbs/repository/cai/sample/ mv /cai/trustee/sample_password /opt/trustee/kbs/repository/cai/sample/password
ローカル HTTP サービスの開始
一時的な Web サーバーを起動して、暗号化されたモデルファイルをクラウド環境に提供します。
# このコマンドは 127.0.0.1:9090 でリッスンするサービスを開始します。このターミナルウィンドウは実行したままにしてください。 cd /cai/trustee/mount/cipher && python3 -m http.server 9090 --bind 127.0.0.1
ステップ 2: 機密クラウド環境でモデルを復号してマウントする
このセクションの操作は、2 番目の SSH ターミナルウィンドウで実行してください。
開始する前に、ステップ 1 の
python3 -m http.serverコマンドで開始されたサービスが最初のターミナルウィンドウでまだ実行されていることを確認してください。そうでない場合、このセクションのwgetコマンドはダウンロードソースを見つけられないため失敗します。
Trustiflux のインストール
2 番目のターミナルウィンドウで、アテステーションエージェント (attestation-agent)、機密データハブ (confidential-data-hub)、および関連する環境依存関係をインストールします。
yum install -y attestation-agent confidential-data-hub gocryptfs wget
リモートアテステーションを実行してキーを取得する
次のコマンドは、アテステーションサービスを構成して開始します。このサービスは、ローカルの Trustee (この例では同じマシンの 127.0.0.1) と通信します。検証が成功すると、サービスはモデルキーを取得して保存します。
キー転送のセキュリティは、Trustiflux と Trustee 間の Trusted Execution Environment (TEE) ベースのアプリケーション層暗号化プロトコルである KBS アテステーションプロトコル によって保証されます。
# ローカル Trustee と通信するように attestation-agent と confidential-data-hub を構成します sed -i "/^\[token_configs\.kbs\]$/,/^$/ s|^url = .*|url = \"http://127.0.0.1:8080\"|" \ /etc/trustiflux/attestation-agent.toml sed -i "/^\[token_configs\.coco_as\]$/,/^$/ s|^url = .*|url = \"http://127.0.0.1:50004\"|" \ /etc/trustiflux/attestation-agent.toml sed -i 's|\(url\s*=\s*"\)[^"]*|\1http://127.0.0.1:8080|' \ /etc/trustiflux/confidential-data-hub.toml # アテステーションエージェントを開始し、キーリソースをリクエストします attestation-agent -c /etc/trustiflux/attestation-agent.toml > /dev/null 2>&1 & PID=$! && sleep 1 password=$(confidential-data-hub \ -c /etc/trustiflux/confidential-data-hub.toml \ get-resource \ --resource-uri kbs:///cai/sample/password) mkdir -p /cai/trustiflux && echo "$password" | base64 -d > "/cai/trustiflux/sample_password"期待される結果
コマンドが正常に実行されると、
/cai/trustiflux/sample_passwordパスに内容が123456のパスワードファイルが見つかります。ファイルが見つからない場合は、ステップ 1ローカル HTTP サービス
モデルの取得と復号
# wget を使用して、ステップ 1.5 で公開された暗号化モデルファイルを再帰的にダウンロードします wget -c --tries=30 --timeout=30 --waitretry=15 \ -r -np -nH --cut-dirs=0 -R "index.html*" \ --progress=dot:giga --show-progress \ -P /cai/trustiflux/mount/cipher \ http://127.0.0.1:9090 # プレーンテキストマウントポイントを作成します mkdir -p /cai/trustiflux/mount/plain # リモートアテステーションで取得したキーを使用して、ダウンロードした暗号化モデルディレクトリをプレーンテキストマウントポイントにマウントします gocryptfs -debug -passfile /cai/trustiflux/sample_password /cai/trustiflux/mount/cipher /cai/trustiflux/mount/plain期待される結果
コマンドが実行されると、ターミナルに
Filesystem mounted and readyと出力されます。ls /cai/trustiflux/mount/plainを実行します。復号されたqwen-7b-chatディレクトリが表示されます。暗号化されたモデルをダウンロードする際に
wgetが "Connection refused" エラーを返す場合は、ステップ 1ローカル HTTP サービス
ステップ 3: Qwen 推論サービスを開始してアクセスする
このセクションの操作は、3 番目の SSH ターミナルウィンドウで実行してください。
Python 環境と依存関係の準備
3 番目のターミナルウィンドウで、Conda を使用して新しい Python 環境を作成し、アクティブ化します。
# Miniconda をダウンロードしてインストールします wget https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-x86_64.sh bash Miniconda3-py39_23.11.0-2-Linux-x86_64.sh -b -p $HOME/miniconda # Conda 環境をアクティブ化します source $HOME/miniconda/bin/activate # 専用の Python 3.10 環境を作成してアクティブ化します conda create -n pytorch_env python=3.10 -y conda activate pytorch_env期待される結果
ターミナルのプロンプトの前にテキスト
(pytorch_env)が表示されます。
次のいずれかの方法でサービスを開始します
API を介してプログラムでモデルを呼び出すには、OpenAI 互換 API サービスを開始するを選択します。
グラフィカルインターフェイスを介してモデルと対話するには、Web UI サービスを開始するを選択します。
サーバーターミナルで直接モデルとチャットするには、コマンドライン対話型チャットを開始するを選択します。
OpenAI 互換 API サービスを開始する
# 専用の Python 3.10 環境をアクティブ化します source $HOME/miniconda/bin/activate conda activate pytorch_env cd /cai/trustiflux git clone https://github.com/QwenLM/Qwen.git cd Qwen pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip3 install -r requirements.txt && pip3 install fastapi uvicorn "openai<1.0" pydantic sse_starlette python openai_api.py -c ../mount/plain/qwen-7b-chat --cpu-only --server-name 0.0.0.0 --server-port 7860アクセス方法: ECS インスタンスのパブリック IP アドレスにアクセスできる任意のターミナルで、
curlコマンドを使用して呼び出しを行います。このトピックでは、ローカルターミナルを例として使用します。
curl -X POST http://<TDX インスタンスのパブリック IP アドレス>:7860/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Who are you?" } ] }'出力は次の図のようになります。

Web UI サービスを開始する
# 専用の Python 3.10 環境をアクティブ化します source $HOME/miniconda/bin/activate conda activate pytorch_env cd /cai/trustiflux git clone https://github.com/QwenLM/Qwen.git cd Qwen pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip3 install -r requirements.txt && pip3 install -r requirements_web_demo.txt python3 web_demo.py -c ../mount/plain/qwen-7b-chat --cpu-only --server-name 0.0.0.0 --server-port 7860アクセス方法: ローカルブラウザのアドレスバーに
http://<ECS インスタンスのパブリック IP アドレス>:7860と入力します。コマンドライン対話型チャットを開始する
# 専用の Python 3.10 環境をアクティブ化します source $HOME/miniconda/bin/activate conda activate pytorch_env cd /cai/trustiflux git clone https://github.com/QwenLM/Qwen.git cd Qwen pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip3 install -r requirements.txt python3 cli_demo.py -c ../mount/plain/qwen-7b-chat --cpu-onlyアクセス方法: 起動後、ターミナルの
User>プロンプトに直接質問を入力します。次の図に例を示します。
ステップ 4: (オプション) TNG でチャネルセキュリティを強化する
クライアントから機密クラウド環境へのエンドツーエンドの暗号化を実現するために、Trusted Network Gateway (TNG) を使用して通信チャネルを保護できます。これにより、推論プロンプトと応答が送信中に傍受されるのを防ぎます。
この例では、API を介してモデルと対話する方法を示します。開始する前に、ステップ 3 の OpenAI 互換 API サービスが実行されていることを確認してください。
サーバー (TDX インスタンス) に TNG をデプロイする
TDX インスタンスで 4 番目のターミナルウィンドウを開き、次のコマンドを実行します。
yum install -y trusted-network-gateway tng launch --config-content '{ "add_egress": [{ "netfilter": { "capture_dst": { "port": 7860 }, "capture_local_traffic": true, "listen_port": 40001 }, "attest": { "aa_addr": "unix:///run/confidential-containers/attestation-agent/attestation-agent.sock" } }] }'
クライアント (ローカルマシン) に TNG をデプロイする
ローカルマシンで TNG をダウンロードして実行します。
その他の TNG バージョン
ローカルマシンが x86_64 の場合
# x86_64 wget https://github.com/inclavare-containers/TNG/releases/download/v2.2.4/tng-v2.2.4.x86_64-unknown-linux-gnu.tar.gz tar -zxvf tng-v2.2.4.x86_64-unknown-linux-gnu.tar.gz && chmod +x tng ./tng launch --config-content '{ "add_ingress": [{ "http_proxy": { "proxy_listen": { "host": "127.0.0.1", "port": 41000 } }, "verify": { "as_addr": "http://<TDX インスタンスのパブリック IP アドレス>:50005", "policy_ids": [ "default" ] } }] }'ローカルマシンが aarch64 の場合
# aarch64 wget https://github.com/inclavare-containers/TNG/releases/download/v2.2.4/tng-v2.2.4.aarch64-unknown-linux-gnu.tar.gz tar -zxvf tng-v2.2.4.aarch64-unknown-linux-gnu.tar.gz && chmod +x tng ./tng launch --config-content '{ "add_ingress": [{ "http_proxy": { "proxy_listen": { "host": "127.0.0.1", "port": 41000 } }, "verify": { "as_addr": "http://<TDX インスタンスのパブリック IP アドレス>:50005", "policy_ids": [ "default" ] } }] }'
TNG プロキシを介してサービスにアクセスする
新しいローカルコマンドラインウィンドウを開き、次のコマンドを実行して HTTP プロキシを構成し、暗号化されたチャネルを介してモデルと対話します。
# HTTP プロキシを構成するための一時的な環境変数を設定します export http_proxy=http://127.0.0.1:41000 # API を介してモデルと対話します curl -X POST http://<TDX インスタンスのパブリック IP アドレス>:7860/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Who are you?" } ] }'
よくある質問
trustee のインストール中のエラー: 「Error: Transaction test error」
原因: システム上の既存のインテル ソフトウェア・ガード・エクステンションズ (SGX) または TDX の依存関係が Trustee と競合しています。
解決策: yum remove libsgx-dcap-default-qpl libsgx-dcap-quote-verify を実行してから、インストールを再試行してください。
wget が「Connection refused」エラーで暗号化されたモデルのダウンロードに失敗する
原因: ステップ 1 で開始された python3 -m http.server サービスが停止しています。
解決策: コマンドを実行したターミナルウィンドウ (最初のターミナルウィンドウ) に戻り、サービスがまだ実行されていることを確認します。停止している場合は、/cai/trustee/mount/cipher ディレクトリに戻って再度開始してください。
ブラウザで Web UI にアクセスできない (http://<ECS インスタンスのパブリック IP アドレス>:7860)
原因とトラブルシューティング:
セキュリティグループルール: セキュリティグループがインターネットからの TCP ポート 7860 でのインバウンドトラフィックを許可していることを確認します。
サービスリッスンアドレス: 起動コマンドに
--server-name 0.0.0.0が含まれていることを確認します。サービスステータス: 3 番目のターミナルウィンドウで、
web_demo.pyプロセスがまだ正しく実行されていることを確認します。
キーファイルの取得中にエラーが発生しました: {code: 111, kind: ConnectionRefused, message: "Connection refused"}
原因 1:systemctl status trustee コマンドを使用して、インスタンス上の Trustee サービスの状態を確認します。状態が inactive の場合、サービスは実行されていません。
解決策: systemctl start trustee コマンドを実行して Trustee サービスを開始します。
原因 2:デフォルトのリモートアテステーションポリシーが厳しすぎるため、TDX 環境の検証に失敗します。
解決策:(開発環境およびステージング環境のみ) sed -i 's/^default allow = false$/default allow = true/' /opt/trustee/kbs/policy.rego コマンドを実行して、一時的に検証を成功させます。