Ottimizza e distribuisci un LLM open source sulla GPU utilizzando Data Science e AI Quick Actions

Introduzione

Questa esercitazione descrive l'utilizzo del servizio Data Science di Oracle Cloud Infrastructure (OCI) per perfezionare un LLM open source utilizzando la funzionalità AI Quick Actions fornita da Data Science. Con facilità point-and-click, utilizzerai AI Quick Actions per perfezionare un LLM Mistral fornito da Hugging Face, con quel LLM ottimizzato su una FAQ pubblicata da NVIDIA. Le azioni rapide AI vengono quindi utilizzate per distribuire tale modello ottimizzato in OCI in una forma GPU A10. Il codice Python in esecuzione in un notebook Jupyter viene quindi utilizzato per dimostrare che l'output del modello sintonizzato ha lo stile e il tono desiderati che sono simili ai dati di addestramento NVIDIA.

Obiettivi

Prerequisiti

Task 1: Provisioning di una sessione notebook Data Science

  1. Utilizzare la console OCI per creare un progetto di Data Science.

  2. Accedere a tale progetto e creare una sessione notebook Data Science con due o più ECPU.

  3. Aprire la sessione notebook e fare clic su Estendi.

  4. Avvia una sessione terminale in Data Science.

  5. Utilizzare tale terminale per clonare un repository github contenente i notebook Jupyter che verranno utilizzati da questo tutorial:

    git clone https://github.com/oracle-nace-dsai/quick-actions-demo-archive.git
    
  6. Duplica NVIDIA FAQ:

    git clone https://huggingface.co/datasets/ajsbsd/nvidia-qa
    
    
  7. Copia le FAQ NVIDIA nella directory dei dati del primo repository

    cp nvidia-qa/NvidiaDocumentationQandApairs.csv quick-actions-demo-archive/data/.
    
    
  8. Installare e quindi attivare il Conda General Machine Learning for CPUs on Python 3.11:

    odsc conda install -s generalml_p311_cpu_x86_64_v1 
    conda activate /home/datascience/conda/generalml_p311_cpu_x86_64_v1
    
  9. Installare LangChain per https://github.com/oracle-samples/oci-data-science-ai-samples/blob/main/ai-quick-actions/model-deployment-tips.md#using-python-sdk-without-streaming

    pip install langgraph "langchain>=0.3" "langchain-community>=0.3" "langchain-openai>=0.2.3" "oracle-ads>2.12"
    

Task 2: Impostare un account Hugging Face

  1. Crea un account Hugging Face su https://huggingface.co.

  2. Passare all'account Hugging Face > Token di accesso e creare un nuovo token di accesso utente con le seguenti autorizzazioni selezionate:

    • Leggi l'accesso ai contenuti di tutti i repository sotto il tuo spazio di nomi personale
    • Leggi l'accesso ai contenuti di tutti i repository con accesso pubblico a cui puoi accedere
  3. Utilizzare una sessione terminale di Data Science per registrare il token di accesso utente con Hugging Face:

    git config --global credential.helper store
    huggingface-cli login
    
    

Task 3: Creare un bucket di storage degli oggetti

Creare un bucket di storage degli oggetti nella stessa area e compartimento del notebook Data Science.

Task 4: Imposta registrazione

Creare un gruppo di log, quindi Creare un log personalizzato

Task 5: utilizzare le azioni rapide AI di Data Science per distribuire LLM sulla forma GPU A10, senza ottimizzazione

  1. Passare a Taccuino Data Science > Lanciatore > Azioni rapide AI

    a. Cercare i modelli Mistral
    b. Fare clic sulla casella mistralai/Mistral-7B-Instruct-v0.3
    c. Fare clic su Distribuisci con il log sopra selezionato

  2. La distribuzione del modello richiede circa 15 minuti. È possibile monitorare il log di distribuzione selezionando Apri log nel terminale.

  3. Al termine della distribuzione del modello, andare a Distribuzioni > <modello appena distribuito> > Eseguire il test del modello e eseguire il test del modello con domande semplici, ad esempio:

    Who wrote the Harry Potter book series?
    
    
  4. Alcuni LLM semplici possono non rispondere correttamente alle seguenti domande di test, ma Mistral-7B-Instruct-v0.3 fa un buon lavoro rispondendo a queste:

    A bat and a ball cost $1.10 in total. The bat costs $1.00 more than the ball. How much does the ball cost?
    Every cat has four legs. My pet has four legs. Is my pet a cat?
    Who is President of the United States? 
    

Task 6: Interazione con l'endpoint del modello distribuito

  1. Passare a Distribuzioni > <modello appena distribuito> Richiamare il modello per visualizzare l'endpoint del modello distribuito. Utilizzare quindi il terminale Data Science per memorizzare l'endpoint come variabile shell. Ad esempio:

    endpoint=https://modeldeployment.<region>.oci.customer-oci.com/<model_ocid>/predict
    
  2. Inviare un prompt all'endpoint del modello distribuito:

    prompt="Who is President of the United States?"
    request_body='{"model":"odsc-llm","prompt":"'$prompt'","max_tokens":100,"temperature":0.1,"top_k":50,"top_p":0.99,"stop":[],"frequency_penalty":0,"presence_penalty":0}'
    oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal
    
  3. Utilizzare questo loop bash per chiamare l'endpoint del modello 100 volte in dieci secondi:

    for i in $(seq 1 100); do
         oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal &
         echo $i
         sleep 0.1
      done
    
    
  4. Passare a Distribuzioni > <modello appena distribuito> > Log per visualizzare il traffico appena inviato nell'endpoint del modello.

img.png

Descrizione dell'immagine log_traffic.png

Task 7: utilizzare le azioni rapide AI per ottimizzare un LLM

Il task precedente ha implementato un LLM Mistral senza ottimizzazione. Questo task ottimizzerà e quindi distribuirà lo stesso LLM. Il task 9 confronterà gli output di entrambi i modelli, ottimizzati e non ottimizzati. Questa attività e la successiva utilizzano anche due notebook Jupyter scaricati da questo archivio di codice.

  1. Utilizzare il browser file del notebook Data Science per accedere alla cartella quick-actions-demo-archive e aprire il notebook Jupyter prep_data.ipynb.

  2. Selezionare il kernel generalml_p311_cpu_x86_64_v1.

  3. Rivedere il secondo all'ultimo paragrafo del notebook in modo che faccia riferimento alla tenancy o allo spazio di nomi e al bucket di storage degli oggetti.

  4. Eseguire il notebook Jupyter prep_data.ipynb, che:

    • leggi le FAQ NVIDIA dal file data/NvidiaDocumentationQandApairs.csv
    • rifondere le domande frequenti CSV come record JSON con i campi prompt e completion previsti dalle azioni rapide AI.
    • eseguire una suddivisione 90:10 di tali dati in esempi di training:test.
    • inviare l'esempio di formazione nel file quick_actions/tuning_data/tune_sample.jsonl nello storage degli oggetti.
  5. Passare ad Azioni rapide AI > Modelli > mistralai/Mistral-7B-Instruct-v0.3. Fare quindi clic su Fine tuning con le impostazioni riportate di seguito.

    • Percorso storage degli oggetti = quick_actions/tuning_data/tune_sample.jsonl
    • divisione di convalida = 20%
    • percorso di storage degli oggetti risultati = quick_actions/tuning_results
    • forma = BM.GPU.A10.4 se la disponibilità esiste. In caso contrario, utilizzare le forme 10.2 o 10.1
    • selezionare Gruppo di log e Log
  6. Abilitare Mostra configurazioni avanzate con le seguenti impostazioni:

    • batch_size = 64
    • sequence_len = 256
    • learning_rate = 0.000025
    • epochs = 12
  7. L'ottimizzazione richiede circa 60 minuti su un A10.2, quindi fare clic su Apri log nel terminale per monitorare i log del job di ottimizzazione.

  8. Visualizzare la curva di apprendimento del modello ottimizzato nella sezione Metriche. Un modello ben sintonizzato avrà una curva di perdita di convalida che scende e poi altipiani con un'epoca crescente. img.png

Descrizione dell'immagine learning_curve.png

Task 8: Distribuire il LLM ottimizzato

  1. Passare ad Azioni rapide AI > Modelli ottimizzati > <modello ottimizzato> > Distribuisci con le impostazioni riportate di seguito.

    • Forma di computazione = VM.GPU.A10.1
    • Selezionare Gruppo di log e Log
  2. Fare clic su Apri log nel terminale per monitorare il log di distribuzione

Task 9: Test della distribuzione di LLM ottimizzata

  1. Al termine della distribuzione del modello, passare a Distribuzioni > <modello con tuning corretto> > Eseguire il test del modello e eseguirne il test utilizzando le domande delle domande di esempio di test visualizzate nel blocco appunti prep_data.ipynb, ad esempio:

    What benefits does Unified Memory bring to complex data structures and classes?
    
    
  2. Copiare/incollare l'endpoint del modello nella variabile shell della sessione terminale:

    endpoint=https://modeldeployment.<region>.oci.customer-oci.com/<model_ocid>/predict
    
  3. Inviare un prompt all'endpoint del modello distribuito:

    prompt="What benefits does Unified Memory bring to complex data structures and classes?"
    request_body='{"model":"odsc-llm","prompt":"'$prompt'","max_tokens":100,"temperature":0.1,"top_k":50,"top_p":0.99,"stop":[],"frequency_penalty":0,"presence_penalty":0}'
    oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal
    
  4. Utilizzare questo loop bash per chiamare l'endpoint del modello 100 volte:

    for i in $(seq 1 100); do
       oci raw-request --http-method POST --target-uri $endpoint --request-body "$request_body" --auth resource_principal &
       echo $i
       sleep 0.1
    done
    
  5. Fare clic sul log del modello ottimizzato/distribuito per visualizzare il traffico recente nell'endpoint del modello

  6. Aprire il notebook Jupyter compare_models.ipynb e aggiornare il paragrafo [8] per fare riferimento agli endpoint dei due modelli, sintonizzati e non sintonizzati.

  7. Eseguire il notebook, che consente di:

    • Leggi il campione di prova dei record FAQ.
    • Usa python per inserire cinque domande di test negli endpoint del modello ottimizzato e non ottimizzato e confrontare le loro risposte.
    • Nota paragrafo [10] che illustra come chiamare l'endpoint di un modello distribuito utilizzando python, che è abbastanza semplice: img.png

      Descrizione dell'immagine call_endpoint.png

  8. Esaminare i principali risultati di questo test:

    • Le risposte LLM ottimizzate hanno un tono, uno stile e una lunghezza abbastanza simili alle risposte delle FAQ composte da NVIDIA.
    • Le risposte dei LLM non sintonizzati sono molto più verbose e includono molte affermazioni estranee che sono probabilmente errate.
    • Le risposte dai LLM ottimizzati rispetto a quelli non sintonizzati sono errate più spesso di quanto non lo siano e altrettanto.
    • L'ottimizzazione di un set di dati molto più grande aumenterebbe probabilmente l'accuratezza delle sue risposte.

Task 10: Elimina le risorse

  1. Passare ad Azioni rapide AI > Distribuzioni ed eliminare le distribuzioni dei modelli.

  2. Passare ad Azioni rapide AI > Modelli > Modelli con tuning ed eliminare.

  3. Utilizzare la pagina Console OCI per andare alla sessione notebook Data Science e all'interruzione.

  4. Fare clic su Job ed eliminare i job di ottimizzazione.

  5. Eliminare il progetto Data Science.

  6. Utilizzare la pagina Console OCI per andare al bucket di storage degli oggetti ed eliminarlo.

  7. Utilizzare la console OCI per eliminare il gruppo di log e di log.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.

Per la documentazione del prodotto, visitare Oracle Help Center.