Nota

Ottimizza e servi modelli di linguaggio di grandi dimensioni su Oracle Cloud Infrastructure con dstack

Introduzione

dstack è uno strumento open source che semplifica l'orchestrazione dei container di intelligenza artificiale (AI) e rende più accessibile la formazione e l'implementazione distribuita di LLM (Large Language Models). La combinazione di dstack e Oracle Cloud Infrastructure (OCI) sblocca un processo semplificato per la configurazione dell'infrastruttura cloud per la formazione distribuita e l'implementazione di modelli scalabili.

Come funziona dstack?

dstack offre un'interfaccia unificata per lo sviluppo, la formazione e la distribuzione di modelli AI in qualsiasi cloud o data center. Ad esempio, è possibile specificare una configurazione per un task di formazione o un modello da distribuire e dstack si occuperà di impostare l'infrastruttura richiesta e di orchestrare i container. Uno dei vantaggi che dstack offre è che consente l'uso di qualsiasi hardware, framework e script.

Obiettivi

Prerequisiti

Task 1: impostare dstack con OCI

  1. Installare il pacchetto dstack Python utilizzando il comando seguente. Poiché dstack supporta più provider cloud, possiamo restringere l'ambito a OCI.

    pip install dstack[oci]
    
  2. Configurare le credenziali specifiche OCI all'interno del file ~/.dstack/server/config.yml. Il codice seguente presuppone che siano configurate le credenziali per l'interfaccia CLI (Command Line Interface) OCI. Per altre opzioni di configurazione, consultare la documentazione di dstack.

    projects:
    - name: main
      backends:
      - type: oci
        creds:
          type: default
    
  3. Eseguire il server dstack utilizzando il comando seguente.

    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. Passare alla cartella con gli script di progetto e inizializzare dstack utilizzando il comando seguente.

    dstack init
    

Task 2: Ottimizza il lavoro su OCI con dstack

Per perfezionare il modello Gemma 7B, utilizzeremo il manuale di allineamento facciale Hugging per garantire l'incorporazione delle migliori pratiche di messa a punto. Il codice sorgente di questa esercitazione può essere ottenuto da qui: GitHub. Immergiamoci nei passaggi pratici per perfezionare il tuo LLM.

Una volta passata la cartella del progetto, utilizzare i comandi seguenti per avviare il job di tuning su 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

Le variabili di ambiente FT_MODEL_CONFIG_PATH, ACCEL_CONFIG_PATH, HUGGING_FACE_HUB_TOKEN e WANDB_API_KEY sono definite all'interno della configurazione del task ft.task.dstack.yml. dstack run sottomette il task definito in ft.task.dstack.yml su OCI.

Nota: dstack copia automaticamente il contenuto della directory corrente durante l'esecuzione del task.

Esploriamo le parti chiave di ogni file YAML (per il contenuto completo, controlla il repository).

Il file qlora_finetune_config.yaml è la configurazione della ricetta utilizzata dal manuale di allineamento per capire come si desidera ottimizzare un modello LLM (Large Language Model).

# 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
# ...

Il file fsdp_qlora_full_shard.yaml configura come accelerare l'utilizzo dell'infrastruttura sottostante per il tuning dell'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)

Partizioni ibride

Con il valore FSDP di distributed_type e FULL_SHARD del valore fsdp_sharding_strategy di fsdp_config, un modello verrà suddiviso in più GPU in un'unica macchina. Quando si tratta di più nodi di calcolo, ogni nodo ospiterà una copia identica del modello, che è a sua volta suddivisa tra più GPU all'interno di tale nodo. Ciò significa che ogni istanza di modello partizionata su ciascun nodo elabora sezioni o batch diversi del data set. Per distribuire un singolo modello su più GPU su più nodi, configurare il parametro fsdp_sharding_strategy come HYBRID_SHARD.

Ulteriori parametri come machine_rank, num_machines e num_processes sono importanti per il coordinamento. Tuttavia, si consiglia di impostare questi valori in modo dinamico in fase di esecuzione, in quanto ciò offre flessibilità quando si passa da un'installazione all'altra dell'infrastruttura.

Task 3: indicare a dstack di utilizzare la configurazione semplificata per eseguire il provisioning dell'infrastruttura

Esploriamo la configurazione fsdp_qlora_full_shard.yaml che riunisce tutti gli elementi e fornisce istruzioni a dstack su come eseguire il provisioning dell'infrastruttura ed eseguire il task.

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

Punti chiave da evidenziare::

Task 4: Servire il tuo modello ottimizzato con dstack

Una volta che il modello è stato ottimizzato, dstack semplifica la distribuzione su OCI utilizzando il framework TGI (Huggging Face Text Generation Inference).

Di seguito è riportato un esempio di come definire un servizio in 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

Vantaggi principali di questo approccio:

A questo punto, è possibile interagire con il servizio utilizzando il comando curl standard e le richieste Python, l'SDK OpenAI e le librerie client di inferenza di Hugging Face. Ad esempio, il seguente frammento di codice mostra un esempio di arricciatura.

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

Inoltre, per un modello distribuito, dstack fornisce automaticamente un'interfaccia utente per interagire direttamente con il modello.

Interfaccia utente

Passi successivi

Seguendo i passaggi descritti in questo tutorial, hai sbloccato un potente approccio per perfezionare e distribuire LLM utilizzando le funzionalità combinate di dstack, OCI e l'ecosistema Hugging Face. Ora puoi sfruttare l'interfaccia intuitiva di dstack per gestire le tue risorse OCI in modo efficace, semplificando il processo di impostazione degli ambienti di formazione distribuiti per i tuoi progetti LLM.

Inoltre, l'integrazione con il manuale di allineamento di Hugging Face e il framework TGI consente di ottimizzare e servire senza problemi i modelli, garantendo che siano ottimizzati per le prestazioni e pronti per le applicazioni del mondo reale. Vi invitiamo a esplorare ulteriormente le possibilità e sperimentare con diversi modelli e configurazioni per ottenere i risultati desiderati nel mondo dell'elaborazione del linguaggio naturale.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione del prodotto, visita l'Oracle Help Center.