Los MoE también presentan su propio conjunto de desafíos, especialmente en términos de ajuste y requisitos de memoria. El proceso de ajuste puede resultar difícil debido a la complejidad del modelo, con la necesidad de equilibrio de uso experto durante el entrenamiento para entrenar adecuadamente los pesos de activación para seleccionar los más relevantes. En términos de memoria, aunque sólo se utiliza una fracción del total de parámetros durante la inferencia, es necesario analizar todo el modelo, incluidos todos los expertos. cargado en la memoriaque requiere una alta capacidad de VRAM.
Más específicamente, existen dos parámetros esenciales cuando se trata de MoE:
- Número de expertos (
num_local_experts
): Esto determina el número total de expertos en la arquitectura (por ejemplo, 8 para Mixtral). Cuanto mayor sea el número de expertos, mayor será el uso de VRAM. - Número de expertos/token (
num_experts_per_tok
): Esto determina la cantidad de expertos que participan para cada token y cada capa (por ejemplo, 2 para Mixtral). Existe una compensación entre una gran cantidad de expertos por token para lograr precisión (pero rendimientos decrecientes) frente a una cantidad baja para un entrenamiento e inferencia rápidos.
Históricamente, los ME han tenido un desempeño inferior al de los modelos densos. Sin embargo, la liberación de Mixtral-8x7B en diciembre de 2023 revolucionó las cosas y mostró un rendimiento impresionante para su tamaño. Además, también se rumorea que GPT-4 es un MoE, lo que tendría sentido ya que sería mucho más barato ejecutarlo y entrenarlo para OpenAI en comparación con un modelo denso. Además de estos excelentes MoE recientes, ahora tenemos una nueva forma de crear MoE con MergeKit: frankenMoE, también llamado MoErges.
La principal diferencia entre los verdaderos MoE y los frankenMoE es cómo se entrenan. En el caso de verdaderos MoE, los expertos y el enrutador reciben capacitación conjunta. En el caso de frankenMoE, reciclamos los modelos existentes y luego inicializamos el enrutador.
En otras palabras, copiamos los pesos de las capas norma y de autoatención de un modelo base, y luego copiamos los pesos de las capas FFN encontradas en cada experto. Esto significa que, además de los FFN, se comparten todos los demás parámetros. Esto explica por qué Mixtral-8x7B con ocho expertos no tiene 8*7 = 56B parámetros, sino alrededor de 45B. Esta es también la razón por la que el uso de dos expertos por token da la velocidad de inferencia (FLOP) de un modelo denso de 12B en lugar de 14B.
FrankenMoE consiste en seleccionar a los expertos más relevantes e inicializarlos adecuadamente. MergeKit actualmente implementa tres formas de inicializar los enrutadores:
- Aleatorio: Pesos aleatorios. Tenga cuidado al usarlo, ya que es posible que se seleccionen siempre los mismos expertos (es necesario realizar más ajustes o
num_local_experts = num_experts_per_tok
lo que significa que no necesita ninguna ruta). - Insertar barato: Utiliza las incrustaciones sin procesar de los tokens de entrada directamente y aplica la misma transformación en todas las capas. Este método es computacionalmente económico y adecuado para su ejecución en hardware menos potente.
- Oculto: Crea representaciones ocultas de una lista de indicaciones positivas y negativas extrayéndolas de la última capa del LLM. Se promedian y normalizan para inicializar las puertas. Más información al respecto está disponible en El blog de Charles Goddard..
Como puedes adivinar, la inicialización “oculta” es la más eficiente para enrutar correctamente los tokens a los expertos más relevantes. En la siguiente sección, crearemos nuestro propio frankenMoE utilizando esta técnica.
Para crear nuestro frankenMoE, debemos seleccionar n
expertos. En este caso confiaremos en el Mistral-7B gracias a su popularidad y tamaño relativamente pequeño. Sin embargo, ocho expertos como en Mixtral son bastantes, ya que necesitamos guardarlos todos en la memoria. Para mayor eficiencia, solo usaré cuatro expertos en este ejemplo, dos de ellos involucrados en cada token y cada capa. En este caso, terminaremos con un modelo con 24,2 mil millones de parámetros en lugar de 4*7 = 28 mil millones de parámetros.
Aquí, nuestro objetivo es crear un modelo completo que pueda hacer prácticamente de todo: escribir historias, explicar artículos, codificar en Python, etc. Podemos descomponer este requisito en cuatro tareas y seleccionar al mejor experto para cada una de ellas. Así lo descompuse:
- modelo de chat: un modelo de propósito general que se utiliza en la mayoría de las interacciones. solía mlabonne/AlphaMonarch-7Bque satisface perfectamente los requisitos.
- modelo de código: un modelo capaz de generar buen código. No tengo mucha experiencia con modelos de código basados en Mistral-7B, pero encontré beowolx/CodeNinja-1.0-OpenChat-7B particularmente bueno en comparación con otros.
- modelo matemático: las matemáticas son complicadas para los LLM, por eso queremos un modelo especializado en matemáticas. Gracias a sus altos puntajes MMLU y GMS8K, elegí mlabonne/NeuralDaredevil-7B para este propósito.
- Modelo de juego de roles: El objetivo de este modelo es escribir historias y conversaciones de alta calidad. Yo seleccioné SanjiWatsuki/Kunoichi-DPO-v2–7B por su buena reputación y su alta puntuación en MT-Bench (8,51 frente a 8,30 de Mixtral).
Ahora que hemos identificado a los expertos que queremos utilizar, podemos crear la configuración YAML que MergeKit utilizará para crear nuestro frankenMoE. Esto utiliza la rama mixtral de MergeKit. Puede encontrar más información sobre cómo escribir la configuración. en esta página. Aquí está nuestra versión:
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"
Para cada experto, proporciono cinco indicaciones positivas básicas. Puedes ser un poco más elegante y escribir oraciones completas si quieres. La mejor estrategia consiste en utilizar indicaciones reales que deberían activar a un experto en particular. También puedes agregar indicaciones negativas para hacer lo contrario.
Una vez que esté listo, puede guardar su configuración como config.yaml
. En la misma carpeta descargaremos e instalaremos el kit de fusión biblioteca (sucursal mixtral).
git clone -b mixtral https://github.com/arcee-ai/mergekit.git
cd mergekit && pip install -e .
pip install -U transformers
Si su computadora tiene suficiente RAM (aproximadamente 24 a 32 GB de RAM), puede ejecutar el siguiente comando:
mergekit-moe config.yaml merge --copy-tokenizer
Si no tiene suficiente RAM, puede fragmentar los modelos de la siguiente manera (llevará más tiempo):
mergekit-moe config.yaml merge --copy-tokenizer --allow-crimes --out-shard-size 1B --lazy-unpickle
Este comando descarga automáticamente los expertos y crea el frankenMoE en el merge
directorio. Para el hidden
modo puerta, también puede utilizar el --load-in-4bit
y --load-in-8bit
opciones para calcular estados ocultos con menor precisión.
Alternativamente, puede copiar su configuración en LazyMergekit, un contenedor que hice para simplificar la fusión de modelos. En este cuaderno de Colab, puede ingresar el nombre de su modelo, seleccionar el mixtral
rama, especifique su nombre de usuario/token de Hugging Face y ejecute las celdas. Después de crear su frankenMoE, también lo cargará en Hugging Face Hub con una tarjeta modelo bien formateada.
Llamé a mi modelo Beyonder-4x7B-v3 y creado Versiones GGUF de ello usando AutoGGUF. Si no puede ejecutar versiones de GGUF en su máquina local, también puede realizar inferencia usando este Cuaderno de colaboración.
Para obtener una buena descripción general de sus capacidades, se ha evaluado en tres puntos de referencia diferentes: el conjunto de puntos de referencia de Nous, EQ-Bench y Open LLM Leaderboard. Este modelo no está diseñado para sobresalir en los puntos de referencia tradicionales, ya que el código y los modelos de juego de roles generalmente no se aplican a esos contextos. No obstante, funciona notablemente bien gracias a sólidos expertos en uso general.
Cacumen: Beyonder-4x7B-v3 es uno de los mejores modelos del conjunto de pruebas de Nous (evaluación realizada utilizando LLM AutoEval) y supera significativamente a la v2. Ver toda la clasificación aquí.
Banco de ecualización: También es el mejor modelo 4x7B del mercado. Tabla de clasificación de EQ-Bench, superando a las versiones anteriores de ChatGPT y Llama-2–70b-chat. Beyonder está muy cerca de Mixtral-8x7B-Instruct-v0.1 y Gemini Pro, que son (supuestamente) modelos mucho más grandes.
Tabla de clasificación abierta de LLM: Finalmente, también tiene un desempeño sólido en la tabla de clasificación Open LLM, superando significativamente al modelo v2.
Además de estas evaluaciones cuantitativas, recomiendo verificar los resultados del modelo de una manera más cualitativa utilizando una versión GGUF en Estudio LM. Una forma común de probar estos modelos es reunir un conjunto privado de preguntas y verificar sus resultados. Con esta estrategia, descubrí que Beyonder-4x7B-v3 es bastante resistente a los cambios en las indicaciones del usuario y del sistema en comparación con otros modelos, incluido AlphaMonarch-7B. Esto es genial ya que mejora la utilidad del modelo en general.
FrankenMoE es un enfoque prometedor pero aún experimental. Las compensaciones, como una mayor demanda de VRAM y velocidades de inferencia más lentas, pueden hacer que sea difícil ver su ventaja sobre técnicas de fusión más simples como SLERP o DARE TIES. Especialmente, cuando usa frankenMoE con solo dos expertos, es posible que no funcionen tan bien como si simplemente hubiera fusionado los dos modelos. Sin embargo, los frankenMoE destacan en la preservación del conocimiento, lo que puede dar como resultado modelos más sólidos, como lo demuestra Beyonder-4x7B-v3. Con el hardware adecuado, estos inconvenientes se pueden mitigar eficazmente.
En este artículo, presentamos la arquitectura Mezcla de expertos. A diferencia de los MoE tradicionales que se capacitan desde cero, MergeKit facilita la creación de MoE reuniendo expertos, ofreciendo un enfoque innovador para mejorar el rendimiento y la eficiencia del modelo. Detallamos el proceso de creación de un frankenMoE con MergeKit, destacando los pasos prácticos involucrados en la selección y combinación de diferentes expertos para producir un MoE de alta calidad.
Gracias por leer este artículo. Te animo a que intentes crear tus propios FrankenMoE usando LazyMergeKit: seleccione algunos modelos, cree su configuración basada en Beyonder y ejecute el cuaderno para crear sus propios modelos. Si te gustó este artículo, sígueme en abrazando la cara y X/Twitter @maximelabonne.