10 |
11 |
12 | >[!NOTE]
13 | >todo este laburo se basa en el [repo de @mlabonne](https://github.com/mlabonne/llm-course), **vayan a meterle una ⭐!**
14 |
15 | Este curso de IA generativa y LLMs va a estar dividido en 3 partes:
16 |
17 | 1. 🧩 **Fundamentos de LLM** cubre conocimientos esenciales sobre matemáticas, Python y redes neuronales.
18 | 2. 🧑🔬 **El Científico de LLM** se enfoca en construir los mejores LLMs posibles usando las técnicas más recientes.
19 | 3. 👷 **El Ingeniero de LLM** se concentra en crear aplicaciones basadas en LLM y desplegarlas.
20 |
21 | ## 📝 Cuadernos
22 |
23 | Una lista de cuadernos y artículos relacionados con modelos de lenguaje grandes.
24 |
25 | ### Herramientas
26 |
27 | | Cuaderno | Descripción | Cuaderno |
28 | |----------|-------------|----------|
29 | | 🧐 LLM AutoEval | Evalúa automáticamente tus LLMs usando RunPod | |
30 | | 🥱 LazyMergekit | Fusiona modelos fácilmente usando mergekit en un clic. | |
31 | | ⚡ AutoGGUF | Cuantiza LLMs en formato GGUF en un clic. | |
32 | | 🌳 Árbol Genealógico de Modelos | Visualiza el árbol genealógico de modelos fusionados. | |
33 |
34 | ### Afinamiento
35 |
36 | | Cuaderno | Descripción | Artículo | Cuaderno |
37 | |---------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
38 | | Afinar Llama 2 en Google Colab | Guía paso a paso para afinar tu primer modelo Llama 2. | [Artículo](https://mlabonne.github.io/blog/posts/Fine_Tune_Your_Own_Llama_2_Model_in_a_Colab_Notebook.html) | |
39 | | Afinar LLMs con Axolotl | Guía de principio a fin para la herramienta de vanguardia para afinamiento. | [Artículo](https://mlabonne.github.io/blog/posts/A_Beginners_Guide_to_LLM_Finetuning.html) | |
40 | | Afinar Mistral-7b con DPO | Mejora el rendimiento de modelos afinados supervisados con DPO. | [Artículo](https://medium.com/towards-data-science/fine-tune-a-mistral-7b-model-with-direct-preference-optimization-708042745aac) | |
41 |
42 | ### Cuantización
43 |
44 | | Cuaderno | Descripción | Artículo | Cuaderno |
45 | |---------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
46 | | 1. Introducción a la Cuantización | Optimización de modelo de lenguaje grande usando cuantización de 8 bits. | [Artículo](https://mlabonne.github.io/blog/posts/Introduction_to_Weight_Quantization.html) | |
47 | | 2. Cuantización de 4 bits usando GPTQ | Cuantiza tus propios LLMs de código abierto para correrlos en hardware de consumidor. | [Artículo](https://mlabonne.github.io/blog/4bit_quantization/) | |
48 | | 3. Cuantización con GGUF y llama.cpp | Cuantiza modelos Llama 2 con llama.cpp y sube versiones GGUF al HF Hub. | [Artículo](https://mlabonne.github.io/blog/posts/Quantize_Llama_2_models_using_ggml.html) | |
49 | | 4. ExLlamaV2: La Biblioteca Más Rápida para Correr LLMs | Cuantiza y corre modelos EXL2 y súbelos al HF Hub. | [Artículo](https://mlabonne.github.io/blog/posts/ExLlamaV2_The_Fastest_Library_to_Run%C2%A0LLMs.html) | |
50 |
51 | ### Otros
52 |
53 | | Cuaderno | Descripción | Artículo | Cuaderno |
54 | |---------------------------------------|-------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
55 | | Estrategias de Decodificación en Modelos de Lenguaje Grandes | Una guía para la generación de texto desde la búsqueda por haz hasta el muestreo de núcleo | [Artículo](https://mlabonne.github.io/blog/posts/2022-06-07-Decoding_strategies.html) | |
56 | | Visualizando el Paisaje de Pérdida de GPT-2 | Gráfico 3D del paisaje de pérdida basado en perturbaciones de peso. | [Tweet](https://twitter.com/maximelabonne/status/1667618081844219904) | |
57 | | Mejorar ChatGPT con Grafos de Conocimiento | Amplía las respuestas de ChatGPT con grafos de conocimiento. | [Artículo](https://mlabonne.github.io/blog/posts/Article_Improve_ChatGPT_with_Knowledge_Graphs.html) | |
58 | | Fusionar LLMs con mergekit | Crea tus propios modelos fácilmente, ¡no se necesita GPU! | [Artículo](https://towardsdatascience.com/merge-large-language-models-with-mergekit-2118fb392b54) | |
59 |
60 | ## 🧩 Fundamentos de LLM
61 |
62 | ### 1. Matemáticas para Aprendizaje Automático
63 |
64 | Antes de dominar el aprendizaje automático, es importante entender los conceptos matemáticos fundamentales que impulsan estos algoritmos.
65 |
66 | - **Álgebra Lineal**: Esto es crucial para entender muchos algoritmos, especialmente aquellos usados en aprendizaje profundo. Conceptos clave incluyen vectores, matrices, determinantes, valores y vectores propios, espacios vectoriales y transformaciones lineales.
67 | - **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.
68 | - **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.
69 |
70 | 📚 Recursos:
71 |
72 | - [3Blue1Brown - La Esencia del Álgebra Lineal](https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab): Serie de videos que proporcionan una intuición geométrica de estos conceptos.
73 | - [StatQuest con Josh Starmer - Fundamentos de Estadística](https://www.youtube.com/watch?v=qBigTkBLU6g&list=PLblh5JKOoLUK0FLuzwntyYI10UQFUhsY9): Ofrece explicaciones simples y claras para muchos conceptos estadísticos.
74 | - [Intuición AP de Estadísticas por Ms Aerin](https://automata88.medium.com/list/cacc224d5e7d): Lista de artículos en Medium que proporcionan la intuición detrás de cada distribución de probabilidad.
75 | - [Álgebra Lineal Inmersiva](https://immersivemath.com/ila/learnmore.html): Otra interpretación visual del álgebra lineal.
76 | - [Khan Academy - Álgebra Lineal](https://www.khanacademy.org/math/linear-algebra): Genial para principiantes ya que explica los conceptos de manera muy intuitiva.
77 | - [Khan Academy - Cálculo](https://www.khanacademy.org/math/calculus-1): Un curso interactivo que cubre todos los fundamentos del cálculo.
78 | - [Khan Academy - Probabilidad y Estadística](https://www.khanacademy.org/math/statistics-probability): Presenta el material de forma fácil de entender.
79 |
80 | ---
81 |
82 | ### 2. Python para Aprendizaje Automático
83 |
84 | 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 bibliotecas de ciencia de datos.
85 |
86 | - **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.
87 | - **Bibliotecas de Ciencia de Datos**: Incluye familiaridad con NumPy para operaciones numéricas, Pandas para manipulación y análisis de datos, Matplotlib y Seaborn para visualización de datos.
88 | - **Preprocesamiento de Datos**: Esto involucra escalado y normalización de características, manejo de datos faltantes, detección de valores atípicos, codificación de datos categóricos y división de datos en conjuntos de entrenamiento, validación y prueba.
89 | - **Bibliotecas de Aprendizaje Automático**: Proficiencia con 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.
90 |
91 | 📚 Recursos:
92 |
93 | - [Real Python](https://realpython.com/): Un recurso comprensivo con artículos y tutoriales tanto para conceptos de Python principiantes como avanzados.
94 | - [freeCodeCamp - Aprende Python](https://www.youtube.com/watch?v=rfscVS0vtbw): Video largo que proporciona una introducción completa a todos los conceptos fundamentales en Python.
95 | - [Python Data Science Handbook](https://jakevdp.github.io/PythonDataScienceHandbook/): Libro digital gratuito que es un gran recurso para aprender pandas, NumPy, Matplotlib y Seaborn.
96 | - [freeCodeCamp - Aprendizaje Automático para Todos](https://youtu.be/i_LwzRVP7bg): Introducción práctica a diferentes algoritmos de aprendizaje automático para principiantes.
97 | - [Udacity - Introducción al Aprendizaje Automático](https://www.udacity.com/course/intro-to-machine-learning--ud120): Curso gratuito que cubre PCA y varios otros conceptos de aprendizaje automático.
98 |
99 | ---
100 |
101 | ### 3. Redes Neuronales
102 |
103 | 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.
104 |
105 | - **Fundamentos**: Esto incluye entender la estructura de una red neuronal como capas, pesos, sesgos y funciones de activación (sigmoide, tanh, ReLU, etc.)
106 | - **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.
107 | - **Sobreajuste**: 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.
108 | - **Implementar un Perceptrón Multicapa (MLP)**: Construye un MLP, también conocido como una red completamente conectada, usando PyTorch.
109 |
110 | 📚 Recursos:
111 |
112 | - [3Blue1Brown - Pero, ¿qué es una red neuronal?](https://www.youtube.com/watch?v=aircAruvnKk): Este video ofrece una explicación intuitiva de las redes neuronales y su funcionamiento interno.
113 | - [freeCodeCamp - Curso Acelerado de Aprendizaje Profundo](https://www.youtube.com/watch?v=VyWAvY2CF9c): Este video introduce de manera eficiente todos los conceptos más importantes en aprendizaje profundo.
114 | - [Fast.ai - Aprendizaje Profundo Práctico](https://course.fast.ai/): Curso gratuito diseñado para personas con experiencia en programación que quieran aprender sobre aprendizaje profundo.
115 | - [Patrick Loeber - Tutoriales de PyTorch](https://www.youtube.com/playlist?list=PLqnslRFeH2UrcDBWF5mfPGpqQDSta6VK4): Serie de videos para principiantes completos para aprender sobre PyTorch.
116 |
117 | ---
118 |
119 | ### 4. Procesamiento de Lenguaje Natural (NLP)
120 |
121 | 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.
122 |
123 | - **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.
124 | - **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.
125 | - **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 y FastText.
126 | - **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.
127 |
128 | 📚 Recursos:
129 |
130 | - [RealPython - NLP con spaCy en Python](https://realpython.com/natural-language-processing-spacy-python/): Guía exhaustiva sobre la biblioteca spaCy para tareas de NLP en Python.
131 | - [Kaggle - Guía de NLP](https://www.kaggle.com/learn-guide/natural-language-processing): Unos cuadernos y recursos para una explicación práctica de NLP en Python.
132 | - [Jay Alammar - La Ilustración Word2Vec](https://jalammar.github.io/illustrated-word2vec/): Una buena referencia para entender la famosa arquitectura Word2Vec.
133 | - [Jake Tae - PyTorch RNN desde Cero](https://jaketae.github.io/study/pytorch-rnn/): Implementación práctica y simple de modelos RNN, LSTM y GRU en PyTorch.
134 | - [Blog de Colah - Entendiendo las Redes LSTM](https://colah.github.io/posts/2015-08-Understanding-LSTMs/): Un artículo más teórico sobre la red LSTM.
135 |
136 | ## 🧑🔬 El Científico de LLM
137 |
138 | Esta sección del curso se enfoca en aprender cómo construir los mejores LLMs posibles usando las técnicas más recientes.
139 |
140 | ### 1. La arquitectura LLM
141 |
142 | 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.
143 |
144 | * **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.
145 | * **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).
146 | * **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.
147 | * **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.
148 |
149 | 📚 **Referencias**:
150 | - [El Transformer Ilustrado](https://jalammar.github.io/illustrated-transformer/) por Jay Alammar: Una explicación visual e intuitiva del modelo Transformer.
151 | - [El GPT-2 Ilustrado](https://jalammar.github.io/illustrated-gpt2/) por Jay Alammar: Más importante que el artículo anterior, se centra en la arquitectura GPT, muy similar a la de Llama.
152 | - [Visualización LLM](https://bbycroft.net/llm) por Brendan Bycroft: Increíble visualización 3D de lo que sucede dentro de un LLM.
153 | * [nanoGPT](https://www.youtube.com/watch?v=kCc8FmEb1nY) por Andrej Karpathy: Video de 2 horas en YouTube para reimplementar GPT desde cero (para programadores).
154 | * [¿Atención? ¡Atención!](https://lilianweng.github.io/posts/2018-06-24-attention/) por Lilian Weng: Introduce la necesidad de atención de una manera más formal.
155 | * [Estrategias de Decodificación en LLMs](https://mlabonne.github.io/blog/posts/2023-06-07-Decoding_strategies.html): Proporciona código y una introducción visual a las diferentes estrategias de decodificación para generar texto.
156 |
157 | ---
158 | ### 2. Construyendo un conjunto de datos de instrucciones
159 |
160 | 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.
161 |
162 | * **Conjunto de datos tipo [Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html)**: 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.
163 | * **Técnicas avanzadas**: Aprender cómo mejorar conjuntos de datos existentes con [Evol-Instruct](https://arxiv.org/abs/2304.12244), cómo generar datos sintéticos de alta calidad como en los papeles [Orca](https://arxiv.org/abs/2306.02707) y [phi-1](https://arxiv.org/abs/2306.11644).
164 | * **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.
165 | * **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](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/chatgpt?
166 |
167 | tabs=python&pivots=programming-language-chat-ml), [Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html), etc.
168 |
169 | 📚 **Referencias**:
170 | * [Preparando un Conjunto de Datos para Ajuste de Instrucciones](https://wandb.ai/capecape/alpaca_ft/reports/How-to-Fine-Tune-an-LLM-Part-1-Preparing-a-Dataset-for-Instruction-Tuning--Vmlldzo1NTcxNzE2) por Thomas Capelle: Exploración de los conjuntos de datos Alpaca y Alpaca-GPT4 y cómo formatearlos.
171 | * [Generando un Conjunto de Datos de Instrucción Clínica](https://medium.com/mlearning-ai/generating-a-clinical-instruction-dataset-in-portuguese-with-langchain-and-gpt-4-6ee9abfa41ae) por Solano Todeschini: Tutorial sobre cómo crear un conjunto de datos de instrucción sintético usando GPT-4.
172 | * [GPT 3.5 para clasificación de noticias](https://medium.com/@kshitiz.sahay26/how-i-created-an-instruction-dataset-using-gpt-3-5-to-fine-tune-llama-2-for-news-classification-ed02fe41c81f) 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.
173 | * [Creación de conjunto de datos para afinamiento de LLM](https://colab.research.google.com/drive/1GH8PW9-zAe4cXEZyOIE-T9uHXblIldAg?usp=sharing): Cuaderno que contiene algunas técnicas para filtrar un conjunto de datos y subir el resultado.
174 | * [Plantilla de Chat](https://huggingface.co/blog/chat-templates) por Matthew Carrigan: Página de Hugging Face sobre plantillas de prompts.
175 |
176 | ---
177 | ### 3. Preentrenamiento de modelos
178 |
179 | El preentrenamiento 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.
180 |
181 | * **Pipeline de datos**: El preentrenamiento requiere enormes conjuntos de datos (por ejemplo, [Llama 2](https://arxiv.org/abs/2307.09288) fue entrenado en 2 billones de tokens) que necesitan ser filtrados, tokenizados y agrupados con un vocabulario predefinido.
182 | * **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](https://github.com/NVIDIA/Megatron-LM) o [gpt-neox](https://github.com/EleutherAI/gpt-neox).
183 | * **Leyes de escalamiento**: Las [leyes de escalamiento](https://arxiv.org/pdf/2001.08361.pdf) 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.
184 | * **Computación de Alto Rendimiento**: 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.).
185 |
186 | 📚 **Referencias**:
187 | * [LLMDataHub](https://github.com/Zjh-819/LLMDataHub) por Junhao Zhao: Lista curada de conjuntos de datos para preentrenamiento, afinamiento y RLHF.
188 | * [Entrenando un modelo de lenguaje causal desde cero](https://huggingface.co/learn/nlp-course/chapter7/6?fw=pt) por Hugging Face: Preentrena un modelo GPT-2 desde cero usando la biblioteca transformers.
189 | * [TinyLlama](https://github.com/jzhang38/TinyLlama) por Zhang et al.: Consulta este proyecto para obtener un buen entendimiento de cómo se entrena un modelo Llama desde cero.
190 | * [Modelado de lenguaje causal](https://huggingface.co/docs/transformers/tasks/language_modeling) por Hugging Face: Explica la diferencia entre modelado de lenguaje causal y enmascarado y cómo afinar rápidamente un modelo Distil
191 |
192 | GPT-2.
193 | * [Las salvajes implicaciones de Chinchilla](https://www.lesswrong.com/posts/6Fpvch8RR29qLEWNH/chinchilla-s-wild-implications) por nostalgebraist: Discute las leyes de escalamiento y explica lo que significan para los LLMs en general.
194 | * [BLOOM](https://bigscience.notion.site/BLOOM-BigScience-176B-Model-ad073ca07cdf479398d5f95d88e218c4) 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.
195 | * [Libreta de bitácora OPT-175](https://github.com/facebookresearch/metaseq/blob/main/projects/OPT/chronicles/OPT175B_Logbook.pdf) 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).
196 | * [LLM 360](https://www.llm360.ai/): Un marco para LLMs de código abierto con código de entrenamiento y preparación de datos, datos, métricas y modelos.
197 |
198 | ---
199 | ### 4. Afinamiento Supervisado
200 |
201 | Los modelos preentrenados 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.
202 |
203 | * **Afinamiento completo**: El afinamiento completo se refiere a entrenar todos los parámetros en el modelo. No es una técnica eficiente, pero produce resultados ligeramente mejores.
204 | * [**LoRA**](https://arxiv.org/abs/2106.09685): 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.
205 | * [**QLoRA**](https://arxiv.org/abs/2305.14314): 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](https://github.com/unslothai/unsloth) para correrlo eficientemente en un cuaderno Colab gratuito.
206 | * **[Axolotl](https://github.com/OpenAccess-AI-Collective/axolotl)**: Una herramienta de afinamiento poderosa y fácil de usar que se utiliza en muchos modelos de código abierto de vanguardia.
207 | * [**DeepSpeed**](https://www.deepspeed.ai/): Preentrenamiento y afinamiento eficientes de LLMs para configuraciones multi-GPU y multi-nodo (implementado en Axolotl).
208 |
209 | 📚 **Referencias**:
210 | * [La Guía de Entrenamiento de LLM para Novatos](https://rentry.org/llm-training) por Alpin: Visión general de los principales conceptos y parámetros a considerar al afinar LLMs.
211 | * [Perspectivas de LoRA](https://lightning.ai/pages/community/lora-insights/) por Sebastian Raschka: Perspectivas prácticas sobre LoRA y cómo seleccionar los mejores parámetros.
212 | * [Afine Tu Propio Modelo Llama 2](https://mlabonne.github.io/blog/posts/Fine_Tune_Your_Own_Llama_2_Model_in_a_Colab_Notebook.html): Tutorial práctico sobre cómo afinar un modelo Llama 2 usando bibliotecas de Hugging Face.
213 | * [Rellenando Modelos de Lenguaje Grandes](https://towardsdatascience.com/padding-large-language-models-examples-with-llama-2-199fb10df8ff) por Benjamin Marie: Mejores prácticas para rellenar ejemplos de entrenamiento para LLMs causales
214 | * [Una Guía para Principiantes en Afinamiento de LLM](https://mlabonne.github.io/blog/posts/A_Beginners_Guide_to_LLM_Finetuning.html): Tutorial sobre cómo afinar un modelo CodeLlama usando Axolotl.
215 |
216 | ---
217 | ### 5. Aprendizaje por Refuerzo a partir de Retroalimentación Humana
218 |
219 | Después del afinamiento supervisado, el ARRH 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 y a menudo se ve como opcional.
220 |
221 | * **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.
222 | * [**Optimización de Política Proximal**](https://arxiv.org/abs/1707.06347): 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.
223 | * **[Optimización de Preferencia Directa](https://arxiv.org/abs/2305.18290)**: 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.
224 |
225 | 📚 **Referencias**:
226 | * [Una Introducción al Entrenamiento de LLMs usando ARRH](https://wandb.ai/ayush-thakur/Intro-RLAIF/reports/An-Introduction-to-Training-LLMs-Using-Reinforcement-Learning-From-Human-Feedback-RLHF---VmlldzozMzYyNjcy) por Ayush Thakur: Explica por qué el ARRH es deseable para reducir el sesgo y aumentar el rendimiento en LLMs.
227 | * [Ilustración ARRH](https://huggingface.co/blog/rlhf) por Hugging Face: Introducción al ARRH con entrenamiento de modelo de recompensa y afinamiento con aprendizaje por refuerzo.
228 | * [StackLLaMA](https://huggingface.co/blog/stackllama) por Hugging Face: Tutorial para alinear eficientemente un modelo LLaMA con ARRH usando la biblioteca de transformers.
229 | * [Entrenamiento de LLM: ARRH y Sus Alternativas](https://substack.com/profile/27393275-sebastian-raschka-phd) por Sebastian Rashcka: Visión general del proceso de ARRH y alternativas como RLAIF.
230 | * [Afinar Mistral-7b con DPO](https://huggingface.co/blog/dpo-trl): Tutorial para afinar un modelo Mistral-7b con DPO y reproducir [NeuralHermes-2.5](https://huggingface.co/mlabonne/NeuralHermes-2.5-Mistral-7B).
231 |
232 | ---
233 | ### 6. Evaluación
234 |
235 | 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."
236 |
237 | * **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.
238 | * **Benchmarks generales**: Basados en el [Language Model Evaluation Harness](https://github.com/EleutherAI/lm-evaluation-harness), el [Open LLM Leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard) es el principal benchmark para LLMs de propósito general (como ChatGPT). Hay otros benchmarks populares como [BigBench](https://github.com/google/BIG-bench), [MT-Bench](https://arxiv.org/abs/2306.05685), etc.
239 | * **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](https://pubmedqa.github.io/) para respuesta a preguntas biomédicas.
240 | * **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.
241 |
242 | 📚 **Referencias**:
243 | * [Perplejidad de modelos de longitud fija](https://huggingface.co/docs/transformers/perplexity) por Hugging Face: Visión general de la perplejidad con código para implementarlo con la biblioteca de transformers.
244 | * [BLEU a tu propio riesgo](https://towardsdatascience.com/evaluating-text-output-in-nlp-bleu-at-your-own-risk-e8609665a213) por Rachael Tatman: Visión general del puntaje BLEU y sus muchos problemas con ejemplos.
245 | * [Una Encuesta sobre la Evaluación de LLMs](https://arxiv.org/abs/2307.03109) por Chang et al.: Documento comprensivo sobre qué evaluar, dónde evaluar y cómo evaluar.
246 | * [Chatbot Arena Leaderboard](https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard) por lmsys: Clasificación Elo de LLMs de propósito general, basada en comparaciones hechas por humanos.
247 |
248 | ---
249 | ### 7. Cuantización
250 |
251 | 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.
252 |
253 | * **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.
254 | * **GGUF y llama.cpp**: Originalmente diseñado para correr en CPUs, [llama.cpp](https://github.com/ggerganov/llama.cpp) y el formato GGUF se han vuelto las herramientas más populares para correr LLMs en hardware de grado consumidor.
255 | * **GPTQ y EXL2**: [GPTQ](https://arxiv.org/abs/2210.17323) y, más específicamente, el formato [EXL2](https://github.com/turboderp/exllamav2) ofrecen una velocidad increíble pero solo pueden correr en GPUs. Los modelos también toman un largo tiempo en ser cuantizados.
256 | * **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.
257 |
258 | 📚 **Referencias**:
259 | * [Introducción a la cuantización](https://mlabonne.github.io/blog/posts/Introduction_to_Weight_Quantization.html): Visión general de la cuantización, cuantización absmax y punto cero, y LLM.int8() con código.
260 | * [Cuantiza modelos Llama con llama.cpp](https://mlabonne.github.io/blog/posts/Quantize_Llama_2_models_using_ggml.html): Tutorial sobre cómo cuantizar un modelo Llama 2 usando llama.cpp y el formato GGUF.
261 | * [Cuantización de LLM de 4 bits con GPTQ](https://mlabonne.github.io/blog/posts/Introduction_to_Weight_Quantization.html): Tutorial sobre cómo cuantizar un LLM usando el algoritmo GPTQ con AutoGPTQ.
262 | * [ExLlamaV2: La Biblioteca Más Rápida para Correr LLMs](https://mlabonne.github.io/blog/posts/ExLlamaV2_The_Fastest_Library_to_Run%C2%A0LLMs.html): Guía sobre cómo cuantizar un modelo Mistral usando el formato EXL2 y correrlo con la biblioteca ExLlamaV2.
263 | * [Entendiendo la Cuantización de Pesos Consciente de Activación](https://medium.com/friendliai/understanding-activation-aware-weight-quantization-awq-boosting-inference-serving-efficiency-in-10bb0faf63a8) por FriendliAI: Visión general de la técnica AWQ y sus beneficios.
264 |
265 | ---
266 | ### 8. Nuevas Tendencias
267 |
268 | * **Codificaciones posicionales**: Aprende cómo los LLMs codifican posiciones, especialmente esquemas de codificación posicional relativa como [RoPE](https://arxiv.org/abs/2104.09864). Implementa [YaRN](https://arxiv.org/abs/2309.00071) (multiplica la matriz de atención por un factor de temperatura) o [ALiBi](https://arxiv.org/abs/2108.12409) (penalización de atención basada en la distancia de tokens) para extender la longitud del contexto.
269 | * **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](https://github.com/cg123/mergekit) implementa los métodos de fusión más populares, como SLERP, [DARE](https://arxiv.org/abs/2311.03099), y [TIES](https://arxiv.org/abs/2311.03099).
270 | * **Mezcla de Expertos**: [Mixtral](https://arxiv.org/abs/2401.04088) repopularizó la arquitectura MoE gracias a su excelente rendimiento. Paralelamente, un tipo de frankenMoE emergió en la comunidad OSS fusionando modelos como [Phixtral](https://huggingface.co/mlabonne/phixtral-2x2_8), que es una opción más económica y performante.
271 | * **Modelos multimodales**: Estos modelos (como [CLIP](https://openai.com/research/clip), [Stable Diffusion](https://stability.ai/stable-image), o [LLaVA](https://llava-vl.github.io/)) 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.
272 |
273 | 📚 **Referencias**:
274 | * [Extendiendo el RoPE](https://blog.eleuther.ai/yarn/) por EleutherAI: Artículo que resume las diferentes técnicas de codificación de posición.
275 | * [Entendiendo YaRN](https://medium.com/@rcrajatchawla/understanding-yarn-extending-context-window-of-llms-3f21e3522465) por Rajat Chawla: Introducción a YaRN.
276 | * [Fusionar LLMs con mergekit](https://mlabonne.github.io/blog/posts/2024-01-08_Merge_LLMs_with_mergekit.html): Tutorial sobre fusión de modelos usando mergekit.
277 | * [Mezcla de Expertos Explicada](https://huggingface.co/blog/moe) por Hugging Face: Guía exhaustiva sobre MoEs y cómo funcionan.
278 | * [Modelos Multimodales Grandes](https://huyenchip.com/2023/10/10/multimodal.html) por Chip Huyen: Visión general de sistemas multimodales y la historia reciente de este campo.
279 |
280 | ## 👷 El Ingeniero de LLM
281 |
282 | 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.
283 |
284 | 
285 |
286 | ### 1. Ejecutando LLMs
287 |
288 | 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 guía pueden mejorar y restringir la salida para tus aplicaciones.
289 |
290 | * **APIs de LLM**: Las APIs son una manera conveniente de desplegar LLMs. Este espacio está dividido entre LLMs privados ([OpenAI](https://platform.openai.com/), [Google](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/overview), [Anthropic](https://docs.anthropic.com/claude/reference/getting-started-with-the-api), [Cohere](https://docs.cohere.com/docs), etc.) y LLMs de código abierto ([OpenRouter](https://openrouter.ai/), [Hugging Face](https://huggingface.co/inference-api), [Together AI](https://www.together.ai/), etc.).
291 | * **LLMs de código abierto**: El [Hugging Face Hub](https://huggingface.co/models) es un excelente lugar para encontrar LLMs. Puedes ejecutar algunos de ellos directamente en [Hugging Face Spaces](https://huggingface.co/spaces), o descargarlos y ejecutarlos localmente en aplicaciones como [LM Studio](https://lmstudio.ai/) o a través de la CLI con [llama.cpp](https://github.com/ggerganov/llama.cpp) o [Ollama](https://ollama.ai/).
292 | * **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.
293 | * **Estructurando salidas**: Muchas tareas requieren una salida estructurada, como una plantilla estricta o un formato JSON. Bibliotecas como [LMQL](https://lmql.ai/), [Outlines](https://github.com/outlines-dev/outlines), [Guidance](https://github.com/guidance-ai/guidance), etc. pueden usarse para guiar la generación y respetar una estructura dada.
294 |
295 | 📚 **Referencias**:
296 | * [Ejecuta un LLM localmente con LM Studio](https://www.kdnuggets.com/run-an-llm-locally-with-lm-studio) por Nisha Arya: Guía corta sobre cómo usar LM Studio.
297 | * [Guía de ingeniería de prompts](https://www.promptingguide.ai/) por DAIR.AI: Lista exhaustiva de técnicas de prompts con ejemplos.
298 | * [Outlines - Inicio rápido](https://outlines-dev.github.io/outlines/quickstart/): Lista de técnicas de generación guiada habilitadas por Outlines.
299 | * [LMQL - Visión general](https://lmql.ai/docs/language/overview.html): Introducción al lenguaje LMQL.
300 |
301 | ---
302 | ### 2. Construyendo un Almacenamiento de Vectores
303 |
304 | Crear un almacenamiento de vectores es el primer paso para construir una tubería de Generación Aumentada por Recuperación (RAG). Los documentos se cargan, se dividen y los fragmentos relevantes se usan para producir representaciones vectoriales (incrustaciones) que se almacenan para su uso futuro durante la inferencia.
305 |
306 | * **Ingesta de documentos**: Los cargadores de documentos son envoltorios convenientes que pueden manejar muchos formatos: PDF, JSON, HTML, Markdown, etc. También pueden recuperar datos directamente de algunas bases de datos y APIs (GitHub, Reddit, Google Drive, etc.).
307 | * **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.
308 | * **Modelos de incrustación**: Los modelos de incrustación convierten el texto en representaciones vectoriales. Permite una comprensión más profunda y matizada del lenguaje, esencial para realizar búsquedas semánticas.
309 | * **Bases de datos vectoriales**: Las bases de datos vectoriales (como [Chroma](https://www.trychroma.com/), [Pinecone](https://www.pinecone.io/), [Milvus
310 |
311 | 📚 **Referencias**:
312 | * [LangChain - Divisores de texto](https://python.langchain.com/docs/modules/data_connection/document_transformers/): Lista de diferentes divisores de texto implementados en LangChain.
313 | * [Biblioteca de Transformadores de Oraciones](https://www.sbert.net/): Biblioteca popular para modelos de incrustación.
314 | * [Tablero de Líderes MTEB](https://huggingface.co/spaces/mteb/leaderboard): Tablero de líderes para modelos de incrustación.
315 | * [Las 5 Mejores Bases de Datos Vectoriales](https://www.datacamp.com/blog/the-top-5-vector-databases) por Moez Ali: Una comparación de las mejores y más populares bases de datos vectoriales.
316 |
317 | ---
318 | ### 3. Generación Aumentada por Recuperación (RAG)
319 |
320 | 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.
321 |
322 | * **Orquestadores**: Los orquestadores (como [LangChain](https://python.langchain.com/docs/get_started/introduction), [LlamaIndex](https://docs.llamaindex.ai/en/stable/), [FastRAG](https://github.com/IntelLabs/fastRAG), etc.) son marcos populares para conectar tus LLMs con herramientas, bases de datos, memorias, etc., y aumentar sus habilidades.
323 | * **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](https://arxiv.org/abs/2212.10496), etc.) pueden aplicarse para reformular/ampliarlas y mejorar el rendimiento.
324 | * **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.
325 | * **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](https://github.com/explodinggradients/ragas/tree/main) y [DeepEval](https://github.com/confident-ai/deepeval).
326 |
327 | 📚 **Referencias**:
328 | * [Llamaindex - Conceptos de alto nivel](https://docs.llamaindex.ai/en/stable/getting_started/concepts.html): Conceptos principales a conocer al construir tuberías RAG.
329 | * [Pinecone - Augmentación de Recuperación](https://www.pinecone.io/learn/series/langchain/langchain-retrieval-augmentation/): Visión general del proceso de augmentación de recuperación.
330 | * [LangChain - Q&A con RAG](https://python.langchain.com/docs/use_cases/question_answering/quickstart): Tutorial paso a paso para construir una típica tubería RAG.
331 | * [LangChain - Tipos de memoria](https://python.langchain.com/docs/modules/memory/types/): Lista de diferentes tipos de memorias con usos relevantes.
332 | * [Pipeline RAG - Métricas](https://docs.ragas.io/en/stable/concepts/metrics/index.html): Visión general de las principales métricas utilizadas para evaluar tuberías RAG.
333 |
334 | ---
335 | ### 4. RAG Avanzado
336 |
337 | Las aplicaciones de la vida real pueden requerir tuberías complejas, 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.
338 |
339 | * **Construcción de consultas**: 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.
340 | * **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.
341 | * **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](https://github.com/Raudaschl/rag-fusion), y clasificación.
342 |
343 | 📚 **Referencias**:
344 | * [LangChain - Construcción de Consultas](https://blog.langchain.dev/query-construction/): Publicación de blog sobre diferentes tipos de construcción de consultas.
345 | * [LangChain - SQL](https://python.langchain.com/docs/use_cases/qa_structured/sql): Tutorial sobre cómo interactuar con bases de datos SQL con LLMs, involucrando Texto-a-SQL y un agente SQL opcional.
346 | * [Pinecone - Agentes LLM](https://www.pinecone.io/learn/series/langchain/langchain-agents/): Introducción a agentes y herramientas con diferentes tipos.
347 | * [Agentes Autónomos Potenciados por LLM](https://lilianweng.github.io/posts/2023-06-23-agent/) por Lilian Weng: Artículo más teórico sobre agentes LLM.
348 | * [LangChain - RAG de OpenAI](https://blog.langchain.dev/applying-openai-rag/): Visión general de las estrategias RAG empleadas por OpenAI, incluyendo post-procesamiento.
349 |
350 | ---
351 | ### 5. Optimización de la Inferencia
352 |
353 | 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.
354 |
355 | * **Atención Flash**: Optimización del mecanismo de atención para transformar su complejidad de cuadrática a lineal, acelerando tanto el entrenamiento como la inferencia.
356 | * **Caché de clave-valor**: Entiende el caché de clave-valor y las mejoras introducidas en la [Atención de Múltiples Consultas](https://arxiv.org/abs/1911.02150) (MQA) y la [Atención de Consultas Agrupadas](https://arxiv.org/abs/2305.13245) (GQA).
357 | * **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.
358 |
359 | 📚 **Referencias**:
360 | * [Inferencia en GPU](https://huggingface.co/docs/transformers/main/en/perf_infer_gpu_one) por Hugging Face: Explica cómo optimizar la inferencia en GPUs.
361 | * [Inferencia de LLM](https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices) por Databricks: Mejores prácticas sobre cómo optimizar la inferencia de LLM en producción.
362 | * [Optimizando LLMs para Velocidad y Memoria](https://huggingface.co/docs/transformers/main/en/llm_tutorial_optimization) por Hugging Face: Explica tres técnicas principales para optimizar velocidad y memoria, a saber, cuantización, Atención Flash e innovaciones arquitectónicas.
363 | * [Generación Asistida](https://huggingface.co/blog/assisted-generation) 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.
364 |
365 | ---
366 | ### 6. Desplegando LLMs
367 |
368 | 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.
369 |
370 | * **Despliegue local**: La privacidad es una ventaja importante que los LLMs de código abierto tienen sobre los privados. Servidores LLM locales ([LM Studio](https://lmstudio.ai/), [Ollama](https://ollama.ai/), [oobabooga](https://github.com/oobabooga/text-generation-webui), [kobold.cpp](https://github.com/LostRuins/koboldcpp), etc.) capitalizan esta ventaja para potenciar aplicaciones locales.
371 | * **Despliegue de demostraciones**: Marcos como [Gradio](https://www.gradio.app/) y [Streamlit](https://docs.streamlit.io/) son útiles para prototipar aplicaciones y compartir demos. También puedes alojarlos fácilmente en línea, por ejemplo, usando [Hugging Face Spaces](https://huggingface.co/spaces).
372 | * **Despliegue de servidores**: Desplegar LLMs a escala requiere infraestructura en la nube (ver también [SkyPilot](https://skypilot.readthedocs.io/en/latest/)) o local y a menudo aprovecha marcos de generación de texto optimizados como [TGI](https://github.com/huggingface/text-generation-inference), [vLLM](https://github.com/vllm-project/vllm/tree/main), etc.
373 | * **Despliegue en el borde**: En entornos restringidos, marcos de alto rendimiento como [MLC LLM](https://github.com/mlc-ai/mlc-llm) y [mnn-llm](https://github.com/wangzhaode/mnn-llm/blob/master/README_en.md) pueden desplegar LLMs en navegadores web, Android e iOS.
374 |
375 | 📚 **Referencias**:
376 | * [Streamlit - Construye una aplicación LLM básica](https://docs.streamlit.io/knowledge-base/tutorials/build-conversational-apps): Tutorial para hacer una app básica tipo ChatGPT usando Streamlit.
377 | * [Contenedor de Inferencia LLM de HF](https://huggingface.co/blog/sagemaker-huggingface-llm): Despliega LLMs en Amazon SageMaker usando el contenedor de inferencia de Hugging Face.
378 | * [Blog de Philschmid](https://www.philschmid.de/) por Philipp Schmid: Colección de artículos de alta calidad sobre despliegue de LLMs usando Amazon SageMaker.
379 | * [Optimizando la latencia](https://hamel.dev/notes/llm/inference/03_inference.html) por Hamel Husain: Comparación de TGI, vLLM, CTranslate2 y mlc en términos de rendimiento y latencia.
380 |
381 | ---
382 | ### 7. Asegurando LLMs
383 |
384 | 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 solicitados.
385 |
386 | * **Hackeo de prompts**: Diferentes técnicas relacionadas con la ingeniería de prompts, incluyendo inyección de prompts (instrucción adicional para secuestrar la respuesta del modelo), filtración de datos/prompts (recuperar sus datos/prompts originales), y jailbreaking (crear prompts para eludir características de seguridad).
387 | * **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).
388 | * **Medidas defensivas**: La mejor manera de proteger tus aplicaciones LLM es probarlas contra estas vulnerabilidades (por ejemplo, usando equipos rojos y controles como [garak](https://github.com/leondz/garak/)) y observarlas en producción (con un marco como [langfuse](https://github.com/langfuse/langfuse)).
389 |
390 | 📚 **Referencias**:
391 | * [OWASP Top 10 para aplicaciones de LLM](https://owasp.org/www-project-top-10-for-large-language-model-applications/) por HEGO Wiki: Lista de las 10 vulnerabilidades críticas más vistas en aplicaciones LLM.
392 | * [Primer sobre Inyección de Prompts](https://github.com/jthack/PIPE) por Joseph Thacker: Guía corta dedicada a la inyección de prompts para ingenieros.
393 | * [Seguridad LLM](https://llmsecurity.net/) por [@llm_sec](https://twitter.com/llm_sec): Lista extensiva de recursos relacionados con la seguridad LLM.
394 | * [Equipos rojos en LLMs](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/red-teaming) por Microsoft: Guía sobre cómo realizar equipos rojos con LLMs.
395 |
396 | ---
397 | ## Acknowledgements
398 |
399 | This roadmap was inspired by the excellent [DevOps Roadmap](https://github.com/milanm/DevOps-Roadmap) from Milan Milanović and Romano Roth.
400 |
401 | Special thanks to:
402 |
403 | * Thomas Thelen for motivating me to create a roadmap
404 | * André Frade for his input and review of the first draft
405 | * Dino Dunn for providing resources about LLM security
406 |
407 | *Disclaimer: I am not affiliated with any sources listed here.*
408 |
409 | ---
410 |
10 |
11 |
12 | Este curso de IA generativa y LLMs va a estar dividido en 3 partes:
13 |
14 | 1. 🧩 **Fundamentos de IA** cubre conocimientos esenciales sobre matemáticas, Python y redes neuronales.
15 | 2. 🧑🔬 **Científico/a de LLMs** se enfoca en construir los mejores LLMs posibles usando las técnicas más recientes.
16 | 3. 👷 **Ingeniero/a de LLMs** se concentra en crear aplicaciones basadas en LLM y desplegarlas.
17 |
18 | >[!NOTE]
19 | >todo este laburo se basa en el [repo de @mlabonne](https://github.com/mlabonne/llm-course), **vayan a meterle una ⭐ ya mismo!**
20 |
21 | ## 📹 Clases en video
22 |
23 | ... proximamente ...
24 |
25 | ## 📹 Videos random
26 |
27 | Una lista de algunos videos que hice ([@machinelearnear](https://www.youtube.com/@machinelearnear)) que tocan varios de estos temas
28 |
29 | - 📁 **@machinelearnear**
30 | - 📹 [Cómo es que funciona realmente Stable Diffusion? (Guia ilustrada paso a paso)](https://www.youtube.com/watch?v=00NV4EXcpLQ&ab_channel=machinelearnear)
31 | - 📹 [Como crear ChatGPT desde 0 explicado](https://www.youtube.com/watch?v=4uXeflZ8q8w&ab_channel=machinelearnear)
32 | - 📹 [Habilidades emergentes de GPT-3.5](https://www.youtube.com/watch?v=TYFy0wZpJuY&ab_channel=machinelearnear)
33 | - 📹 [Reinforcement Learning from Human Feedback](https://www.youtube.com/watch?v=tzPuVAJ3XoI&ab_channel=machinelearnear)
34 | - 📹 [In-Context Learning & Gradient Descent](https://www.youtube.com/watch?v=TMYpH8wsGFU&ab_channel=machinelearnear)
35 | - 📹 [Que hace que un agente de diálogo sea útil?](https://www.youtube.com/watch?v=DRf4j0EpYuQ&ab_channel=machinelearnear)
36 | - 📹 ["Estado de GPT" por Andrej Karpathy](https://www.youtube.com/watch?v=aqv6Sd67R7M&ab_channel=machinelearnear)
37 | - 📹 [Como las empresas crean aplicaciones con LLMs](https://www.youtube.com/watch?v=7YDxI66fySk&ab_channel=machinelearnear)
38 | - 📹 [Tutorial para hacer una aplicación con GPT4, LangChain, Whisper, y otros](https://www.youtube.com/watch?v=1Rpn4lrshlo&ab_channel=machinelearnear)
39 | - 📹 [Ingenieria de Prompts (Octubre 2023)](https://www.youtube.com/watch?v=21pUaHVlHaQ&ab_channel=machinelearnear)
40 |
41 | Y acá otra colección de excelentes videos tocando varios temas de IA generativa y LLMs.
42 |
43 | - 📁 **@otros**
44 | - 📹 [Intro to Large Language Models](https://www.youtube.com/watch?v=zjkBMFhNj_g&ab_channel=AndrejKarpathy)
45 | - 📹 [Let's build GPT: from scratch, in code, spelled out](https://www.youtube.com/watch?v=kCc8FmEb1nY&ab_channel=AndrejKarpathy)
46 | - 📹 [Training and deploying open-source large language models](https://www.youtube.com/watch?v=Ma4clS-IdhA&ab_channel=NielsRogge)
47 | - 📹 [Transformers demystified: how do ChatGPT, GPT-4, LLaMa work?](https://www.youtube.com/watch?v=C6ZszXYPDDw&ab_channel=NielsRogge)
48 | - 📹 [LLM Bootcamp - Spring 2023](https://www.youtube.com/playlist?list=PL1T8fO7ArWleyIqOy37OVXsP4hFXymdOZ)
49 | - 📹 [Stanford CS25 - Transformers United](https://www.youtube.com/playlist?list=PLoROMvodv4rNiJRchCzutFw5ItR_Z27CM)
50 | - 📹 [EfficientML.ai Lecture, Fall 2023, MIT 6.5940](https://www.youtube.com/playlist?list=PL80kAHvQbh-pT4lCkDT53zT8DKmhE0idB)
51 | - 📹 [Natural Language Processing at UT Austin, 2023-2024 version (Greg Durrett)](https://www.youtube.com/playlist?list=PLofp2YXfp7TZZ5c7HEChs0_wfEfewLDs7)
52 | - 📹 [Harvard CS50’s Introduction to Programming with Python – Full University Course](https://www.youtube.com/watch?v=nLRL_NcnK-4&ab_channel=freeCodeCamp.org)
53 | - 📹 [MIT 6.S191: Introduction to Deep Learning](https://www.youtube.com/playlist?list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI)
54 | - 📹 [Neural Networks: Zero to Hero](https://www.youtube.com/playlist?list=PLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ)
55 | - 📹 [Computer Vision in Practice](https://www.youtube.com/playlist?list=PLZCA39VpuaZajiCtgDDwU8ghchtqx347R)
56 | - 📹 [UMass CS685: Advanced Natural Language Processing (Spring 2023)](https://www.youtube.com/playlist?list=PLWnsVgP6CzaelCF_jmn5HrpOXzRAPNjWj)
57 | - 📹 [Stanford CS229: Machine Learning I Spring 2022](https://www.youtube.com/playlist?list=PLoROMvodv4rNyWOpJg_Yh4NSqI4Z4vOYy)
58 | - 📹 [Machine Learning Engineering for Production (MLOps)](https://www.youtube.com/playlist?list=PLkDaE6sCZn6GMoA0wbpJLi3t34Gd8l0aK)
59 | - 📹 [CMU Multimodal Machine Learning course (11-777), Fall 2022 semester](https://www.youtube.com/playlist?list=PL-Fhd_vrvisNM7pbbevXKAbT_Xmub37fA)
60 | - 📹 [Stanford CS330: Deep Multi-Task and Meta Learning I Autumn 2022](https://www.youtube.com/playlist?list=PLoROMvodv4rNjRoawgt72BBNwL2V7doGI)
61 | - 📹 [Practical Deep Learning for Coders](https://www.youtube.com/playlist?list=PLfYUBJiXbdtSvpQjSnJJ_PmDQB_VyT5iU)
62 | - 📹 [Stanford CS224U: Natural Language Understanding | Spring 2021](https://www.youtube.com/playlist?list=PLoROMvodv4rPt5D0zs3YhbWSZA8Q_DyiJ)
63 | - 📹 [NYU Deep Learning Fall 2022](https://www.youtube.com/playlist?list=PLLHTzKZzVU9d_3TcHbyiAjl5qCbpJR-o0)
64 | - 📹 [DeepMind x UCL | Deep Learning Lecture Series 2021](https://www.youtube.com/playlist?list=PLqYmG7hTraZDVH599EItlEWsUOsJbAodm)
65 | - 📹 [Stanford CS224N: Natural Language Processing with Deep Learning | Winter 2021](https://www.youtube.com/playlist?list=PLoROMvodv4rOSH4v6133s9LFPRHjEmbmJ)
66 | - 📹 [DeepMind x UCL | Deep Learning Lecture Series 2020](https://www.youtube.com/playlist?list=PLqYmG7hTraZCDxZ44o4p3N5Anz3lLRVZF)
67 | - 📹 [Deep Learning for Computer Vision](https://www.youtube.com/playlist?list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r)
68 | - 📹 [Lecture Collection | Convolutional Neural Networks for Visual Recognition (Spring 2017)](https://www.youtube.com/playlist?app=desktop&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv)
69 | - 📹 [Statistics 110: Probability](https://www.youtube.com/playlist?list=PL2SOU6wwxB0uwwH80KTQ6ht66KWxbzTIo)
70 |
71 | ## 📝 Notebooks
72 |
73 | Una lista de notebooks y artículos relacionados con modelos de lenguaje grandes hechos por [@mlabonne](https://github.com/mlabonne).
74 |
75 | - 📁 **Herramientas**
76 | - 🧐 **LLM AutoEval** - Evalúa automáticamente tus LLMs usando RunPod. [Abrir en Colab](https://colab.research.google.com/)
77 | - 🥱 **LazyMergekit** - Fusiona modelos fácilmente usando mergekit en un clic. [Abrir en Colab](https://colab.research.google.com/)
78 | - ⚡ **AutoGGUF** - Cuantiza LLMs en formato GGUF en un click. [Abrir en Colab](https://colab.research.google.com/)
79 | - 🌳 **Árbol genealógico de modelos** - Visualiza el árbol genealógico de modelos fusionados. [Abrir en Colab](https://colab.research.google.com/)
80 |
81 | - 🎛 **Ajuste fino**
82 | - 🧐 **Ajuste fino de Llama-2 en Google Colab** - Guía paso a paso para afinar tu primer modelo Llama 2. [Artículo](https://mlabonne.github.io/blog/posts/Fine_Tune_Your_Own_Llama_2_Model_in_a_Colab_Notebook.html) | [Abrir en Colab](https://colab.research.google.com/)
83 | - 🥱 **Ajuste fino de LLMs con Axolotl** - Guía de principio a fin para la herramienta de vanguardia para afinamiento. [Artículo](https://mlabonne.github.io/blog/posts/A_Beginners_Guide_to_LLM_Finetuning.html) | [Abrir en Colab](https://colab.research.google.com/)
84 | - ⚡ **Ajuste fino de Mistral-7b con DPO** - Mejora el rendimiento de modelos afinados supervisados con DPO. [Artículo](https://medium.com/towards-data-science/fine-tune-a-mistral-7b-model-with-direct-preference-optimization-708042745aac) | [Abrir en Colab](https://colab.research.google.com/)
85 |
86 | - 💾 **Cuantización**
87 | - 1️⃣ **Introducción a la cuantización** - Optimización de LLMs usando cuantización de 8 bits. [Artículo](https://mlabonne.github.io/blog/posts/Introduction_to_Weight_Quantization.html) | [Abrir en Colab](https://colab.research.google.com/)
88 | - 2️⃣ **Cuantización de 4 bits usando GPTQ** - Cuantiza tus propios LLMs de código abierto. [Artículo](https://mlabonne.github.io/blog/4bit_quantization/) | [Abrir en Colab](https://colab.research.google.com/)
89 | - 3️⃣ **Cuantización con GGUF y `llama.cpp`** - Llama 2 con llama.cpp y sube versiones GGUF al HF Hub. [Artículo](https://mlabonne.github.io/blog/posts/Quantize_Llama_2_models_using_ggml.html) | [Abrir en Colab](https://colab.research.google.com/)
90 | - 4️⃣ **ExLlamaV2** - Cuantiza y corre modelos EXL2 y súbelos al HF Hub. [Artículo](https://mlabonne.github.io/blog/posts/ExLlamaV2_The_Fastest_Library_to_Run%C2%A0LLMs.html) | [Abrir en Colab](https://colab.research.google.com/)
91 |
92 | - 📚 **Otros**
93 | - 📖 **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](https://mlabonne.github.io/blog/posts/2022-06-07-Decoding_strategies.html) | [Abrir en Colab](https://colab.research.google.com/)
94 | - 🌐 **Visualizar el paisaje de pérdida de GPT-2** - Gráfico 3D del paisaje de pérdida basado en perturbaciones de peso. [Tweet](https://twitter.com/maximelabonne/status/1667618081844219904) | [Abrir en Colab](https://colab.research.google.com/)
95 | - 🚀 **Mejorar ChatGPT con grafos de conocimiento** - Amplía las respuestas de ChatGPT con grafos de conocimiento. [Artículo](https://mlabonne.github.io/blog/posts/Article_Improve_ChatGPT_with_Knowledge_Graphs.html) | [Abrir en Colab](https://colab.research.google.com/)
96 | - 🛠 **Fusionar LLMs usando `mergekit`** - Crea tus propios modelos fácilmente, ¡no se necesita GPU! [Artículo](https://towardsdatascience.com/merge-large-language-models-with-mergekit-2118fb392b54) | [Abrir en Colab](https://colab.research.google.com/)
97 |
98 | ## 🧩 Roadmap para aprender fundamentos de IA
99 |
100 | ```
101 | 📁
102 | ├── 📚 Matemáticas para el aprendizaje automático
103 | │ ├── 🧮 Álgebra lineal
104 | │ ├── 🔢 Cálculo
105 | │ └── 📊 Probabilidad y estadística
106 | ├── 🐍 Python para el aprendizaje automático
107 | │ ├── 💻 Fundamentos de Python
108 | │ └── 📊 Bibliotecas de ciencia de datos
109 | ├── 🧠 Redes neuronales
110 | │ ├── 📖 Fundamentos
111 | │ ├── ⚙️ Entrenamiento y optimización
112 | │ └── ⚠️ Sobreajuste
113 | └── 💬 Procesamiento de lenguaje natural
114 | ├── 📝 Preprocesamiento de texto
115 | ├── ✨ Técnicas de extracción de características
116 | ├── 🪄 Representaciones de palabras
117 | └── 🔄 Redes neuronales recurrentes (RNN)
118 | ```
119 | ### Matemáticas para aprendizaje automático
120 |
121 | Antes de dominar el aprendizaje automático (ML o machine learning), es importante entender los conceptos matemáticos fundamentales que impulsan estos algoritmos.
122 |
123 | - **Á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.
124 | - **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.
125 | - **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.
126 |
127 | 📚 **Referencias**:
128 |
129 | - [3Blue1Brown, La Esencia del álgebra lineal](https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab): Serie de videos que proporcionan una intuición geométrica de estos conceptos.
130 | - [StatQuest con Josh Starmer, Fundamentos de estadística](https://www.youtube.com/watch?v=qBigTkBLU6g&list=PLblh5JKOoLUK0FLuzwntyYI10UQFUhsY9): Ofrece explicaciones simples y claras para muchos conceptos estadísticos.
131 | - [Intuición AP de estadísticas por Ms Aerin](https://automata88.medium.com/list/cacc224d5e7d): Lista de artículos en Medium que proporcionan la intuición detrás de cada distribución de probabilidad.
132 | - [Álgebra lineal inmersiva](https://immersivemath.com/ila/learnmore.html): Otra interpretación visual del álgebra lineal.
133 | - [Khan Academy, Álgebra lineal](https://www.khanacademy.org/math/linear-algebra): Genial para principiantes ya que explica los conceptos de manera muy intuitiva.
134 | - [Khan Academy, Cálculo](https://www.khanacademy.org/math/calculus-1): Un curso interactivo que cubre todos los fundamentos del cálculo.
135 | - [Khan Academy, Probabilidad y estadística](https://www.khanacademy.org/math/statistics-probability): Presenta el material de forma fácil de entender.
136 |
137 | ---
138 |
139 | ### Python para aprendizaje automático
140 |
141 | 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.
142 |
143 | - **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.
144 | - **Librerías de ciencia de datos**: Incluye familiaridad con `NumPy` para operaciones numéricas, `Pandas` para manipulación y análisis de datos, `Matplotlib` y `Seaborn` para visualización de datos.
145 | - **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.
146 | - **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.
147 |
148 | 📚 **Referencias**:
149 |
150 | - [Real Python](https://realpython.com/): Un recurso comprensivo con artículos y tutoriales tanto para conceptos de Python principiantes como avanzados.
151 | - [freeCodeCamp, Aprende Python](https://www.youtube.com/watch?v=rfscVS0vtbw): Video largo que proporciona una introducción completa a todos los conceptos fundamentales en Python.
152 | - [Python Data Science Handbook](https://jakevdp.github.io/PythonDataScienceHandbook/): Libro digital gratuito que es un gran recurso para aprender pandas, NumPy, Matplotlib y Seaborn.
153 | - [freeCodeCamp, Aprendizaje automático para todos](https://youtu.be/i_LwzRVP7bg): Introducción práctica a diferentes algoritmos de aprendizaje automático para principiantes.
154 | - [Udacity, Introducción al aprendizaje automático](https://www.udacity.com/course/intro-to-machine-learning--ud120): Curso gratuito que cubre PCA y varios otros conceptos de aprendizaje automático.
155 |
156 | ---
157 |
158 | ### Redes neuronales
159 |
160 | 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.
161 |
162 | - **Fundamentos**: Esto incluye entender la estructura de una red neuronal como capas, pesos, sesgos y funciones de activación (sigmoide, tanh, ReLU, etc.)
163 | - **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.
164 | - **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.
165 | - **Implementar un perceptrón multicapa (MLP)**: Construye un `MLP`, también conocido como una red completamente conectada (fully-connected network), usando `PyTorch`.
166 |
167 | 📚 **Referencias**:
168 |
169 | - [3Blue1Brown, "Pero, ¿qué es una red neuronal?"](https://www.youtube.com/watch?v=aircAruvnKk): Este video ofrece una explicación intuitiva de las redes neuronales y su funcionamiento interno.
170 | - [freeCodeCamp, Curso acelerado de aprendizaje profundo](https://www.youtube.com/watch?v=VyWAvY2CF9c): Este video introduce de manera eficiente todos los conceptos más importantes en aprendizaje profundo.
171 | - [Fast.ai, Aprendizaje profundo práctico](https://course.fast.ai/): Curso gratuito diseñado para personas con experiencia en programación que quieran aprender sobre aprendizaje profundo.
172 | - [Patrick Loeber, Tutoriales de PyTorch](https://www.youtube.com/playlist?list=PLqnslRFeH2UrcDBWF5mfPGpqQDSta6VK4): Serie de videos para principiantes completos para aprender sobre PyTorch.
173 |
174 | ---
175 |
176 | ### Procesamiento de lenguaje natural (NLP)
177 |
178 | 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.
179 |
180 | - **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.
181 | - **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.
182 | - **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` y `FastText`.
183 | - **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.
184 |
185 | 📚 **Referencias**:
186 |
187 | - [RealPython, NLP con `spaCy` en Python](https://realpython.com/natural-language-processing-spacy-python/): Guía exhaustiva sobre la biblioteca spaCy para tareas de NLP en Python.
188 | - [Kaggle, Guía de NLP](https://www.kaggle.com/learn-guide/natural-language-processing): Unos cuadernos y recursos para una explicación práctica de NLP en Python.
189 | - [Jay Alammar, Word2Vec ilustrado](https://jalammar.github.io/illustrated-word2vec/): Una buena referencia para entender la famosa arquitectura Word2Vec.
190 | - [Jake Tae, PyTorch RNN desde cero](https://jaketae.github.io/study/pytorch-rnn/): Implementación práctica y simple de modelos RNN, LSTM y GRU en PyTorch.
191 | - [Blog de Colah, Entendiendo las redes LSTM](https://colah.github.io/posts/2015-08-Understanding-LSTMs/): Un artículo más teórico sobre la red LSTM.
192 |
193 | ## 🧑🔬 Roadmap para ser científico/a de LLMs
194 |
195 | Esta sección del curso se enfoca en aprender cómo construir los mejores LLMs posibles usando las técnicas más recientes.
196 |
197 | ```
198 | 📁
199 | ├── 🏗 Arquitectura de LLMs
200 | │ ├── 🌐 Visión general
201 | │ ├── 🔤 Tokenización
202 | │ ├── 🧠 Mecanismos de atención
203 | │ └── ✍️ Generación de texto
204 | ├── 🛠 Construcción de un dataset de instrucciones
205 | │ ├── 🦙 Dataset tipo Alpaca
206 | │ ├── 🧪 Técnicas avanzadas
207 | │ ├── 🚿 Filtrado de datos
208 | │ └── 📝 Plantillas de prompts
209 | ├── 🔄 Pre-entrenamiento de modelos
210 | │ ├── 📊 Pipeline de datos
211 | │ ├── 📖 Modelado de lenguaje causal
212 | │ ├── 📈 Leyes de escalado
213 | │ └── 💻 Computación de alto rendimiento
214 | ├── 🎛 Ajuste fino supervisado
215 | │ ├── 📚 Ajuste fino completo
216 | │ ├── 🧮 LoRA y QLoRA
217 | │ ├── 🐸 Axolotl
218 | │ └── 🚀 DeepSpeed
219 | ├── 🤖 RLHF
220 | │ ├── 📏 Métricas tradicionales
221 | │ ├── 🌍 Benchmarks generales
222 | │ ├── 🎯 Benchmarks específicos de tareas
223 | │ └── 👥 Evaluación humana
224 | ├── 🔢 Cuantización
225 | │ ├── 🛠 Técnicas base
226 | │ ├── 🦙 GGUF y llama.cpp
227 | │ ├── ⚡ GPTQ y EXL2
228 | │ └── 🏋️♂️ AWQ
229 | └── 🌟 Nuevas tendencias
230 | ├── 📍 Embeddings posicionales
231 | ├── 🔄 Fusión de modelos
232 | ├── 🧑🔬 Mix de expertos
233 | └── 🎭 Modelos multimodales
234 | ```
235 |
236 | ### Arquitectura de modelos de lenguaje grandes (LLMs)
237 |
238 | 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.
239 |
240 | * **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.
241 | * **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).
242 | * **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.
243 | * **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.
244 |
245 | 📚 **Referencias**:
246 | - [Transformers ilustrado](https://jalammar.github.io/illustrated-transformer/) por Jay Alammar: Una explicación visual e intuitiva del modelo Transformer.
247 | - [GPT-2 ilustrado](https://jalammar.github.io/illustrated-gpt2/) por Jay Alammar: Más importante que el artículo anterior, se centra en la arquitectura GPT, muy similar a la de Llama.
248 | - [Visualización de LLMs](https://bbycroft.net/llm) por Brendan Bycroft: Increíble visualización 3D de lo que sucede dentro de un LLM.
249 | * [`nanoGPT`](https://www.youtube.com/watch?v=kCc8FmEb1nY) por Andrej Karpathy: Video de 2 horas en YouTube para reimplementar GPT desde cero (para programadores).
250 | * [¿Atención? ¡Atención!](https://lilianweng.github.io/posts/2018-06-24-attention/) por Lilian Weng: Introduce la necesidad de atención de una manera más formal.
251 | * [Estrategias de decodificación en LLMs](https://mlabonne.github.io/blog/posts/2023-06-07-Decoding_strategies.html): Proporciona código y una introducción visual a las diferentes estrategias de decodificación para generar texto.
252 |
253 | ---
254 | ### Construyendo un dataset de instrucciones
255 |
256 | 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.
257 |
258 | * **Conjunto de datos tipo [Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html)**: 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.
259 | * **Técnicas avanzadas**: Aprender cómo mejorar conjuntos de datos existentes con [Evol-Instruct](https://arxiv.org/abs/2304.12244), cómo generar datos sintéticos de alta calidad como en los papeles [Orca](https://arxiv.org/abs/2306.02707) y [phi-1](https://arxiv.org/abs/2306.11644).
260 | * **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.
261 | * **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](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/chatgpt?tabs=python&pivots=programming-language-chat-ml), [Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html), etc.
262 |
263 | 📚 **Referencias**:
264 | * [Preparando un dataset para ajuste de instrucciones](https://wandb.ai/capecape/alpaca_ft/reports/How-to-Fine-Tune-an-LLM-Part-1-Preparing-a-Dataset-for-Instruction-Tuning--Vmlldzo1NTcxNzE2) por Thomas Capelle: Exploración de los conjuntos de datos Alpaca y Alpaca-GPT4 y cómo formatearlos.
265 | * [Generando un dataset de instrucción clínica](https://medium.com/mlearning-ai/generating-a-clinical-instruction-dataset-in-portuguese-with-langchain-and-gpt-4-6ee9abfa41ae) por Solano Todeschini: Tutorial sobre cómo crear un conjunto de datos de instrucción sintético usando GPT-4.
266 | * [GPT 3.5 para clasificación de noticias](https://medium.com/@kshitiz.sahay26/how-i-created-an-instruction-dataset-using-gpt-3-5-to-fine-tune-llama-2-for-news-classification-ed02fe41c81f) 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.
267 | * [Creación de conjunto de datos para ajuste fino de LLMs](https://colab.research.google.com/drive/1GH8PW9-zAe4cXEZyOIE-T9uHXblIldAg?usp=sharing): Cuaderno que contiene algunas técnicas para filtrar un conjunto de datos y subir el resultado.
268 | * [Plantilla de prompts](https://huggingface.co/blog/chat-templates) por Matthew Carrigan: Página de Hugging Face sobre plantillas de prompts.
269 |
270 | ---
271 | ### Pre-entrenamiento de modelos
272 |
273 | 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.
274 |
275 | * **Pipeline de datos**: El preentrenamiento requiere enormes conjuntos de datos (por ejemplo, [Llama 2](https://arxiv.org/abs/2307.09288) fue entrenado en 2 billones de tokens) que necesitan ser filtrados, tokenizados y agrupados con un vocabulario predefinido.
276 | * **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](https://github.com/NVIDIA/Megatron-LM) o [gpt-neox](https://github.com/EleutherAI/gpt-neox).
277 | * **Leyes de escalamiento ie. Chinchilla scaling laws**: Las [leyes de escalamiento](https://arxiv.org/pdf/2001.08361.pdf) 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.
278 | * **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.).
279 |
280 | 📚 **Referencias**:
281 | * [`LLMDataHub`](https://github.com/Zjh-819/LLMDataHub) por Junhao Zhao: Lista curada de conjuntos de datos para preentrenamiento, afinamiento y RLHF.
282 | * [Entrenando un modelo de lenguaje causal desde cero](https://huggingface.co/learn/nlp-course/chapter7/6?fw=pt) por Hugging Face: Preentrena un modelo GPT-2 desde cero usando la biblioteca transformers.
283 | * [`TinyLlama`](https://github.com/jzhang38/TinyLlama) por Zhang et al.: Consulta este proyecto para obtener un buen entendimiento de cómo se entrena un modelo Llama desde cero.
284 | * [Modelado de lenguaje causal](https://huggingface.co/docs/transformers/tasks/language_modeling) por Hugging Face: Explica la diferencia entre modelado de lenguaje causal y enmascarado y cómo afinar rápidamente un modelo DistilGPT-2.
285 | * [Las zarpadas implicaciones de Chinchilla](https://www.lesswrong.com/posts/6Fpvch8RR29qLEWNH/chinchilla-s-wild-implications) por nostalgebraist: Discute las leyes de escalamiento y explica lo que significan para los LLMs en general.
286 | * [BLOOM](https://bigscience.notion.site/BLOOM-BigScience-176B-Model-ad073ca07cdf479398d5f95d88e218c4) 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.
287 | * [Bitácora de entrenamiento de OPT-175](https://github.com/facebookresearch/metaseq/blob/main/projects/OPT/chronicles/OPT175B_Logbook.pdf) 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).
288 | * [LLM 360](https://www.llm360.ai/): Un marco para LLMs de código abierto con código de entrenamiento y preparación de datos, datos, métricas y modelos.
289 |
290 | ---
291 | ### Ajuste fino supervisado
292 |
293 | 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.
294 |
295 | * **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.
296 | * [**LoRA**](https://arxiv.org/abs/2106.09685): 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.
297 | * [**QLoRA**](https://arxiv.org/abs/2305.14314): 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](https://github.com/unslothai/unsloth) para correrlo eficientemente en un cuaderno Colab gratuito.
298 | * **[Axolotl](https://github.com/OpenAccess-AI-Collective/axolotl)**: Una herramienta de afinamiento poderosa y fácil de usar que se utiliza en muchos modelos de código abierto de vanguardia.
299 | * [**DeepSpeed**](https://www.deepspeed.ai/): Pre-entrenamiento y afinamiento eficientes de LLMs para configuraciones multi-GPU y multi-nodo (implementado en Axolotl).
300 |
301 | 📚 **Referencias**:
302 | * [Guía de entrenamiento de LLM para novatos](https://rentry.org/llm-training) por Alpin: Visión general de los principales conceptos y parámetros a considerar al afinar LLMs.
303 | * [Insights sobre LoRA](https://lightning.ai/pages/community/lora-insights/) por Sebastian Raschka: Perspectivas prácticas sobre LoRA y cómo seleccionar los mejores parámetros.
304 | * [Ajuste fino de tu propio modelo Llama-2](https://mlabonne.github.io/blog/posts/Fine_Tune_Your_Own_Llama_2_Model_in_a_Colab_Notebook.html): Tutorial práctico sobre cómo afinar un modelo Llama 2 usando bibliotecas de Hugging Face.
305 | * [Padding de modelos de lenguaje grandes](https://towardsdatascience.com/padding-large-language-models-examples-with-llama-2-199fb10df8ff) por Benjamin Marie: Mejores prácticas para rellenar ejemplos de entrenamiento para LLMs causales
306 | * [Una Guía para principiantes en ajuste fino de LLMs](https://mlabonne.github.io/blog/posts/A_Beginners_Guide_to_LLM_Finetuning.html): Tutorial sobre cómo afinar un modelo CodeLlama usando Axolotl.
307 |
308 | ---
309 | ### Aprendizaje por refuerzo a partir de feedback humano (RLHF)
310 |
311 | 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.
312 |
313 | * **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.
314 | * [**Optimización de política proxima**](https://arxiv.org/abs/1707.06347): 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.
315 | * **[Optimización de preferencia directa](https://arxiv.org/abs/2305.18290)**: 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.
316 |
317 | 📚 **Referencias**:
318 | * [Introducción al entrenamiento de LLMs usando RLHF](https://wandb.ai/ayush-thakur/Intro-RLAIF/reports/An-Introduction-to-Training-LLMs-Using-Reinforcement-Learning-From-Human-Feedback-RLHF---VmlldzozMzYyNjcy) por Ayush Thakur: Explica por qué el ARRH es deseable para reducir el sesgo y aumentar el rendimiento en LLMs.
319 | * [Ilustración RLHF](https://huggingface.co/blog/rlhf) por Hugging Face: Introducción al ARRH con entrenamiento de modelo de recompensa y afinamiento con aprendizaje por refuerzo.
320 | * [StackLLaMA](https://huggingface.co/blog/stackllama) por Hugging Face: Tutorial para alinear eficientemente un modelo LLaMA con ARRH usando la biblioteca de transformers.
321 | * [Entrenamiento de LLM: RLHF y sus alternativas](https://substack.com/profile/27393275-sebastian-raschka-phd) por Sebastian Rashcka: Visión general del proceso de ARRH y alternativas como RLAIF.
322 | * [Ajuste fino de Mistral-7b con DPO](https://huggingface.co/blog/dpo-trl): Tutorial para afinar un modelo Mistral-7b con DPO y reproducir [NeuralHermes-2.5](https://huggingface.co/mlabonne/NeuralHermes-2.5-Mistral-7B).
323 |
324 | ---
325 | ### Evaluación de modelos
326 |
327 | 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."
328 |
329 | * **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.
330 | * **Benchmarks generales**: Basados en el [Language Model Evaluation Harness](https://github.com/EleutherAI/lm-evaluation-harness), el [Open LLM Leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard) es el principal benchmark para LLMs de propósito general (como ChatGPT). Hay otros benchmarks populares como [BigBench](https://github.com/google/BIG-bench), [MT-Bench](https://arxiv.org/abs/2306.05685), etc.
331 | * **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](https://pubmedqa.github.io/) para respuesta a preguntas biomédicas.
332 | * **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.
333 |
334 | 📚 **Referencias**:
335 | * [Perplejidad de modelos de longitud fija](https://huggingface.co/docs/transformers/perplexity) por Hugging Face: Visión general de la perplejidad con código para implementarlo con la biblioteca de transformers.
336 | * [BLEU a tu propio riesgo](https://towardsdatascience.com/evaluating-text-output-in-nlp-bleu-at-your-own-risk-e8609665a213) por Rachael Tatman: Visión general del puntaje BLEU y sus muchos problemas con ejemplos.
337 | * [Una encuesta sobre la evaluación de LLMs](https://arxiv.org/abs/2307.03109) por Chang et al.: Documento comprensivo sobre qué evaluar, dónde evaluar y cómo evaluar.
338 | * [Chatbot Arena Leaderboard](https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard) por lmsys: Clasificación Elo de LLMs de propósito general, basada en comparaciones hechas por humanos.
339 |
340 | ---
341 | ### Cuantización
342 |
343 | 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.
344 |
345 | * **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.
346 | * **`GGUF` y `llama.cpp`**: Originalmente diseñado para correr en CPUs, [llama.cpp](https://github.com/ggerganov/llama.cpp) y el formato GGUF se han vuelto las herramientas más populares para correr LLMs en hardware de grado consumidor.
347 | * **`GPTQ` y `EXL2`**: [GPTQ](https://arxiv.org/abs/2210.17323) y, más específicamente, el formato [EXL2](https://github.com/turboderp/exllamav2) ofrecen una velocidad increíble pero solo pueden correr en GPUs. Los modelos también toman un largo tiempo en ser cuantizados.
348 | * **`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.
349 |
350 | 📚 **Referencias**:
351 | * [Introducción a la cuantización](https://mlabonne.github.io/blog/posts/Introduction_to_Weight_Quantization.html): Visión general de la cuantización, cuantización absmax y punto cero, y LLM.int8() con código.
352 | * [Cuantiza modelos Llama con llama.cpp](https://mlabonne.github.io/blog/posts/Quantize_Llama_2_models_using_ggml.html): Tutorial sobre cómo cuantizar un modelo Llama 2 usando llama.cpp y el formato GGUF.
353 | * [Cuantización de LLM de 4 bits con GPTQ](https://mlabonne.github.io/blog/posts/Introduction_to_Weight_Quantization.html): Tutorial sobre cómo cuantizar un LLM usando el algoritmo GPTQ con AutoGPTQ.
354 | * [ExLlamaV2: La librería más rápida para correr LLMs](https://mlabonne.github.io/blog/posts/ExLlamaV2_The_Fastest_Library_to_Run%C2%A0LLMs.html): Guía sobre cómo cuantizar un modelo Mistral usando el formato EXL2 y correrlo con la biblioteca ExLlamaV2.
355 | * [Entendiendo la cuantización con AWQ](https://medium.com/friendliai/understanding-activation-aware-weight-quantization-awq-boosting-inference-serving-efficiency-in-10bb0faf63a8) por FriendliAI: Visión general de la técnica AWQ y sus beneficios.
356 |
357 | ---
358 | ### Nuevas tendencias
359 |
360 | * **Codificaciones posicionales**: Aprende cómo los LLMs codifican posiciones, especialmente esquemas de codificación posicional relativa como [RoPE](https://arxiv.org/abs/2104.09864). Implementa [YaRN](https://arxiv.org/abs/2309.00071) (multiplica la matriz de atención por un factor de temperatura) o [ALiBi](https://arxiv.org/abs/2108.12409) (penalización de atención basada en la distancia de tokens) para extender la longitud del contexto.
361 | * **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](https://github.com/cg123/mergekit) implementa los métodos de fusión más populares, como SLERP, [DARE](https://arxiv.org/abs/2311.03099), y [TIES](https://arxiv.org/abs/2311.03099).
362 | * **Mix de expertos**: [Mixtral](https://arxiv.org/abs/2401.04088) repopularizó la arquitectura MoE gracias a su excelente rendimiento. Paralelamente, un tipo de frankenMoE emergió en la comunidad OSS fusionando modelos como [Phixtral](https://huggingface.co/mlabonne/phixtral-2x2_8), que es una opción más económica y performante.
363 | * **Modelos multimodales**: Estos modelos (como [CLIP](https://openai.com/research/clip), [Stable Diffusion](https://stability.ai/stable-image), o [LLaVA](https://llava-vl.github.io/)) 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.
364 |
365 | 📚 **Referencias**:
366 | * [Extendiendo el RoPE](https://blog.eleuther.ai/yarn/) por EleutherAI: Artículo que resume las diferentes técnicas de codificación de posición.
367 | * [Entendiendo YaRN](https://medium.com/@rcrajatchawla/understanding-yarn-extending-context-window-of-llms-3f21e3522465) por Rajat Chawla: Introducción a YaRN.
368 | * [Fusionar LLMs con `mergekit`](https://mlabonne.github.io/blog/posts/2024-01-08_Merge_LLMs_with_mergekit.html): Tutorial sobre fusión de modelos usando mergekit.
369 | * [Mix de expertos explicado](https://huggingface.co/blog/moe) por Hugging Face: Guía exhaustiva sobre MoEs y cómo funcionan.
370 | * [Modelos multimodales grandes](https://huyenchip.com/2023/10/10/multimodal.html) por Chip Huyen: Visión general de sistemas multimodales y la historia reciente de este campo.
371 |
372 | ## 👷 Roadmap para ser ingeniero/a de LLMs
373 |
374 | 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.
375 |
376 | ```
377 | 📁
378 | ├── 🚀 Corriendo LLMs
379 | │ ├── 🌐 APIs de LLM
380 | │ ├── 📖 LLMs de código abierto
381 | │ ├── 💡 Ingeniería de prompts
382 | │ └── 📐 Estructuración de salidas
383 | ├── 🗂 Creando bases de datos vectoriales
384 | │ ├── 📥 Ingesta de documentos
385 | │ ├── ✂️ División de documentos
386 | │ ├── 🧬 Modelos de embedding
387 | │ └── 🗃 Bases de datos vectoriales
388 | ├── 🤖 Retrieval augmented generation (generación aumentada por recuperación)
389 | │ ├── 🎛 Orquestadores
390 | │ ├── 🔍 Retrievers
391 | │ ├── 🧠 Memoria
392 | │ └── 📋 Evaluación
393 | ├── ⚙️ RAG avanzado
394 | │ ├── 📝 Construcción de consultas
395 | │ ├── 🛠 Agentes y herramientas
396 | │ └── 🔄 Post-procesamiento
397 | ├── 🚄 Optimización de inferencia
398 | │ ├── ⚡ Flash attention
399 | │ ├── 🗝 Caché de key-value
400 | │ └── 🔮 Decodificación especulativa
401 | ├── 📡 Desplegando LLMs
402 | │ ├── 🏠 Despliegue local
403 | │ ├── 🎮 Despliegue de un prototipo
404 | │ ├── 🖥 Despliegue en un servidor
405 | │ └── 🌐 Despliegue en edge
406 | └── 🔒 Asegurando LLMs
407 | ├── 🎣 Hacking de prompts
408 | ├── 🚧 Barreras de seguridad (guardrails)
409 | ├── 🚪 Puertas traseras
410 | └── 🛡 Medidas defensivas
411 | ```
412 |
413 | ### Corriendo LLMs
414 |
415 | 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.
416 |
417 | * **APIs de LLM**: Las APIs son una manera conveniente de desplegar LLMs. Este espacio está dividido entre LLMs privados o propietarios ([OpenAI](https://platform.openai.com/), [Google](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/overview), [Anthropic](https://docs.anthropic.com/claude/reference/getting-started-with-the-api), [Cohere](https://docs.cohere.com/docs), etc.) y LLMs de código abierto ([OpenRouter](https://openrouter.ai/), [Hugging Face](https://huggingface.co/inference-api), [Together AI](https://www.together.ai/), etc.).
418 | * **LLMs de código abierto**: El [Hugging Face Hub](https://huggingface.co/models) es un excelente lugar para encontrar LLMs. Puedes ejecutar algunos de ellos directamente en [Hugging Face Spaces](https://huggingface.co/spaces), o descargarlos y ejecutarlos localmente en aplicaciones como [LM Studio](https://lmstudio.ai/) o a través de la CLI con [llama.cpp](https://github.com/ggerganov/llama.cpp) o [Ollama](https://ollama.ai/).
419 | * **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.
420 | * **Estructurando outputs (resultados del modelo)**: Muchas tareas requieren un output estructurado, como una plantilla estricta o un formato `JSON`. Librerías como [LMQL](https://lmql.ai/), [Outlines](https://github.com/outlines-dev/outlines), [Guidance](https://github.com/guidance-ai/guidance), etc. pueden usarse para guiar la generación y respetar una estructura dada.
421 |
422 | 📚 **Referencias**:
423 | * [Ejecutá un LLM localmente con LM Studio](https://www.kdnuggets.com/run-an-llm-locally-with-lm-studio) por Nisha Arya: Guía corta sobre cómo usar LM Studio.
424 | * [Guía de ingeniería de prompts](https://www.promptingguide.ai/) por DAIR.AI: Lista exhaustiva de técnicas de prompts con ejemplos.
425 | * [Outlines, Inicio rápido](https://outlines-dev.github.io/outlines/quickstart/): Lista de técnicas de generación guiada habilitadas por Outlines.
426 | * [LMQL, Resúmen](https://lmql.ai/docs/language/overview.html): Introducción al lenguaje LMQL.
427 |
428 | ---
429 | ### Creando una base de datos vectorial
430 |
431 | 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.
432 |
433 | * **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.).
434 | * **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.
435 | * **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.
436 | * **Bases de datos vectoriales**: Las bases de datos vectoriales (como [Chroma](https://www.trychroma.com/), [Pinecone](https://www.pinecone.io/), [Milvus](https://milvus.io/), [FAISS](https://faiss.ai/), [Annoy](https://github.com/spotify/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.
437 |
438 | 📚 **Referencias**:
439 | * [LangChain, divisores de texto](https://python.langchain.com/docs/modules/data_connection/document_transformers/): Lista de diferentes divisores de texto implementados en LangChain.
440 | * [Librería de SentenceTransformers](https://www.sbert.net/): Biblioteca popular para modelos de embeddings.
441 | * [MTEB leaderboard](https://huggingface.co/spaces/mteb/leaderboard): Leaderboard para modelos de embeddings.
442 | * [Las 5 Mejores Bases de Datos Vectoriales](https://www.datacamp.com/blog/the-top-5-vector-databases) por Moez Ali: Una comparación de las mejores y más populares bases de datos vectoriales.
443 |
444 | ---
445 | ### Generación aumentada por recuperación (RAG)
446 |
447 | 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.
448 |
449 | * **Orquestadores**: Los orquestadores (como [LangChain](https://python.langchain.com/docs/get_started/introduction), [LlamaIndex](https://docs.llamaindex.ai/en/stable/), [FastRAG](https://github.com/IntelLabs/fastRAG), etc.) son marcos populares para conectar tus LLMs con herramientas, bases de datos, memorias, etc., y aumentar sus habilidades.
450 | * **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](https://arxiv.org/abs/2212.10496), etc.) pueden aplicarse para reformular/ampliarlas y mejorar el rendimiento.
451 | * **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.
452 | * **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](https://github.com/explodinggradients/ragas/tree/main) y [DeepEval](https://github.com/confident-ai/deepeval).
453 |
454 | 📚 **Referencias**:
455 | * [Llamaindex, conceptos de alto nivel](https://docs.llamaindex.ai/en/stable/getting_started/concepts.html): Conceptos principales a conocer al construir tuberías RAG.
456 | * [Pinecone, aumento de recuperación](https://www.pinecone.io/learn/series/langchain/langchain-retrieval-augmentation/): Visión general del proceso de augmentación de recuperación.
457 | * [LangChain, Q&A con RAG](https://python.langchain.com/docs/use_cases/question_answering/quickstart): Tutorial paso a paso para construir una típica tubería RAG.
458 | * [LangChain, tipos de memoria](https://python.langchain.com/docs/modules/memory/types/): Lista de diferentes tipos de memorias con usos relevantes.
459 | * [Pipeline RAG, métricas](https://docs.ragas.io/en/stable/concepts/metrics/index.html): Resúmen general de las principales métricas utilizadas para evaluar pipeline RAG.
460 |
461 | ---
462 | ### RAG Avanzado
463 |
464 | 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.
465 |
466 | * **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.
467 | * **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.
468 | * **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](https://github.com/Raudaschl/rag-fusion), y clasificación.
469 |
470 | 📚 **Referencias**:
471 | * [LangChain, construcción de consultas/queries](https://blog.langchain.dev/query-construction/): Posteo sobre diferentes tipos de construcción de consultas.
472 | * [LangChain, SQL](https://python.langchain.com/docs/use_cases/qa_structured/sql): Tutorial sobre cómo interactuar con bases de datos SQL con LLMs, involucrando Texto-a-SQL y un agente SQL opcional.
473 | * [Pinecone, agentes LLM](https://www.pinecone.io/learn/series/langchain/langchain-agents/): Introducción a agentes y herramientas con diferentes tipos.
474 | * [Agentes autónomos potenciados por LLM](https://lilianweng.github.io/posts/2023-06-23-agent/) por Lilian Weng: Artículo más teórico sobre agentes LLM.
475 | * [LangChain, RAG de OpenAI](https://blog.langchain.dev/applying-openai-rag/): Visión general de las estrategias RAG empleadas por OpenAI, incluyendo post-procesamiento.
476 |
477 | ---
478 | ### Optimización de la inferencia de un modelo
479 |
480 | 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.
481 |
482 | * **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.
483 | * **Caché de key-value**: Entiende el caché de key-value y las mejoras introducidas en la [atención de múltiples consultas](https://arxiv.org/abs/1911.02150) (MQA) y la [atención de consultas agrupadas](https://arxiv.org/abs/2305.13245) (GQA).
484 | * **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.
485 |
486 | 📚 **Referencias**:
487 | * [Inferencia en GPU](https://huggingface.co/docs/transformers/main/en/perf_infer_gpu_one) por Hugging Face: Explica cómo optimizar la inferencia en GPUs.
488 | * [Inferencia de LLM](https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices) por Databricks: Mejores prácticas sobre cómo optimizar la inferencia de LLM en producción.
489 | * [Optimizando LLMs para velocidad y memoria](https://huggingface.co/docs/transformers/main/en/llm_tutorial_optimization) por Hugging Face: Explica tres técnicas principales para optimizar velocidad y memoria, a saber, cuantización, Atención Flash e innovaciones arquitectónicas.
490 | * [Generación asistida](https://huggingface.co/blog/assisted-generation) 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.
491 |
492 | ---
493 | ### Desplegando LLMs
494 |
495 | 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.
496 |
497 | * **Despliegue local**: La privacidad es una ventaja importante que los LLMs de código abierto tienen sobre los privados. Servidores LLM locales ([LM Studio](https://lmstudio.ai/), [Ollama](https://ollama.ai/), [oobabooga](https://github.com/oobabooga/text-generation-webui), [kobold.cpp](https://github.com/LostRuins/koboldcpp), etc.) capitalizan esta ventaja para potenciar aplicaciones locales.
498 | * **Despliegue de un prototipo**: Frameworks como [Gradio](https://www.gradio.app/) y [Streamlit](https://docs.streamlit.io/) son útiles para prototipar aplicaciones y compartir demos. También puedes alojarlos fácilmente en línea, por ejemplo, usando [Hugging Face Spaces](https://huggingface.co/spaces).
499 | * **Despliegue en un servidor**: Desplegar LLMs a escala requiere infraestructura en la nube (ver también [SkyPilot](https://skypilot.readthedocs.io/en/latest/)) o local y a menudo aprovecha frameworks de generación de texto optimizados como [TGI](https://github.com/huggingface/text-generation-inference), [vLLM](https://github.com/vllm-project/vllm/tree/main), etc.
500 | * **Despliegue en el edge**: En entornos restringidos, frameworks de alto rendimiento como [MLC LLM](https://github.com/mlc-ai/mlc-llm) y [mnn-llm](https://github.com/wangzhaode/mnn-llm/blob/master/README_en.md) pueden desplegar LLMs en navegadores web, Android, e iOS.
501 |
502 | 📚 **Referencias**:
503 | * [Streamlit, construye una aplicación LLM básica](https://docs.streamlit.io/knowledge-base/tutorials/build-conversational-apps): Tutorial para hacer una app básica tipo ChatGPT usando Streamlit.
504 | * [Contenedor Docker de inferencia LLM de HF](https://huggingface.co/blog/sagemaker-huggingface-llm): Despliega LLMs en Amazon SageMaker usando el contenedor de inferencia de Hugging Face.
505 | * [Blog](https://www.philschmid.de/) por Philipp Schmid: Colección de artículos de alta calidad sobre despliegue y ajuste fino de LLMs.
506 | * [Optimizando la latencia](https://hamel.dev/notes/llm/inference/03_inference.html) por Hamel Husain: Comparación de TGI, vLLM, CTranslate2 y mlc en términos de rendimiento y latencia.
507 |
508 | ---
509 | ### Haciendo a los LLMs mas seguros
510 |
511 | 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.
512 |
513 | * **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).
514 | * **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).
515 | * **Medidas defensivas**: La mejor manera de proteger tus aplicaciones LLM es probarlas contra estas vulnerabilidades (por ejemplo, usando equipos rojos y controles como [garak](https://github.com/leondz/garak/)) y observarlas en producción (con un marco como [langfuse](https://github.com/langfuse/langfuse)).
516 |
517 | 📚 **Referencias**:
518 | * [OWASP Top 10 para aplicaciones de LLM](https://owasp.org/www-project-top-10-for-large-language-model-applications/) por HEGO Wiki: Lista de las 10 vulnerabilidades críticas más vistas en aplicaciones LLM.
519 | * [Inyección de prompts](https://github.com/jthack/PIPE) por Joseph Thacker: Guía corta dedicada a la inyección de prompts para ingenieros.
520 | * [Seguridad en LLMs](https://llmsecurity.net/) por [@llm_sec](https://twitter.com/llm_sec): Lista extensiva de recursos relacionados con la seguridad LLM.
521 | * [Equipos rojos (red teaming) en LLMs](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/red-teaming) por Microsoft: Guía sobre cómo realizar equipos rojos con LLMs.
522 |
523 | ---
524 | ## Reconocimientos
525 |
526 | Este roadmap está inspirado fuertemente (robado) del roadmap que hizo Maxime Labonne ([twitter](https://twitter.com/maximelabonne) & [github](https://github.com/mlabonne))
527 |
528 | *Disclaimer: No estoy afiliado con ninguna institución mencionada acá.*
529 |
530 | ---
531 |