すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:AIイメージを構築し、イメージプルを高速化

最終更新日:Dec 10, 2024

イメージを使用してコンテナーを作成すると、通常、コンテナーの起動に必要なリソースがいくつかある場合でも、イメージのパッケージ全体がダウンロードされて解凍されます。 これには通常長い時間がかかる。 Container Registry Enterprise Editionを使用して、加速バージョンのコンテナイメージをデプロイできます。 アクセラレーションバージョンでは、イメージパッケージ全体をダウンロードする必要なく、必要なリソースのみをダウンロードおよび解凍できます。 これは、アプリケーション展開を加速し、高い弾性を提供する。 このトピックでは、Stable Diffusionアプリケーションを例として、Container Registry Enterprise Editionを使用してAIイメージを構築し、イメージプルを高速化する方法について説明します。

前提条件

制限

オンデマンドイメージロード機能は、Alibaba Finance CloudおよびAlibaba Gov Cloudのリージョンではサポートされていません。

はじめに安定した拡散

Stable Diffusion WebUIはGithubで人気のあるプロジェクトで、プロンプトから画像を生成できます。 安定拡散は、テキスト理解コンポーネントと画像生成コンポーネントで構成されます。 安定拡散は、CLIPモデルを使用してプロンプトをエンコードし、拡散モデルを使用して画像を生成します。

重要
  • Alibaba Cloudは、サードパーティモデルのStable Diffusionの正当性、セキュリティ、または正確性を保証するものではありません。 Alibaba Cloudは、安定拡散の使用によって生じたいかなる損害についても責任を負わないものとします。

  • 安定した拡散のユーザーの同意、使用法の指定および関連した法律および規則によって従わなければなりません。 安定した拡散の正当性とコンプライアンスの要件から生じるすべての結果に耐えます。

手順1: ソースコードホストプラットフォームでDockerfileを作成する

Container Registry Enterprise Editionインスタンスを使用してイメージを作成するには、まずインスタンスをソースコードホストプラットフォームにバインドする必要があります。 Container Registryは、次のソースコードホスティングプラットフォームをサポートしています。 Gitee、GitHub、およびGitLab。

前提条件の説明に従って、ソースコードホスティングプラットフォームをバインドした後、プラットフォーム上にDockerfileを作成します。 Dockerfileは、Stable Diffusionアプリケーションイメージをプルするために使用されます。 次のコードブロックは例です。

FROM yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:model-only-v1.5 as model

FROM docker.io/nvidia/cuda:12.1.0-cudnn8-runtime-ubuntu22.04

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
    libgl1 libglib2.0-0 wget git curl vim python3.10 python3-venv && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git && \
cd stable-diffusion-webui && git checkout v1.6.0

COPY --from=model /data/v1-5-pruned-emaonly.safetensors /stable-diffusion-webui/models/Stable-diffusion/
COPY --from=model /root/.cache/huggingface /root/.cache/huggingface

WORKDIR /stable-diffusion-webui/

RUN ./webui.sh -f can_run_as_root --exit --skip-torch-cuda-test

ENV VIRTUAL_ENV=/stable-diffusion-webui/venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

CMD ["python3", "launch.py", "--listen --skip-torch-cuda-test --no-half"]

ステップ2: Container Registry Enterprise Editionを使用して安定した拡散アプリケーションのイメージ構築

このセクションでは、イメージアクセラレーションをサポートするContainer Registry Enterprise Editionインスタンスが作成されます。 イメージアクセラレーションを有効にすると、イメージレジストリにプッシュされたイメージは自動的にアクセラレーションされたイメージに変換されます。

  1. Container Registryコンソールにログインします。

  2. 上部のナビゲーションバーで、リージョンを選択します。

  3. 作成したContainer Registry Enterprise Editionインスタンスをクリックします。 左側のナビゲーションウィンドウで、[リポジトリ] > [リポジトリ] を選択します。

  4. [リポジトリの作成] をクリックし、表示されるダイアログボックスでパラメーターを設定し、[リポジトリの作成] をクリックします。

    次の表に、主要なパラメーターを示します。 詳細については、「手順3: イメージリポジトリの作成」をご参照ください。

    パラメーター

    説明と例

    レイアウトのコンソール

    名前空間

    名前空間を選択します。

    image.png

    リポジトリ名

    イメージリポジトリの名前を入力します。

    高速イメージ

    イメージアクセラレーションを有効にすると、イメージリポジトリにプッシュされたイメージは自動的にアクセラレーションイメージに変換されます。

    このトピックでは、イメージアクセラレーションが有効になっています。

    概要

    サマリーを入力します。

    コードソース

    Container Registry Enterprise Editionインスタンスにバインドされ、Dockerfileを含むソースコードホスティングプラットフォームを選択します。

    image.png

    ビルド設定

    コードが変更されたときにイメージを自動的にビルドし、中国本土以外に配置されたサーバーでビルドします。

    • コードが変更されたときにイメージを自動的にビルドする: コードがブランチからコミットされると、ビルドルールが自動的にトリガーされます。

    • 中国本土外に配置されたサーバーを使用したビルド: イメージは中国本土外のサーバー上にビルドされ、指定されたリージョンのリポジトリにプッシュされます。 プロジェクトで使用されるDockerfileを中国本土以外のサイトからダウンロードする必要があるが、国境を越えたネットワーク接続が不安定な場合は、中国本土以外に配置されたサーバーでビルドを有効にできます。

  5. イメージリポジトリの詳細ページに移動します。 左側のナビゲーションウィンドウで、[ビルド] をクリックします。 [ビルドルール] セクションで、[ビルドルールの追加] をクリックします。 ウィザードでパラメーターを設定し、[OK] をクリックします。

    次の表に、主要なパラメーターを示します。 詳細については、「手順4: イメージの作成」をご参照ください。

    パラメーター

    説明と例

    レイアウトのコンソール

    必須

    ソースコードリポジトリのタイプを指定します。 有効な値: BranchとTag。

    image.png

    ブランチ /タグ

    ブランチまたはタグを選択または入力します。 正規表現に対応しています。 release-(?<imageTag>\w *) 正規表現を指定すると、release-v1ブランチのソースコードが更新されると、システムは自動的にV1のイメージを構築します。 イメージを手動でビルドすることはできません。 正規表現を指定する方法の詳細については、「名前付きキャプチャグループでの正規表現の使用」をご参照ください。

    説明

    正規表現を指定すると、イメージはシステムによってのみ作成できます。 イメージを手動で作成することはできません。

    ビルドコンテキストディレクトリ

    Dockerfileが存在するディレクトリを指定します。 ブランチまたはタグディレクトリのサブディレクトリです。 たとえば、ブランチディレクトリがmaster /で、Dockerfileがmaster /ディレクトリにある場合、値はmaster/Dockerfileです。

    Dockerfileファイル名

    Dockerfileの名前を指定します。 デフォルトの名前はDockerfileです。

    画像タグ

    イメージタグ (1.0.0など) を指定します。 名前付きキャプチャグループを有効にできます。 たとえば、Branch/Tagに名前付きキャプチャグループを指定した場合、キャプチャされたコンテンツを使用できます。

    image.png

    ビルド設定

    ビルドアーキテクチャとビルドパラメーターを設定します。 このトピックでは、デフォルト設定が使用されます。

    image.png

  6. [ビルド設定] ページの [ビルドルール] セクションで、ビルドルールの [操作] 列の [ビルド] をクリックします。

    image.png

    設定が完了したら、[ビルドログ] セクションでイメージビルドタスクのステータスを確認できます。 ステータスがSuccessの場合、イメージがビルドされます。

    イメージアクセラレーションを有効にすると、イメージの作成に約30分かかります。

  7. イメージが作成されたら、左側のナビゲーションウィンドウで [イメージタグ] をクリックし、タイプが [高速化イメージ] であるイメージのタグとタイプが [コンテナイメージ] であるイメージのタグを表示します。

    image.png

    現在のリポジトリは、高速化されたイメージリポジトリです。 リポジトリ内のすべての画像は自動的に高速化画像に変換されます。 上の図では、2つのアクセラレーションイメージと1つのレギュラーコンテナイメージが作成されています。

  8. タイプがコンテナーイメージのセクションで、[タグ] をクリックし、[リポジトリURL] をコピーします。 URLは、ACKクラスター内のStable Diffusionアプリケーションによって使用されます。

    image.png

手順3: ACKクラスターで安定拡散アプリケーションを高速化

1. 画像アクセラレーションコンポーネントのインストール

コンテナーアクセラレーションを有効にするには、ワーカーノードにイメージアクセラレーションコンポーネントをインストールする必要があります。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、aliyun-acr-acr-acceleration-suiteを見つけてクリックし、指示に従ってコンポーネントをインストールします。

2. 高速化イメージを使用するノードプールを作成する

アクセラレーションイメージをテストするには、ノードプールを作成する必要があります。 ノードプールを作成するときに、alibabacloud.com/image-accelerate-enabled: trueラベルをノードに追加して、ノードの初期化中にイメージアクセラレーションを使用します。

説明

alibabacloud.com/image-accelerate-enabled: trueラベルは、既存のノードには適用されません。 イメージアクセラレーションを使用するノードを管理するために、別のノードプールを作成することをお勧めします。

  1. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  2. ページの右上隅にある [ノードプールの作成] をクリックします。 期待されるノードを1に設定して、CPU高速化ノードを作成します。 16 vCoreおよび32 GBメモリ以上のインスタンスタイプを選択します。 次に、[詳細オプション] をクリックし、[ノードラベル][true] に設定します。

    詳細については、「ノードプールの作成とスケールアウト」をご参照ください。image.png

  3. 次のコマンドを実行して、イメージアクセラレーションラベルを持つノードを照会します。

    kubectl get nodes -l alibabacloud.com/image-accelerate-enabled=true

    期待される出力:

    NAME                       STATUS   ROLES    AGE     VERSION
    cn-hangzhou.172.XX.XX.115   Ready    <none>   2m33s   v1.24.6-aliyun.1

3。 イメージリポジトリのVPCの設定

ACKクラスターがイメージリポジトリからイメージをプルできるようにするには、Container RegistryコンソールでイメージリポジトリのACKクラスターの仮想プライベートクラウド (VPC) を指定する必要があります。

  1. Container Registryコンソールにログインします。

  2. 上部のナビゲーションバーで、リージョンを選択します。

  3. Container Registry Enterprise Editionインスタンスをクリックします。 左側のナビゲーションウィンドウで、[リポジトリ] > [アクセス制御] を選択します。

  4. [VPCの追加] をクリックし、ACKクラスターのVPCとイメージアクセラレーションラベルが付いているノードのvSwitchを選択し、[OK] をクリックします。

    VPCのステータスが [実行中] に変わると、VPCが追加されます。

    説明

    VPCとvSwitchに関する情報を表示するには、ACKコンソールにログインします。 [クラスター] ページで、ACKクラスターの名前をクリックし、次の手順を実行します。

    • ACKクラスターのVPCを表示する: 左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。 次に、[クラスターリソース] タブをクリックしてVPC情報を表示します。

    • イメージアクセラレーションラベルを持つノードのvSwitchを表示する: 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。 表示するノードプールの名前をクリックし、[概要] タブをクリックします。 vSwitchの情報は、[ノード設定] セクションで確認できます。

4。 ACK Proクラスターへのアプリケーションポッドのデプロイ

YAMLファイルを使用して、Container Registryインスタンスから高速化イメージをプルし、ACKクラスターにイメージをデプロイできます。

  1. 次のコマンドを実行して、Stable Diffusionアプリケーションの名前空間を作成します。

    kubectl create ns accelerate-ai-demo
  2. 次のコマンドを実行して、イメージアクセラレーションラベルを名前空間に追加します。

    kubectl label namespaces accelerate-ai-demo k8s.aliyun.com/image-accelerate-mode=on-demand
  3. 次のコマンドを実行して、acr-credential-test名前空間にacr-credential-testを作成し、イメージのプルに使用する資格情報を格納します。

    <yourInstanceName>-<registry-vpc.cn-hangzhou.cr.aliyuncs.com> をリポジトリURLに、<yourUserName> をAlibaba Cloudアカウントのユーザー名に、<yourPassword> をContainer Registryインスタンスのパスワードに置き換えます。

    kubectl -n accelerate-ai-demo create secret docker-registry acr-credential-test --docker-server=<yourInstanceName>-<registry-vpc.cn-hangzhou.cr.aliyuncs.com> --docker-username=<yourUserName> --docker-password=<yourPassword>
  4. 次のコードを使用して、stable-diffusion-ack-gpu-accelerate.yamlという名前のファイルを作成します。 このファイルは、Stable Diffusionアプリケーション用にteaという名前の展開とtea-svcという名前のサービスを展開するために使用されます。

    サンプルコードの表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: stable-diffusion
      name: stable-diffusion
      namespace: accelerate-ai-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: stable-diffusion
      template:
        metadata:
          labels:
            app: stable-diffusion
        spec:
          containers:
          - args:
            - --listen
            - --skip-torch-cuda-test 
            - --no-half
            command:
            - python3
            - launch.py
            image: <Stable Diffusion application image name> # The URL of the repository from which the Stable Diffusion application image is pulled. 
            imagePullPolicy: Always
            name: stable-diffusion
            ports:
            - containerPort: 7860
              protocol: TCP
            readinessProbe:
              tcpSocket:
                port: 7860
            resources:
              requests:
                cpu: "8"
                memory: 16Gi
                ephemeral-storage: 50Gi
          imagePullSecrets:
            - name: acr-credential-test
    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: PayByCLCU
      name: stable-diffusion
      namespace: accelerate-ai-demo
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 7860
        protocol: TCP
        targetPort: 7860
      selector:
        app: stable-diffusion
      type: LoadBalancer
  5. 次のコマンドを実行して、Stable Diffusionアプリケーションをデプロイします。

    kubectl apply -f stable-diffusion-ack-gpu-accelerate.yaml
  6. 次のコマンドを実行して、Stable Diffusionアプリケーション用にデプロイされたポッドのステータスを照会します。

    kubectl -n accelerate-ai-demo get pod

    期待される出力:

    NAME                                READY   STATUS    RESTARTS   AGE
    stable-diffusion-75759ff59f-hw5zm   1/1     Running   0          73s
  7. 次のコマンドを実行して、ポッドの詳細を照会します。

    kubectl -n accelerate-ai-demo describe pod <pod-name>

    期待される出力:

    ...
    Events:
      Type    Reason          Age   From               Message
      ----    ------          ----  ----               -------
      Normal  Scheduled       23s   default-scheduler  Successfully assigned accelerate-ai-demo/stable-diffusion-75ff55794f-5mj8p to cn-hangzhou.172.16.7.99
      Normal  AllocIPSucceed  19s   terway-daemon      Alloc IP 172.16.7.115/24
      Normal  Pulling         19s   kubelet            Pulling image "XXX"
      Normal  Pulled          17s   kubelet            Successfully pulled image "XXX" in 1.61s (1.61s including waiting)
      Normal  Created         17s   kubelet            Created container stable-diffusion
      Normal  Started         16s   kubelet            Started container stable-diffusion

    出力は、安定拡散アプリケーションが約7秒後に準備ができたことを示す。 実際の時間はあなたの環境に依存します。

    イメージアクセラレーションが無効になっている場合、ACKクラスターはイメージをプルするのに約4分かかります。 実際の時間はあなたの環境に依存します。 イメージアクセラレーションは、ACKのイメージプリング時間を大幅に短縮し、Stable Diffusionアプリケーションの起動を加速します。

ステップ5: 設定の確認

  1. 次のコマンドを実行して、Stable Diffusionアプリケーション用にデプロイされたポッドのサービスの詳細を照会します。 外部IPアドレスを記録し、それを使用してアプリケーションにアクセスします。

    kubectl -n accelerate-ai-demo get svc 

    期待される出力:

    NAME               TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)          AGE
    stable-diffusion   LoadBalancer   172.XX.XX.163   121.XX.XX.64   7860:32621/TCP   116s

    EXTERNAL-IPの値を記録します。

  2. 次のcurlコマンドを実行して、Stable Diffusionアプリケーションをテストします。

    <EXTERNAL-IP> を、記録したEXTERNAL-IPの値に置き換えます。

    curl http://<EXTERNAL-IP>:7860/ 

    ブラウザで http://<EXTERNAL-IP>:7860/ にアクセスすることもできます。 左上隅で、チェックポイントを選択します。 [プロンプト] セクションでプロンプトを入力し、[生成] をクリックして画像を生成します。

    アプリケーションに初めてアクセスするときに遅延が存在する場合があります。 しばらく待つか、ページを更新します。

    image.png