モデル推論中、Object Storage Service(OSS)または Apsara File Storage NAS(NAS)に保存されているモデルファイルは、ローカルディレクトリにマウントされます。 モデルファイルへのアクセスは、ネットワーク帯域幅とレイテンシの影響を受けます。 この問題を解決するために、Elastic Algorithm Service(EAS)はローカルディレクトリのメモリキャッシュを提供します。 EAS は、ディスクからメモリにモデルファイルをキャッシュして、データの読み取りを高速化し、レイテンシを削減します。 このトピックでは、ローカルディレクトリのメモリキャッシュを構成する方法と、高速化のパフォーマンスについて説明します。
背景情報
ほとんどのモデル推論シナリオでは、EAS サービスは OSS、NAS、または Docker イメージを使用してモデルファイルをローカルディレクトリにマウントします。 詳細については、「サービスへのストレージのマウント」をご参照ください。 モデルの読み取り、モデルの切り替え、コンテナのスケーリングなどの操作を実行すると、操作はネットワーク帯域幅の影響を受ける可能性があります。 Stable Diffusion を使用するシナリオなどの一般的なシナリオでは、推論リクエストには基本モデルと Low-Rank Adaptation(LoRA)モデル間の頻繁なスイッチオーバーが含まれます。 各スイッチオーバーでは、OSS または NAS からモデルを読み取る必要があるため、ネットワークレイテンシが増加します。
EAS は、この問題を解決するために、ローカルディレクトリのメモリキャッシュを提供します。 次の図は、その原則を示しています。
モデルファイルをローカルディレクトリからメモリにキャッシュできます。
キャッシュは Least Recently Used(LRU)ポリシーをサポートし、インスタンス間でファイルを共有できます。 キャッシュされたファイルは、ファイルシステムディレクトリとして表示されます。
サービスは、メモリ内のキャッシュされたファイルを直接読み取ります。 ビジネスコードを変更することなく、操作を高速化できます。
サービスのインスタンスは、P2P ネットワークを共有します。 サービス クラスタをスケールアウトすると、追加されたインスタンスは P2P ネットワーク経由で近くのインスタンスからキャッシュされたファイルを読み取って、クラスタのスケールアウトを高速化できます。
注意事項
データの整合性を確保するために、キャッシュディレクトリは読み取り専用です。
モデルファイルを追加する場合は、ソースディレクトリにモデルファイルを追加できます。 モデルファイルは、キャッシュディレクトリから直接読み取ることができます。
ソースディレクトリ内のモデルファイルを直接変更または削除しないことをお勧めします。 そうしないと、ダーティデータがキャッシュされる可能性があります。
手順
この例では、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 にマウントされます。 これにより、サービスはソースディレクトリ /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機能
メモリキャッシュ
[メモリキャッシュ] をオンにし、次のパラメータを構成します。
最大メモリ使用量: キャッシュされたファイルが使用する最大メモリ。 単位: GB。 最大メモリ使用量を超えると、LRU ポリシーを使用して特定のキャッシュファイルが削除されます。
ソースパス: ディレクトリは、キャッシュされたファイルが保存されているソースディレクトリ、OSS または NAS 内のキャッシュされたファイルがマウントされているコンテナ内のキャッシュディレクトリ、キャッシュディレクトリのサブディレクトリ、コンテナ内の共通ファイルディレクトリのいずれかになります。
マウントパス: キャッシュされたファイルがマウントされるキャッシュディレクトリ。 サービスはこのキャッシュディレクトリからファイルを読み取る必要があります。
最大メモリ使用量: 20 GB
ソースパス:
/code/stable-diffusion-webui/data-slowマウントパス:
/code/stable-diffusion-webui/data-fast
パラメータを構成した後、[デプロイ] をクリックします。
オンプレミスクライアントでメモリキャッシュを構成する
構成ファイルを準備します。 サンプルコード:
{
"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" // Stable Diffusion サービスの場合、--ckpt-dir パラメータを起動コマンドに追加し、キャッシュディレクトリに設定する必要があります。
}
],
"metadata": {
"cpu": 16,
"enable_webservice": true,
"gpu": 1,
"instance": 1,
"memory": 60000,
"name": "sdwebui_test"
},
"options": {
"enable_cache": true
},
"storage": [
{
"cache": {
"capacity": "20G", // キャッシュされたファイルが使用する最大メモリ。 単位: GB。 最大メモリ使用量を超えると、LRU ポリシーを使用して特定のキャッシュファイルが削除されます。
"path": "/code/stable-diffusion-webui/data-slow" // キャッシュされたファイルのソースディレクトリ。 ディレクトリは、コンテナ内のキャッシュディレクトリ(OSS または NAS 内のキャッシュされたファイルがマウントされている)、キャッシュディレクトリのサブディレクトリ、コンテナ内の共通ファイルディレクトリのいずれかになります。
},
"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 サービスの場合、 | |
cache | capacity | キャッシュされたファイルが使用する最大メモリ。 単位: GB。 最大メモリ使用量を超えると、LRU ポリシーを使用して特定のキャッシュファイルが削除されます。 |
path | キャッシュされたファイルのソースディレクトリ。 ディレクトリは、コンテナ内のキャッシュディレクトリ(OSS または NAS 内のキャッシュされたファイルがマウントされている)、キャッシュディレクトリのサブディレクトリ、コンテナ内の共通ファイルディレクトリのいずれかになります。 | |
mount_path | キャッシュされたファイルがマウントされるキャッシュディレクトリ。 このディレクトリ内のファイルは、ソースディレクトリ内のファイルと同じです。 サービスはこのディレクトリからファイルを読み取る必要があります。 | |
手順 2: モデルサービスをデプロイする
モデルサービスをデプロイし、モデルサービスのメモリキャッシュを有効にします。
PAI コンソールでモデルサービスをデプロイする
PAI コンソール にログインします。 上部のナビゲーションバーでリージョンを選択します。 次に、目的のワークスペースを選択し、[elastic Algorithm Service (EAS) に入る] をクリックします。
[elastic Algorithm Service (EAS)] ページで、[サービスのデプロイ] をクリックします。 [サービスのデプロイ] ページで、[カスタムモデルデプロイ] セクションの [JSON デプロイ] をクリックします。 エディタフィールドに、手順 1 で準備した構成コードを入力します。
[デプロイ] をクリックします。
EASCMD クライアントを使用してモデルサービスをデプロイする
EASCMD クライアントをダウンロードし、身分認証を実行します。 詳細については、「EASCMD クライアントのダウンロードと身分認証の完了」をご参照ください。
手順 1 の指示に従って、EASCMD クライアントが保存されているディレクトリに
test.jsonという名前の JSON ファイルを作成します。JSON ファイルが保存されているディレクトリで、次のコマンドを実行します。 この例では、Windows 64 を使用します。
eascmdwin64.exe create <test.json>
高速化効果
次の表に、Stable Diffusion を使用するサンプルモデル切り替えシナリオでの高速化効果を示します。 単位: 秒。 高速化効果は、実際の状況によって異なります。
モデル | モデルサイズ | OSS パスのマウント | ローカルインスタンスメモリのヒット | リモートインスタンスメモリのヒット |
anything-v4.5.safetensors | 7.2G | 89.88 | 3.845 | 15.18 |
Anything-v5.0-PRT-RE.safetensors | 2.0G | 16.73 | 2.967 | 5.46 |
cetusMix_Coda2.safetensors | 3.6G | 24.76 | 3.249 | 7.13 |
chilloutmix_NiPrunedFp32Fix.safetensors | 4.0G | 48.79 | 3.556 | 8.47 |
CounterfeitV30_v30.safetensors | 4.0G | 64.99 | 3.014 | 7.94 |
deliberate_v2.safetensors | 2.0G | 16.33 | 2.985 | 5.55 |
DreamShaper_6_NoVae.safetensors | 5.6G | 71.78 | 3.416 | 10.17 |
pastelmix-fp32.ckpt | 4.0G | 43.88 | 4.959 | 9.23 |
revAnimated_v122.safetensors | 4.0G | 69.38 | 3.165 | 3.20 |
メモリキャッシュにモデルファイルが存在しない場合、CacheFS はソースディレクトリからモデルファイルを自動的に読み取ります。 たとえば、ファイルが OSS バケットにマウントされている場合、CacheFS は OSS バケットからファイルを読み取ります。
サービスに複数のインスタンスがある場合、インスタンス クラスタはメモリを共有します。 インスタンスがモデルをロードすると、インスタンスはクラスタ内の他のインスタンスのメモリからモデルファイルを直接読み取ることができます。 ファイルの読み取りに必要な時間は、ファイルサイズによって異なります。
サービス クラスタをスケールアウトすると、追加のインスタンスは初期化中にクラスタ内の他のインスタンスのメモリからモデルファイルを自動的に読み取ることができます。 これにより、サービスはより迅速かつ柔軟にスケールアウトされます。