Note :

Régler et servir des modèles linguistiques volumineux sur Oracle Cloud Infrastructure avec dstack

Présentation

dstack est un outil à code source libre qui simplifie l'orchestration de conteneurs d'intelligence artificielle (IA) et rend plus accessible la formation distribuée et le déploiement de modèles LLL (Large Language Models). La combinaison de dstack et d'Oracle Cloud Infrastructure (OCI) déverrouille un processus simplifié pour configurer l'infrastructure en nuage pour un entraînement distribué et un déploiement de modèle évolutif.

Comment fonctionne dstack?

dstack offre une interface unifiée pour le développement, la formation et le déploiement de modèles d'IA dans n'importe quel nuage ou centre de données. Par exemple, vous pouvez spécifier une configuration pour une tâche d'entraînement ou un modèle à déployer, et dstack s'occupera de la configuration de l'infrastructure requise et de l'orchestration des conteneurs. L'un des avantages offerts par dstack est qu'il permet l'utilisation de tout matériel, cadre et script.

Objectifs

Préalables

Tâche 1 : Configurer dstack avec OCI

  1. Installez l'ensemble Python dstack à l'aide de la commande suivante. Comme dstack prend en charge plusieurs fournisseurs de nuage, nous pouvons restreindre la portée à OCI.

    pip install dstack[oci]
    
  2. Configurez les données d'identification propres à OCI dans le fichier ~/.dstack/server/config.yml. Le code suivant suppose que vous avez configuré des données d'identification pour l'interface de ligne de commande OCI. Pour d'autres options de configuration, consultez la documentation sur la pile.

    projects:
    - name: main
      backends:
      - type: oci
        creds:
          type: default
    
  3. Exécutez le serveur dstack à l'aide de la commande suivante.

    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. Passez au dossier avec vos scripts de projet et initialisez dstack à l'aide de la commande suivante.

    dstack init
    

Tâche 2 : Tâche de réglage fin sur OCI avec dstack

Pour affiner le modèle Gemma 7B, nous utiliserons le manuel Hugging Face Alignment Handbook pour assurer l'intégration des meilleures pratiques de réglage fin. Vous pouvez obtenir le code source de ce tutoriel à partir d'ici : GitHub. Plongeons dans les étapes pratiques pour affiner votre LLM.

Une fois que vous passez au dossier de projet, utilisez les commandes suivantes pour lancer la tâche de réglage fin sur OCI avec 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

Les variables d'environnement FT_MODEL_CONFIG_PATH, ACCEL_CONFIG_PATH, HUGGING_FACE_HUB_TOKEN et WANDB_API_KEY sont définies dans la configuration de tâche ft.task.dstack.yml. dstack run soumet la tâche définie dans ft.task.dstack.yml sur OCI.

Note : dstack copie automatiquement le contenu du répertoire courant lors de l'exécution de la tâche.

Explorons les parties clés de chaque fichier YAML (pour le contenu complet, consultez le référentiel).

Le fichier qlora_finetune_config.yaml est la configuration de recette que le manuel d'alignement utilise pour comprendre comment ajuster un modèle de langue volumineux (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
# ...

Le fichier fsdp_qlora_full_shard.yaml configure l'utilisation accélérée de l'infrastructure sous-jacente pour le réglage fin du 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)

Tartes hybrides

Avec FSDP de distributed_type et FULL_SHARD de fsdp_sharding_strategy de fsdp_config, un modèle est fragmenté sur plusieurs GPU dans une seule machine. Lorsque vous traitez avec plusieurs noeuds de calcul, chaque noeud hébergera une copie identique du modèle, qui est elle-même fractionnée entre plusieurs GPU au sein de ce noeud. Cela signifie que chaque instance de modèle partitionnée sur chaque noeud traite différentes sections ou lots de votre jeu de données. Pour répartir un modèle unique entre plusieurs GPU sur plusieurs noeuds, configurez le paramètre fsdp_sharding_strategy en tant que HYBRID_SHARD.

Des paramètres supplémentaires tels que machine_rank, num_machines et num_processes sont importants pour la coordination. Toutefois, il est recommandé de définir ces valeurs dynamiquement lors de l'exécution, car cela offre une flexibilité lors du basculement entre différentes configurations d'infrastructure.

Tâche 3 : Instructions dstack à l'aide de la configuration simplifiée pour provisionner l'infrastructure

Explorons la configuration fsdp_qlora_full_shard.yaml qui regroupe tous les éléments et indique à dstack comment provisionner l'infrastructure et exécuter la tâche.

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

Points clés à mettre en évidence : :

Tâche 4 : Servez votre modèle à réglage fin avec dstack

Une fois votre modèle ajusté, dstack facilite son déploiement sur OCI à l'aide du cadre TGI (Hugging Face Text Generation Inference).

Voici un exemple de définition d'un service dans 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

Principaux avantages de cette approche :

À ce stade, vous pouvez interagir avec le service à l'aide de la commande curl standard et des demandes Python, de la trousse SDK OpenAI et des bibliothèques client d'inférence de Hugging Face. Par exemple, l'extrait de code suivant présente un exemple 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}}'

De plus, pour un modèle déployé, dstack fournit automatiquement une interface utilisateur pour interagir directement avec le modèle.

Interface utilisateur

Étapes suivantes

En suivant les étapes décrites dans ce tutoriel, vous avez débloqué une approche puissante pour affiner et déployer les LLM à l'aide des capacités combinées de dstack, OCI et de l'écosystème Hugging Face. Vous pouvez maintenant tirer parti de l'interface conviviale de dstack pour gérer vos ressources OCI de manière efficace, simplifiant le processus de configuration des environnements de formation répartis pour vos projets de LLM.

De plus, l'intégration avec le manuel d'alignement de Hugging Face et le cadre TGI vous permet d'affiner et de servir vos modèles de façon transparente, en vous assurant qu'ils sont optimisés pour les performances et prêts pour les applications du monde réel. Nous vous encourageons à explorer davantage les possibilités et à expérimenter différents modèles et configurations pour atteindre les résultats souhaités dans le monde du traitement du langage naturel.

Confirmation

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.