このトピックでは、DataCache を使用してポートレート AI 生成コンテンツ (AIGC) のベースモデル (ID: ly261666/cv_portrait_model) を保存し、妙鴨カメラに似た eci-facechain アプリケーションを構築する方法について説明します。ポートレート AIGC のベースモデルは、ModelScope コミュニティによって提供されています。eci-facechain をデプロイする前に、アプリケーションのモデルデータを DataCache に保存できます。アプリケーションに対応するポッドを作成するときに、モデルデータをポッドにマウントできます。このようにして、システムはモデルデータをプルする必要がなくなり、アプリケーションをより迅速にデプロイできます。
背景情報
妙鴨カメラは、AIGC ベースのポートレートアプリケーションです。アプリケーションに個人写真をアップロードしてデジタルIDを取得し、好みのスタイルテンプレートを選択して個人写真一式を取得できます。
Alibaba DAMO Academy は最近、ModelScope でFaceChainという名前のオープンソースアプリケーションを公開しました。FaceChain は妙鴨カメラに似ています。FaceChain は、Stable Diffusion (SD) と Low-Rank Adaptation of Large Language Models (LoRA) の融合です。FaceChain の仕組みは以下のとおりです。
既存の個人写真 (元の写真) をトレーニングして、顔固有の LoRA ウェイトを取得します。
標準の SD ベースモデルに基づいて、さまざまなスタイルの個人写真 (結果の写真) を生成します。
説明FaceChain は、さまざまなポートレート関連および肌関連のモデルに基づいて写真を最適化し、より効果の高い写真を生成します。
FaceChain アプリケーションをダウンロードした後、オープンソースの FaceChain を構成して使用できます。ただし、FaceChain には次の問題があります。
トレーニングと推論中に、FaceChain はサイズが約 25 GB の複数のモデルを含むモデルハブからモデルをダウンロードします。その結果、モデルのダウンロードには長い時間がかかります。さらに、インターネット経由でモデルをダウンロードする場合は、安定したネットワーク接続と特定の帯域幅が必要です。ネットワーク関連および帯域幅関連の理由により、モデルのダウンロードに失敗する可能性があります。
FaceChain は顔の記憶をサポートしていません。アプリケーションは、履歴トレーニングから取得した LoRA ウェイトを保持できず、最新のトレーニング結果のみに基づいて推論を実行します。
モデルを変更したり、モデルのバージョンを変更したりする場合は、コードを手動で変更する必要があります。FaceChain はメンテナンスが複雑で、構成に柔軟性がありません。
前述の問題に対処するために、Elastic Container Instance は、eci-facechainと呼ばれる FaceChain の最適化バージョンを公開しました。eci-facechain には次の利点があります。
モデルデータを Elastic Container Instance の DataCache に保存します。アプリケーションの起動後、アプリケーションはモデルハブからモデルをダウンロードする必要はありません。
顔の記憶をサポートします。トレーニング中に顔にタグを追加し、推論中にトレーニング済みの顔をタグに基づいて選択できます。
環境変数を追加します。アプリケーションコードを変更することなく、コンテナの環境変数を使用して、SD のモデル、バージョン、ディレクトリ、およびアプリケーションポートを指定できます。環境変数の詳細については、
env.py
ファイルを参照してください。Web ページを最適化します。たとえば、生成する写真のピクセル数を指定できます。
前提条件
DataCache カスタムリソース定義 (CRD) がクラスターにデプロイされています。詳細については、DataCache CRD のデプロイを参照してください。
クラスターが存在する仮想プライベートクラウド (VPC) がインターネット NAT ゲートウェイに関連付けられています。インターネット NAT ゲートウェイには、VPC 内のリソースまたは VPC 内の vSwitch に接続されているリソースがインターネットにアクセスできるように SNAT エントリが構成されています。
説明VPC がインターネット NAT ゲートウェイに関連付けられていない場合は、DataCache を作成してアプリケーションをデプロイするときに、VPC に Elastic IP アドレス (EIP) を関連付ける必要があります。このようにして、インターネットからデータをプルできます。
ランタイム環境を準備する
ハードウェア要件
アプリケーションをデプロイするには、GPU アクセラレーション Elastic Compute Service (ECS) インスタンスタイプに基づくエラスティックコンテナインスタンスを使用する必要があります。アプリケーションには特定の vCPU およびメモリ要件はありません。GPU メモリ仕様の高い ECS インスタンスタイプを選択することをお勧めします。エラスティックコンテナインスタンスの作成に使用できる GPU アクセラレーション ECS インスタンスタイプについては、サポートされているインスタンスファミリを参照してください。
ソフトウェア要件
Elastic Container Instance は、eci-facechain に基づくパブリックコンテナイメージを提供します。イメージを直接使用することも、イメージをベースイメージとして使用して二次開発を行うこともできます。イメージアドレスは registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2 です。
手順
DataCache を作成する
ModelScopeにアクセスして、モデルの ID を取得します。
この例では、ポートレート AIGC のベースモデル (ID: ly261666/cv_portrait_model) のバージョンは v4.0 です。ModelScope で使用するモデルを見つけ、モデル詳細ページの上部にあるモデル ID をコピーします。
DataCache の YAML 構成ファイルを記述します。次に、YAML ファイルを使用して、ポートレート AIGC のベースモデルを保存するために使用される DataCache を作成します。
kubectl create -f datacache-test.yaml
datacache-test.yaml ファイルの例
apiVersion: eci.aliyun.com/v1alpha1 kind: DataCache metadata: name: cv spec: bucket: test path: /model/cv/ dataSource: type: URL options: repoSource: ModelScope/Model # データソースとして ModelScope モデルを指定します。 repoId: ly261666/cv_portrait_model # モデル ID を指定します。 revision: v4.0 # モデルバージョンを指定します。 retentionDays: 1 netConfig: securityGroupId: sg-2ze63v3jtm8e6s****** vSwitchId: vsw-2ze94pjtfuj9vay****** # SNAT エントリが構成されている vSwitch を指定します。
DataCache のステータスをクエリします。
kubectl get edc
データがダウンロードされ、DataCache のステータスが Available になると、DataCache は使用できる状態になります。例:
eci-facechain アプリケーションを構築する
eci-facechain アプリケーションの YAML 構成ファイルを記述し、YAML ファイルを使用してアプリケーションをデプロイします。
kubectl create -f cv.yaml
次のサンプルコードは、cv.yamlファイルの内容の例を示しています。1つのPodレプリカを含むデプロイメントを作成できます。このPodは、GPUアクセラレーション対応のECSインスタンスタイプに基づいており、ポートレートAIGCのベースモデルがマウントされています。Pod内のコンテナは、Elastic Container Instanceによって提供されるパブリックイメージを使用します。コンテナが起動した後、コンテナはWebサービスを実行し、ポート8888経由でアクセスできます。
説明次のYAMLファイルでは、システムによって自動的にElastic IPアドレス(EIP)が作成され、EIPがポッドに関連付けられます。クラスターが属する仮想プライベートクラウド(VPC)にインターネットNATゲートウェイが関連付けられている場合は、EIPのアノテーションを削除できます。ポッドの作成後、DNATエントリを設定して、ポッドへの外部アクセスを許可できます。ポッドへの均一なアクセスを提供するために、サービスを作成することをお勧めします。
デフォルトでは、コンテナに対してポート8888が有効になっています。ポートを変更する場合は、コンテナ環境変数
APP_PORT
を使用して別のポートを指定します。
apiVersion: apps/v1 kind: Deployment metadata: name: cv labels: app: cv spec: replicas: 1 selector: matchLabels: app: cv template: metadata: name: cv labels: app: cv alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs: "ecs.gn7i-c8g1.2xlarge" # GPU アクセラレーション対応の ECS インスタンスタイプを指定します。 k8s.aliyun.com/eci-data-cache-bucket: "test" # DataCache を保存するバケットを指定します。 k8s.aliyun.com/eci-with-eip: "true" # 自動的に EIP を作成し、ポッドに関連付けて、ポッドへの外部アクセスを許可します。 spec: containers: - name: cv image: registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2 # Elastic Container Instance によって提供されるパブリックイメージを使用します。 resources: limits: nvidia.com/gpu: "1" # コンテナに必要な GPU の数を指定します。 volumeMounts: - name: "model-cv" mountPath: "/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/" # コンテナ内のモデルデータのマウントパスを指定します。 volumes: - name: "model-cv" hostPath: path: "/model/cv/" # モデルデータがマウントされるパスを指定します。
アプリケーションがデプロイされているかどうかを確認します。
kubectl get deployment cv kubectl get Pod
次のサンプル出力は、アプリケーションがデプロイされていることを示しています。
モデルがマウントされているかどうかを確認します。
kubectl exec -it <POD_NAME> -- bash ls /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
次のサンプル出力は、モデルがコンテナの
/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
ディレクトリにマウントされていることを示しています。ポッドに関連付けられている EIP を確認します。
kubectl describe pod <pod_name>
返されたポッド詳細の Annotations セクションで、ポッドに関連付けられている EIP を確認できます。
モデルをテストする
ポッドが属するセキュリティグループにインバウンドルールを追加し、ポート 8888 を許可します。
ブラウザを使用して、eci-facechain アプリケーションの Web ページにアクセスします。
この例では、EIP が eci-facechain アプリケーションに関連付けられています。ポッドの EIP とコンテナのオープンポート (例:
60.205.XX.XX:8888
) を入力して、アプリケーションにアクセスできます。ポートレート AIGC のベースモデルが妙鴨カメラと同様の効果があるかどうかをテストします。
トレーニングタブで、顔写真をアップロードします。
必要に応じて顔写真にタグを追加し、トレーニング開始をクリックします。
トレーニングが完了したら、推論タブをクリックします。
要件に基づいてスタイルモデルと服のスタイルを選択し、生成する写真の数量、高さ、幅を指定して、生成をクリックします。
待って、生成結果を表示します。
説明エラーメッセージが表示された場合は、コンテナログを表示してエラーの原因を特定します。エラータイプがメモリ不足 (OOM) の場合は、画像の幅と高さを小さくするか、より大きな GPU メモリを持つ ECS インスタンスタイプを使用してアプリケーションをデプロイすることをお勧めします。