View a markdown version of this page

Fine-tune Hugging Face LM con LoRa e QLoRa - Deadline Cloud

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Fine-tune Hugging Face LM con LoRa e QLoRa

Questo tutorial illustra la messa a punto di un modello di linguaggio causale di Hugging Face con Low-Rank Adaptation (LoRa) o Quantized Low-Rank Adaptation (QLoRa) su un set di dati di istruzioni personalizzato. Invii il pacchetto di lavoro di ottimizzazione di Hugging Face LoRa a una flotta di GPU della tua farm Deadline Cloud. GitHub

LoRa addestra un piccolo adattatore su un modello base congelato invece di aggiornare tutti i pesi del modello. QLoRa fa lo stesso mantenendo il modello base in forma quantizzata a 4 bit, il che dimezza all'incirca la memoria GPU necessaria e consente ai modelli più grandi di adattarsi a GPU più piccole.

Il pacchetto utilizza la libreria di trasformatori Hugging Face, la libreria di ottimizzazione fine efficiente dei parametri PEFT e la libreria di quantizzazione bitsandbytes per eseguire una regolazione fine efficiente dai parametri. https://github.com/TimDettmers/bitsandbytes L'uscita è un piccolo adattatore LoRa (circa 50-200 MB). Caricalo sopra il modello base per modificare il comportamento del modello. Usalo per insegnare al modello uno stile di scrittura, una competenza di dominio, un formato di output specifico o alcune conoscenze proprietarie.

Tempo stimato: circa un'ora, compresa la configurazione. La maggior parte delle regolazioni LoRa per i modelli 1B-7B vengono completate in 5-30 minuti di formazione.

L'esecuzione di questo tutorial comporta l'addebito delle istanze di lavoro della GPU che elaborano il job.

Panoramica di

Il flusso di lavoro è suddiviso in quattro fasi. Si prepara un set di dati JSONL, si invia il job Deadline Cloud in modo che un operatore GPU scarichi il set di dati ed esegua il fine-tuning di QLoRa, scarichi l'adattatore e combini l'adattatore con il modello base per l'deadline job download-outputinferenza locale.

Per completare questo tutorial, segui questi passaggi:

  1. Completare i prerequisiti .

  2. Allestisci la tua fattoria.

  3. Prepara il tuo set di dati.

  4. Concedi al ruolo di coda l'accesso al tuo bucket di set di dati (solo set di dati S3).

  5. Invia il lavoro di ottimizzazione.

  6. Scarica e usa l'adattatore addestrato.

  7. Eliminare le risorse.

Prerequisiti

Prima di iniziare, avrai bisogno di:

  • L'interfaccia a riga di comando di Deadline Cloud è GitHub installata.

  • Un set di dati in formato JSONL, in una cartella locale o caricato in un bucket Amazon S3 che il ruolo della coda può leggere.

  • (Facoltativo) Un token Hugging Face, necessario solo se ripunti il pacchetto su un modello chiuso (ad esempio, Llama o Gemma). Tutti i modelli nel menu a discesa sono pubblici.

Configura la tua fattoria

È necessaria una farm Deadline Cloud con una GPU-enabled coda (parco Linux, GPU NVIDIA con 16 GB o più di RAM video (VRAM)).

La tabella seguente elenca i consigli sulla flotta in base alle dimensioni del modello. QLoRa dimezza il fabbisogno di memoria rispetto a LoRa completo e il pacchetto predefinito è QLoRa.

Consigli sulla flotta
Dimensione del modello VRAM minima (QLoRa a 4 bit) Istanza Amazon EC2 consigliata

0,5B-1,5B

8 GB

g5.xlarge(A10G) o superiore

3B-7B

12 GB

g5.2xlarge(A10G), g6.xlarge (L4)

7B-14B

24 GB

g5.4xlarge(A10G 24 GB), g6.2xlarge (L4 24 GB)

14B—32B

48 GB

g6e.xlarge(L40S 48 GB), g5.12xlarge (4 × A10G 24 GB), g6.12xlarge (4 × L4 24 GB)

Nota

Le istanze multi-GPU nell'ultima riga forniscono quattro GPU da 24 GB anziché una singola GPU con 48 GB di VRAM. Lo script di training del pacchetto carica il modello con l'device_map="auto"impostazione Hugging Face, che suddivide i livelli del modello nelle GPU dell'istanza. Per una singola GPU con 48 GB di VRAM, usa un'istanza (L40S). g6e

Prepara il tuo set di dati

Il set di dati è un file JSONL in cui ogni riga è un oggetto JSON con due campi di testo. I nomi dei campi predefiniti sono instruction e output puoi configurarli con i parametri and. InstructionColumn ResponseColumn

Le righe seguenti sono tratte dal set di dati di esempio Saffron Stack incluso nel pacchetto:

{"instruction": "What is Saffron Stack's tagline?", "output": "Saffron Stack's tagline is 'Layered with love.'"} {"instruction": "How old is Saffron Stack?", "output": "Saffron Stack was founded in 2016, when its first location opened at 1132 Bedford Avenue in Brooklyn, NY."}

Il pacchetto accetta dati in due forme:

  • Cartella locale (impostazione predefinita): il DatasetPath parametro punta a una cartella locale di uno o più .jsonl file. Gli allegati al lavoro di Deadline Cloud caricano automaticamente la cartella e il lavoro concatena più file nella cartella, incluse le sottocartelle. Il valore predefinito è la sample_data/ cartella del pacchetto, quindi l'invio con tutte le impostazioni predefinite si basa sui dati di esempio inclusi (un esempio fittizio di un ristorante chiamato Saffron Stack).

  • URI Amazon S3 (override opzionale): se imposti il parametro, il pacchetto lo ignora e scarica invece da Amazon S3. DatasetS3Uri DatasetPath Accetta un singolo file, ad esempios3://bucket/path/train.jsonl, oppure un prefisso / che termina con il quale concatena tutti i file al suo interno. .jsonl La modalità S3 richiede che il ruolo di sessione della coda disponga dell'autorizzazione sul set di dati. s3:GetObject

Il formato del set di dati è compatibile con molti set di dati pubblici di Hugging Face, tra cui il dataset tatsu- su Hugging Face e il lab/alpaca dataset databricks-dolly-15k su Hugging Face, che utilizza i campi + (set). instruction response ResponseColumn=response

Concedi al ruolo di coda l'accesso al bucket del tuo set di dati

I lavoratori di Deadline Cloud eseguono i lavori nell'ambito del ruolo di sessione della coda. Per impostazione predefinita, tale ruolo può leggere solo gli allegati ai lavori della coda, nel bucket Amazon S3. Se il tuo set di dati si trova altrove, devi concedere l'accesso in lettura al ruolo. Se utilizzi il set di dati predefinito con cartelle locali, salta questa sezione.

Per concedere al ruolo di coda l'accesso in lettura al set di dati
  1. Crea un documento politico denominatodatasets-policy.json, sostituendo la risorsa ARN con il bucket e il prefisso effettivi:

    { "Version": "2012-10-17", "Statement": [{ "Sid": "ReadFineTuningDatasets", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/datasets/*" ] }] }
  2. Allega la policy al tuo ruolo di coda:

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam put-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets \ --policy-document file://datasets-policy.json

In alternativa, posiziona il set di dati sotto il prefisso del bucket job-attachments esistente della coda () a cui il ruolo ha già accesso. DeadlineCloud/...

Invia il lavoro di perfezionamento

Per inviarlo con il mittente della GUI, esegui il comando seguente, compila il modulo e scegli Invia. La GUI è organizzata in sezioni comprimibili: Model, Dataset, LoRa, Training e Output.

deadline bundle gui-submit /path/to/hf_finetune_lora

In alternativa, invia con la CLI:

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p DatasetPath=/path/to/your/data \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

Il BaseModel parametro è predefinito Qwen/Qwen2.5-7B e offre un menu a discesa di cinque modelli pubblici: Qwen2.5 (0.5B, 1.5B e 7B) e. Mistral-7B-v0.3 Phi-3.5-mini-instruct Per ottimizzare un modello che non è nell'elenco, modifica il parametro nel file del allowedValues pacchetto. BaseModel template.yaml Gli iperparametri predefiniti sono ottimizzati per la memorizzazione dei fatti, che corrisponde ai dati di esempio raggruppati. Per i casi d'uso legati al trasferimento dello stile, una configurazione più leggera si allena più velocemente:

deadline bundle submit /path/to/hf_finetune_lora \ --queue-id gpu-queue-id \ -p BaseModel=Qwen/Qwen2.5-1.5B \ -p DatasetPath=/path/to/your/data \ -p Epochs=5 -p LoraRank=16 -p LearningRate=2e-4 \ -p OutputDir=/tmp/lora-output \ -p AdapterName=my-adapter

Per l'elenco completo dei parametri, tra cui il ranking LoRa, il tasso di apprendimento, la dimensione del batch e la lunghezza della sequenza, consulta la tabella dei parametri chiave nell'esempio README on. GitHub

Per attendere il completamento del processo, esegui il comando seguente:

deadline job wait --job-id job-id --timeout 3600

Scaricate e utilizzate l'adattatore addestrato

Per scaricare e testare l'adattatore
  1. Al termine del processo, scarica l'output:

    deadline job download-output --job-id job-id

    L'adattatore finisce OutputDir/AdapterName/ e contiene i pesi LoRa (), la configurazione PEFT (adapter_model.safetensors), i metadati di addestramento e i file tokenizer. adapter_config.json

  2. Installa lo stack di inferenza principale sul tuo computer locale:

    pip install torch transformers peft

    Gli strumenti di chat caricano l'intero modello base, quindi la tua macchina ha bisogno di risorse sufficienti per eseguirlo. Una GPU è opzionale: su una GPU NVIDIA, l'impostazione predefinita di pip CUDA-enabled PyTorch gestisce l'accelerazione; su un Mac Apple Silicon, utilizza PyTorch automaticamente Metal (MPS) e CPU-only funziona ma è lenta (circa 30 secondi per risposta per un modello da 1,5 B).

  3. Prova l'adattatore con lo strumento di chat interattivo incluso:

    python3 inference/chat.py --adapter-path /path/to/downloaded/my-adapter

    Lo strumento carica l'adattatore sopra il modello base e fornisce un REPL in cui è possibile porre domande e confrontarlo con il modello base per verificare che la messa a punto abbia funzionato.

  4. Per un'interfaccia utente web più adatta alle demo con bolle di chat nel browser, installa Gradio ed esegui lo strumento di chat web:

    pip install gradio python3 inference/gradio_chat.py --adapter-path /path/to/downloaded/my-adapter

Per i dettagli su entrambi gli strumenti e sul caricamento programmatico dell'adattatore con PEFT, consulta il file README degli strumenti di inferenza su. GitHub

Suggerimenti

  • La perdita dovrebbe diminuire in modo monotono. In caso contrario, riduci il tasso di apprendimento (prova). 1e-4

  • Pressione della memoria: PerDeviceBatchSize abbassala (prova 1 o 2) e aumenta GradAccumSteps per mantenere costante la dimensione effettiva del batch.

  • Il trasferimento dello stile e la memorizzazione dei fatti sono diversi: il trasferimento di stile spesso funziona con 3-5 epoche e circa 50-200 campioni. La memorizzazione dei fatti richiede 8-15 epoche e più campioni per fatto (5—8 frasi).

  • Modelli controllati: se riposizionate il pacchetto in base a un modello controllato come Llama o Gemma aggiungendolo al parametro del parametro, impostate il parametro. allowedValues BaseModel HuggingFaceToken Per la produzione, preferite impostarla HF_TOKEN come variabile di ambiente sulla coda stessa piuttosto che passarla come parametro.

  • Model cache: il bundle utilizza, /mnt/persistent/hf_cache per impostazione predefinita, il volume persistente del lavoratore. La cache conserva i modelli di base tra i lavori, quindi le esecuzioni successive sono molto più veloci.

Eliminazione

Per evitare addebiti continui, pulisci le risorse che hai creato per questo tutorial:

Per ripulire le risorse del tutorial
  1. Se hai creato una flotta di GPU appositamente per questo tutorial, interrompila o eliminala. Se hai utilizzato un parco veicoli condiviso preesistente, lascialo al suo posto.

  2. Se hai aggiunto la ReadFineTuningDatasets policy al tuo ruolo di coda e non ne hai più bisogno, rimuovila:

    QUEUE_ROLE=$(aws deadline get-queue --farm-id FARM-ID --queue-id QUEUE-ID \ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets
  3. Rimuovi i file di output locali se non ti servono più.

Le seguenti risorse forniscono informazioni aggiuntive: