ストレージのセットアップと、ご使用の環境にあるモデルのアップロード

以下のステップに従って、独自の環境にある基盤モデルを PVC ストレージにアップロードします。

前提条件

この資料のコード・スニペットで使用される環境変数の一部は、インストール・ステージで設定されるグローバル変数です。 詳しくは、インストール環境変数の設定を参照してください。

ストレージをセットアップし、ご使用の環境にあるモデルをアップロードするには、以下のようにします。

  1. 基本環境変数をセットアップします。
    export MODEL_PATH="/mnt/models"
  2. モデル・サイズを確認してください。 ご使用の環境に Git ラージ・File Storage (git lfs) がインストールされている場合は、モデルが含まれているフォルダーに移動し、モデルのサイズを確認します。
    cd ${MODEL_PATH}
    git lfs ls-files -s
    出力例:
    root@wmlubntu1:~/falcon-7b# git lfs ls-files -s
    1c4b989693 - pytorch_model-00001-of-00002.bin (10 GB)
    11822397cd - pytorch_model-00002-of-00002.bin (4.5 GB)
    ご使用の環境に git lfs がインストールされていない場合は、モデル・ビルダーまたはモデルが最初にダウンロードされたリポジトリーからこの情報を取得する必要があります。 Hugging Faceにあるモデルの場合、モデル名をクリックしてからファイルおよびバージョンタブを選択すると、すべてのファイル・サイズが表示されます。
  3. モデルの合計サイズを計算し、その結果に 100% のバッファーを追加します。 例えば、モデル・サイズが 14.5 GB の場合、作成する必要がある PVC のサイズは 29 GB です。 モデル・サイズを環境変数として設定します。
    export MODEL_SIZE="<calculated model size>"
  4. PVC の ストレージ・クラスを確認します。
  5. カスタム 基盤モデル 用の PersistentVolumeClaims (PVC) ストレージを作成します。

    まず、新しい PVC の名前を環境変数として設定します。

    export PVC_NAME="<The name of the new PVC>"

    次に、以下のコードを実行します。

    cat <<EOF |oc apply -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ${PVC_NAME}
      namespace: ${PROJECT_CPD_INST_OPERANDS}
    spec:
      storageClassName: ${STG_CLASS_FILE}
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: ${MODEL_SIZE}Gi
    EOF
    新規 PVC の作成、またはストレージ・ボリュームを使用した既存の PVC の使用について詳しくは、ストレージ・ボリュームの管理を参照してください。
  6. PVC を作成した後、2 分待ってから、以下のコマンドを実行して PVC がバインドされていることを確認します。
    oc get pvc ${PVC_NAME} -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath='{.status.phase}'
    予期される結果: Bound
  7. カスタム・スタンドアロン・ジョブを作成して、モデル・コンテンツをソース・ロケーションから PVC パスにコピーします。

    以下に、カスタム・モデルを PVC にコピーする例を示します。 この例では、モデルが IBM COS バケット内にあることを前提としています。

    まず、COS シークレットを作成します。

    oc create secret generic aws-credentials \
    --from-literal=AWS_ACCESS_KEY_ID=<your access key id> \
    --from-literal=AWS_SECRET_ACCESS_KEY=<your secret access key>
    次に、必要な環境変数をセットアップします。
    export ENDPOINT="<Endpoint for the s3 bucket>"
    export BUCKET_NAME="<Name of the bucket where the model is located>"
    export MODEL_PATH_IN_BUCKET="<Model path in bucket>"
    export COPY_JOB_NAME="<Name of the job that copies the model from COS>"
    次に、IBM COS バケットから PVC にモデルをコピーするジョブを作成して実行します。
    cat <<EOF |oc apply -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: ${COPY_JOB_NAME}
    spec:
      template:
        spec:
          containers:
          - name: aws-cli
            image: amazon/aws-cli:latest
            command: ["sh","-c"]
            args:
              - aws --endpoint-url ${ENDPOINT} s3 cp s3://${BUCKET_NAME}/${MODEL_PATH_IN_BUCKET} /model --recursive
            env:
            - name: AWS_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  name: aws-credentials
                  key: AWS_ACCESS_KEY_ID
            - name: AWS_SECRET_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: aws-credentials
                  key: AWS_SECRET_ACCESS_KEY
            - name: BUCKET_NAME
              value: ${BUCKET_NAME}
            - name: ENDPOINT
              value: ${ENDPOINT}
            - name: MODEL_PATH
              value: ${MODEL_PATH_IN_BUCKET}
            volumeMounts:
            - name: pvc-mount
              mountPath: /model
          restartPolicy: Never
          volumes:
          - name: pvc-mount
            persistentVolumeClaim:
              claimName: ${PVC_NAME}
    EOF
  8. ジョブが作成されたことを確認します。
    oc get job ${COPY_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS}
    予期される出力:
    NAME                   COMPLETIONS   DURATION   AGE
    <job name>   1/1           xx         xx
  9. ジョブ状況を確認します。
    oc get job ${COPY_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'
    予期される出力: True
  10. モデルを safetensor および fast-tokenizer フォーマットに変換するジョブを作成して実行します。 モデルが既にこれらの基準を満たしていることが確実な場合は、このステップをスキップできます。 最も速い方法は、モデル・リポジトリーを開いて、tokenizer.json ファイルと .safetensors ファイルが含まれているかどうかを確認することです。

    まず、ダイジェストの nametag を環境変数として設定します。 ダイジェストは、Docker・イメージの固有 ID です。 これは、イメージの内容に基づいて計算されます。

    export IMAGE_NAME="http://registry.redhat.io/rhoai/odh-vllm-cuda-rhel9@sha256:751e2359439161babb9ad8e93e16251888a8c07aed895ffa55e4dfaf2a45f89d"
    export IMAGE_TAG="rhoai-2.8-58cac74"

    次に、ジョブ名の環境変数をセットアップします。

    export CONV_JOB_NAME="<Name of the job>"

    次に、コンバーター・ジョブを作成して実行します。

    cat <<EOF |oc apply -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: ${CONV_JOB_NAME}
      namespace: ${PROJECT_CPD_INST_OPERANDS}
    spec:
      template:
        spec:
          containers:
          - name: models-safetensor
            image: ${IMAGE_NAME}:${IMAGE_TAG}
            env:
            - name: MODEL_PATH
            value: /model
            command: ["/bin/sh", "-c"]
            args:
            - |
              text-generation-server convert-to-safetensors ${MODEL_PATH}
              text-generation-server convert-to-fast-tokenizer ${MODEL_PATH}
            volumeMounts:
            - mountPath: /model
              name: byom-model
          restartPolicy: Never
          volumes:
          - name: byom-model
            persistentVolumeClaim:
              claimName: ${PVC_NAME}
    EOF

    ジョブが作成されたことを確認します。

    oc get job ${CONV_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS}

    予期される出力:

    NAME                   COMPLETIONS   DURATION   AGE
    <job name>   1/1           xx         xx

    次に、ジョブ状況を確認します。

    oc get job ${CONV_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'
    予期される出力: True
注:

チャット API を使用するモデルの場合、モデルに付属の標準チャット・テンプレートをオーバーライドできます。 これを可能にするには、まず、モデル作成者によって準備された代替テンプレートをダウンロードします。 次に、config.json ファイルが配置されているのと同じ場所 (ルート・フォルダー) にアップロードします。