Déployez le modèle Qwen-7B-Chat sur des instances de calcul confidentiel TDX d'Alibaba Cloud. L'attestation à distance récupère la clé de déchiffrement, garantissant une protection matérielle des actifs du modèle d'IA et des données sensibles lors de l'inférence.
Cas d'utilisation
IA conforme pour la finance et la santé : Traitez du texte contenant des informations personnelles identifiables (PII) ou des informations de santé protégées (PHI) sans exposer les données pendant l'inférence. Le calcul confidentiel garantit ainsi la conformité réglementaire.
Bases de connaissances privées d'entreprise : Enrichissez un grand modèle de langage avec des documents internes sensibles (rapports financiers, matériaux de R&D) sans que ces données n'apparaissent en clair dans le cloud. Cette solution offre une protection matérielle tant pour la base de connaissances que pour le modèle affiné.
Protection des actifs modèles commerciaux : Empêchez la copie illégale ou le vol de modèles d'IA propriétaires dans le cloud afin de sécuriser les actifs commerciaux essentiels des fournisseurs de services d'IA.
Présentation de la solution
Qu'est-ce que Confidential AI
Confidential AI est une solution Alibaba Cloud conçue pour exécuter des tâches d'IA en toute sécurité dans des environnements cloud non approuvés. Elle s'appuie sur le matériel Intel TDX pour créer un environnement confidentiel dédié à vos modèles d'IA et à vos données sensibles, garantissant une protection de bout en bout de la confidentialité.
Composants principaux
Trustee : Service de gestion des clés stockant de manière sécurisée les clés de déchiffrement des modèles d'IA. Seules les requêtes ayant réussi l'attestation à distance peuvent obtenir une clé auprès de Trustee.
Trustiflux : Agent déployé au sein de l'instance TDX. Il utilise l'attestation à distance pour prouver à Trustee que l'environnement d'exécution est bien un environnement confidentiel TDX authentique et non altéré. Trustiflux obtient la clé auprès de Trustee uniquement après cette vérification.
Flux global

Dans votre environnement de confiance : Téléchargez le modèle d'IA original, chiffrez-le, puis stockez la clé dans Trustee.
-
Dans l'environnement de calcul confidentiel (instance TDX) :
Trustiflux, présent dans l'instance TDX, lance l'attestation à distance. Trustee vérifie cette attestation. Une fois la vérification réussie, Trustee transmet la clé à Trustiflux.
Trustiflux récupère le modèle chiffré et utilise la clé reçue pour le déchiffrer.
Chargez le modèle déchiffré et démarrez le service d'inférence IA dans l'environnement confidentiel.
Prérequis
-
Préparer les ressources ECS : Créer une instance de calcul confidentiel TDX avec les configurations suivantes :
Région et zone : Chine (Pékin) Zone I.
Type d'instance : Qwen-7B-Chat nécessite environ 30 GiB de mémoire. Sélectionnez
ecs.g8i.4xlarge(16 vCPU, 64 GiB) ou supérieur.Image : Choisissez
Alibaba Cloud Linux 3.2104 LTS 64-bitet activez l'option Confidential VM.Adresse IP publique : Cochez Assign Public IPv4 Address. Optez pour Pay-By-Traffic avec une bande passante maximale de 100 Mbps afin d'accélérer le téléchargement du modèle.
Disque de données : Définissez le disque système à au moins
100 GiBpour héberger le modèle et les fichiers associés.
-
Configurer le groupe de sécurité : Autorisez le trafic entrant sur les ports suivants. Pour plus d'informations, consultez Gérer les règles de groupe de sécurité.
22: Pour la connexion distante Secure Shell (SSH).9090: Pour le service HTTP temporaire servant le modèle chiffré.7860: Pour l'interface Web UI ou le service API de Qwen.50005: (Facultatif) Pour Trusted Network Gateway (TNG), afin de garantir la sécurité du canal pour les invites et les réponses d'inférence.
Étape 1 : Préparer le modèle chiffré et la clé dans un environnement de confiance
Téléchargez et chiffrez le modèle, puis stockez la clé dans Trustee. Pour cette démonstration, ces opérations s'exécutent sur la même instance TDX. En production, effectuez-les dans votre environnement local ou tout autre environnement de confiance.
-
Installer les outils de base
Connectez-vous à l'instance en tant qu'utilisateur root et installez Trustee, gocryptfs ainsi que les autres dépendances.
yum install -y trustee gocryptfs tmux git git-lfs wget && git lfs install # Start the trustee service systemctl start trustee
-
Télécharger le modèle Qwen-7B-Chat
Le téléchargement dure environ 15 à 20 minutes. Exécutez-le dans une session
tmuxpour éviter qu'une déconnexion SSH n'interrompe le processus.# Create a working directory mkdir -p /cai/trustee && cd /cai/trustee # Create and enter a tmux session named qwen_clone # Note: Using tmux prevents the download from being interrupted by network issues or a closed SSH client. tmux new-session -d -s qwen_clone "git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git qwen-7b-chat --depth=1" # Monitor the download progress # Note: After the download is complete, the process will exit and show [exited]. tmux attach -t qwen_clone
-
Chiffrer les fichiers du modèle
Créez un répertoire chiffré avec
gocryptfs, puis déplacez-y les fichiers du modèle pour les chiffrer automatiquement.# Prepare directories for the encrypted data (cipher) and the plaintext mount target (plain) mkdir -p /cai/trustee/mount/{cipher,plain} # Create a password file for encryption. In a production environment, use a more secure, random password. printf '123456' > /cai/trustee/sample_password # Use the password file to initialize the gocryptfs encrypted directory cat /cai/trustee/sample_password | gocryptfs -init /cai/trustee/mount/cipher # Mount the encrypted directory to the plaintext mount target as a background process (cat /cai/trustee/sample_password | gocryptfs /cai/trustee/mount/cipher /cai/trustee/mount/plain &) && sleep 2 # Move model files to plaintext mount target for encryption mv /cai/trustee/qwen-7b-chat/ /cai/trustee/mount/plain # After the operation is complete, unmount the plaintext mount target fusermount -u /cai/trustee/mount/plainRésultat attendu
Exécutez
ls /cai/trustee/mount/cipherpour vérifier que des noms de fichiers chiffrés apparaissent à la place deqwen-7b-chat. Lancez ensuitels /cai/trusteepour confirmer que le répertoireqwen-7b-chatn'existe plus.
-
Enregistrer la clé dans Trustee
Stockez le fichier de mot de passe dans le référentiel de clés
Trustee.mkdir -p /opt/trustee/kbs/repository/cai/sample/ mv /cai/trustee/sample_password /opt/trustee/kbs/repository/cai/sample/password
-
Démarrer le service HTTP local
Lancez un serveur web temporaire pour servir les fichiers du modèle chiffré.
# This command starts a service listening on 127.0.0.1:9090. Keep this terminal window running. cd /cai/trustee/mount/cipher && python3 -m http.server 9090 --bind 127.0.0.1
Étape 2 : Déchiffrer et monter le modèle dans l'environnement cloud confidentiel
Effectuez les opérations de cette section dans une deuxième fenêtre de terminal SSH.
Avant de commencer, assurez-vous que le service démarré avec la commande
python3 -m http.serverlors de l'Étape 1 est toujours actif dans la première fenêtre de terminal. Sinon, la commandewgetde cette section échouera car elle ne trouvera pas la source de téléchargement.
-
Installer Trustiflux
Dans la deuxième fenêtre de terminal, installez attestation-agent, confidential-data-hub et leurs dépendances.
yum install -y attestation-agent confidential-data-hub gocryptfs wget
-
Effectuer l'attestation à distance et obtenir la clé
Configurez et démarrez le service d'attestation qui communique avec le Trustee local (127.0.0.1). Après une vérification réussie, il récupère et enregistre la clé du modèle.
La sécurité du transfert de clé est garantie par le protocole d'attestation KBS , un protocole de chiffrement de couche applicative basé sur un environnement d'exécution de confiance (TEE) entre Trustiflux et Trustee.
# Configure attestation-agent and confidential-data-hub to communicate with the local Trustee 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 # Start the attestation agent, then request the key resource 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"Résultat attendu
Le fichier de mot de passe contenant
123456est enregistré sous/cai/trustiflux/sample_password.Si le fichier est introuvable, vérifiez que le service HTTP local de l' Étape 1 fonctionne correctement.
-
Récupérer et déchiffrer le modèle
# Use wget to recursively download the encrypted model files exposed in Step 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 # Create a plaintext mount target mkdir -p /cai/trustiflux/mount/plain # Use the key obtained through remote attestation to mount the downloaded encrypted model directory to the plaintext mount target gocryptfs -debug -passfile /cai/trustiflux/sample_password /cai/trustiflux/mount/cipher /cai/trustiflux/mount/plainRésultat attendu
Le terminal affiche
Filesystem mounted and ready. Exécutezls /cai/trustiflux/mount/plainpour voir le répertoire déchiffréqwen-7b-chat.Si
wgetrenvoie une erreur « Connection refused » lors du téléchargement du modèle chiffré, vérifiez que le service HTTP local de l' Étape 1 est bien actif.
Étape 3 : Démarrer et accéder au service d'inférence Qwen
Effectuez les opérations de cette section dans une troisième fenêtre de terminal SSH.
-
Préparer l'environnement Python et les dépendances
Dans la troisième fenêtre de terminal, créez et activez un environnement Python Conda.
# Download and install 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 # Activate the Conda environment source $HOME/miniconda/bin/activate # Create and activate a dedicated Python 3.10 environment conda create -n pytorch_env python=3.10 -y conda activate pytorch_envRésultat attendu
Le texte
(pytorch_env)apparaît avant l'invite de commande du terminal.
-
Démarrer le service selon l'une des méthodes suivantes
Pour appeler le modèle par programmation via une API, choisissez Démarrer le service API compatible OpenAI.
Pour interagir avec le modèle via une interface graphique, optez pour Démarrer le service Web UI.
Pour discuter avec le modèle directement dans le terminal du serveur, sélectionnez Démarrer le chat interactif en ligne de commande.
Démarrer le service API compatible OpenAI
# Activate the dedicated Python 3.10 environment 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 7860Accès : Depuis n'importe quel terminal pouvant joindre l'adresse IP publique de l'instance ECS, utilisez la commande
curlpour effectuer un appel.Cette rubrique prend un terminal local comme exemple.
curl -X POST http://<Public IP address of the TDX instance>: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?" } ] }'La sortie est illustrée dans la figure suivante.

Démarrer le service Web UI
# Activate the dedicated Python 3.10 environment 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 7860Accès : Dans la barre d'adresse de votre navigateur local, saisissez
http://<Public IP address of the ECS instance>:7860.Démarrer le chat interactif en ligne de commande
# Activate the dedicated Python 3.10 environment 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-onlyAccès : Après le démarrage, posez votre question directement à l'invite
User>dans le terminal. La figure suivante montre un exemple.
Étape 4 : (Facultatif) Renforcer la sécurité du canal avec TNG
Utilisez Trusted Network Gateway (TNG) pour établir un chiffrement de bout en bout entre le client et l'environnement cloud confidentiel. Cela empêche l'interception des invites et des réponses d'inférence pendant leur transmission.
Cet exemple montre comment interagir avec le modèle via une API. Avant de commencer, assurez-vous que le service API compatible OpenAI de l'Étape 3 est en cours d'exécution.
-
Déployer TNG sur le serveur (instance TDX)
Ouvrez une quatrième fenêtre de terminal sur l'instance TDX et exécutez :
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" } }] }'
-
Déployer TNG sur le client (machine locale)
Téléchargez et exécutez TNG sur votre machine locale :
Autres versions de TNG
Machine locale 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://<Public IP address of the TDX instance>:50005", "policy_ids": [ "default" ] } }] }'Machine locale 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://<Public IP address of the TDX instance>:50005", "policy_ids": [ "default" ] } }] }'
-
Accéder au service via le proxy TNG
Ouvrez un nouveau terminal local, configurez le proxy HTTP et interagissez avec le modèle via le canal chiffré :
# Temporarily set an environment variable to configure the HTTP proxy export http_proxy=http://127.0.0.1:41000 # Interact with the model through the API curl -X POST http://<Public IP address of the TDX instance>: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?" } ] }'
FAQ
Erreur lors de l'installation de Trustee : « Error: Transaction test error »
Cause : Des dépendances SGX ou TDX existantes sur le système entrent en conflit avec Trustee.
Solution : Exécutez yum remove libsgx-dcap-default-qpl libsgx-dcap-quote-verify, puis réessayez l'installation.
Échec du téléchargement du modèle chiffré par wget avec l'erreur « Connection refused »
Cause : Le service python3 -m http.server démarré à l'étape 1 s'est arrêté.
Solution : Retournez dans la première fenêtre de terminal et vérifiez que le service est actif. S'il est arrêté, placez-vous dans le répertoire /cai/trustee/mount/cipher et redémarrez-le.
Impossible d'accéder à l'interface Web UI dans un navigateur (http://<Public IP address of the ECS instance>:7860)
Causes et résolution des problèmes :
Règle de groupe de sécurité : Vérifiez que le groupe de sécurité autorise le trafic entrant sur le port TCP 7860 depuis Internet.
Adresse d'écoute du service : Assurez-vous que la commande de démarrage inclut
--server-name 0.0.0.0.État du service : Dans la troisième fenêtre de terminal, contrôlez que le processus
web_demo.pys'exécute toujours correctement.
Erreur lors de l'obtention du fichier de clé : {code: 111, kind: ConnectionRefused, message: "Connection refused"}
Cause 1 : Exécutez systemctl status trustee pour vérifier le service Trustee. Si l'état est inactive, le service ne fonctionne pas.
Solution : Lancez systemctl start trustee pour démarrer le service.
Cause 2 : La politique d'attestation à distance par défaut est trop stricte, ce qui fait échouer la vérification de l'environnement TDX.
Solution : (Uniquement pour le développement et la préproduction) Exécutez sed -i 's/^default allow = false$/default allow = true/' /opt/trustee/kbs/policy.rego pour autoriser temporairement la réussite de la vérification.