Configuración del almacenamiento y carga de un modelo ubicado en Hugging Face

Siga estos pasos para cargar un modelo base que se encuentra en Hugging Face al almacenamiento PVC.

Requisitos previos

Algunas de las variables de entorno que se utilizan en los fragmentos de código de este documento son variables globales que se configuran durante la instalación. Para obtener más información, consulte Configuración de las variables de entorno de instalación.

Para configurar el almacenamiento y cargar un modelo que se encuentra en Hugging Face :

  1. Busca el nombre del modelo en el Hugging Face sitio web.
  2. Configurar las variables de entorno básicas:
    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. Clona el modelo.
    git clone --no-checkout https://${HF_USERNAME}:${HF_TOKEN}@huggingface.co/${MODEL_NAME}
    Después de clonar el modelo, comprueba el nombre de la carpeta creada.
  4. Comprueba el tamaño del modelo. Si tiene Git Large File Storage (git lfs) instalado en su entorno, vaya a la carpeta que contiene su modelo y compruebe el tamaño del modelo:
    git lfs ls-files -s
    Salida:
    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)
    Si no tiene git lfs instalado en su entorno, debe obtener esta información del generador de modelos o del repositorio donde se encontraba originalmente el modelo. En el caso de los modelos que se encuentran en Hugging Face, todos los tamaños de archivo son visibles al hacer clic en el nombre del modelo y seleccionar la pestaña Archivos y versiones.
  5. Calcule el tamaño total del modelo y añada un margen del 100 % al resultado. Por ejemplo, si el tamaño del modelo es 14.5 GB, el tamaño del PVC que creará será de 29 GB. Establezca el tamaño del modelo como una variable de entorno:
    export MODEL_SIZE="<calculated model size>"
  6. Cree el almacenamiento PersistentVolumeClaims (PVC) para su modelo de base personalizado en su clúster.

    En primer lugar, establezca el nombre del nuevo PVC como variable de entorno:

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

    A continuación, ejecute este código:

    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
    Para obtener más información sobre cómo crear un nuevo PVC o utilizar un PVC existente con volúmenes de almacenamiento, consulte Administración de volúmenes de almacenamiento.
  7. Después de crear el PVC, espere dos minutos y luego ejecute este comando para verificar que el PVC esté vinculado:
    oc get pvc ${PVC_NAME} -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath='{.status.phase}'
    Resultado esperado: Bound
  8. Codifica tu Hugging Face token en base64:
    ENCODED_TOKEN=`echo -n ${HF_TOKEN} | base64`
  9. Cree el secreto en su clúster:

    En primer lugar, establezca el nombre del nuevo secreto:

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

    A continuación, ejecute este código:

    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. Establezca name y tag de la imagen Docker como variables de entorno.
    export IMAGE_NAME="http://registry.redhat.io/rhoai/odh-vllm-cuda-rhel9@sha256:751e2359439161babb9ad8e93e16251888a8c07aed895ffa55e4dfaf2a45f89d"
  11. Cree y ejecute una tarea que descargue el modelo desde Hugging Face y, a continuación, convierta su modelo a los formatos safetensorfast-tokenizer y.

    En primer lugar, configure una variable de entorno para el nombre de su trabajo:

    export DOWN_AND_CONV_JOB_NAME="<Name of the job>"

    A continuación, ejecute este código:

    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. Verifique que se haya creado el trabajo:
    oc get job ${DOWN_AND_CONV_JOB_NAME} -n ${PROJECT_CPD_INST_OPERANDS}

    Salida prevista:

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

    Por último, comprueba el estado del trabajo:

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

    Salida prevista: True

  13. Si su modelo es un modelo de series temporales, es posible que sea necesario un paso adicional. Consulte Generar el tsfm_config.json archivo para modelos de series temporales.

    Para los modelos que utilizan la API de chat, puede sobrescribir la plantilla de chat estándar que se proporciona con el modelo. Para que esto sea posible, primero descargue una plantilla alternativa preparada por los creadores del modelo. A continuación, súbelo a la misma ubicación en la que se encuentra el config.json archivo (carpeta raíz).

Generación del tsfm_config.json archivo para modelos de series temporales

El directorio de modelos para modelos de series temporales debe contener el tsfm_config.json archivo. Los modelos de series temporales alojados en Hugging Face (model_type: tinytimemixer) no pueden incluir este archivo. Si el archivo no está presente cuando se descarga e implementa el modelo, el pronóstico fallará. Si no ve este archivo en el directorio del modelo, siga estos pasos:
  1. Nota:

    Para generar los archivos, debe tener Python instalada la versión 3.9 o superior en su entorno.

    Dado que es necesario instalar un paquete, si está trabajando en un entorno aislado, debe ejecutar el script en un equipo que tenga acceso a Internet y, a continuación, transferir los archivos generados a su entorno aislado.

  2. Ejecute este código para instalar dos paquetes necesarios en su máquina local:
    
    pip3 install granite-tsfm==0.2.27
    pip3 install ibm-cos-sdk
  3. Cree y ejecute un Python script que cree el archivo que falta:
    
    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)
    Este código guardará los archivos en el ttm directorio.
  4. Copie los archivos generados a la ubicación PVC donde se encuentra su modelo.
    Nota: El script genera tres archivos: config.json, model.safetensors, y tsfm_config.json. Si ya ha generado algunos de estos archivos anteriormente, puede sobrescribir los archivos antiguos.