Object Storage Service (OSS) または Apsara File Storage NAS (NAS) に格納されたモデルファイルをローカルディレクトリにマウントすると、ネットワーク帯域幅が読み取りパフォーマンスのボトルネックとなります。Elastic Algorithm Service (EAS) は、これらのファイルをディスクからメモリへキャッシュすることで、データ読み取りを高速化し、モデル推論時のレイテンシを低減します。
仕組み
EAS は、OSS、NAS、または Docker イメージからモデルファイルをローカルディレクトリにマウントします。詳細については、「ストレージのマウント」をご参照ください。モデルの読み込み、モデル切り替え、コンテナーのスケールアウトはすべてネットワーク帯域幅に依存します。Stable Diffusion のユースケースでは、推論リクエストがベースモデルと Low-Rank Adaptation (LoRA) モデル間で頻繁に切り替わります。各切り替え時に OSS または NAS からファイルが読み込まれるため、ネットワーク遅延が増加します。
メモリキャッシュはこの課題を解決します。以下の図にアーキテクチャを示します。
ローカルディレクトリ内のモデルファイルがメモリにキャッシュされます。
キャッシュは、最近使用されていない順(LRU)でファイルを削除する立ち退きポリシーを採用しており、インスタンス間でのファイル共有をサポートします。キャッシュされたファイルは、標準的なファイルシステムディレクトリとして表示されます。
サービスはキャッシュされたファイルをメモリから直接読み取ります。アプリケーションコードの変更は不要です。
サービス内のインスタンスはピアツーピア(P2P)ネットワークを共有します。サービスをスケールアウトする際、新規インスタンスは P2P ネットワーク経由で近隣の既存インスタンスのメモリからキャッシュファイルを読み込みます。これにより、クラスターのスケールアウトが高速化されます。
注意事項
キャッシュディレクトリはデータ整合性を確保するため、読み取り専用です。
モデルファイルを追加するには、ソースディレクトリに配置してください。ファイルは自動的にキャッシュディレクトリに反映されます。
ソースディレクトリ内のモデルファイルを直接変更または削除しないでください。これにより、キャッシュ内にダーティデータが発生する可能性があります。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Platform for AI (PAI) ワークスペース(EAS へのアクセス権付与済み)
OSS または NAS に格納されたモデルファイル
キャッシュ用に十分なメモリを備えた適切なインスタンスタイプ(例:
ml.gu7i.c16m60.1-gu30)
PAI コンソールでのメモリキャッシュの構成
本セクションでは、Stable Diffusion を例として、以下の構成を使用します。
イメージ起動コマンド:
./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-prepare-environment --api --filebrowserモデルファイルの OSS ディレクトリ:
oss://path/to/models/モデルファイルのコンテナー内ディレクトリ(ソースディレクトリ):
/code/stable-diffusion-webui/data-slow
ソースディレクトリ /code/stable-diffusion-webui/data-slow にモデルファイルが格納されています。これらのファイルは、キャッシュディレクトリ /code/stable-diffusion-webui/data-fast にマウントされます。サービスは、ソースディレクトリではなく、このキャッシュディレクトリからモデルファイルを読み取ります。
PAI コンソールでのメモリキャッシュの構成
PAI コンソールにログインします。上部ナビゲーションバーからリージョンを選択し、目的のワークスペースを選択して、Elastic Algorithm Service (EAS) に移動 をクリックします。
サービスのデプロイ をクリックし、カスタムモデルデプロイ セクションで カスタムデプロイ を選択します。
カスタムデプロイ ページで、以下のパラメーターを構成します。その他のパラメーターについては、「カスタムデプロイ」をご参照ください。
パラメーター 説明 例 環境情報 > モデル設定 OSS マウントモードを選択します。 URI: oss://path/to/models/マウントパス: /code/stable-diffusion-webui/data-slowコマンド イメージまたはコードに応じて起動パラメーターを構成します。Stable Diffusion の場合、 --ckpt-dirパラメーターを追加し、キャッシュディレクトリを指定します。./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-prepare-environment --api --filebrowser --ckpt-dir /code/stable-diffusion-webui/data-fast機能 > 分散キャッシュアクセラレーション メモリキャッシュ を有効化し、以下のパラメーターを構成します。 最大メモリ使用量: 20GB最大メモリ使用量:キャッシュファイルに割り当てる最大メモリ量(単位:GB)。上限を超えると、LRU ポリシーに基づいてキャッシュファイルが削除されます。 ソースパス: /code/stable-diffusion-webui/data-slowソースパス:キャッシュ対象ファイルのソースディレクトリ。OSS または NAS のマウントディレクトリ、そのサブディレクトリ、またはコンテナー内の通常のファイルディレクトリを指定できます。 マウントパス: /code/stable-diffusion-webui/data-fastマウントパス:サービスがファイルを読み取るキャッシュディレクトリです。 デプロイ をクリックします。
JSON 構成ファイルを用いたメモリキャッシュの構成
ステップ 1:構成ファイルの準備
JSON 構成ファイルを作成します。以下にサンプル構成を示します。
{
"cloud": {
"computing": {
"instances": [
{
"type": "ml.gu7i.c16m60.1-gu30"
}
]
}
},
"containers": [
{
"image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:4.2",
"port": 8000,
"script": "./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-prepare-environment --api --filebrowser --ckpt-dir /code/stable-diffusion-webui/data-fast"
}
],
"metadata": {
"cpu": 16,
"enable_webservice": true,
"gpu": 1,
"instance": 1,
"memory": 60000,
"name": "sdwebui_test"
},
"options": {
"enable_cache": true
},
"storage": [
{
"cache": {
"capacity": "20G",
"path": "/code/stable-diffusion-webui/data-slow"
},
"mount_path": "/code/stable-diffusion-webui/data-fast"
},
{
"mount_path": "/code/stable-diffusion-webui/data-slow",
"oss": {
"path": "oss://path/to/models/",
"readOnly": false
},
"properties": {
"resource_type": "model"
}
}
]
}以下の表に、キャッシュ関連のパラメーターを示します。その他のパラメーターについては、「モデルサービスのパラメーター」をご参照ください。
| パラメーター | 説明 |
|---|---|
script | 起動コマンドです。イメージまたはコードに応じて構成します。Stable Diffusion の場合、--ckpt-dir パラメーターを追加し、キャッシュディレクトリを指定します。 |
cache.capacity | キャッシュファイルに割り当てる最大メモリ量(単位:GB)。上限を超えると、LRU ポリシーに基づいてキャッシュファイルが削除されます。 |
cache.path | キャッシュ対象ファイルのソースディレクトリです。OSS または NAS のコンテナー内マウントディレクトリ、そのサブディレクトリ、またはコンテナー内の通常のファイルディレクトリを指定できます。 |
mount_path(キャッシュエントリ) | キャッシュファイルがマウントされるキャッシュディレクトリです。このディレクトリ内のファイルはソースディレクトリと一致します。サービスはこのディレクトリからファイルを読み取ります。 |
ステップ 2:サービスのデプロイ
以下のいずれかの方法でサービスをデプロイします。
PAI コンソールでのデプロイ
PAI コンソールにログインします。上部ナビゲーションバーからリージョンを選択し、目的のワークスペースを選択して、Elastic Algorithm Service (EAS) に移動 をクリックします。
Elastic Algorithm Service (EAS) ページで、サービスのデプロイ をクリックします。デプロイページで、カスタムモデルデプロイ セクションより JSON デプロイ をクリックします。エディターに、ステップ 1 で作成した JSON 構成を貼り付けます。
デプロイ をクリックします。
EASCMD クライアントを用いたデプロイ
EASCMD クライアントをダウンロードし、身分認証を完了します。詳細については、「EASCMD クライアントのダウンロードと身分認証の完了」をご参照ください。
ステップ 1 で作成した JSON 構成を、EASCMD クライアントがインストールされているディレクトリに
test.jsonとして保存します。以下のコマンドを実行します(本例では Windows 64 ビット環境を想定)。
eascmdwin64.exe create <test.json>
パフォーマンスベンチマーク
以下の表は、Stable Diffusion のユースケースにおけるモデル切り替えパフォーマンスを示します。すべての値の単位は秒です。実際の結果はご利用の環境によって異なります。
| モデル | サイズ | OSS マウント | ローカルメモリヒット(秒) | リモートメモリヒット(秒) |
|---|---|---|---|---|
| anything-v4.5.safetensors | 7.2 GB | 89.88 | 3.845 | 15.18 |
| Anything-v5.0-PRT-RE.safetensors | 2.0 GB | 16.73 | 2.967 | 5.46 |
| cetusMix_Coda2.safetensors | 3.6 GB | 24.76 | 3.249 | 7.13 |
| chilloutmix_NiPrunedFp32Fix.safetensors | 4.0 GB | 48.79 | 3.556 | 8.47 |
| CounterfeitV30_v30.safetensors | 4.0 GB | 64.99 | 3.014 | 7.94 |
| deliberate_v2.safetensors | 2.0 GB | 16.33 | 2.985 | 5.55 |
| DreamShaper_6_NoVae.safetensors | 5.6 GB | 71.78 | 3.416 | 10.17 |
| pastelmix-fp32.ckpt | 4.0 GB | 43.88 | 4.959 | 9.23 |
| revAnimated_v122.safetensors | 4.0 GB | 69.38 | 3.165 | 3.20 |
メモリキャッシュ内にモデルファイルが存在しない場合、CacheFS は自動的にソースディレクトリからモデルファイルを読み込みます。たとえば、OSS バケットからマウントされている場合は、その OSS バケットから読み込みます。
サービスに複数のインスタンスがある場合、インスタンスはクラスター全体でメモリを共有します。あるインスタンスは、クラスター内の他のインスタンスのメモリから直接モデルファイルを読み取ることができます。読み取り時間はファイルサイズによって異なります。
サービスクラスターをスケールアウトする際、新規インスタンスは初期化時に既存インスタンスのメモリから自動的にモデルファイルを読み込みます。これにより、スケールアウト操作が高速化されます。