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

Elastic Container Instance:DataCache を使用して Alpaca-LoRa アプリケーションの構築を高速化する

最終更新日:Dec 28, 2024

このトピックでは、DataCache を使用して Alpaca-LoRa アプリケーションの構築を高速化する方法について説明します。Alpaca-LoRa アプリケーションを構築する場合、事前に llama-7b-hf モデルデータと alpaca-lora-7b 重みデータを DataCache からプルできます。Alpaca-LoRa アプリケーションに対応するポッドを作成するときに、モデルデータと重みデータをポッドにマウントできます。これにより、データをプルする必要がなくなり、Apache-LoRa アプリケーションの起動が高速化されます。

背景情報

Alpaca-LoRa は、Low-Rank Adaptation (LoRA) 技術を使用して LLaMA (Large Language Model Meta AI) モデルで微調整された軽量言語モデルです。Alpaca-LoRa は、自然言語をシミュレートして対話やインタラクションを行い、ユーザーが入力した指示に基づいてさまざまなテキストを生成し、書き込み、翻訳、コーディングなどのタスクをユーザーが完了するのを支援できます。

重要
  • Alibaba Cloud は、サードパーティモデルの合法性、セキュリティ、または正確性を保証しません。Alibaba Cloud は、それによって引き起こされた損害について責任を負いません。

  • サードパーティモデルのユーザー契約、使用仕様、および関連する法律および規制を遵守する必要があります。お客様は、サードパーティモデルの使用について、お客様ご自身の責任において行うことに同意するものとします。

前提条件

  • DataCache カスタムリソース定義 (CRD) がクラスターにデプロイされています。詳細については、DataCache CRD のデプロイを参照してください。

  • クラスターが存在する仮想プライベートクラウド (VPC) は、インターネット NAT ゲートウェイに関連付けられています。VPC 内のリソースまたは VPC 内の vSwitch に接続されているリソースがインターネットにアクセスできるように、インターネット NAT ゲートウェイ用に SNAT エントリが構成されています。

    説明

    VPC がインターネット NAT ゲートウェイに関連付けられていない場合は、DataCache を作成してアプリケーションをデプロイするときに、VPC に Elastic IP アドレス (EIP) を関連付ける必要があります。これにより、インターネットからデータをプルできます。

手順

Alpaca-LoRa イメージの作成

ビジネス要件に基づいてイメージを作成します。

  1. alpaca-lora にアクセスし、リポジトリをオンプレミスマシンにクローンします。

  2. リポジトリ内の requirements.txt と Dockerfile を変更します。

    requirements.txt を表示

    accelerate
    appdirs
    loralib
    bitsandbytes
    black
    black[jupyter]
    datasets
    fire
    git+https://github.com/huggingface/peft.git
    transformers>=4.28.0
    sentencepiece
    gradio
    scipy

    Dockerfile を表示

    FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
    
    ARG DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update && apt-get install -y \
        git \
        curl \
        software-properties-common \
        && add-apt-repository ppa:deadsnakes/ppa \
        && apt install -y python3.10 \
        && rm -rf /var/lib/apt/lists/*
    WORKDIR /workspace
    COPY requirements.txt requirements.txt
    RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 \
        && python3.10 -m pip install -r requirements.txt \
        && python3.10 -m pip install numpy --pre torch --force-reinstall --index-url https://download.pytorch.org/whl/nightly/cu118 \
        && python3.10 -m pip install --upgrade typing-extensions
    COPY . .
    
    EXPOSE 7860
  3. Dockerfile を使用してイメージをビルドします。

  4. イメージをイメージリポジトリにプッシュします。

DataCache の作成

  1. Hugging Face にアクセスし、モデルの ID を取得します。

    この例では、次のモデルを使用します。Hugging Face でモデルを見つけ、モデルの詳細ページの上部にあるモデルの ID をコピーします。

    • decapoda-research/llama-7b-hf

    • tloen/alpaca-lora-7b

  2. DataCache の作成

    1. llama-7b-hf の DataCache を作成します。

      kubectl apply -f llama-7b-hf.yaml

      llama-7b-hf.yaml ドキュメント:

      apiVersion: eci.aliyun.com/v1alpha1
      kind: DataCache
      metadata:
        name: llama-7b-hf
      spec:
        path: /model/llama-7b-hf                          # モデルデータのストレージパスを指定します。
        bucket: test                                      # DataCache を格納するバケットを指定します。
        dataSource:
          type: URL 
          options:
            repoSource: "HuggingFace/Model"               # データソースが Hugging Face であるモデルを指定します。
            repoId: "decapoda-research/llama-7b-hf"       # モデルの ID を指定します。
        netConfig: 
          securityGroupId: sg-2ze63v3jtm8e6sy******
          vSwitchId: vsw-2ze94pjtfuj9vaym******           # SNAT ゲートウェイが構成されている vSwitch を指定します。
    2. alpaca-lora-7b の DataCache を作成します。

      kubectl apply -f alpaca-lora-7b.yaml

      alpaca-lora-7b.yaml ドキュメント:

      apiVersion: eci.aliyun.com/v1alpha1
      kind: DataCache
      metadata:
        name: alpaca-lora-7b
      spec:
        path: /model/alpaca-lora-7b                        # モデルデータのストレージパスを指定します。
        bucket: test                                       # DataCache を格納するバケットを指定します。
        dataSource:
          type: URL 
          options:
            repoSource: "HuggingFace/Model"               # データソースが Hugging Face であるモデルを指定します。
            repoId: "tloen/alpaca-lora-7b" # モデルの ID を指定します。
        netConfig: 
          securityGroupId: sg-2ze63v3jtm8e6sy******
          vSwitchId: vsw-2ze94pjtfuj9vaym******           # SNAT ゲートウェイが構成されている vSwitch を指定します。
  3. DataCache のステータスをクエリします。

    kubectl get edc

    データがダウンロードされ、DataCache のステータスが Available になると、DataCache を使用できるようになります。例:

    lora1.png

Alpaca-lora アプリケーションのデプロイ

  1. Alpaca-lora アプリケーションの YAML 構成ファイルを記述し、その YAML ファイルを使用してアプリケーションをデプロイします。

    kubectl create -f alpacalora.yaml

    次のサンプルコードは、alpacalora.yaml のサンプルコンテンツを提供します。2 つのリソースオブジェクトを作成できます。

    • Deployment: Deployment の名前は alpacalora です。Deployment にはポッドレプリカが含まれています。ポッドには 20 GiB の追加の一時ストレージスペースがあります。llama-7b-hf および alpaca-lora-7b DataCache はポッドにマウントされます。ポッド内のコンテナーのイメージは、作成した Alpaca-LoRa イメージです。コンテナーが起動されると、コンテナーは python3.10 generate.py --load_8bit --base_model /data/llama-7b-hf --lora_weights /data/alpaca-lora-7b を実行します。

    • Service: Service の名前は alpacalora-svc です。Service のタイプは LoadBalancer です。Service はポート 80 を公開し、app: alpacalora ラベルが付いたポッドのポート 7860 にデータ転送を転送します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alpacalora
      labels:
        app: alpacalora
    spec:
      replicas: 1 
      selector:
        matchLabels:
          app: alpacalora
      template:
        metadata:
          labels:
            app: alpacalora
          annotations:
            k8s.aliyun.com/eci-data-cache-bucket: "test"              # DataCache を格納するバケットを指定します。
            k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi"        # 一時ストレージスペースを 20 GiB 増やします。
        spec:
          containers:
          - name: alpacalora
            image: registry.cn-hangzhou.aliyuncs.com/****/alpaca-lora:v3.5   # 作成したイメージを使用します。
            command: ["/bin/sh","-c"]
            args: ["python3.10 generate.py --load_8bit --base_model /data/llama-7b-hf --lora_weights /data/alpaca-lora-7b"] # 起動コマンドの引数を実際の値に置き換えます。
            resources:
              limits:
                cpu: "16000m"
                memory: "64.0Gi"
            ports:
            - containerPort: 7860
            volumeMounts:
            - mountPath: /data/llama-7b-hf         # コンテナー内の llama-7b-hf のマウントパスを指定します。
              name: llama-model
            - mountPath: /data/alpaca-lora-7b   # コンテナー内の alpaca-lora-7b のマウントパスを指定します。
              name: alpacalora-weight
          volumes:
            - name: llama-model
              hostPath:
                path: /model/llama-7b-hf       # llama-7b-hf のストレージパスを指定します。
            - name: alpacalora-weight
              hostPath:
                path: /model/alpaca-lora-7b   # alpaca-lora-7b のストレージパスを指定します。
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alpacalora-svc
    spec:
      ports:
      - port: 80
        targetPort: 7860
        protocol: TCP
      selector:
        app: alpacalora
      type: LoadBalancer
  2. アプリケーションのデプロイステータスを確認します。

    kubectl get deployment alpacalora
    kubectl get Pod

    次の例は、Alpaca-lora アプリケーションがデプロイされていることを示しています。

    lora2.png

  3. Service の IP アドレスを表示します。

    kubectl get svc alpacalora-svc 

    次の例では、EXTERNAL-IP 列に表示されている Service の IP アドレスは 123.57.XX.XX です。

    lora3.png

モデルのテスト

  1. ポッドが属するセキュリティグループにインバウンドルールを追加し、ポート 80 を開きます。

  2. ブラウザーを開き、ポート 80 経由で Service の外部 IP アドレスにアクセスします。

  3. テキストトランスクリプトを入力してモデルをテストします。

    例:

    lora4.png