🐦 twitter • 💻 web • 📹 youtube • 💻 repo original de @mlabonne
Este curso de IA generativa y LLMs va a estar dividido en 3 partes:
- 🧩 Fundamentos de IA cubre conocimientos esenciales sobre matemáticas, Python y redes neuronales.
- 🧑🔬 Científico/a de LLMs se enfoca en construir los mejores LLMs posibles usando las técnicas más recientes.
- 👷 Ingeniero/a de LLMs se concentra en crear aplicaciones basadas en LLM y desplegarlas.
Note
todo este laburo se basa en el repo de @mlabonne, vayan a meterle una ⭐ ya mismo!
... proximamente ...
Una lista de algunos videos que hice (@machinelearnear) que tocan varios de estos temas
- 📁 @machinelearnear
- 📹 Cómo es que funciona realmente Stable Diffusion? (Guia ilustrada paso a paso)
- 📹 Como crear ChatGPT desde 0 explicado
- 📹 Habilidades emergentes de GPT-3.5
- 📹 Reinforcement Learning from Human Feedback
- 📹 In-Context Learning & Gradient Descent
- 📹 Que hace que un agente de diálogo sea útil?
- 📹 "Estado de GPT" por Andrej Karpathy
- 📹 Como las empresas crean aplicaciones con LLMs
- 📹 Tutorial para hacer una aplicación con GPT4, LangChain, Whisper, y otros
- 📹 Ingenieria de Prompts (Octubre 2023)
Y acá otra colección de excelentes videos tocando varios temas de IA generativa y LLMs.
- 📁 @otros
- 📹 Intro to Large Language Models
- 📹 Let's build GPT: from scratch, in code, spelled out
- 📹 Training and deploying open-source large language models
- 📹 Transformers demystified: how do ChatGPT, GPT-4, LLaMa work?
- 📹 LLM Bootcamp - Spring 2023
- 📹 Stanford CS25 - Transformers United
- 📹 EfficientML.ai Lecture, Fall 2023, MIT 6.5940
- 📹 Natural Language Processing at UT Austin, 2023-2024 version (Greg Durrett)
- 📹 Harvard CS50’s Introduction to Programming with Python – Full University Course
- 📹 MIT 6.S191: Introduction to Deep Learning
- 📹 Neural Networks: Zero to Hero
- 📹 Computer Vision in Practice
- 📹 UMass CS685: Advanced Natural Language Processing (Spring 2023)
- 📹 Stanford CS229: Machine Learning I Spring 2022
- 📹 Machine Learning Engineering for Production (MLOps)
- 📹 CMU Multimodal Machine Learning course (11-777), Fall 2022 semester
- 📹 Stanford CS330: Deep Multi-Task and Meta Learning I Autumn 2022
- 📹 Practical Deep Learning for Coders
- 📹 Stanford CS224U: Natural Language Understanding | Spring 2021
- 📹 NYU Deep Learning Fall 2022
- 📹 DeepMind x UCL | Deep Learning Lecture Series 2021
- 📹 Stanford CS224N: Natural Language Processing with Deep Learning | Winter 2021
- 📹 DeepMind x UCL | Deep Learning Lecture Series 2020
- 📹 Deep Learning for Computer Vision
- 📹 Lecture Collection | Convolutional Neural Networks for Visual Recognition (Spring 2017)
- 📹 Statistics 110: Probability
Una lista de notebooks y artículos relacionados con modelos de lenguaje grandes hechos por @mlabonne.
-
📁 Herramientas
- 🧐 LLM AutoEval - Evalúa automáticamente tus LLMs usando RunPod. Abrir en Colab
- 🥱 LazyMergekit - Fusiona modelos fácilmente usando mergekit en un clic. Abrir en Colab
- ⚡ AutoGGUF - Cuantiza LLMs en formato GGUF en un click. Abrir en Colab
- 🌳 Árbol genealógico de modelos - Visualiza el árbol genealógico de modelos fusionados. Abrir en Colab
-
🎛 Ajuste fino
- 🧐 Ajuste fino de Llama-2 en Google Colab - Guía paso a paso para afinar tu primer modelo Llama 2. Artículo | Abrir en Colab
- 🥱 Ajuste fino de LLMs con Axolotl - Guía de principio a fin para la herramienta de vanguardia para afinamiento. Artículo | Abrir en Colab
- ⚡ Ajuste fino de Mistral-7b con DPO - Mejora el rendimiento de modelos afinados supervisados con DPO. Artículo | Abrir en Colab
-
💾 Cuantización
- 1️⃣ Introducción a la cuantización - Optimización de LLMs usando cuantización de 8 bits. Artículo | Abrir en Colab
- 2️⃣ Cuantización de 4 bits usando GPTQ - Cuantiza tus propios LLMs de código abierto. Artículo | Abrir en Colab
- 3️⃣ Cuantización con GGUF y
llama.cpp
- Llama 2 con llama.cpp y sube versiones GGUF al HF Hub. Artículo | Abrir en Colab - 4️⃣ ExLlamaV2 - Cuantiza y corre modelos EXL2 y súbelos al HF Hub. Artículo | Abrir en Colab
-
📚 Otros
- 📖 Estrategias de decodificación en LLMs - Una guía para la generación de texto desde la búsqueda por haz hasta el muestreo de núcleo. Artículo | Abrir en Colab
- 🌐 Visualizar el paisaje de pérdida de GPT-2 - Gráfico 3D del paisaje de pérdida basado en perturbaciones de peso. Tweet | Abrir en Colab
- 🚀 Mejorar ChatGPT con grafos de conocimiento - Amplía las respuestas de ChatGPT con grafos de conocimiento. Artículo | Abrir en Colab
- 🛠 Fusionar LLMs usando
mergekit
- Crea tus propios modelos fácilmente, ¡no se necesita GPU! Artículo | Abrir en Colab
📁
├── 📚 Matemáticas para el aprendizaje automático
│ ├── 🧮 Álgebra lineal
│ ├── 🔢 Cálculo
│ └── 📊 Probabilidad y estadística
├── 🐍 Python para el aprendizaje automático
│ ├── 💻 Fundamentos de Python
│ └── 📊 Bibliotecas de ciencia de datos
├── 🧠 Redes neuronales
│ ├── 📖 Fundamentos
│ ├── ⚙️ Entrenamiento y optimización
│ └── ⚠️ Sobreajuste
└── 💬 Procesamiento de lenguaje natural
├── 📝 Preprocesamiento de texto
├── ✨ Técnicas de extracción de características
├── 🪄 Representaciones de palabras
└── 🔄 Redes neuronales recurrentes (RNN)
Antes de dominar el aprendizaje automático (ML o machine learning), es importante entender los conceptos matemáticos fundamentales que impulsan estos algoritmos.
- Álgebra lineal: Esto es crucial para entender muchos algoritmos, especialmente aquellos usados en aprendizaje profundo (deep learning). Conceptos clave incluyen vectores, matrices, determinantes, valores y vectores propios, espacios vectoriales y transformaciones lineales.
- Cálculo: Muchos algoritmos de aprendizaje automático involucran la optimización de funciones continuas, lo que requiere un entendimiento de derivadas, integrales, límites y series. El cálculo multivariable y el concepto de gradientes también son importantes.
- Probabilidad y estadística: Estos son cruciales para entender cómo los modelos aprenden de datos y hacen predicciones. Conceptos clave incluyen teoría de probabilidad, variables aleatorias, distribuciones de probabilidad, expectativas, varianza, covarianza, correlación, pruebas de hipótesis, intervalos de confianza, estimación de máxima verosimilitud e inferencia Bayesiana.
📚 Referencias:
- 3Blue1Brown, La Esencia del álgebra lineal: Serie de videos que proporcionan una intuición geométrica de estos conceptos.
- StatQuest con Josh Starmer, Fundamentos de estadística: Ofrece explicaciones simples y claras para muchos conceptos estadísticos.
- Intuición AP de estadísticas por Ms Aerin: Lista de artículos en Medium que proporcionan la intuición detrás de cada distribución de probabilidad.
- Álgebra lineal inmersiva: Otra interpretación visual del álgebra lineal.
- Khan Academy, Álgebra lineal: Genial para principiantes ya que explica los conceptos de manera muy intuitiva.
- Khan Academy, Cálculo: Un curso interactivo que cubre todos los fundamentos del cálculo.
- Khan Academy, Probabilidad y estadística: Presenta el material de forma fácil de entender.
Python es un lenguaje de programación poderoso y flexible que es particularmente bueno para el aprendizaje automático, gracias a su legibilidad, consistencia y el robusto ecosistema de librerías de ciencia de datos.
- Fundamentos de Python: Programar en Python requiere un buen entendimiento de la sintaxis básica, tipos de datos, manejo de errores y programación orientada a objetos.
- Librerías de ciencia de datos: Incluye familiaridad con
NumPy
para operaciones numéricas,Pandas
para manipulación y análisis de datos,Matplotlib
ySeaborn
para visualización de datos. - Pre-procesamiento de datos: Esto involucra escalado y normalización de características (features), manejo de datos faltantes, detección de valores atípicos (outliers), codificación de datos categóricos y división de datos en conjuntos de entrenamiento, validación y prueba.
- Librerías de aprendizaje automático: Saber usar
Scikit-learn
, una biblioteca que proporciona una amplia selección de algoritmos de aprendizaje supervisado y no supervisado, es vital. Entender cómo implementar algoritmos como regresión lineal, regresión logística, árboles de decisión, bosques aleatorios, vecinos más cercanos (K-NN) y agrupamiento por K-medias es importante. Técnicas de reducción de dimensionalidad como PCA y t-SNE también son útiles para visualizar datos de alta dimensión.
📚 Referencias:
- Real Python: Un recurso comprensivo con artículos y tutoriales tanto para conceptos de Python principiantes como avanzados.
- freeCodeCamp, Aprende Python: Video largo que proporciona una introducción completa a todos los conceptos fundamentales en Python.
- Python Data Science Handbook: Libro digital gratuito que es un gran recurso para aprender pandas, NumPy, Matplotlib y Seaborn.
- freeCodeCamp, Aprendizaje automático para todos: Introducción práctica a diferentes algoritmos de aprendizaje automático para principiantes.
- Udacity, Introducción al aprendizaje automático: Curso gratuito que cubre PCA y varios otros conceptos de aprendizaje automático.
Las redes neuronales son una parte fundamental de muchos modelos de aprendizaje automático, particularmente en el ámbito del aprendizaje profundo. Para utilizarlas efectivamente, es esencial tener un entendimiento comprensivo de su diseño y mecánicas.
- Fundamentos: Esto incluye entender la estructura de una red neuronal como capas, pesos, sesgos y funciones de activación (sigmoide, tanh, ReLU, etc.)
- Entrenamiento y optimización: Familiarízate con la retropropagación y diferentes tipos de funciones de pérdida, como Error Cuadrático Medio (MSE) y Entropía Cruzada. Entiende varios algoritmos de optimización como Descenso de Gradiente, Descenso de Gradiente Estocástico, RMSprop y Adam.
- Sobreajuste (over-fitting): Entender el concepto de sobreajuste (donde un modelo rinde bien en datos de entrenamiento pero pobremente en datos no vistos) y aprender varias técnicas de regularización (abandono, regularización L1/L2, detención temprana, aumento de datos) para prevenirlo.
- Implementar un perceptrón multicapa (MLP): Construye un
MLP
, también conocido como una red completamente conectada (fully-connected network), usandoPyTorch
.
📚 Referencias:
- 3Blue1Brown, "Pero, ¿qué es una red neuronal?": Este video ofrece una explicación intuitiva de las redes neuronales y su funcionamiento interno.
- freeCodeCamp, Curso acelerado de aprendizaje profundo: Este video introduce de manera eficiente todos los conceptos más importantes en aprendizaje profundo.
- Fast.ai, Aprendizaje profundo práctico: Curso gratuito diseñado para personas con experiencia en programación que quieran aprender sobre aprendizaje profundo.
- Patrick Loeber, Tutoriales de PyTorch: Serie de videos para principiantes completos para aprender sobre PyTorch.
NLP es una rama fascinante de la inteligencia artificial que cierra la brecha entre el lenguaje humano y la comprensión de las máquinas. Desde el procesamiento de texto simple hasta la comprensión de matices lingüísticos, NLP juega un papel crucial en muchas aplicaciones como traducción, análisis de sentimientos, chatbots y mucho más.
- Preprocesamiento de texto: Aprende varios pasos de preprocesamiento de texto como tokenización (dividir texto en palabras o frases), stemming (reducir palabras a su forma raíz), lematización (similar al stemming pero considera el contexto), eliminación de palabras vacías, etc.
- Técnicas de extracción de características: Familiarízate con técnicas para convertir datos de texto en un formato que pueda ser entendido por algoritmos de aprendizaje automático. Los métodos clave incluyen "bolsa de palabras" (BoW), "frecuencia de término", inversa de frecuencia de documentos (
TF-IDF
) y n-gramas. - Embeddings de palabras: Los embeddings de palabras son un tipo de representación de palabras que permite que palabras con significados similares tengan representaciones similares. Los métodos clave incluyen
Word2Vec
,GloVe
yFastText
. - Redes neuronales recurrentes (RNNs): Entiende el funcionamiento de RNNs, un tipo de red neuronal diseñada para trabajar con datos secuenciales. Explora LSTMs y GRUs, dos variantes de RNN que son capaces de aprender dependencias a largo plazo.
📚 Referencias:
- RealPython, NLP con
spaCy
en Python: Guía exhaustiva sobre la biblioteca spaCy para tareas de NLP en Python. - Kaggle, Guía de NLP: Unos cuadernos y recursos para una explicación práctica de NLP en Python.
- Jay Alammar, Word2Vec ilustrado: Una buena referencia para entender la famosa arquitectura Word2Vec.
- Jake Tae, PyTorch RNN desde cero: Implementación práctica y simple de modelos RNN, LSTM y GRU en PyTorch.
- Blog de Colah, Entendiendo las redes LSTM: Un artículo más teórico sobre la red LSTM.
Esta sección del curso se enfoca en aprender cómo construir los mejores LLMs posibles usando las técnicas más recientes.
📁
├── 🏗 Arquitectura de LLMs
│ ├── 🌐 Visión general
│ ├── 🔤 Tokenización
│ ├── 🧠 Mecanismos de atención
│ └── ✍️ Generación de texto
├── 🛠 Construcción de un dataset de instrucciones
│ ├── 🦙 Dataset tipo Alpaca
│ ├── 🧪 Técnicas avanzadas
│ ├── 🚿 Filtrado de datos
│ └── 📝 Plantillas de prompts
├── 🔄 Pre-entrenamiento de modelos
│ ├── 📊 Pipeline de datos
│ ├── 📖 Modelado de lenguaje causal
│ ├── 📈 Leyes de escalado
│ └── 💻 Computación de alto rendimiento
├── 🎛 Ajuste fino supervisado
│ ├── 📚 Ajuste fino completo
│ ├── 🧮 LoRA y QLoRA
│ ├── 🐸 Axolotl
│ └── 🚀 DeepSpeed
├── 🤖 RLHF
│ ├── 📏 Métricas tradicionales
│ ├── 🌍 Benchmarks generales
│ ├── 🎯 Benchmarks específicos de tareas
│ └── 👥 Evaluación humana
├── 🔢 Cuantización
│ ├── 🛠 Técnicas base
│ ├── 🦙 GGUF y llama.cpp
│ ├── ⚡ GPTQ y EXL2
│ └── 🏋️♂️ AWQ
└── 🌟 Nuevas tendencias
├── 📍 Embeddings posicionales
├── 🔄 Fusión de modelos
├── 🧑🔬 Mix de expertos
└── 🎭 Modelos multimodales
Aunque no es necesario un conocimiento profundo sobre la arquitectura Transformer, es importante tener un buen entendimiento de sus entradas (tokens) y salidas (logits). El mecanismo de atención básico es otro componente crucial para dominar, ya que se introducen versiones mejoradas más adelante.
- Vista de alto nivel: Revisar la arquitectura Transformer de codificador-decodificador, y más específicamente la arquitectura GPT solo de decodificador, que se usa en todos los LLMs modernos.
- Tokenización: Entender cómo convertir datos de texto crudo en un formato que el modelo pueda entender, lo que involucra dividir el texto en tokens (generalmente palabras o subpalabras).
- Mecanismos de atención: Comprender la teoría detrás de los mecanismos de atención, incluyendo la autoatención y la atención de producto punto escalado, que permite al modelo enfocarse en diferentes partes de la entrada al producir una salida.
- Generación de texto: Aprender sobre las diferentes maneras en que el modelo puede generar secuencias de salida. Las estrategias comunes incluyen la decodificación ávida, búsqueda por haz, muestreo top-k y muestreo de núcleo.
📚 Referencias:
- Transformers ilustrado por Jay Alammar: Una explicación visual e intuitiva del modelo Transformer.
- GPT-2 ilustrado por Jay Alammar: Más importante que el artículo anterior, se centra en la arquitectura GPT, muy similar a la de Llama.
- Visualización de LLMs por Brendan Bycroft: Increíble visualización 3D de lo que sucede dentro de un LLM.
nanoGPT
por Andrej Karpathy: Video de 2 horas en YouTube para reimplementar GPT desde cero (para programadores).- ¿Atención? ¡Atención! por Lilian Weng: Introduce la necesidad de atención de una manera más formal.
- Estrategias de decodificación en LLMs: Proporciona código y una introducción visual a las diferentes estrategias de decodificación para generar texto.
Aunque es fácil encontrar datos crudos de Wikipedia y otros sitios web, es difícil recolectar pares de instrucciones y respuestas en la naturaleza. Como en el aprendizaje automático tradicional, la calidad del conjunto de datos influirá directamente en la calidad del modelo, lo que significa que podría ser el componente más importante en el proceso de afinamiento.
- Conjunto de datos tipo Alpaca: Generar datos sintéticos desde cero con la API de OpenAI (GPT). Puedes especificar semillas y prompts del sistema para crear un conjunto de datos diverso.
- Técnicas avanzadas: Aprender cómo mejorar conjuntos de datos existentes con Evol-Instruct, cómo generar datos sintéticos de alta calidad como en los papeles Orca y phi-1.
- Filtrado de datos: Técnicas tradicionales que involucran regex, eliminación de duplicados cercanos, enfocándose en respuestas con un alto número de tokens, etc.
- Plantillas de prompts: No existe una manera estándar verdadera de formatear instrucciones y respuestas, por lo que es importante saber sobre las diferentes plantillas de chat, como ChatML, Alpaca, etc.
📚 Referencias:
- Preparando un dataset para ajuste de instrucciones por Thomas Capelle: Exploración de los conjuntos de datos Alpaca y Alpaca-GPT4 y cómo formatearlos.
- Generando un dataset de instrucción clínica por Solano Todeschini: Tutorial sobre cómo crear un conjunto de datos de instrucción sintético usando GPT-4.
- GPT 3.5 para clasificación de noticias por Kshitiz Sahay: Uso de GPT 3.5 para crear un conjunto de datos de instrucción para afinar Llama 2 para clasificación de noticias.
- Creación de conjunto de datos para ajuste fino de LLMs: Cuaderno que contiene algunas técnicas para filtrar un conjunto de datos y subir el resultado.
- Plantilla de prompts por Matthew Carrigan: Página de Hugging Face sobre plantillas de prompts.
El pre-entrenamiento es un proceso muy largo y costoso, por lo que no es el foco de este curso. Es bueno tener algún nivel de entendimiento sobre lo que sucede durante el preentrenamiento, pero la experiencia práctica no es requerida.
- Pipeline de datos: El preentrenamiento requiere enormes conjuntos de datos (por ejemplo, Llama 2 fue entrenado en 2 billones de tokens) que necesitan ser filtrados, tokenizados y agrupados con un vocabulario predefinido.
- Modelado de lenguaje causal: Aprender la diferencia entre modelado de lenguaje causal y modelado de lenguaje enmascarado, así como la función de pérdida utilizada en este caso. Para un preentrenamiento eficiente, aprender más sobre Megatron-LM o gpt-neox.
- Leyes de escalamiento ie. Chinchilla scaling laws: Las leyes de escalamiento describen el rendimiento esperado del modelo basado en el tamaño del modelo, tamaño del conjunto de datos y la cantidad de cómputo usado para el entrenamiento.
- Computación de alto rendimiento (HPC): Fuera del alcance aquí, pero más conocimiento sobre HPC es fundamental si estás planeando crear tu propio LLM desde cero (hardware, carga de trabajo distribuida, etc.).
📚 Referencias:
LLMDataHub
por Junhao Zhao: Lista curada de conjuntos de datos para preentrenamiento, afinamiento y RLHF.- Entrenando un modelo de lenguaje causal desde cero por Hugging Face: Preentrena un modelo GPT-2 desde cero usando la biblioteca transformers.
TinyLlama
por Zhang et al.: Consulta este proyecto para obtener un buen entendimiento de cómo se entrena un modelo Llama desde cero.- Modelado de lenguaje causal por Hugging Face: Explica la diferencia entre modelado de lenguaje causal y enmascarado y cómo afinar rápidamente un modelo DistilGPT-2.
- Las zarpadas implicaciones de Chinchilla por nostalgebraist: Discute las leyes de escalamiento y explica lo que significan para los LLMs en general.
- BLOOM por BigScience: Página de Notion que describe cómo se construyó el modelo BLOOM, con mucha información útil sobre la parte de ingeniería y los problemas que se encontraron.
- Bitácora de entrenamiento de OPT-175 por Meta: Registros de investigación que muestran lo que salió mal y lo que salió bien. Útil si planeas preentrenar un modelo de lenguaje grande (en este caso, 175B parámetros).
- LLM 360: Un marco para LLMs de código abierto con código de entrenamiento y preparación de datos, datos, métricas y modelos.
Los modelos pre-entrenados solo están entrenados en una tarea de predicción del siguiente token, por lo que no son asistentes útiles. SFT te permite ajustarlos para responder a instrucciones. Además, te permite afinar tu modelo en cualquier dato (privado, no visto por GPT-4, etc.) y usarlo sin tener que pagar por una API como la de OpenAI.
- Ajuste fino completo: El ajuste fino (fine-tuning) completo se refiere a entrenar todos los parámetros en el modelo. No es una técnica eficiente, pero produce resultados ligeramente mejores.
- LoRA: Una técnica de afinamiento eficiente en parámetros (PEFT) basada en adaptadores de rango bajo. En lugar de entrenar todos los parámetros, solo entrenamos estos adaptadores.
- QLoRA: Otra PEFT basada en LoRA, que también cuantiza los pesos del modelo en 4 bits e introduce optimizadores paginados para manejar picos de memoria. Combínalo con Unsloth para correrlo eficientemente en un cuaderno Colab gratuito.
- Axolotl: Una herramienta de afinamiento poderosa y fácil de usar que se utiliza en muchos modelos de código abierto de vanguardia.
- DeepSpeed: Pre-entrenamiento y afinamiento eficientes de LLMs para configuraciones multi-GPU y multi-nodo (implementado en Axolotl).
📚 Referencias:
- Guía de entrenamiento de LLM para novatos por Alpin: Visión general de los principales conceptos y parámetros a considerar al afinar LLMs.
- Insights sobre LoRA por Sebastian Raschka: Perspectivas prácticas sobre LoRA y cómo seleccionar los mejores parámetros.
- Ajuste fino de tu propio modelo Llama-2: Tutorial práctico sobre cómo afinar un modelo Llama 2 usando bibliotecas de Hugging Face.
- Padding de modelos de lenguaje grandes por Benjamin Marie: Mejores prácticas para rellenar ejemplos de entrenamiento para LLMs causales
- Una Guía para principiantes en ajuste fino de LLMs: Tutorial sobre cómo afinar un modelo CodeLlama usando Axolotl.
Después del afinamiento supervisado, el RLFH ("Reinforcement learning from human feedback") es un paso usado para alinear las respuestas del LLM con las expectativas humanas. La idea es aprender preferencias a partir de retroalimentación humana (o artificial), que se puede usar para reducir sesgos, censurar modelos, o hacerlos actuar de una manera más útil. Es más complejo que el SFT (supervised fine-tuning) y a menudo se ve como opcional.
- Conjuntos de datos de preferencia: Estos conjuntos típicamente contienen varias respuestas con algún tipo de clasificación, lo que los hace más difíciles de producir que los conjuntos de instrucciones.
- Optimización de política proxima: Este algoritmo aprovecha un modelo de recompensa que predice si un texto dado está altamente clasificado por humanos. Esta predicción se usa luego para optimizar el modelo SFT con una penalización basada en divergencia KL.
- Optimización de preferencia directa: DPO simplifica el proceso al reformularlo como un problema de clasificación. Usa un modelo de referencia en lugar de un modelo de recompensa (no necesita entrenamiento) y solo requiere un hiperparámetro, lo que lo hace más estable y eficiente.
📚 Referencias:
- Introducción al entrenamiento de LLMs usando RLHF por Ayush Thakur: Explica por qué el ARRH es deseable para reducir el sesgo y aumentar el rendimiento en LLMs.
- Ilustración RLHF por Hugging Face: Introducción al ARRH con entrenamiento de modelo de recompensa y afinamiento con aprendizaje por refuerzo.
- StackLLaMA por Hugging Face: Tutorial para alinear eficientemente un modelo LLaMA con ARRH usando la biblioteca de transformers.
- Entrenamiento de LLM: RLHF y sus alternativas por Sebastian Rashcka: Visión general del proceso de ARRH y alternativas como RLAIF.
- Ajuste fino de Mistral-7b con DPO: Tutorial para afinar un modelo Mistral-7b con DPO y reproducir NeuralHermes-2.5.
Evaluar LLMs es una parte subestimada del pipeline, que consume tiempo y es moderadamente confiable. Tu tarea específica debería dictar qué quieres evaluar, pero siempre recuerda la ley de Goodhart: "Cuando una medida se convierte en un objetivo, deja de ser una buena medida."
- Métricas tradicionales: Métricas como la perplejidad y el puntaje BLEU no son tan populares como lo eran porque están defectuosas en la mayoría de los contextos. Aún es importante entenderlas y cuándo pueden ser aplicadas.
- Benchmarks generales: Basados en el Language Model Evaluation Harness, el Open LLM Leaderboard es el principal benchmark para LLMs de propósito general (como ChatGPT). Hay otros benchmarks populares como BigBench, MT-Bench, etc.
- Benchmarks específicos de tareas: Tareas como la summarización, traducción y respuesta a preguntas tienen benchmarks dedicados, métricas e incluso subdominios (médico, financiero, etc.), como PubMedQA para respuesta a preguntas biomédicas.
- Evaluación humana: La evaluación más confiable es la tasa de aceptación por parte de los usuarios o comparaciones hechas por humanos. Si quieres saber si un modelo rinde bien, la forma más simple pero segura es usarlo tú mismo.
📚 Referencias:
- Perplejidad de modelos de longitud fija por Hugging Face: Visión general de la perplejidad con código para implementarlo con la biblioteca de transformers.
- BLEU a tu propio riesgo por Rachael Tatman: Visión general del puntaje BLEU y sus muchos problemas con ejemplos.
- Una encuesta sobre la evaluación de LLMs por Chang et al.: Documento comprensivo sobre qué evaluar, dónde evaluar y cómo evaluar.
- Chatbot Arena Leaderboard por lmsys: Clasificación Elo de LLMs de propósito general, basada en comparaciones hechas por humanos.
La cuantización es el proceso de convertir los pesos (y activaciones) de un modelo usando una precisión menor. Por ejemplo, los pesos almacenados usando 16 bits pueden ser convertidos en una representación de 4 bits. Esta técnica se ha vuelto cada vez más importante para reducir los costos computacionales y de memoria asociados con los LLMs.
- Técnicas base: Aprende los diferentes niveles de precisión (FP32, FP16, INT8, etc.) y cómo realizar cuantización naíf con técnicas de absmax y punto cero.
GGUF
yllama.cpp
: Originalmente diseñado para correr en CPUs, llama.cpp y el formato GGUF se han vuelto las herramientas más populares para correr LLMs en hardware de grado consumidor.GPTQ
yEXL2
: GPTQ y, más específicamente, el formato EXL2 ofrecen una velocidad increíble pero solo pueden correr en GPUs. Los modelos también toman un largo tiempo en ser cuantizados.AWQ
: Este nuevo formato es más preciso que GPTQ (menor perplejidad) pero usa mucho más VRAM y no necesariamente es más rápido.
📚 Referencias:
- Introducción a la cuantización: Visión general de la cuantización, cuantización absmax y punto cero, y LLM.int8() con código.
- Cuantiza modelos Llama con llama.cpp: Tutorial sobre cómo cuantizar un modelo Llama 2 usando llama.cpp y el formato GGUF.
- Cuantización de LLM de 4 bits con GPTQ: Tutorial sobre cómo cuantizar un LLM usando el algoritmo GPTQ con AutoGPTQ.
- ExLlamaV2: La librería más rápida para correr LLMs: Guía sobre cómo cuantizar un modelo Mistral usando el formato EXL2 y correrlo con la biblioteca ExLlamaV2.
- Entendiendo la cuantización con AWQ por FriendliAI: Visión general de la técnica AWQ y sus beneficios.
- Codificaciones posicionales: Aprende cómo los LLMs codifican posiciones, especialmente esquemas de codificación posicional relativa como RoPE. Implementa YaRN (multiplica la matriz de atención por un factor de temperatura) o ALiBi (penalización de atención basada en la distancia de tokens) para extender la longitud del contexto.
- Fusión de modelos: Fusionar modelos entrenados se ha vuelto una manera popular de crear modelos performantes sin ningún afinamiento. La popular biblioteca mergekit implementa los métodos de fusión más populares, como SLERP, DARE, y TIES.
- Mix de expertos: Mixtral repopularizó la arquitectura MoE gracias a su excelente rendimiento. Paralelamente, un tipo de frankenMoE emergió en la comunidad OSS fusionando modelos como Phixtral, que es una opción más económica y performante.
- Modelos multimodales: Estos modelos (como CLIP, Stable Diffusion, o LLaVA) procesan múltiples tipos de entradas (texto, imágenes, audio, etc.) con un espacio de incrustación unificado, lo que desbloquea aplicaciones poderosas como texto-a-imagen.
📚 Referencias:
- Extendiendo el RoPE por EleutherAI: Artículo que resume las diferentes técnicas de codificación de posición.
- Entendiendo YaRN por Rajat Chawla: Introducción a YaRN.
- Fusionar LLMs con
mergekit
: Tutorial sobre fusión de modelos usando mergekit. - Mix de expertos explicado por Hugging Face: Guía exhaustiva sobre MoEs y cómo funcionan.
- Modelos multimodales grandes por Chip Huyen: Visión general de sistemas multimodales y la historia reciente de este campo.
Esta sección del curso se enfoca en aprender cómo construir aplicaciones potenciadas por LLM que puedan usarse en producción, con un enfoque en aumentar modelos y desplegarlos a escala.
📁
├── 🚀 Corriendo LLMs
│ ├── 🌐 APIs de LLM
│ ├── 📖 LLMs de código abierto
│ ├── 💡 Ingeniería de prompts
│ └── 📐 Estructuración de salidas
├── 🗂 Creando bases de datos vectoriales
│ ├── 📥 Ingesta de documentos
│ ├── ✂️ División de documentos
│ ├── 🧬 Modelos de embedding
│ └── 🗃 Bases de datos vectoriales
├── 🤖 Retrieval augmented generation (generación aumentada por recuperación)
│ ├── 🎛 Orquestadores
│ ├── 🔍 Retrievers
│ ├── 🧠 Memoria
│ └── 📋 Evaluación
├── ⚙️ RAG avanzado
│ ├── 📝 Construcción de consultas
│ ├── 🛠 Agentes y herramientas
│ └── 🔄 Post-procesamiento
├── 🚄 Optimización de inferencia
│ ├── ⚡ Flash attention
│ ├── 🗝 Caché de key-value
│ └── 🔮 Decodificación especulativa
├── 📡 Desplegando LLMs
│ ├── 🏠 Despliegue local
│ ├── 🎮 Despliegue de un prototipo
│ ├── 🖥 Despliegue en un servidor
│ └── 🌐 Despliegue en edge
└── 🔒 Asegurando LLMs
├── 🎣 Hacking de prompts
├── 🚧 Barreras de seguridad (guardrails)
├── 🚪 Puertas traseras
└── 🛡 Medidas defensivas
Ejecutar LLMs puede ser difícil debido a los altos requisitos de hardware. Dependiendo de tu caso de uso, podrías querer simplemente consumir un modelo a través de una API (como GPT-4
) o ejecutarlo localmente. En cualquier caso, técnicas adicionales de prompting y alineamiento pueden mejorar y restringir los outputs para tus aplicaciones.
- APIs de LLM: Las APIs son una manera conveniente de desplegar LLMs. Este espacio está dividido entre LLMs privados o propietarios (OpenAI, Google, Anthropic, Cohere, etc.) y LLMs de código abierto (OpenRouter, Hugging Face, Together AI, etc.).
- LLMs de código abierto: El Hugging Face Hub es un excelente lugar para encontrar LLMs. Puedes ejecutar algunos de ellos directamente en Hugging Face Spaces, o descargarlos y ejecutarlos localmente en aplicaciones como LM Studio o a través de la CLI con llama.cpp o Ollama.
- Ingeniería de prompts: Técnicas comunes incluyen prompting de cero disparos, prompting de pocos disparos, cadena de pensamiento y ReAct. Funcionan mejor con modelos más grandes, pero pueden adaptarse a modelos más pequeños.
- Estructurando outputs (resultados del modelo): Muchas tareas requieren un output estructurado, como una plantilla estricta o un formato
JSON
. Librerías como LMQL, Outlines, Guidance, etc. pueden usarse para guiar la generación y respetar una estructura dada.
📚 Referencias:
- Ejecutá un LLM localmente con LM Studio por Nisha Arya: Guía corta sobre cómo usar LM Studio.
- Guía de ingeniería de prompts por DAIR.AI: Lista exhaustiva de técnicas de prompts con ejemplos.
- Outlines, Inicio rápido: Lista de técnicas de generación guiada habilitadas por Outlines.
- LMQL, Resúmen: Introducción al lenguaje LMQL.
Crear un almacenamiento de vectores es el primer paso para construir un pipeline de Generación Aumentada por Recuperación ("Retrieval Augmented Generation", RAG). Los documentos se ingestan, se dividen (split) y los fragmentos relevantes se usan para producir representaciones vectoriales (embeddings) que se almacenan para su uso futuro durante la inferencia.
- Ingesta de documentos: Los cargadores de documentos son wrappers convenientes que pueden manejar muchos formatos:
PDF
,JSON
,HTML
,Markdown
, etc. También pueden traer datos directamente de algunas bases de datos y APIs (GitHub, Reddit, Google Drive, etc.). - División de documentos: Los divisores de texto descomponen los documentos en fragmentos más pequeños, semánticamente significativos. En lugar de dividir el texto después de n caracteres, a menudo es mejor dividir por encabezado o recursivamente, con algunos metadatos adicionales.
- Modelos de embeddings: Los modelos de embeddings convierten el texto en representaciones vectoriales. Permite una comprensión más profunda y matizada del lenguaje, esencial para realizar búsquedas semánticas.
- Bases de datos vectoriales: Las bases de datos vectoriales (como Chroma, Pinecone, Milvus, FAISS, Annoy, etc.) están diseñadas para almacenar vectores de embeddings. Nos permiten traer, de forma eficiente, información qué es "más similar" a una consulta hecha al modelo basado en la similitud que tenemos entre vectores.
📚 Referencias:
- LangChain, divisores de texto: Lista de diferentes divisores de texto implementados en LangChain.
- Librería de SentenceTransformers: Biblioteca popular para modelos de embeddings.
- MTEB leaderboard: Leaderboard para modelos de embeddings.
- Las 5 Mejores Bases de Datos Vectoriales por Moez Ali: Una comparación de las mejores y más populares bases de datos vectoriales.
Con RAG, los LLMs recuperan documentos contextuales de una base de datos para mejorar la precisión de sus respuestas. RAG es una forma popular de aumentar el conocimiento del modelo sin necesidad de afinamiento adicional.
- Orquestadores: Los orquestadores (como LangChain, LlamaIndex, FastRAG, etc.) son marcos populares para conectar tus LLMs con herramientas, bases de datos, memorias, etc., y aumentar sus habilidades.
- Recuperadores: Las instrucciones de los usuarios no están optimizadas para la recuperación. Diferentes técnicas (por ejemplo, recuperador de múltiples consultas, HyDE, etc.) pueden aplicarse para reformular/ampliarlas y mejorar el rendimiento.
- Memoria: Para recordar instrucciones y respuestas anteriores, LLMs y chatbots como ChatGPT agregan este historial a su ventana de contexto. Este búfer puede mejorarse con resúmenes (por ejemplo, usando un LLM más pequeño), una tienda vectorial + RAG, etc.
- Evaluación: Necesitamos evaluar tanto la recuperación de documentos (precisión y recall del contexto) como las etapas de generación (fidelidad y relevancia de la respuesta). Se puede simplificar con herramientas como Ragas y DeepEval.
📚 Referencias:
- Llamaindex, conceptos de alto nivel: Conceptos principales a conocer al construir tuberías RAG.
- Pinecone, aumento de recuperación: Visión general del proceso de augmentación de recuperación.
- LangChain, Q&A con RAG: Tutorial paso a paso para construir una típica tubería RAG.
- LangChain, tipos de memoria: Lista de diferentes tipos de memorias con usos relevantes.
- Pipeline RAG, métricas: Resúmen general de las principales métricas utilizadas para evaluar pipeline RAG.
Aplicaciones en producción pueden requerir pipelines complejos, incluyendo bases de datos SQL o de grafos, así como la selección automática de herramientas y APIs relevantes. Estas técnicas avanzadas pueden mejorar una solución base y proporcionar características adicionales.
- Construcción de consultas/queries: Los datos estructurados almacenados en bases de datos tradicionales requieren un lenguaje de consulta específico como SQL, Cypher, metadatos, etc. Podemos traducir directamente la instrucción del usuario en una consulta para acceder a los datos con la construcción de consultas.
- Agentes y herramientas: Los agentes aumentan los LLMs seleccionando automáticamente las herramientas más relevantes para proporcionar una respuesta. Estas herramientas pueden ser tan simples como usar Google o Wikipedia, o más complejas como un intérprete de Python o Jira.
- Post-procesamiento: Paso final que procesa las entradas que se alimentan al LLM. Mejora la relevancia y diversidad de los documentos recuperados con reordenamiento, RAG-fusión, y clasificación.
📚 Referencias:
- LangChain, construcción de consultas/queries: Posteo sobre diferentes tipos de construcción de consultas.
- LangChain, SQL: Tutorial sobre cómo interactuar con bases de datos SQL con LLMs, involucrando Texto-a-SQL y un agente SQL opcional.
- Pinecone, agentes LLM: Introducción a agentes y herramientas con diferentes tipos.
- Agentes autónomos potenciados por LLM por Lilian Weng: Artículo más teórico sobre agentes LLM.
- LangChain, RAG de OpenAI: Visión general de las estrategias RAG empleadas por OpenAI, incluyendo post-procesamiento.
La generación de texto es un proceso costoso que requiere hardware caro. Además de la cuantización, se han propuesto varias técnicas para maximizar el rendimiento y reducir los costos de inferencia.
- Flash attention: Optimización del mecanismo de atención para transformar su complejidad de cuadrática a lineal, acelerando tanto el entrenamiento como la inferencia.
- Caché de key-value: Entiende el caché de key-value y las mejoras introducidas en la atención de múltiples consultas (MQA) y la atención de consultas agrupadas (GQA).
- Decodificación especulativa: Usa un modelo pequeño para producir borradores que luego son revisados por un modelo más grande para acelerar la generación de texto.
📚 Referencias:
- Inferencia en GPU por Hugging Face: Explica cómo optimizar la inferencia en GPUs.
- Inferencia de LLM por Databricks: Mejores prácticas sobre cómo optimizar la inferencia de LLM en producción.
- Optimizando LLMs para velocidad y memoria por Hugging Face: Explica tres técnicas principales para optimizar velocidad y memoria, a saber, cuantización, Atención Flash e innovaciones arquitectónicas.
- Generación asistida por Hugging Face: Versión de Hugging Face de la decodificación especulativa, es un post interesante sobre cómo funciona con código para implementarlo.
Desplegar LLMs a escala es una hazaña de ingeniería que puede requerir múltiples clústeres de GPUs. En otros escenarios, demos y aplicaciones locales pueden lograrse con mucha menor complejidad.
- Despliegue local: La privacidad es una ventaja importante que los LLMs de código abierto tienen sobre los privados. Servidores LLM locales (LM Studio, Ollama, oobabooga, kobold.cpp, etc.) capitalizan esta ventaja para potenciar aplicaciones locales.
- Despliegue de un prototipo: Frameworks como Gradio y Streamlit son útiles para prototipar aplicaciones y compartir demos. También puedes alojarlos fácilmente en línea, por ejemplo, usando Hugging Face Spaces.
- Despliegue en un servidor: Desplegar LLMs a escala requiere infraestructura en la nube (ver también SkyPilot) o local y a menudo aprovecha frameworks de generación de texto optimizados como TGI, vLLM, etc.
- Despliegue en el edge: En entornos restringidos, frameworks de alto rendimiento como MLC LLM y mnn-llm pueden desplegar LLMs en navegadores web, Android, e iOS.
📚 Referencias:
- Streamlit, construye una aplicación LLM básica: Tutorial para hacer una app básica tipo ChatGPT usando Streamlit.
- Contenedor Docker de inferencia LLM de HF: Despliega LLMs en Amazon SageMaker usando el contenedor de inferencia de Hugging Face.
- Blog por Philipp Schmid: Colección de artículos de alta calidad sobre despliegue y ajuste fino de LLMs.
- Optimizando la latencia por Hamel Husain: Comparación de TGI, vLLM, CTranslate2 y mlc en términos de rendimiento y latencia.
Además de los problemas de seguridad tradicionales asociados con el software, los LLMs tienen debilidades únicas debido a la forma en que son entrenados y consultados.
- Hackeo de prompts: Diferentes técnicas relacionadas con la ingeniería de prompts, incluyendo inyección de prompts (instrucción adicional para modificar la respuesta del modelo), filtración de datos/prompts (recuperar sus datos/prompts originales), y jailbreaking (crear prompts para eludir características de seguridad).
- Puertas traseras: Los vectores de ataque pueden apuntar al propio conjunto de datos de entrenamiento, envenenando los datos de entrenamiento (por ejemplo, con información falsa) o creando puertas traseras (disparadores secretos para cambiar el comportamiento del modelo durante la inferencia).
- Medidas defensivas: La mejor manera de proteger tus aplicaciones LLM es probarlas contra estas vulnerabilidades (por ejemplo, usando equipos rojos y controles como garak) y observarlas en producción (con un marco como langfuse).
📚 Referencias:
- OWASP Top 10 para aplicaciones de LLM por HEGO Wiki: Lista de las 10 vulnerabilidades críticas más vistas en aplicaciones LLM.
- Inyección de prompts por Joseph Thacker: Guía corta dedicada a la inyección de prompts para ingenieros.
- Seguridad en LLMs por @llm_sec: Lista extensiva de recursos relacionados con la seguridad LLM.
- Equipos rojos (red teaming) en LLMs por Microsoft: Guía sobre cómo realizar equipos rojos con LLMs.
Este roadmap está inspirado fuertemente (robado) del roadmap que hizo Maxime Labonne (twitter & github)
Disclaimer: No estoy afiliado con ninguna institución mencionada acá.