I modelli di generazione del codice Llama di Meta sono ora disponibili tramite Amazon SageMaker JumpStart

I modelli di generazione del codice Llama di Meta sono ora accessibili tramite Amazon SageMaker JumpStart

Oggi, siamo entusiasti di annunciare che i modelli di fondazione di Code Llama, sviluppati da Meta, sono disponibili per i clienti attraverso Amazon SageMaker JumpStart per il deployment con un solo clic per l’esecuzione di inferenze. Code Llama è un modello di linguaggio avanzato (LLM) in grado di generare codice e linguaggio naturale sul codice da prompt sia di codice che di linguaggio naturale. Code Llama è gratuito per l’uso di ricerca e commerciale. Puoi provare questo modello con SageMaker JumpStart, un hub di machine learning (ML) che fornisce accesso ad algoritmi, modelli e soluzioni di ML in modo da poter iniziare rapidamente con l’ML. In questo post, spiegheremo come scoprire e implementare il modello di Code Llama tramite SageMaker JumpStart.

Cosa è Code Llama

Code Llama è un modello rilasciato da Meta che è basato su Llama 2 ed è un modello allo stato dell’arte progettato per migliorare la produttività delle attività di programmazione per gli sviluppatori, aiutandoli a creare codice di alta qualità e ben documentato. I modelli mostrano prestazioni all’avanguardia in Python, C++, Java, PHP, C#, TypeScript e Bash, e hanno il potenziale per risparmiare tempo agli sviluppatori e rendere i flussi di lavoro del software più efficienti. Esistono tre varianti, progettate per coprire una vasta gamma di applicazioni: il modello fondamentale (Code Llama), un modello specializzato in Python (Code Llama-Python) e un modello per seguire le istruzioni che comprende il linguaggio naturale (Code Llama-Instruct). Tutte le varianti di Code Llama sono disponibili in tre dimensioni: 7B, 13B e 34B di parametri. Le varianti di base e di istruzioni da 7B e 13B supportano l’inserimento basato sul contenuto circostante, rendendole ideali per le applicazioni di assistenza al codice.

I modelli sono stati progettati utilizzando Llama 2 come base e poi addestrati su 500 miliardi di token di codice, con la versione specializzata in Python addestrata su un incrementale di 100 miliardi di token. I modelli di Code Llama forniscono generazioni stabili con un contesto di fino a 100.000 token. Tutti i modelli sono addestrati su sequenze di 16.000 token e mostrano miglioramenti su input con fino a 100.000 token.

Il modello è reso disponibile con la stessa licenza comunitaria di Llama 2.

Cosa è SageMaker JumpStart

Con SageMaker JumpStart, i praticanti di ML possono scegliere tra un elenco crescente di modelli di fondazione tra i migliori performanti. I praticanti di ML possono implementare modelli di fondazione su istanze dedicate di Amazon SageMaker all’interno di un ambiente isolato di rete e personalizzare i modelli utilizzando SageMaker per l’addestramento e l’implementazione del modello.

Ora puoi scoprire e implementare i modelli di Code Llama con pochi clic in Amazon SageMaker Studio o tramite programmazione attraverso il SageMaker Python SDK, consentendoti di ottenere prestazioni del modello e controlli di MLOps con le funzionalità di SageMaker come Amazon SageMaker Pipelines, Amazon SageMaker Debugger o i log dei container. Il modello viene implementato in un ambiente AWS sicuro e sotto i tuoi controlli VPC, contribuendo a garantire la sicurezza dei dati. I modelli di Code Llama sono individuabili e possono essere implementati nelle regioni US East (N. Virginia), US West (Oregon) ed Europe (Ireland).

I clienti devono accettare l’EULA per implementare il modello tramite SageMaker SDK.

Scoprire i modelli

Puoi accedere ai modelli di fondazione di Code Llama tramite SageMaker JumpStart nell’interfaccia utente di SageMaker Studio e nell’SDK Python di SageMaker. In questa sezione, vedremo come scoprire i modelli in SageMaker Studio.

SageMaker Studio è un ambiente di sviluppo integrato (IDE) che fornisce un’unica interfaccia visuale basata sul web in cui puoi accedere a strumenti appositamente progettati per svolgere tutti i passaggi di sviluppo di ML, dalla preparazione dei dati alla creazione, all’addestramento e all’implementazione dei tuoi modelli di ML. Per ulteriori dettagli su come iniziare e configurare SageMaker Studio, consulta Amazon SageMaker Studio.

In SageMaker Studio, puoi accedere a SageMaker JumpStart, che contiene modelli pre-addestrati, notebook e soluzioni pre-costruite, nell’area Soluzioni pre-costruite e automatizzate.

Nella pagina iniziale di SageMaker JumpStart, puoi cercare soluzioni, modelli, notebook e altre risorse. Puoi trovare i modelli di Code Llama nella sezione Modelli Fondamentali: Generazione di Testo.

Puoi trovare anche altre varianti di modelli scegliendo Esplora tutti i Modelli di Generazione di Testo o cercando Code Llama.

Puoi selezionare la scheda del modello per visualizzare i dettagli come la licenza, i dati utilizzati per l’addestramento e come utilizzarlo. Troverai anche due pulsanti, Deploy e Apri Notebook, che ti aiuteranno ad utilizzare il modello.

Deploy

Quando scegli Deploy e accetti i termini, partirà il deployment. In alternativa, puoi effettuare il deploy tramite il notebook di esempio scegliendo Apri Notebook. Il notebook di esempio fornisce una guida completa su come effettuare il deploy del modello per l’inferenza e pulire le risorse.

Per effettuare il deploy utilizzando il notebook, cominciamo selezionando un modello appropriato, specificato dal model_id. Puoi effettuare il deploy di uno qualsiasi dei modelli selezionati su SageMaker utilizzando il seguente codice:

from sagemaker.jumpstart.model import JumpStartModelmodel = JumpStartModel(model_id="meta-textgeneration-llama-codellama-7b")predictor = model.deploy()

Questo effettua il deploy del modello su SageMaker con le configurazioni predefinite, inclusi il tipo di istanza predefinito e le configurazioni VPC predefinite. Puoi cambiare queste configurazioni specificando valori non predefiniti in JumpStartModel. Dopo il deploy, puoi eseguire inferenze sull’endpoint deployato tramite il predictor di SageMaker:

payload = {   "inputs": "<s>[INST] Come effettuare il deploy di un modello su Amazon SageMaker? [/INST]",   "parameters": {"max_new_tokens": 512, "temperature": 0.2, "top_p": 0.9}}predictor.predict(payload, custom_attributes="accept_eula=true")

Si ricorda che per impostazione predefinita, accept_eula è impostato su false. È necessario impostare accept_eula=true per invocare correttamente l’endpoint. Facendolo, si accetta il contratto di licenza dell’utente e la politica di utilizzo accettabili menzionati in precedenza. È inoltre possibile scaricare il contratto di licenza.

Custom_attributes viene utilizzato per passare EULA come coppie chiave/valore. La chiave e il valore sono separati da = e le coppie sono separate da ;. Se l’utente passa la stessa chiave più di una volta, l’ultimo valore viene mantenuto e passato all’handler dello script (in questo caso, utilizzato per la logica condizionale). Ad esempio, se accept_eula=false; accept_eula=true viene passato al server, allora accept_eula=true viene mantenuto e passato all’handler dello script.

I parametri di inferenza controllano il processo di generazione del testo sull’endpoint. Il controllo dei nuovi token massimi si riferisce alla dimensione dell’output generato dal modello. Si noti che questo non è lo stesso numero di parole perché il vocabolario del modello non è lo stesso del vocabolario della lingua inglese, e ogni token potrebbe non essere una parola della lingua inglese. La temperature controlla l’imprevedibilità dell’output. Una temperatura più alta produce output più creativi ed allucinati. Tutti i parametri di inferenza sono opzionali.

La seguente tabella elenca tutti i modelli Code Llama disponibili in SageMaker JumpStart insieme agli ID dei modelli, ai tipi di istanze predefiniti e al numero massimo di token supportati (somma del numero di token di input e del numero di token generati per tutte le richieste simultanee) supportati per ciascuno di questi modelli.

Nome del modello ID del modello Tipo di istanza predefinito Token Massimi Supportati
CodeLlama-7b meta-textgeneration-llama-codellama-7b ml.g5.2xlarge 10000
CodeLlama-7b-Instruct meta-textgeneration-llama-codellama-7b-instruct ml.g5.2xlarge 10000
CodeLlama-7b-Python meta-textgeneration-llama-codellama-7b-python ml.g5.2xlarge 10000
CodeLlama-13b meta-textgeneration-llama-codellama-13b ml.g5.12xlarge 32000
CodeLlama-13b-Instruct meta-textgeneration-llama-codellama-13b-instruct ml.g5.12xlarge 32000
CodeLlama-13b-Python meta-textgeneration-llama-codellama-13b-python ml.g5.12xlarge 32000
CodeLlama-34b meta-textgeneration-llama-codellama-34b ml.g5.48xlarge 48000
CodeLlama-34b-Instruct meta-textgeneration-llama-codellama-34b-instruct ml.g5.48xlarge 48000
CodeLlama-34b-Python meta-textgeneration-llama-codellama-34b-python ml.g5.48xlarge 48000

Anche se i modelli Code Llama sono stati addestrati su una lunghezza di contesto di 16.000 token, i modelli hanno segnalato ottime prestazioni anche su finestre di contesto ancora più ampie. La colonna dei token massimi supportati nella tabella precedente rappresenta il limite superiore sulla finestra di contesto supportata sul tipo di istanza predefinito. Poiché il modello Code Llama 7B può supportare solo 10.000 token su un’istanza ml.g5.2xlarge, consigliamo di distribuire una versione del modello 13B o 34B se sono necessari contesti più ampi per la tua applicazione.

Per impostazione predefinita, tutti i modelli funzionano per compiti di generazione di codice. I modelli base e instruct rispondono entrambi a compiti di riempimento, anche se il modello base produce risultati di qualità migliore per la maggior parte delle query di esempio. Infine, solo i modelli instruct funzionano su compiti di istruzione. La seguente tabella illustra quali modelli hanno avuto buone prestazioni (Buone) e prestazioni moderate (Moderate) su query di esempio nei notebook demo.

. Generazione del codice Riempimento del codice Istruzioni del codice
CodeLlama-7b Buono Buono N/D
CodeLlama-7b-Instruct Buono Moderato Buono
CodeLlama-7b-Python Buono N/D N/D
CodeLlama-13b Buono Buono N/D
CodeLlama-13b-Instruct Buono Moderato Buono
CodeLlama-13b-Python Buono N/D N/D
CodeLlama-34b Buono N/D N/D
CodeLlama-34b-Instruct Buono N/D Buono
CodeLlama-34b-Python Buono N/D N/D

Generazione del codice

Gli esempi seguenti sono stati eseguiti sul modello CodeLlama-34b-Instruct con i parametri di payload "parameters": {"max_new_tokens": 256, "temperature": 0.2, "top_p": 0.9}:

Ingressoimport socketdef ping_exponential_backoff(host: str):Output    """    Esegui un ping a un host utilizzando un tempo di attesa esponenziale.    """    for i in range(1, 10):        try:            socket.gethostbyname(host)            return True        except socket.gaierror:            time.sleep(2 ** i)    return FalseIngressoimport argparsedef main(string: str):    print(string)    print(string[::-1])if __name__ == "__main__":Output    parser = argparse.ArgumentParser()    parser.add_argument("string", help="Stringa da stampare")    args = parser.parse_args()    main(args.string)

Riempimento del codice

Il riempimento del codice consiste nel restituire un codice generato date il contesto circostante. Questo differisce dal compito di generazione del codice perché, oltre a un segmento di codice prefisso, al modello viene fornito anche un suffisso del segmento di codice. Durante il fine-tuning sono stati utilizzati token speciali per segnare l’inizio del prefisso (<PRE>), l’inizio del suffisso (<SUF>) e l’inizio della parte centrale (<MID>). Le sequenze di input per il modello dovrebbero essere in uno dei seguenti formati:

  • prefisso-suffisso-centrale<PRE> {prefisso} <SUF>{suffisso} <MID>
  • suffisso-prefisso-centrale<PRE> <SUF>{suffisso} <MID> {prefisso}

I seguenti esempi utilizzano il formato prefisso-suffisso-medio sul modello CodeLlama-7b con payload parametri {"max_new_tokens": 256, "temperature": 0.05, "top_p": 0.9}:

Input<PRE> def remove_non_ascii(s: str) -> str:    """ <SUF>    return result <MID>Output    Rimuove i caratteri non-ASCII da una stringa.    :param s: La stringa da cui rimuovere i caratteri non-ASCII.    :return: La stringa con i caratteri non-ASCII rimossi.    """    result = ""    for c in s:        if ord(c) < 128:            result += cInput# Istruzioni di installazione:    ```bash<FILL>    ```Questo scarica il codice di inferenza LLaMA e installa il repository come pacchetto pip locale.Output    git clone https://github.com/LLaMA-AI/LLaMA-inference.git    cd LLaMA-inference    pip install -e .Inputclass InterfacciaManagerFactory(AbstractManagerFactory):    def __init__(<FILL>def main():    factory = InterfaceManagerFactory(start=datetime.now())    managers = []    for i in range(10):        managers.append(factory.build(id=i))Outputself, start=None):        self.start = start    def build(self, id):        return InterfaceManager(id, self.start)Input/-- Un quasi-prefunctoid è 1-connesso se e solo se tutte le sue etalisazioni sono 1-connesse. -/teorema connected_iff_etalisation [C D : precategoroid] (P : quasi_prefunctoid C D) :  π₁ P = 0 ↔ <FILL> = 0 :=begin  split,  { intros h f,    rw pi_1_etalisation at h,    simp [h],    refl  },  { intro h,    have := @quasi_adjoint C D P,    simp [←pi_1_etalisation, this, h],    refl  }endOutput∀ f : C ⟶ D, π₁ (P.etalise f)

Istruzioni per il codice

Meta fornisce anche una variante del modello Code Llama ottimizzata per le istruzioni. Gli esempi di query in questa sezione possono essere applicati solo a questi modelli Code Llama ottimizzati per le istruzioni, che sono i modelli con un suffisso di modello instruct. Il formato Code Llama per le istruzioni è lo stesso formato del prompt di Llama-2-chat, che dettagliamo in Llama 2 foundation models are now available in SageMaker JumpStart

Una semplice istruzione dell’utente può essere così:

<s>[INST] {user_prompt} [/INST]

Puoi anche aggiungere un’istruzione del sistema con la seguente sintassi:

<s>[INST] <<SYS>>{system_prompt}<</SYS>>{user_prompt} [/INST]

Infine, puoi avere un’interazione conversazionale con il modello includendo tutte le prompt precedenti dell’utente e le risposte dell’assistente nell’input:

<s>[INST] <<SYS>>{system_prompt}<</SYS>>{user_prompt_1} [/INST] {assistant_response_1} </s><s>[INST] {user_prompt_1} [/INST]

Questi esempi sono stati eseguiti sul modello CodeLlama-13b-Instruct con payload “parameters”: {"max_new_tokens": 512, "temperature": 0.2, "top_p": 0.9}:

Input<s>[INST] In Bash, come posso elencare tutti i file di testo nella directory corrente (escludendo le sottodirectory) che sono stati modificati nell'ultimo mese? [/INST] Output Puoi utilizzare il comando `find` in Bash per elencare tutti i file di testo nella directory corrente (escludendo le sottodirectory) che sono stati modificati nell'ultimo mese. Ecco un esempio di comando:```find . -type f -name "*.txt" -mtime -30```Ecco una descrizione del comando:* `find .`: Questo indica a `find` di cercare nella directory corrente e in tutte le sue sottodirectory.* `-type f`: Questo indica a `find` di cercare solo file (non directory).* `-name "*.txt"`: Questo indica a `find` di cercare solo file con l'estensione `.txt`.* `-mtime -30`: Questo indica a `find` di cercare solo file modificati negli ultimi 30 giorni (2.592.000 secondi).L'output del comando sarà un elenco di tutti i file di testo nella directory corrente (escludendo le sottodirectory) che sono stati modificati nell'ultimo mese.Input<s>[INST] Qual è la differenza tra l'attraversamento inorder e preorder? Dai un esempio in Python. [/INST] Output L'attraversamento inorder e l'attraversamento preorder sono due modi diversi per attraversare un albero binario.L'attraversamento inorder è un modo di visitare i nodi di un albero binario in un ordine specifico. In un attraversamento inorder, il sottoalbero sinistro viene visitato prima, poi il nodo corrente e infine viene visitato il sottoalbero destro. Ciò significa che i nodi vengono visitati in un ordine da sinistra a destra, dall'alto verso il basso.L'attraversamento preorder, invece, è un modo di visitare i nodi di un albero binario in un ordine diverso. In un attraversamento preorder, il nodo corrente viene visitato per primo, seguito dal sottoalbero sinistro e infine dal sottoalbero destro. Ciò significa che i nodi vengono visitati in un ordine dall'alto verso il basso, da sinistra a destra.Ecco un esempio di attraversamento inorder di un albero binario in Python:```def inorder_traversal(root):    if root is None:        return []    return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right)```Ecco un esempio di attraversamento preorder di un albero binario in Python:```def preorder_traversal(root):    if root is None:        return []    return [root.val] + preorder_traversal(root.left) + preorder_traversal(root.right)```In questo esempio, la funzione `inorder_traversal` restituisce una lista dei valori nell'albero nell'ordine delle chiavi, dal più piccolo al più grande. La funzione `preorder_traversal` restituisce una lista dei valori nell'albero nell'ordine delle chiavi, ma con il nodo corrente visitato prima dei suoi figli.Input<s>[INST] <<SYS>>Fornisci le risposte in JavaScript<</SYS>>Scrivi una funzione che calcoli l'insieme delle somme di tutte le sottoliste contigue di una lista data. [/INST] Output function contiguousSublistSums(list) {  let sums = [];  for (let i = 0; i < list.length; i++) {    let sum = 0;    for (let j = i; j < list.length; j++) {      sum += list[j];      sums.push(sum);    }  }  return sums;}console.log(contiguousSublistSums([1, 2, 3, 4, 5])); // [1, 3, 6, 10, 15]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6])); // [1, 3, 6, 10, 15, 21]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6, 7])); // [1, 3, 6, 10, 15, 21, 28]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6, 7, 8])); // [1, 3, 6, 10, 15, 21, 28, 36]console.log(contiguousSublistSums([1, 2, 3, 4, 5, 6, 7, 8, 9])); // [1, 3, 6, 10, 15, 21, 28, 36, 45]

Pulizia

Dopo aver terminato l’esecuzione del notebook, assicurati di eliminare tutte le risorse che hai creato durante il processo in modo da interrompere la fatturazione. Utilizza il seguente codice:

predictor.delete_model()predictor.delete_endpoint()

Conclusioni

In questo post, ti abbiamo mostrato come iniziare con i modelli di Code Llama in SageMaker Studio e come distribuire il modello per generare codice e linguaggio naturale sul codice da prompt di codice e linguaggio naturale. Poiché i modelli di base sono pre-addestrati, possono contribuire a ridurre i costi di addestramento e infrastruttura e consentire la personalizzazione per il tuo caso d’uso. Visita ora SageMaker JumpStart in SageMaker Studio per iniziare.

Risorse