Vous pouvez ajouter des instances Elastic Compute Service (ECS) de la famille d'instances généralistes de 8e génération g8i à vos clusters Container Service for Kubernetes (ACK) en tant que nœuds de calcul, et utiliser la technologie Intel® Extension for PyTorch (IPEX) pour accélérer l'inférence texte-vers-image. Vous pouvez également créer un pool de nœuds compatible avec les machines virtuelles confidentielles Trust Domain Extensions (TDX), puis migrer votre service d'inférence vers ce pool afin de renforcer sa sécurité. Cette rubrique utilise le modèle Stable Diffusion XL Turbo comme exemple pour illustrer comment tirer parti d'une stratégie d'accélération par processeur et de la famille d'instances g8i afin d'obtenir une expérience d'inférence accélérée comparable à celle offerte par les instances ECS accélérées par GPU. Cela vous permet de développer des services d'inférence texte-vers-image stables, performants, rentables et sécurisés.
Contexte
Famille d'instances généralistes de 8e génération g8i
La famille d'instances ECS généralistes de 8e génération g8i s'appuie sur les Cloud Infrastructure Processing Units (CIPU) et Apsara Stack. Elle intègre les processeurs Intel® Xeon® Scalables de 5e génération (nom de code Emerald Rapids) pour booster les performances. De plus, la famille g8i prend en charge les Advanced Matrix Extensions (AMX), qui améliorent les performances et la sécurité des charges de travail IA. Toutes les instances ECS de la famille g8i sont compatibles avec Intel® TDX. Cette technologie vous permet de déployer vos charges de travail dans un environnement d'exécution de confiance (TEE) sans modifier vos applications. Elle réduit la complexité technique pour les débutants et renforce la confidentialité des applications IA, telles que les grands modèles de langage, avec une perte de performance minimale. Pour plus d'informations, consultez la section Famille d'instances généralistes g8i.
Intel® TDX
Intel® TDX est une technologie de protection matérielle dédiée aux instances ECS. Au sein d'une instance TDX, les registres du processeur, les données en mémoire, la gestion des interruptions et d'autres états d'exécution sont protégés de manière confidentielle par le matériel du processeur. Ni le fournisseur de cloud ni des attaquants externes ne peuvent surveiller ou altérer l'état d'exécution interne d'une instance TDX, notamment les processus en cours et les données sensibles traitées lors des calculs. Consultez la documentation Intel® Trusted Domain Extension (Intel® TDX).
Intel® TDX sécurise les instances et les applications par défaut. Les applications existantes peuvent migrer vers des instances TDX sans nécessiter de refonte.
IPEX
Intel® Extension for PyTorch (IPEX) est une extension open source de PyTorch maintenue par Intel. Elle améliore considérablement les performances des applications IA utilisant PyTorch et s'exécutant sur des processeurs Intel. Intel optimise continuellement IPEX en intégrant les dernières innovations matérielles et logicielles pour soutenir la communauté PyTorch. Pour plus d'informations, consultez le dépôt IPEX.
Alibaba Cloud ne garantit pas la légitimité, la sécurité ni l'exactitude des modèles tiers « Stable Diffusion » et « stabilityai/sdxl-turbo ». Alibaba Cloud décline toute responsabilité en cas de perte ou de dommage résultant de l'utilisation de ces modèles.
Vous devez respecter les conditions d'utilisation, les spécifications d'usage ainsi que les lois et réglementations applicables aux modèles tiers. Vous reconnaissez que l'utilisation de ces modèles se fait à vos propres risques.
Le service d'exemple présenté dans cette rubrique est destiné uniquement à l'apprentissage, aux tests et à la preuve de concept (POC). Les statistiques fournies sont indicatives et peuvent varier selon votre environnement.
Prérequis
Un cluster ACK Pro a été créé dans la région China (Beijing). Pour plus d'informations, consultez la section Créer un cluster ACK managé.
-
Un pool de nœuds a été créé.
-
Pool de nœuds standard : Créez un pool de nœuds contenant des instances ECS de la famille g8i et respectant les exigences suivantes :
Région et zone : Le pool de nœuds doit se trouver dans une région et une zone prises en charge par ECS. Pour plus d'informations, consultez la page Types d'instances disponibles par région.
Types d'instance : Sélectionnez un type d'instance disposant d'au moins 16 vCPU. Nous vous recommandons de choisir
ecs.g8i.4xlarge, ecs.g8i.8xlarge ouecs.g8i.12xlarge.Espace disque : L'espace disque de chaque nœud du pool doit être d'au moins 200 Go. Vous pouvez utiliser un disque système ou un disque de données supérieur à 200 Go.
Pool de nœuds compatible avec les machines virtuelles confidentielles TDX : Vous pouvez également migrer votre application vers un pool de nœuds prenant en charge les machines virtuelles confidentielles TDX afin de renforcer la sécurité de votre service d'inférence. Assurez-vous que les Prérequis sont satisfaits.
-
Un client kubectl est connecté au cluster ACK. Pour plus d'informations, consultez la section Obtenir un fichier kubeconfig et se connecter à un cluster avec kubectl.
Étape 1 : Préparer un modèle Stable Diffusion XL Turbo
Cet exemple utilise le modèle Stable Diffusion XL Turbo stabilityai/sdxl-turbo.
Procédure
Utiliser le modèle officiel stabilityai/sdxl-turbo
Créez un fichier nommé values.yaml et ajoutez-y le contenu suivant. Vous pouvez ajuster la configuration des ressources en fonction du type d'instance de votre pool de nœuds.
resources:
limits:
cpu: "16"
memory: 32Gi
requests:
cpu: "14"
memory: 24Gi
Utiliser un modèle stabilityai/sdxl-turbo personnalisé
Vous pouvez également utiliser un modèle stabilityai/sdxl-turbo personnalisé stocké dans Object Storage Service (OSS). Créez un utilisateur Resource Access Management (RAM) disposant des autorisations d'accès OSS et récupérez la paire de clés AccessKey de cet utilisateur.
Procédure
-
Créez un fichier nommé models-oss-secret.yaml et ajoutez-y le contenu suivant.
apiVersion: v1 kind: Secret metadata: name: models-oss-secret namespace: default stringData: akId: <yourAccessKeyID> # Replace with the AccessKey ID of the RAM user. akSecret: <yourAccessKeySecret> # Replace with the AccessKey secret of the RAM user. -
Exécutez la commande suivante pour créer le Secret :
kubectl create -f models-oss-secret.yamlRésultat attendu :
secret/models-oss-secret created -
Créez un fichier nommé models-oss-pv.yaml et ajoutez-y le contenu suivant.
apiVersion: v1 kind: PersistentVolume metadata: name: models-oss-pv labels: alicloud-pvname: models-oss-pv spec: capacity: storage: 50Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: models-oss-pv nodePublishSecretRef: name: models-oss-secret namespace: default volumeAttributes: bucket: "<yourBucketName>" # Replace with the name of the OSS bucket to be mounted. url: "<yourOssEndpoint>" # Replace with the endpoint of the OSS bucket to be mounted. We recommend that you use an internal endpoint. In this example, the endpoint is oss-cn-beijing-internal.aliyuncs.com. otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other" path: "/models" # The path of the model. Make sure that the stabilityai/sdxl-turbo directory can be found in this path.Pour plus d'informations sur les paramètres OSS, consultez la section Utiliser un volume statique ossfs 1.0.
-
Exécutez la commande suivante pour créer un volume persistant (PV) provisionné statiquement :
kubectl create -f models-oss-pv.yamlRésultat attendu :
persistentvolume/models-oss-pv created -
Créez un fichier nommé models-oss-pvc.yaml et ajoutez-y le contenu suivant :
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: models-oss-pvc spec: accessModes: - ReadOnlyMany resources: requests: storage: 50Gi selector: matchLabels: alicloud-pvname: models-oss-pv -
Exécutez la commande suivante pour créer une revendication de volume persistant (PVC) :
kubectl create -f models-oss-pvc.yamlRésultat attendu :
persistentvolumeclaim/models-oss-pvc created -
Créez un fichier nommé values.yaml et ajoutez-y le contenu suivant.
Vous pouvez ajuster la configuration des ressources en fonction du type d'instance de votre pool de nœuds.
resources: limits: cpu: "16" memory: 32Gi requests: cpu: "14" memory: 24Gi useCustomModels: true volumes: models: name: data-volume persistentVolumeClaim: claimName: models-oss-pvc
Configuration du déploiement du service dans values.yaml
Étape 2 : Déployer l'exemple de service
-
Exécutez la commande suivante pour déployer un modèle Stable Diffusion XL Turbo accéléré par IPEX :
helm install stable-diffusion-ipex https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/stable-diffusion-ipex-0.1.7.tgz -f values.yamlRésultat attendu :
NAME: stable-diffusion-ipex LAST DEPLOYED: Mon Jan 22 20:42:35 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None -
Attendez 10 minutes, puis exécutez la commande suivante pour vérifier l'état du pod. Assurez-vous que le pod est en cours d'exécution.
kubectl get pod |grep stable-diffusion-ipexRésultat attendu :
stable-diffusion-ipex-65d98cc78-vmj49 1/1 Running 0 1m44s
Une fois le service déployé, une API texte-vers-image accessible publiquement est générée. Pour plus d'informations sur les paramètres de l'API, consultez la section Paramètres de l'API.
Étape 3 : Tester l'exemple de service
Procédure
-
Exécutez la commande suivante pour mapper le port du service Stable Diffusion XL Turbo sur un port local :
kubectl port-forward svc/stable-diffusion-ipex 5000:5000Résultat attendu :
Forwarding from 127.0.0.1:5000 -> 5000 Forwarding from [::1]:5000 -> 5000 -
Utilisez des invites textuelles pour demander au service de générer une image.
Dans cet exemple, le service génère des images de dimension
512x512ou1024x1024.Image 512x512
Exécutez la commande suivante pour demander au service de générer une image à partir de l'invite textuelle
A panda listening to music with headphones. highly detailed, 8k.:curl -X POST http://127.0.0.1:5000/api/text2image \ -d '{"prompt": "A panda listening to music with headphones. highly detailed, 8k.", "number": 1}'Résultat attendu :
{ "averageImageGenerationTimeSeconds": 2.0333826541900635, "generationTimeSeconds": 2.0333826541900635, "id": "9ae43577-170b-45c9-ab80-69c783b41a70", "meta": { "input": { "batch": 1, "model": "stabilityai/sdxl-turbo", "number": 1, "prompt": "A panda listening to music with headphones. highly detailed, 8k.", "size": "512x512", "step": 4 } }, "output": [ { "latencySeconds": 2.0333826541900635, "url": "http://127.0.0.1:5000/images/9ae43577-170b-45c9-ab80-69c783b41a70/0_0.png" } ], "status": "success" }Saisissez l'URL renvoyée dans la barre d'adresse de votre navigateur pour afficher l'image.
Image 1024x1024
Exécutez la commande suivante pour demander au service de générer une image à partir de l'invite textuelle
A panda listening to music with headphones. highly detailed, 8k.:curl -X POST http://127.0.0.1:5000/api/text2image \ -d '{"prompt": "A panda listening to music with headphones. highly detailed, 8k.", "number": 1, "size": "1024x1024"}'Résultat attendu :
{ "averageImageGenerationTimeSeconds": 8.635204315185547, "generationTimeSeconds": 8.635204315185547, "id": "ac341ced-430d-4952-b9f9-efa57b4eeb60", "meta": { "input": { "batch": 1, "model": "stabilityai/sdxl-turbo", "number": 1, "prompt": "A panda listening to music with headphones. highly detailed, 8k.", "size": "1024x1024", "step": 4 } }, "output": [ { "latencySeconds": 8.635204315185547, "url": "http://127.0.0.1:5000/images/ac341ced-430d-4952-b9f9-efa57b4eeb60/0_0.png" } ], "status": "success" }Saisissez l'URL renvoyée dans la barre d'adresse de votre navigateur pour afficher l'image.
Données de test
Le tableau suivant présente les durées moyennes de génération d'images 512x512 et 1024x1024 par le modèle Stable Diffusion XL Turbo sur différents types d'instances ECS de la famille g8i. Ces statistiques sont indicatives et peuvent varier selon votre environnement.
|
Type d'instance |
Pod Request/Limit |
Paramètre |
Durée moyenne par requête (512x512) |
Durée moyenne par requête (1024x1024) |
|
ecs.g8i.4xlarge (16 vCPU, 64 Go) |
14/16 |
batch : 1 step : 4 |
2,2 s |
8,8 s |
|
ecs.g8i.8xlarge (32 vCPU, 128 Go) |
24/32 |
batch : 1 step : 4 |
1,3 s |
4,7 s |
|
ecs.g8i.12xlarge (48 vCPU, 192 Go) |
32/32 |
batch : 1 step : 4 |
1,1 s |
3,9 s |
(Facultatif) Étape 4 : Migrer le service vers un pool de nœuds compatible avec les machines virtuelles confidentielles TDX
Après avoir déployé l'exemple de service, vous pouvez le migrer de manière transparente vers un pool de nœuds prenant en charge les machines virtuelles confidentielles TDX afin de renforcer la sécurité du service d'inférence.
Prérequis
-
Un pool de nœuds compatible avec les machines virtuelles confidentielles TDX a été créé dans le cluster ACK et répond aux exigences spécifiées. Pour plus d'informations, consultez la section Créer un pool de nœuds de machines virtuelles confidentielles TDX.
De plus, le pool de nœuds doit satisfaire aux critères suivants :
Type d'instance : Choisissez un type d'instance disposant d'au moins 16 vCPU. Nous vous recommandons de sélectionner ecs.g8i.4xlarge.
Espace disque : L'espace disque de chaque nœud du pool doit être d'au moins 200 Go. Vous pouvez utiliser un disque système ou un disque de données supérieur à 200 Go.
Libellé de nœud : Ajoutez le libellé
nodepool-label=tdx-vm-poolau pool de nœuds.
Procédure
-
Créez un fichier nommé tdx_values.yaml et ajoutez-y le contenu suivant.
Pour plus d'informations sur le fichier values.yaml, consultez la section Configuration du déploiement du service dans values.yaml.
RemarqueDans cet exemple, le libellé
nodepool-label=tdx-vm-poolest ajouté au pool de nœuds. Pour ajouter d'autres libellés, remplacez la valeur denodepool-labeldans la sectionnodeSelector.nodeSelector: nodepool-label: tdx-vm-pool -
Exécutez la commande suivante pour migrer le modèle Stable Diffusion vers le pool de nœuds :
helm upgrade stable-diffusion-ipex https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/stable-diffusion-ipex-0.1.7.tgz -f tdx_values.yamlRésultat attendu :
Release "stable-diffusion-ipex" has been upgraded. Happy Helming! NAME: stable-diffusion-ipex LAST DEPLOYED: Wed Jan 24 16:38:04 2024 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None -
Attendez 10 minutes, puis vérifiez l'état du pod. Assurez-vous que le pod est en cours d'exécution.
kubectl get pod |grep stable-diffusion-ipexRésultat attendu :
stable-diffusion-ipex-7f8c4f88f5-r478t 1/1 Running 0 1m44s Répétez l'Étape 3 : Tester l'exemple de service pour tester le modèle Stable Diffusion dans le pool de nœuds.
Informations sur l'API
Paramètres de l'API
Lorsque vous déployez un service Stable Diffusion XL Turbo à partir du modèle stabilityai/sdxl-turbo, une API texte-vers-image accessible publiquement est générée. Les tableaux ci-dessous décrivent les paramètres de l'API.
Syntaxe de la requête
POST /api/text2image
Paramètres de la requête
Exemple de requête
Paramètres de la réponse
Exemple de réponse
Comparaison des performances
Le pool de nœuds compatible avec les machines virtuelles confidentielles TDX contient des instances ECS de la famille g8i, optimisées par AMX et IPEX. Elles accélèrent efficacement l'inférence texte-vers-image et permettent d'activer un environnement d'exécution de confiance (TEE) pour renforcer la sécurité. Dans cet exemple, des instances ECS de type ecs.g8i.4xlarge équipées de processeurs Intel® Xeon® Scalables de 5e génération sont utilisées pour exécuter et affiner le modèle stabilityai/sdxl-turbo. Cet exemple illustre comment développer un service d'inférence texte-vers-image rentable et sécurisé.
En termes de vitesse de génération d'images, l'accélération par GPU (A10) reste supérieure à l'accélération par processeur. Avec un type d'instance ecs.g8i.8xlarge, un paramètre step de 30 et une taille de lot (batch) de 16, la vitesse de génération atteint 0,14 image/s. Avec une instance accélérée par GPU A10, un paramètre step de 30 et une taille de lot de 16, la vitesse atteint 0,4 image/s. Toutefois, pour obtenir une qualité d'image optimale, avec un type d'instance ecs.g8i.8xlarge, un paramètre step de 4 et une taille de lot de 16, la vitesse de génération atteint 1,2 image/s. Cela signifie qu'il est possible de générer une image par seconde sans compromettre la qualité visuelle.
Par conséquent, cette solution offre une alternative à l'accélération par GPU pour vous aider à développer des services d'inférence texte-vers-image stables, performants, rentables et sécurisés.
Si vous recherchez un bon rapport coût-efficacité, un calcul confidentiel basé sur TEE et une disponibilité élevée des ressources, nous vous recommandons d'utiliser le type d'instance ecs.g8i.4xlarge pour exécuter et affiner le modèle stabilityai/sdxl-turbo.
L'utilisation d'ecs.g8i.8xlarge au lieu d'ecs.gn7i-c8g1.2xlarge réduit le coût de 9 % tout en garantissant une vitesse de génération d'images de 1,2 image/s.
L'utilisation d'ecs.g8i.4xlarge au lieu d'ecs.gn7i-c8g1.2xlarge ralentit la génération d'images à 0,5 image/s, mais réduit le coût de plus de 53 %.
Les prix réels des instances ECS varient selon les régions. Veuillez consulter l'onglet Pricing de la page d'accueil Elastic Compute Service.
Références
Créer un pool de nœuds de machines virtuelles confidentielles TDX



