Note:

Ajuste y sirva modelos de lenguaje de gran tamaño en Oracle Cloud Infrastructure con dstack

Introducción

dstack es una herramienta de código abierto que simplifica la orquestación de contenedores de inteligencia artificial (IA) y hace que la formación y el despliegue distribuidos de modelos de lenguaje grande (LLM) sean más accesibles. La combinación de dstack y Oracle Cloud Infrastructure (OCI) desbloquea un proceso optimizado para configurar la infraestructura en la nube para el entrenamiento distribuido y el despliegue de modelos escalables.

¿Cómo funciona dstack?

dstack ofrece una interfaz unificada para el desarrollo, entrenamiento e implementación de modelos de IA en cualquier nube o centro de datos. Por ejemplo, puede especificar una configuración para una tarea de formación o un modelo que desplegar, y dstack se encargará de configurar la infraestructura necesaria y orquestar los contenedores. Una de las ventajas que ofrece dstack es que permite el uso de cualquier hardware, marcos y scripts.

Objetivos

Requisitos

Tarea 1: Configuración de dstack con OCI

  1. Instale el paquete Python dstack con el siguiente comando. Dado que dstack soporta varios proveedores de nube, podemos reducir el ámbito a OCI.

    pip install dstack[oci]
    
  2. Configure las credenciales específicas de OCI en el archivo ~/.dstack/server/config.yml. El siguiente código asume que tiene credenciales configuradas para la interfaz de línea de comandos (CLI) de OCI. Para obtener otras opciones de configuración, consulte la documentación de dstack.

    projects:
    - name: main
      backends:
      - type: oci
        creds:
          type: default
    
  3. Ejecute el servidor dstack con el siguiente comando.

    dstack server
    INFO     Applying ~/.dstack/server/config.yml...
    INFO     Configured the main project in ~/.dstack/config.yml
    INFO     The admin token is ab6e8759-9cd9-4e84-8d47-5b94ac877ebf
    INFO     The dstack server 0.18.4 is running at http://127.0.0.1:3000
    
  4. Cambie a la carpeta con los scripts de proyecto e inicialice dstack con el siguiente comando.

    dstack init
    

Tarea 2: Ajuste del trabajo en OCI con dstack

Para afinar el modelo Gemma 7B, utilizaremos el manual de alineación facial de abrazo para garantizar la incorporación de las mejores prácticas de ajuste fino. El código fuente de este tutorial se puede obtener de aquí: GitHub. Sumérjase en los pasos prácticos para afinar su LLM.

Una vez que haya cambiado a la carpeta del proyecto, utilice los siguientes comandos para iniciar el trabajo de ajuste en OCI con dstack.

ACCEL_CONFIG_PATH=fsdp_qlora_full_shard.yaml \
  FT_MODEL_CONFIG_PATH=qlora_finetune_config.yaml \
  HUGGING_FACE_HUB_TOKEN=xxxx \
  WANDB_API_KEY=xxxx \
  dstack run . -f ft.task.dstack.yml

Las variables de entorno FT_MODEL_CONFIG_PATH, ACCEL_CONFIG_PATH, HUGGING_FACE_HUB_TOKEN y WANDB_API_KEY se definen dentro de la configuración de tarea ft.task.dstack.yml. dstack run ejecuta la tarea definida en ft.task.dstack.yml en OCI.

Nota: dstack copia automáticamente el contenido del directorio actual al ejecutar la tarea.

Vamos a explorar las partes clave de cada archivo YAML (para ver el contenido completo, consulte el repositorio).

El archivo qlora_finetune_config.yaml es la configuración de receta que utiliza el manual de alineación para comprender cómo desea ajustar un modelo de lenguaje grande (LLM).

# Model arguments
model_name_or_path: google/gemma-7b
tokenizer_name_or_path: philschmid/gemma-tokenizer-chatml
torch_dtype: bfloat16
bnb_4bit_quant_storage: bfloat16

# LoRA arguments
load_in_4bit: true
use_peft: true
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
  - q_proj
  - k_proj
# ...

# Data training arguments
dataset_mixer:
  chansung/mental_health_counseling_conversations: 1.0
dataset_splits:
  - train
  - test
# ...

El archivo fsdp_qlora_full_shard.yaml configura para acelerar el uso de la infraestructura subyacente para ajustar el LLM.

compute_environment: LOCAL_MACHINE
distributed_type: FSDP  # Use Fully Sharded Data Parallelism
fsdp_config:
  fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  fsdp_backward_prefetch: BACKWARD_PRE
  fsdp_cpu_ram_efficient_loading: true
  fsdp_use_orig_params: false
  fsdp_offload_params: true
  fsdp_sharding_strategy: FULL_SHARD
  # ... (other FSDP configurations)
# ... (other configurations)

Particiones híbridas

Con FSDP de distributed_type y FULL_SHARD de fsdp_sharding_strategy de fsdp_config, un modelo se particionará en varias GPU en una sola máquina. Cuando se trata de varios nodos de cálculo, cada nodo alojará una copia idéntica del modelo, que se divide en varias GPU dentro de ese nodo. Esto significa que cada instancia de modelo particionada en cada nodo procesa diferentes secciones o lotes del juego de datos. Para distribuir un único modelo entre varias GPU que abarquen varios nodos, configure el parámetro fsdp_sharding_strategy como HYBRID_SHARD.

Los parámetros adicionales como machine_rank, num_machines y num_processes son importantes para la coordinación. Sin embargo, se recomienda definir estos valores de forma dinámica en tiempo de ejecución, ya que proporciona flexibilidad al cambiar entre diferentes configuraciones de infraestructura.

Tarea 3: Instrucciones para dstack mediante la configuración simplificada para aprovisionar la infraestructura

Vamos a explorar la configuración fsdp_qlora_full_shard.yaml que reúne todo y le indica a dstack cómo aprovisionar la infraestructura y ejecutar la tarea.

type: task
nodes: 3

python: "3.11"
env:
  - ACCEL_CONFIG_PATH
  - FT_MODEL_CONFIG_PATH
  - HUGGING_FACE_HUB_TOKEN
  - WANDB_API_KEY
commands:
  # ... (setup steps, cloning repo, installing requirements)
  - ACCELERATE_LOG_LEVEL=info accelerate launch \
      --config_file recipes/custom/accel_config.yaml \
      --main_process_ip=$DSTACK_MASTER_NODE_IP \
      --main_process_port=8008 \
      --machine_rank=$DSTACK_NODE_RANK \
      --num_processes=$DSTACK_GPUS_NUM \
      --num_machines=$DSTACK_NODES_NUM \
      scripts/run_sft.py recipes/custom/config.yaml
ports:
  - 6006
resources:
  gpu: 1..2
  shm_size: 24GB

Puntos clave para resaltar::

Tarea 4: Servir su modelo ajustado con dstack

Una vez que el modelo está ajustado, dstack facilita su despliegue en OCI mediante el marco Hugging Face Text Generation Inference (TGI).

A continuación, se muestra un ejemplo de cómo puede definir un servicio en dstack:

type: service
image: ghcr.io/huggingface/text-generation-inference:latest
env:
  - HUGGING_FACE_HUB_TOKEN
  - MODEL_ID=chansung/mental_health_counseling_merged_v0.1
commands:
  - text-generation-launcher \
    --max-input-tokens 512 --max-total-tokens 1024 \
    --max-batch-prefill-tokens 512 --port 8000
port: 8000

resources:
  gpu:
    memory: 48GB

# (Optional) Enable the OpenAI-compatible endpoint
model:
  format: tgi
  type: chat
  name: chansung/mental_health_counseling_merged_v0.1

Ventajas clave de este enfoque:

En este punto, puede interactuar con el servicio mediante el comando curl estándar y las solicitudes de Python, el SDK OpenAI y las bibliotecas de cliente de inferencia de Hugging Face. Por ejemplo, el siguiente fragmento de código muestra un ejemplo de curl.

curl -X POST https://black-octopus-1.mycustomdomain.com/generate \
  -H "Authorization: Bearer <dstack-token>" \
  -H 'Content-Type: application/json' \
  -d '{"inputs": "I feel bad...", "parameters": {"max_new_tokens": 128}}'

Además, para un modelo desplegado, dstack proporciona automáticamente una interfaz de usuario para interactuar directamente con el modelo.

Interfaz de usuario

Pasos Siguientes

Al seguir los pasos descritos en este tutorial, ha desbloqueado un potente enfoque para ajustar y desplegar LLM mediante las capacidades combinadas de dstack, OCI y el ecosistema Hugging Face. Ahora puede aprovechar la interfaz fácil de usar de dstack para gestionar sus recursos de OCI de forma eficaz, lo que agiliza el proceso de configuración de entornos de formación distribuidos para sus proyectos de LLM.

Además, la integración con el Manual de alineación de Hugging Face y el marco TGI le permite ajustar y servir sus modelos sin problemas, asegurando que estén optimizados para el rendimiento y listos para aplicaciones del mundo real. Le animamos a explorar las posibilidades y experimentar con diferentes modelos y configuraciones para lograr los resultados deseados en el mundo del procesamiento del lenguaje natural.

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en Oracle Learning Explorer.

Para obtener documentación sobre el producto, visite Oracle Help Center.