Remarques :

Réglez et servez des modèles de langage volumineux sur Oracle Cloud Infrastructure avec dstack

Introduction

dstack est un outil open source qui simplifie l'orchestration de conteneurs d'intelligence artificielle (IA) et rend plus accessible l'entraînement et le déploiement distribués de modèles de langage volumineux. L'association de dstack et d'Oracle Cloud Infrastructure (OCI) déverrouille un processus simplifié de configuration de l'infrastructure cloud pour l'entraînement distribué et le déploiement de modèles évolutifs.

Fonctionnement de dstack

dstack offre une interface unifiée pour le développement, l'entraînement et le déploiement de modèles d'IA dans n'importe quel cloud ou centre de données. Par exemple, vous pouvez indiquer une configuration pour une tâche d'entraînement ou un modèle à déployer, et dstack se charge de configurer l'infrastructure requise et d'orchestrer les conteneurs. L'un des avantages offerts par dstack est qu'il permet l'utilisation de tout matériel, frameworks et scripts.

Objectifs

Prérequis

Tâche 1 : configurer dstack avec OCI

  1. Installez le package Python dstack à l'aide de la commande suivante. Comme dstack prend en charge plusieurs fournisseurs cloud, nous pouvons limiter la portée à OCI.

    pip install dstack[oci]
    
  2. Configurez les informations d'identification propres à OCI dans le fichier ~/.dstack/server/config.yml. Le code suivant suppose que vous disposez d'informations d'identification pour l'interface de ligne de commande (CLI) OCI configurée. Pour obtenir d'autres options de configuration, reportez-vous à la dstack documentation.

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

    dstack init
    

Tâche 2 : affiner le travail sur OCI avec dstack

Pour peaufiner le modèle Gemma 7B, nous utiliserons le manuel d'alignement du visage pour assurer l'intégration des meilleures pratiques d'ajustement. Le code source de ce tutoriel est disponible ici : GitHub. Laissez-nous plonger dans les étapes pratiques pour affiner votre LLM.

Une fois que vous avez basculé vers le dossier du projet, utilisez les commandes suivantes pour lancer le travail 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.

Remarque : dstack copie automatiquement le contenu du répertoire en cours 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 utilisée par le manuel d'alignement pour comprendre comment affiner un modèle de langage volumineux.

# 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 la façon d'accélérer l'utilisation de l'infrastructure sous-jacente pour affiner le 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)

Shards hybrides

Avec FSDP de distributed_type et FULL_SHARD de fsdp_sharding_strategy de fsdp_config, un modèle sera distribué sur plusieurs GPU dans une seule machine. Lorsqu'il s'agit de plusieurs noeuds de calcul, chaque noeud héberge une copie identique du modèle, qui est lui-même répartie entre plusieurs GPU au sein de ce noeud. Cela signifie que chaque instance de modèle partitionné sur chaque noeud traite différentes sections ou lots de votre ensemble de données. Pour distribuer un modèle unique sur plusieurs GPU couvrant 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 certaine flexibilité lors du basculement entre différentes configurations d'infrastructure.

Tâche 3 : indiquer à dstack d'utiliser la configuration simplifiée pour provisionner l'infrastructure

Explorons la configuration fsdp_qlora_full_shard.yaml qui rassemble 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 affiné, dstack facilite son déploiement sur OCI à l'aide de la structure 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 :

A ce stade, vous pouvez interagir avec le service à l'aide de la commande curl standard et des demandes Python, du kit SDK OpenAI et des bibliothèques client d'inférence de Hugging Face. Par exemple, le fragment de code suivant présente un exemple de boucle.

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}}'

En outre, pour un modèle déployé, dstack fournit automatiquement une interface utilisateur permettant d'interagir directement avec le modèle.

Interface utilisateur

Etapes suivantes

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

En outre, 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 manière transparente, en vous assurant qu'ils sont optimisés pour les performances et prêts pour des applications concrètes. 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.

Remerciements

Ressources de formation supplémentaires

Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

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