すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:Confidential AI ソリューションを使用した Intel TDX 保護下でのプライベート Qwen-7B-Chat モデルのデプロイ

最終更新日:Jan 14, 2026

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 に証明することです。その完全性を証明した後にのみ、TrustifluxTrustee からキーを取得できます。

全体のフロー

image

  1. 信頼できる環境で: 元の AI モデルをダウンロードし、モデルを暗号化してから、キーを Trustee に保存します。

  2. 機密コンピューティング環境 (TDX インスタンス) で:

    1. TDX インスタンス内の Trustiflux がリモートアテステーションを開始します。Trustee がアテステーションを検証します。検証が成功すると、Trustee はキーを Trustiflux に送信します。

    2. Trustiflux は暗号化されたモデルを取得し、受け取ったキーを使用して復号します。

    3. 復号されたモデルをロードし、機密環境で 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 インスタンスで実行されます。実際のデプロイメントでは、これらのステップをローカル環境または別の信頼できる環境で実行する必要があります。

  1. 基本的なツールのインストール

    root ユーザーとしてインスタンスにログオンし、Trustee、gocryptfs、およびその他の依存関係をインストールします。

    yum install -y trustee gocryptfs tmux git git-lfs wget && git lfs install
    
    # trustee サービスを開始します
    systemctl start trustee
  1. 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
  1. モデルファイルの暗号化

    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 ディレクトリが存在しないことを確認します。

  1. Trustee にキーを保存する

    前のステップのパスワードファイルを Trustee キーリポジトリに安全に保存します。

    mkdir -p /opt/trustee/kbs/repository/cai/sample/
    mv /cai/trustee/sample_password /opt/trustee/kbs/repository/cai/sample/password
  1. ローカル 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 ターミナルウィンドウで実行してください。

  • 開始する前に、ステップ 1python3 -m http.server コマンドで開始されたサービスが最初のターミナルウィンドウでまだ実行されていることを確認してください。そうでない場合、このセクションの wget コマンドはダウンロードソースを見つけられないため失敗します。

  1. Trustiflux のインストール

    2 番目のターミナルウィンドウで、アテステーションエージェント (attestation-agent)、機密データハブ (confidential-data-hub)、および関連する環境依存関係をインストールします。

    yum install -y attestation-agent confidential-data-hub gocryptfs wget
  1. リモートアテステーションを実行してキーを取得する

    次のコマンドは、アテステーションサービスを構成して開始します。このサービスは、ローカルの 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 サービス
  1. モデルの取得と復号

    # 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 ターミナルウィンドウで実行してください。

  1. 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) が表示されます。

  1. 次のいずれかの方法でサービスを開始します

    • 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?"
            }
        ]
    }'

    出力は次の図のようになります。

    image

    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> プロンプトに直接質問を入力します。次の図に例を示します。

    image

ステップ 4: (オプション) TNG でチャネルセキュリティを強化する

クライアントから機密クラウド環境へのエンドツーエンドの暗号化を実現するために、Trusted Network Gateway (TNG) を使用して通信チャネルを保護できます。これにより、推論プロンプトと応答が送信中に傍受されるのを防ぎます。

説明

この例では、API を介してモデルと対話する方法を示します。開始する前に、ステップ 3OpenAI 互換 API サービスが実行されていることを確認してください。

  1. サーバー (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" }
      }]
    }'
  1. クライアント (ローカルマシン) に 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" ] }
      }]
    }'
  1. 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)

原因とトラブルシューティング:

  1. セキュリティグループルール: セキュリティグループがインターネットからの TCP ポート 7860 でのインバウンドトラフィックを許可していることを確認します。

  2. サービスリッスンアドレス: 起動コマンドに --server-name 0.0.0.0 が含まれていることを確認します。

  3. サービスステータス: 3 番目のターミナルウィンドウで、web_demo.py プロセスがまだ正しく実行されていることを確認します。

キーファイルの取得中にエラーが発生しました: {code: 111, kind: ConnectionRefused, message: "Connection refused"}

原因 1systemctl status trustee コマンドを使用して、インスタンス上の Trustee サービスの状態を確認します。状態が inactive の場合、サービスは実行されていません。

解決策: systemctl start trustee コマンドを実行して Trustee サービスを開始します。

原因 2:デフォルトのリモートアテステーションポリシーが厳しすぎるため、TDX 環境の検証に失敗します。

解決策:(開発環境およびステージング環境のみ) sed -i 's/^default allow = false$/default allow = true/' /opt/trustee/kbs/policy.rego コマンドを実行して、一時的に検証を成功させます。

関連ドキュメント