Hugging Faceにあるストレージのセットアップとモデルのアップロード

Hugging Faceにある基盤モデルをPVCストレージにアップロードするには、以下の手順に従ってください。

前提条件

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

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

  1. Hugging Face Web サイトでモデルの名前を見つけます。
  2. 基本環境変数をセットアップします。
    export MODEL_NAME="<Hugging Face model name>"
    export HF_USERNAME="<Your Hugging Face username>"
    export HF_TOKEN="<Your Hugging Face token>"
    export MODEL_PATH="/mnt/models"
  3. モデルを複製します。
    git clone --no-checkout https://${HF_USERNAME}:${HF_TOKEN}@huggingface.co/${MODEL_NAME}
    モデルのクローン作成後に、作成されたフォルダーの名前を確認します。
  4. モデル・サイズを確認してください。 ご使用の環境に Git ラージ・File Storage (git lfs) がインストールされている場合は、モデルが含まれているフォルダーに移動し、モデルのサイズを確認します。
    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にあるモデルの場合、モデル名をクリックしてからファイルおよびバージョンタブを選択すると、すべてのファイル・サイズが表示されます。
  5. モデルの合計サイズを計算し、その結果に 100% のバッファーを追加します。 例えば、モデル・サイズが 14.5 GB の場合、作成する PVC のサイズは 29 GB です。 モデル・サイズを環境変数として設定します。
    export MODEL_SIZE="<calculated model size>"
  6. クラスター内にカスタム 基盤モデル 用の 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 の使用について詳しくは、ストレージ・ボリュームの管理を参照してください。
  7. PVC を作成した後、2 分待ってから、以下のコマンドを実行して PVC がバインドされていることを確認します。
    oc get pvc ${PVC_NAME} -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath='{.status.phase}'
    予期される結果: Bound
  8. Hugging Face・トークンを base64にエンコードします。
    ENCODED_TOKEN=`echo -n ${HF_TOKEN} | base64`
  9. クラスター内に シークレット を作成します。

    まず、新しい シークレット の名前を設定します。

    export SECRET_NAME="<The name of the new secret>"

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

    cat <<EOF |oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: ${SECRET_NAME}
      namespace: ${PROJECT_CPD_INST_OPERANDS}
    type: Opaque
    data:
      TOKEN: ${ENCODED_TOKEN}
    EOF
  10. Docker・イメージの nametagを環境変数として設定します。
    export IMAGE_NAME="http://registry.redhat.io/rhoai/odh-vllm-cuda-rhel9@sha256:751e2359439161babb9ad8e93e16251888a8c07aed895ffa55e4dfaf2a45f89d"
  11. Hugging Faceからモデルをダウンロードし、その後、モデルをsafetensorおよびfast-tokenizer形式に変換するジョブを作成して実行します。

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

    export DOWN_AND_CONV_JOB_NAME="<Name of the job>"

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

    cat <<EOF |oc apply -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: ${DOWN_AND_CONV_JOB_NAME}
      namespace: ${PROJECT_CPD_INST_OPERANDS}
    spec:
      template:
        spec:
          containers:
          - name: models-convertor
            image: ${IMAGE_NAME}:${IMAGE_TAG}
            env:
            - name: MODEL_PATH
              value: ${MODEL_PATH}
            - name: MODEL_NAME
              value: ${MODEL_NAME}
            - name: TOKEN
              valueFrom:
                secretKeyRef:
                  name: ${SECRET_NAME}
                  key: TOKEN
            command: ["/bin/sh", "-c"]
            args:
            - |
              huggingface-cli login --token \${TOKEN}
              huggingface-cli download ${MODEL_NAME} --local-dir ${MODEL_PATH} --cache-dir ${MODEL_PATH}
              text-generation-server convert-to-safetensors ${MODEL_PATH}
              text-generation-server convert-to-fast-tokenizer ${MODEL_PATH}
            volumeMounts:
            - mountPath: ${MODEL_PATH}
              name: byom-model
          restartPolicy: Never
          volumes:
          - name: byom-model
            persistentVolumeClaim:
              claimName: ${PVC_NAME}
    EOF
  12. ジョブが作成されたことを確認します。
    oc get job ${DOWN_AND_CONV_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS}

    予期される出力:

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

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

    oc get job ${DOWN_AND_CONV_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'

    予期される出力: True

  13. モデルが時系列モデルの場合は、追加のステップが必要になることがあります。 時系列モデルの tsfm_config.json ファイルの生成 を参照してください。

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

時系列モデルの tsfm_config.json ファイルの生成

時系列モデルのモデル・ディレクトリーには、tsfm_config.json ファイルが含まれている必要があります。 Hugging Face でホストされる時系列モデル (model_type: tinytimemixer) には、このファイルが含まれていない可能性があります。 モデルがダウンロードされてデプロイされるときにファイルが存在しない場合、予測は失敗します。 このファイルがモデル・ディレクトリーにない場合は、以下の手順を実行します。
  1. 注:

    ファイルを生成するには、ご使用の環境に Python バージョン 3.9 以上がインストールされている必要があります。

    パッケージのインストールが必要なため、エアー・ギャップ環境で操作している場合は、インターネットにアクセスできるマシンでスクリプトを実行してから、生成されたファイルをエアー・ギャップ環境に転送する必要があります。

  2. 以下のコードを実行して、2 つの必須パッケージをローカル・マシンにインストールします。
    
    pip3 install granite-tsfm==0.2.27
    pip3 install ibm-cos-sdk
  3. 欠落しているファイルを作成する Python スクリプトを作成して実行します。
    
    from tsfm_public import TinyTimeMixerForPrediction
    from tsfm_public.toolkit.service_util import save_deployment_package
    
    # Instantiate the model
    target_columns = ["total load actual"]
    zeroshot_model = TinyTimeMixerForPrediction.from_pretrained(
        "ibm-granite/granite-timeseries-ttm-r2",  # Name of the model on Hugging Face
        num_input_channels=len(target_columns),  # tsp.num_input_channels
    )
    
    save_deployment_package("ttm", zeroshot_model)
    このコードは、ファイルを ttm ディレクトリーに保存します。
  4. 生成されたファイルを、モデルが配置されている PVC ロケーションにコピーします。
    注: このスクリプトは、以下の 3 つのファイルを生成します。 config.jsonmodel.safetensors、およびtsfm_config.json。 これらのファイルの一部を既に生成している場合は、古いファイルを上書きできます。