Anche i MoE presentano una serie di sfide, soprattutto in termini di messa a punto e requisiti di memoria. Il processo di messa a punto può essere difficile a causa della complessità del modello e della necessità di farlo utilizzo esperto dell'equilibrio durante l'allenamento per addestrare adeguatamente i pesi di controllo per selezionare quelli più rilevanti. In termini di memoria, anche se durante l’inferenza viene utilizzata solo una frazione dei parametri totali, l’intero modello, compresi tutti gli esperti, deve essere caricato in memoriache richiede un'elevata capacità VRAM.
Più nello specifico, ci sono due parametri essenziali quando si parla di MoE:
- Numero di esperti (
num_local_experts
): determina il numero totale di esperti nell'architettura (ad esempio, 8 per Mixtral). Maggiore è il numero di esperti, maggiore è l'utilizzo della VRAM. - Numero di esperti/token (
num_experts_per_tok
): determina il numero di esperti impegnati per ogni gettone e ogni strato (es. 2 per Mixtral). Esiste un compromesso tra un numero elevato di esperti per token per l'accuratezza (ma rendimenti decrescenti) e un numero basso per l'addestramento e l'inferenza rapidi.
Storicamente, i MoE hanno sottoperformato i modelli densi. Tuttavia, il rilascio di Mixtral-8x7B nel dicembre 2023 ha scosso le cose e ha mostrato prestazioni impressionanti per le sue dimensioni. Inoltre, si dice che GPT-4 sia un MoE, il che avrebbe senso in quanto sarebbe molto più economico eseguire e addestrare per OpenAI rispetto a un modello denso. Oltre a questi recenti eccellenti MoE, ora abbiamo un nuovo modo di creare MoE con MergeKit: frankenMoE, chiamati anche MoErges.
La differenza principale tra i veri MoE e i FrankenMoE è il modo in cui vengono addestrati. Nel caso dei veri MdE, gli esperti e il router vengono formati congiuntamente. Nel caso dei FrankenMoE, ricicliamo i modelli esistenti e successivamente inizializziamo il router.
In altre parole, copiamo i pesi degli strati norma e autoattenzione da un modello base, quindi copiamo i pesi degli strati FFN trovati in ciascun esperto. Ciò significa che oltre agli FFN, tutti gli altri parametri sono condivisi. Questo spiega perché Mixtral-8x7B con otto esperti non ha 8*7 = 56B parametri, ma circa 45B. Questo è anche il motivo per cui l'utilizzo di due esperti per token fornisce la velocità di inferenza (FLOP) di un modello denso di 12B invece di 14B.
I FrankenMoE si occupano di selezionare gli esperti più rilevanti e di inizializzarli adeguatamente. MergeKit attualmente implementa tre modi per inizializzare i router:
- casuale: Pesi casuali. Fare attenzione quando lo si utilizza poiché potrebbero essere selezionati ogni volta gli stessi esperti (richiede un'ulteriore messa a punto o
num_local_experts = num_experts_per_tok
il che significa che non è necessario alcun routing). - Incorporamento economico: utilizza direttamente gli incorporamenti grezzi dei token di input e applica la stessa trasformazione su tutti i livelli. Questo metodo è poco costoso dal punto di vista computazionale e adatto all'esecuzione su hardware meno potente.
- Nascosto: Crea rappresentazioni nascoste di un elenco di prompt positivi e negativi estraendoli dall'ultimo strato del LLM. Vengono mediati e normalizzati per inizializzare le porte. Maggiori informazioni a riguardo sono disponibili su Il blog di Charles Goddard.
Come puoi intuire, l’inizializzazione “nascosta” è la più efficiente per instradare correttamente i token agli esperti più rilevanti. Nella prossima sezione creeremo il nostro FrankenMoE utilizzando questa tecnica.
Per creare il nostro frankenMoE, dobbiamo selezionare n
esperti. In questo caso faremo affidamento sul Mistral-7B grazie alla sua popolarità e alle dimensioni relativamente ridotte. Tuttavia, otto esperti come in Mixtral sono parecchi, poiché dobbiamo inserirli tutti nella memoria. Per motivi di efficienza, in questo esempio utilizzerò solo quattro esperti, due dei quali impegnati per ciascun token e ciascun livello. In questo caso, ci ritroveremo con un modello con parametri 24.2B invece di 4*7 = parametri 28B.
In questo caso, il nostro obiettivo è creare un modello a tutto tondo che possa fare praticamente tutto: scrivere storie, spiegare articoli, scrivere codice in Python, ecc. Possiamo scomporre questo requisito in quattro attività e selezionare il miglior esperto per ciascuna di esse. Ecco come l'ho scomposto:
- Modello di chat: un modello generico utilizzato nella maggior parte delle interazioni. ero solito mlabonne/AlphaMonarch-7Bche soddisfa perfettamente i requisiti.
- Modello di codice: un modello in grado di generare buon codice. Non ho molta esperienza con i modelli di codice basati su Mistral-7B, ma ho trovato beowolx/CodeNinja-1.0-OpenChat-7B particolarmente buono rispetto ad altri.
- Modello matematico: la matematica è complicata per i LLM, ecco perché vogliamo un modello specializzato in matematica. Grazie ai suoi alti punteggi MMLU e GMS8K, ho scelto mlabonne/NeuralDaredevil-7B per questo scopo.
- Modello di gioco di ruolo: l'obiettivo di questo modello è scrivere storie e conversazioni di alta qualità. Ho selezionato SanjiWatsuki/Kunoichi-DPO-v2–7B per la sua buona reputazione e l'alto punteggio MT-Bench (8,51 contro 8,30 per Mixtral).
Ora che abbiamo identificato gli esperti che vogliamo utilizzare, possiamo creare la configurazione YAML che MergeKit utilizzerà per creare il nostro frankenMoE. Questo utilizza il ramo mixtral di MergeKit. È possibile trovare ulteriori informazioni su come scrivere la configurazione su questa pagina. Ecco la nostra versione:
base_model: mlabonne/AlphaMonarch-7B
experts:
- source_model: mlabonne/AlphaMonarch-7B
positive_prompts:
- "chat"
- "assistant"
- "tell me"
- "explain"
- "I want"
- source_model: beowolx/CodeNinja-1.0-OpenChat-7B
positive_prompts:
- "code"
- "python"
- "javascript"
- "programming"
- "algorithm"
- source_model: SanjiWatsuki/Kunoichi-DPO-v2-7B
positive_prompts:
- "storywriting"
- "write"
- "scene"
- "story"
- "character"
- source_model: mlabonne/NeuralDaredevil-7B
positive_prompts:
- "reason"
- "math"
- "mathematics"
- "solve"
- "count"
Per ogni esperto, fornisco cinque suggerimenti positivi di base. Puoi essere un po' più elaborato e scrivere intere frasi, se vuoi. La migliore strategia consiste nell'utilizzare suggerimenti reali che dovrebbero attivare un particolare esperto. Puoi anche aggiungere suggerimenti negativi per fare il contrario.
Una volta pronto, puoi salvare la configurazione come config.yaml
. Nella stessa cartella scaricheremo e installeremo il file mergekit biblioteca (ramo mixtral).
git clone -b mixtral https://github.com/arcee-ai/mergekit.git
cd mergekit && pip install -e .
pip install -U transformers
Se il tuo computer ha abbastanza RAM (circa 24-32 GB di RAM), puoi eseguire il seguente comando:
mergekit-moe config.yaml merge --copy-tokenizer
Se non hai abbastanza RAM, puoi invece partizionare i modelli come segue (ci vorrà più tempo):
mergekit-moe config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickle
Questo comando scarica automaticamente gli esperti e crea il frankenMoE nel file merge
directory. Per il hidden
modalità gate, puoi anche utilizzare il file --load-in-4bit
E --load-in-8bit
opzioni per calcolare gli stati nascosti con precisione inferiore.
In alternativa, puoi copiare la configurazione in LazyMergekitun wrapper che ho creato per semplificare l'unione dei modelli. In questo notebook Colab puoi inserire il nome del tuo modello, selezionare il file mixtral
branch, specifica il tuo nome utente/token Hugging Face ed esegui le celle. Dopo aver creato il tuo frankenMoE, lo caricherà anche su Hugging Face Hub con una scheda modello ben formattata.
Ho chiamato la mia modella Beyonder-4x7B-v3 e creato Versioni GGUF di esso utilizzando AutoGGUF. Se non puoi eseguire le versioni GGUF sul tuo computer locale, puoi anche eseguire l'inferenza utilizzando questo Taccuino di Colab.
Per avere una buona panoramica delle sue capacità, è stato valutato su tre diversi benchmark: la suite di benchmark di Nous, EQ-Bench e Open LLM Leaderboard. Questo modello non è progettato per eccellere nei benchmark tradizionali, poiché il codice e i modelli di gioco di ruolo generalmente non si applicano a tali contesti. Tuttavia, funziona molto bene grazie a forti esperti generalisti.
Noi: Beyonder-4x7B-v3 è uno dei migliori modelli della suite benchmark di Nous (valutazione eseguita utilizzando Valutazione automatica LLM) e supera significativamente la versione v2. Visualizza l'intera classifica Qui.
Banco EQ: È anche il miglior modello 4x7B sul mercato Classifica EQ-Benchsuperando le versioni precedenti di ChatGPT e Llama-2–70b-chat. Beyonder è molto vicino a Mixtral-8x7B-Instruct-v0.1 e Gemini Pro, che sono (presumibilmente) modelli molto più grandi.
Apri la classifica LLM: Infine, ha anche ottime prestazioni nella classifica Open LLM, superando significativamente il modello v2.
Oltre a queste valutazioni quantitative, consiglio di verificare i risultati del modello in modo più qualitativo utilizzando una versione GGUF su Studio LM. Un modo comune per testare questi modelli è raccogliere una serie privata di domande e controllarne i risultati. Con questa strategia, ho scoperto che Beyonder-4x7B-v3 è abbastanza resistente ai cambiamenti nei prompt dell'utente e del sistema rispetto ad altri modelli, incluso AlphaMonarch-7B. Questo è piuttosto interessante in quanto migliora l'utilità del modello in generale.
I FrankenMoE rappresentano un approccio promettente ma ancora sperimentale. I compromessi, come una maggiore richiesta di VRAM e velocità di inferenza più lente, possono rendere difficile vedere il loro vantaggio rispetto a tecniche di fusione più semplici come SLERP o DARE TIES. Soprattutto, quando si utilizzano FrankenMoE con solo due esperti, potrebbero non funzionare così bene come se si fossero semplicemente uniti i due modelli. Tuttavia, i FrankenMoE eccellono nel preservare la conoscenza, il che può portare a modelli più forti, come dimostrato da Beyonder-4x7B-v3. Con l'hardware giusto, questi inconvenienti possono essere efficacemente mitigati.
In questo articolo abbiamo introdotto l'architettura Mixture of Experts. A differenza dei MoE tradizionali che vengono formati da zero, MergeKit facilita la creazione di MoE riunendo esperti, offrendo un approccio innovativo per migliorare le prestazioni e l’efficienza del modello. Abbiamo dettagliato il processo di creazione di un FrankenMoE con MergeKit, evidenziando i passaggi pratici coinvolti nella selezione e nella combinazione di diversi esperti per produrre un MoE di alta qualità.
Grazie per aver letto questo articolo. Ti incoraggio a provare a creare i tuoi FrankenMoE utilizzando LazyMergeKit: seleziona alcuni modelli, crea il tuo Beyonder basato sulla configurazione ed esegui il notebook per creare i tuoi modelli! Se ti è piaciuto questo articolo, seguimi su Volto che abbraccia e X/Twitter @maximelabonne.
Fonte: towardsdatascience.com