エンタープライズクラスの第8世代インスタンスファミリーg8iのElastic Compute Service (ECS) インスタンスをContainer Service for Kubernetes (ACK) クラスターにワーカーノードとして追加し、Intelを採用できます。®テキストから画像への推論を高速化するためのPyTorch (IPEX) テクノロジーの拡張。 Trust Domain Extensions (TDX) 機密VMをサポートするノードプールを作成し、推論サービスをノードプールに移行して、推論サービスのセキュリティを強化することもできます。 このトピックでは、CPUアクセラレーションポリシーとg8iインスタンスファミリーを使用して、GPU高速化ECSインスタンスを使用するのと同じ高速化モデル推論エクスペリエンスを取得する方法を例として、Stable Diffusion XL Turboモデルを使用して説明します。 これにより、安定した、高性能で、費用対効果の高い、安全なテキストからイメージへの推論サービスを開発できます。
背景情報
エンタープライズクラスの第8世代インスタンスファミリーg8i
第8世代の汎用ECSインスタンスファミリーg8iは、Cloud Infrastructure Processing Unit (CIPU) とApsara Stackによって強化されています。 それは第5世代Intelを使用します®Xeon®パフォーマンスを向上させるスケーラブルなプロセッサ (コードネームEmerald Rapids) 。 さらに、g8iインスタンスファミリーは、AIのパフォーマンスとセキュリティを強化するAdvanced Matrix Extensions (AMX) を採用しています。 g8iインスタンスファミリーのすべてのECSインスタンスはIntelをサポート®TDXだ このテクノロジを使用すると、アプリケーションに対応する変更を加えることなく、ワークロードを信頼できる実行環境 (TEE) にデプロイできます。 初心者向けのテクノロジーギャップを解消し、パフォーマンスの低下を最小限に抑えながら、大規模な言語モデルなどのAIアプリケーションの機密性を高めます。 詳細については、「g8i, general-purpose instance family」をご参照ください。
インテル ®TDX
インテル ®TDXは、CPUレジスタ、メモリデータ、割り込みインジェクションなどのランタイムデータを保護するために、ECSインスタンスにハードウェア支援による分離と暗号化を提供するCPUハードウェアベースのテクノロジーです。 インテル®TDXは、より高いレベルのデータプライバシーを実現し、実行中のプロセスや処理中の機密データへの不正アクセスに関連するリスクを軽減します。 インテルの詳細については®TDX、Intelを参照®ドメイン拡張機能を信頼する (Intel)®TDX) 。
インテル ®TDXは、ECSインスタンスとアプリケーションのデフォルトの保護を提供します。 アプリケーションコードを変更することなく、TDX対応インスタンスにアプリケーションを移行できます。
IPEX
インテル ®Extension for PyTorch (IPEX) は、Intelが管理するオープンソースのPyTorch拡張機能です。 PyTorchを使用し、Intelプロセッサで実行されるAIアプリケーションのパフォーマンスが大幅に向上します。 Intelは、最先端のハードウェアおよびソフトウェアテクノロジーを使用してIPEXを継続的に最適化し、PyTorchコミュニティを強化します。 詳細については、「IPEX」をご参照ください。
重要
Alibaba Cloudは、サードパーティモデル「Stable Diffusion」および「stabilityai/sdxl-turbo」の正当性、セキュリティ、および正確性を保証するものではありません。 Alibaba Cloudは、これらのモデルの使用に起因する損失または損害について責任を負いません。
サードパーティモデルのユーザー契約、使用法の仕様、および関連する法律および規制を遵守する必要があります。 あなたは、サードパーティ制モデルの使用があなたの唯一のリスクにあることに同意します。
このトピックのサンプルサービスは、学習、テスト、概念実証 (POC) 専用であり、統計は参照専用です。 実際の統計は、環境によって異なる場合があります。
ステップ1: 安定した拡散XLターボモデルを準備する
この例では、Stable Diffusion XL Turboモデルstabilityai/sdxl-turbo
を使用します。
手順
公式のstabilityai/sdxl-turboモデルを使用する
カスタムのstabilityai/sdxl-turboモデルを使用する
values.yamlという名前のファイルを作成し、次の内容をファイルに追加します。 ノードプールのインスタンスタイプに基づいてリソース設定を変更できます。
resources:
limits:
cpu: "16"
memory: 32Gi
requests:
cpu: "14"
memory: 24Gi
Object Storage Service (OSS) に保存されているカスタムのstabilityai/sdxl-turbo
モデルを使用することもできます。 OSSアクセス権限を持つRAM (Resource Access Management) ユーザーを作成し、RAMユーザーのAccessKeyペアを取得します。
手順
models-oss-secret.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
apiVersion: v1
kind: 秘密
メタデータ:
名前: models-oss-secret
namespace: デフォルト
stringData:
akId: <yourAccessKeyID>
akSecret: <yourAccessKeySecret>
次のコマンドを実行して、シークレットを作成します。
kubectl create -f models-oss-secret.yaml
期待される出力:
secret/models-oss-secret created
models-oss-pv.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
apiVersion: v1
kind: PersistentVolume
メタデータ:
名前: models-oss-pv
labels:
alicloud-pvname: models-oss-pv
spec:
capacity:
ストレージ: 50Gi
accessModes:
-ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
volumeHandle: モデル-oss-pv
nodePublishSecretRef:
名前: models-oss-secret
NAMESPACE:デフォルト
volumeAttributes:
bucket: "<yourBucketName>"
url: "<yourOssEndpoint>"
otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
path: "/models"
OSSパラメーターの詳細については、「方法1: シークレットを使用してPVとPVCを作成する」をご参照ください。
次のコマンドを実行して、静的にプロビジョニングされた永続ボリューム (PV) を作成します。
kubectl create -f models-oss-pv.yaml
期待される出力:
persistentvolume/models-oss-pv created
models-oss-pvc.yamlという名前のファイルを作成し、次のコンテンツをファイルに追加します。
apiVersion: v1
kind: PersistentVolumeClaim
メタデータ:
名前: models-oss-pvc
spec:
accessModes:
-ReadOnlyMany
resources:
requests:
ストレージ: 50Gi
セレクタ:
matchLabels:
alicloud-pvname: models-oss-pv
次のコマンドを実行して、永続ボリュームクレーム (PVC) を作成します。
kubectl create -f models-oss-pvc.yaml
期待される出力:
persistentvolumeclaim/models-oss-pvc created
values.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
ノードプールのインスタンスタイプに基づいてリソース設定を変更できます。
リソース:
limits:
cpu: "16"
memory: 32Gi
requests:
cpu: "14"
メモリ: 24Gi
useCustomModels: true
ボリューム:
モデル:
name: data-volume
persistentVolumeClaim:
claimName: モデル-oss-pvc
values.yamlのサービス展開構成
replicaCount: 1
image:
repository: registry-vpc.cn-beijing.aliyuncs.com/eric-dev/stable-diffusion-ipex
pullPolicy: IfNotPresent
tag: "v0.1.5"
tagOnlyApi: "v0.1.5-lite"
imagePullSecrets: []
outputDirPath: /tmp/sd
useCustomModels: false
volumes:
output:
name: output-volume
emptyDir: {}
models:
name: data-volume
persistentVolumeClaim:
claimName: models-oss-pvc
service:
type: ClusterIP
port: 5000
resources:
limits:
cpu: "16"
memory: 32Gi
requests:
cpu: "14"
memory: 24Gi
strategy:
type: RollingUpdate
nodeSelector: {}
tolerations: []
affinity: {}
securityContext:
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 3
targetCPUUtilizationPercentage: 80
targetMemoryUtilizationPercentage: 90
手順2: サンプルサービスのデプロイ
次のコマンドを実行して、IPEX-accelerated Stable Diffusion XL Turboモデルをデプロイします。
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.yaml
期待される出力:
NAME: stable-diffusion-ipex
LAST DEPLOYED: Mon Jan 22 20:42:35 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
10分待ち、次のコマンドを実行してポッドのステータスを照会します。 ポッドが実行されていることを確認します。
kubectl get pod | grep stable-diffusion-ipex
期待される出力:
stable-diffusion-ipex-65d98cc78-vmj49 1/1 Running 0 1m44s
サービスがデプロイされたら、パブリックにアクセス可能なtext-to-image APIを生成します。 APIの詳細については、「APIパラメーター」をご参照ください。
ステップ3: サンプルサービスのテスト
手順
次のコマンドを実行して、Stable Diffusion XL Turboモデルサービスのポートをローカルポートにマッピングします。
kubectl port-forward svc/stable-diffusion-ipex 5000:5000
期待される出力:
Forwarding from 127.0.0.1:5000 -> 5000
Forwarding from [::1]:5000 -> 5000
からの転送
テキストプロンプトを使用して、画像の生成をサービスに要求します。
この例では、サービスは512x51 2
または1024x102 4
イメージを生成します。
次のコマンドを実行して、テキストプロンプトに基づいて画像を生成するようにサービスに要求します。 非常に詳細、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}'
期待される出力:
{
"averageImageGenerationTimeSeconds": 2.0333826541900635、
"generationTimeSeconds": 2.0333826541900635、
"id": "9ae43577-170b-45c9-ab80-69c783b41a70" 、
"meta": {
"input": {
"バッチ": 1、
"model": "stabilityai/sdxl-turbo" 、
"number": 1、
"prompt": "ヘッドフォンで音楽を聴くパンダ。 非常に詳細、8k。"、
"サイズ": "512x512" 、
"ステップ": 4
}
},
"output": [
{
"latencySeconds": 2.0333826541900635、
"url": "http:// 127.0.0.1:5000/images/9ae43577-170b-45c9-ab80-69c783b41a70/0_0.png"
}
],
"status": "success"
}
返されたURLをブラウザのアドレスバーに入力して、画像を表示できます。
次のコマンドを実行して、テキストプロンプトに基づいて画像を生成するようにサービスに要求します。 非常に詳細、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"}'
期待される出力:
{
"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"
}
返されたURLをブラウザのアドレスバーに入力して、画像を表示できます。
テストデータ
次の表に、g8iインスタンスファミリーのさまざまなECSインスタンスタイプで512x512および1024x1024イメージを生成するStable Diffusion XL Turboモデルの期間統計を示します。 统计は参照だけのためです。 実際の統計は、環境によって異なる場合があります。
インスタンスタイプ | ポッドのリクエスト /制限 | パラメーター | 各時間の平均期間 (512x512) | 各時間の平均期間 (1024x1024) |
インスタンスタイプ | ポッドのリクエスト /制限 | パラメーター | 各時間の平均期間 (512x512) | 各時間の平均期間 (1024x1024) |
ecs.g8i.4xlarge (16 vCPU、64 GiB) | 14/16 | バッチ: 1 ステップ: 4 | 2.2s | 8.8s |
ecs.g8i.8xlarge (32 vCPU、128 GiB) | 24/32 | バッチ: 1 ステップ: 4 | 1.3s | 4.7s |
ecs.g8i.12xlarge (48 vCPU、192 GiB) | 32/32 | バッチ: 1 ステップ: 4 | 1.1s | 3.9s |
(オプション) 手順4: TDX機密VMをサポートするノードプールにサービスを移行する
サンプルサービスのデプロイ後、TDX機密VMをサポートするノードプールにサービスをシームレスに移行して、推論サービスのセキュリティを強化できます。
前提条件
手順
tdx_values.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
values.yamlファイルの詳細については、「values.yamlのサービス展開構成」をご参照ください。
説明
この例では、nodepool-label=tdx-vm-pool
ラベルがノードプールに追加されます。 他のラベルを追加するには、nodeSelector
セクションのnodepool-label
の値を置き換えます。
nodeSelector:
nodepool-label: tdx-vm-pool
次のコマンドを実行して、安定拡散モデルをノードプールに移行します。
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.yaml
期待される出力:
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
10分待ってから、ポッドのステータスを照会します。 ポッドが実行されていることを確認します。
kubectl get pod |grep stable-diffusion-ipex
期待される出力:
stable-diffusion-ipex-7f8c4f88f5-r478t 1/1 Running 0 1m44s
手順3: サンプルサービスのテストを繰り返して、ノードプールで安定拡散モデルをテストします。
API情報
APIパラメーター
stabilityai/sdxl-Turbo
モデルからStable Diffusion XL turboサービスをデプロイすると、このサービスはパブリックにアクセス可能なテキストからイメージへのAPIを生成します。 次の表に、APIパラメーターについて説明します。
リクエスト構文
リクエストパラメーター
パラメーター | タイプ | 説明 |
プロンプト | String | テキストプロンプト。 |
数値 | integer | 画像の数。 画像の最終的な数は、以下の式: 数 × バッチ に基づいて計算される。 |
size | String | 各画像のサイズ。 デフォルト値: 512x51 2 有効な値: |
step | integer | ステップ設定。 デフォルト値: 4 |
バッチ | integer | バッチサイズ。 既定値:1 |
サンプルリクエスト
{
"prompt": "A panda listening to music with headphones. highly detailed, 8k.",
"number": 1
}
応答パラメーター
パラメーター | タイプ | 説明 |
id | String | ジョブの ID |
averageImageGenerationTimeSeconds | フロート | 画像を生成するのに必要な平均時間。 単位は秒です。 |
generationTimeSeconds | フロート | すべての画像を生成するのに必要な合計時間。 単位は秒です。 |
meta | object | ジョブのメタデータ。 |
meta.input | object | ジョブの入力データ。 |
meta.input.model | String | モデルの名前。 |
meta.input.batch | integer | バッチサイズ。 |
meta.input.step | integer | ステップ設定。 |
meta.input.number | integer | 画像の数。 画像の最終的な数は、以下の式: 数 × バッチ に基づいて計算される。 |
アウトプット | array | イメージ情報。 number の値が1 より大きい場合、すべての画像をマージした追加画像が生成されます。 画像の名前はimage_grid.png です。
|
output[].url | String | 画像のURL。 レプリケートされたポッドの数が1 場合にのみ、ブラウザでイメージを表示できます。 |
output[].latencySeconds | フロート | バッチの生成に必要な時間。 単位は秒です。 |
status | String | ジョブのステータス。 |
サンプル応答
{
"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"
}
パフォーマンス比較
TDX機密VMをサポートするノードプールには、AMXおよびIPEXによって権限を与えられたg8iインスタンスファミリーのECSインスタンスが含まれています。 テキストから画像への推論を効率的に高速化し、TEEを有効にしてセキュリティを強化できます。 この例では、第5世代Intelを搭載したECS. g8i.4xlargeタイプのecsインスタンス®Xeon®スケーラブルなプロセッサを使用して、stabilityai/sdxl-turbo
モデルを実行および微調整します。 この例では、費用対効果が高く安全なテキストイメージ推論サービスを開発する方法を示します。
画像生成速度の観点では、GPUアクセラレーション (A10) は依然としてCPUアクセラレーションを上回っています。 インスタンスタイプがecs.g8i.8xlarge、stepが30、バッチサイズが16の場合、イメージは0.14イメージ /sの割合で生成されます。 インスタンスタイプがA10 GPUアクセラレーションインスタンスで、ステップが30、バッチサイズが16の場合、画像は0.4画像 /秒の速度で生成されます。 ただし、最適な画質の観点から、インスタンスタイプがecs.g8i.8xlarge、stepが4、バッチサイズが16の場合、1.2イメージ /sの割合でイメージが生成されます。 これは、画質を損なうことなく毎秒1つの画像を生成できることを意味する。
したがって、このソリューションは、安定した、高性能で、費用対効果の高い、安全なテキストからイメージへの推論サービスの開発に役立つGPUアクセラレーションの代替手段を提供します。
費用対効果、TEE機密コンピューティング、および大規模なリソース供給が必要な場合は、ecs.g8i.4xlargeインスタンスタイプを使用してstabilityai/sdxl-turbo
モデルを実行および微調整することを推奨します。
CPUアクセラレーション
さまざまな推論モデルのベンチマークデータは、ecs.g8i.8xlargeインスタンスタイプに基づいて生成されます。 次の表に、ベンチマークデータを示します。 詳細については、「ベンチマークツール: lambda-diffusers」をご参照ください。
ベンチマークデータは参考用です。 実際のデータは環境によって異なる場合があります。
インスタンスタイプ | Alibaba Cloud ecs.g8i.8xlarge 32vCPU、128 GiB VM、EMR | Alibaba Cloud ecs.g8i.8xlarge 32vCPU、128 GiB VM、EMR |
step | 4 | 30 |
モデル | sdxl-ターボ | stable-diffusion-2-1-ベース |
コマンド | python sd_pipe_sdxl_turbo.py -- bf16 -- バッチ1-高さ512-幅512-繰り返し5-ステップ4-プロンプト "ヘッドフォンで音楽を聴いているパンダ。 非常に詳細、8k" | python sd_pipe_infer.py -- model /data/models/stable-diffusion-2-1-base-bf16-batch 1-高さ512-幅512-繰り返し5-ステップ30-プロンプト "ヘッドフォンで音楽を聴くパンダ。 非常に詳細、8k" |
パフォーマンス | 
| 
|
GPUアクセラレーション

