Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"LoRA (Low-Rank Adaptation)","local":"lora-low-rank-adaptation","sections":[{"title":"Entender LoRA","local":"entender-lora","sections":[],"depth":2},{"title":"Ventajas clave de LoRA","local":"ventajas-clave-de-lora","sections":[],"depth":2},{"title":"Cargar adaptadores LoRA con PEFT","local":"cargar-adaptadores-lora-con-peft","sections":[],"depth":2},{"title":"Ajustar un LLM con trl y SFTTrainer usando LoRA","local":"ajustar-un-llm-con-trl-y-sfttrainer-usando-lora","sections":[],"depth":2},{"title":"Configuración de LoRA","local":"configuración-de-lora","sections":[],"depth":2},{"title":"Usar TRL con PEFT","local":"usar-trl-con-peft","sections":[],"depth":2},{"title":"Fusionar adaptadores LoRA","local":"fusionar-adaptadores-lora","sections":[],"depth":2},{"title":"Implementación de la fusión","local":"implementación-de-la-fusión","sections":[],"depth":2}],"depth":1}"> | |
| <link href="/docs/course/pr_1213/es/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/entry/start.36d27295.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/scheduler.505acc25.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/singletons.6865fa96.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/index.001f95d5.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/paths.ec28c642.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/entry/app.3b43d7f3.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/preload-helper.8c2bab6b.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/index.e22abd30.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/nodes/0.e2c0ea78.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/nodes/24.8732c432.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.a144e953.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/CodeBlock.f6688f67.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/CourseFloatingBanner.f0a2dc21.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"LoRA (Low-Rank Adaptation)","local":"lora-low-rank-adaptation","sections":[{"title":"Entender LoRA","local":"entender-lora","sections":[],"depth":2},{"title":"Ventajas clave de LoRA","local":"ventajas-clave-de-lora","sections":[],"depth":2},{"title":"Cargar adaptadores LoRA con PEFT","local":"cargar-adaptadores-lora-con-peft","sections":[],"depth":2},{"title":"Ajustar un LLM con trl y SFTTrainer usando LoRA","local":"ajustar-un-llm-con-trl-y-sfttrainer-usando-lora","sections":[],"depth":2},{"title":"Configuración de LoRA","local":"configuración-de-lora","sections":[],"depth":2},{"title":"Usar TRL con PEFT","local":"usar-trl-con-peft","sections":[],"depth":2},{"title":"Fusionar adaptadores LoRA","local":"fusionar-adaptadores-lora","sections":[],"depth":2},{"title":"Implementación de la fusión","local":"implementación-de-la-fusión","sections":[],"depth":2}],"depth":1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <div class="flex space-x-1 absolute z-10 right-0 top-0" style=""><a href="https://discuss.huggingface.co/t/chapter-2-questions" target="_blank"><img alt="Ask a Question" class="!m-0" src="https://img.shields.io/badge/Ask%20a%20question-ffcb4c.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTEgMTA0IDEwNiI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMyMzFmMjA7fS5jbHMtMntmaWxsOiNmZmY5YWU7fS5jbHMtM3tmaWxsOiMwMGFlZWY7fS5jbHMtNHtmaWxsOiMwMGE5NGY7fS5jbHMtNXtmaWxsOiNmMTVkMjI7fS5jbHMtNntmaWxsOiNlMzFiMjM7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5EaXNjb3Vyc2VfbG9nbzwvdGl0bGU+PGcgaWQ9IkxheWVyXzIiPjxnIGlkPSJMYXllcl8zIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MS44NywwQzIzLjcxLDAsMCwyMi44MywwLDUxYzAsLjkxLDAsNTIuODEsMCw1Mi44MWw1MS44Ni0uMDVjMjguMTYsMCw1MS0yMy43MSw1MS01MS44N1M4MCwwLDUxLjg3LDBaIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNTIuMzcsMTkuNzRBMzEuNjIsMzEuNjIsMCwwLDAsMjQuNTgsNjYuNDFsLTUuNzIsMTguNEwzOS40LDgwLjE3YTMxLjYxLDMxLjYxLDAsMSwwLDEzLTYwLjQzWiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTc3LjQ1LDMyLjEyYTMxLjYsMzEuNiwwLDAsMS0zOC4wNSw0OEwxOC44Niw4NC44MmwyMC45MS0yLjQ3QTMxLjYsMzEuNiwwLDAsMCw3Ny40NSwzMi4xMloiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik03MS42MywyNi4yOUEzMS42LDMxLjYsMCwwLDEsMzguOCw3OEwxOC44Niw4NC44MiwzOS40LDgwLjE3QTMxLjYsMzEuNiwwLDAsMCw3MS42MywyNi4yOVoiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik0yNi40Nyw2Ny4xMWEzMS42MSwzMS42MSwwLDAsMSw1MS0zNUEzMS42MSwzMS42MSwwLDAsMCwyNC41OCw2Ni40MWwtNS43MiwxOC40WiIvPjxwYXRoIGNsYXNzPSJjbHMtNiIgZD0iTTI0LjU4LDY2LjQxQTMxLjYxLDMxLjYxLDAsMCwxLDcxLjYzLDI2LjI5YTMxLjYxLDMxLjYxLDAsMCwwLTQ5LDM5LjYzbC0zLjc2LDE4LjlaIi8+PC9nPjwvZz48L3N2Zz4="></a> <a href="https://colab.research.google.com/github/huggingface/notebooks/blob/main/course/en/chapter11/section4.ipynb" target="_blank"><img alt="Open In Colab" class="!m-0" src="https://colab.research.google.com/assets/colab-badge.svg"></a> </div> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg></button></div> </div> <h1 class="relative group"><a id="lora-low-rank-adaptation" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#lora-low-rank-adaptation"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>LoRA (Low-Rank Adaptation)</span></h1> <p data-svelte-h="svelte-xlu08n">El ajuste fino de grandes modelos de lenguaje es un proceso intensivo en recursos. LoRA es una técnica que permite ajustar grandes modelos de lenguaje usando una pequeña cantidad de parámetros. Funciona añadiendo y optimizando matrices más pequeñas sobre los pesos de atención, lo que suele reducir el número de parámetros entrenables aproximadamente en un 90%.</p> <h2 class="relative group"><a id="entender-lora" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#entender-lora"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Entender LoRA</span></h2> <p data-svelte-h="svelte-uw45fn">LoRA (Low-Rank Adaptation) es una técnica de ajuste fino eficiente en parámetros que congela los pesos del modelo preentrenado e inyecta matrices entrenables de descomposición de rango en las capas del modelo. En lugar de entrenar todos los parámetros del modelo durante el ajuste fino, LoRA descompone las actualizaciones de pesos en matrices más pequeñas mediante una descomposición de bajo rango, lo que reduce de forma significativa el número de parámetros entrenables mientras mantiene el rendimiento del modelo. Por ejemplo, cuando se aplicó a GPT-3 175B, LoRA redujo el número de parámetros entrenables en un factor de 10.000 y los requisitos de memoria GPU en un factor de 3 en comparación con el ajuste fino completo. Puedes leer más en el <a href="https://arxiv.org/pdf/2106.09685" rel="nofollow">paper de LoRA</a>.</p> <p data-svelte-h="svelte-103ey2p">LoRA funciona añadiendo pares de matrices de descomposición de rango a las capas del transformer, normalmente centrándose en los pesos de atención. Durante la inferencia, estos pesos de adaptador pueden fusionarse con el modelo base, lo que evita latencia adicional. LoRA resulta especialmente útil para adaptar grandes modelos de lenguaje a tareas o dominios específicos manteniendo razonables los requisitos de recursos.</p> <h2 class="relative group"><a id="ventajas-clave-de-lora" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#ventajas-clave-de-lora"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Ventajas clave de LoRA</span></h2> <ol data-svelte-h="svelte-aol7fz"><li><p><strong>Eficiencia de memoria</strong>:</p> <ul><li>Solo se almacenan en la memoria de la GPU los parámetros del adaptador</li> <li>Los pesos del modelo base permanecen congelados y pueden cargarse con menor precisión</li> <li>Permite ajustar modelos grandes incluso en GPUs de consumo</li></ul></li> <li><p><strong>Características de entrenamiento</strong>:</p> <ul><li>Integración nativa con PEFT/LoRA con una configuración mínima</li> <li>Compatibilidad con QLoRA (Quantized LoRA) para mejorar aún más la eficiencia en memoria</li></ul></li> <li><p><strong>Gestión de adaptadores</strong>:</p> <ul><li>Guardado de pesos de adaptadores en los checkpoints</li> <li>Posibilidad de fusionar los adaptadores de vuelta en el modelo base</li></ul></li></ol> <h2 class="relative group"><a id="cargar-adaptadores-lora-con-peft" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#cargar-adaptadores-lora-con-peft"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Cargar adaptadores LoRA con PEFT</span></h2> <p data-svelte-h="svelte-gsvxvk"><a href="https://github.com/huggingface/peft" rel="nofollow">PEFT</a> es una librería que ofrece una interfaz unificada para cargar y gestionar métodos PEFT, incluido LoRA. Esto facilita cambiar entre distintos métodos y experimentar con diferentes técnicas de ajuste fino.</p> <p data-svelte-h="svelte-1a81ick">Los adaptadores pueden cargarse sobre un modelo preentrenado con <code>load_adapter()</code>, lo que resulta útil para probar distintos adaptadores cuyos pesos no se han fusionado. Los pesos del adaptador activo se seleccionan con <code>set_adapter()</code>. Para volver al modelo base, puedes usar <code>unload()</code> para descargar todos los módulos LoRA. Eso facilita alternar entre pesos específicos de distintas tareas.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">from</span> peft <span class="hljs-keyword">import</span> PeftModel, PeftConfig | |
| config = PeftConfig.from_pretrained(<span class="hljs-string">"ybelkada/opt-350m-lora"</span>) | |
| model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path) | |
| lora_model = PeftModel.from_pretrained(model, <span class="hljs-string">"ybelkada/opt-350m-lora"</span>)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-bkhm6l"><img src="https://github.com/huggingface/smol-course/raw/main/3_parameter_efficient_finetuning/images/lora_adapter.png" alt="lora_load_adapter"></p> <h2 class="relative group"><a id="ajustar-un-llm-con-trl-y-sfttrainer-usando-lora" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#ajustar-un-llm-con-trl-y-sfttrainer-usando-lora"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Ajustar un LLM con trl y SFTTrainer usando LoRA</span></h2> <p data-svelte-h="svelte-1v4py6n"><code>SFTTrainer</code> de <a href="https://huggingface.co/docs/trl/sft_trainer" rel="nofollow"><code>trl</code></a> ofrece integración con adaptadores LoRA a través de <a href="https://huggingface.co/docs/peft/en/index" rel="nofollow">PEFT</a>. Eso significa que podemos ajustar un modelo igual que en el caso de SFT, pero usando LoRA para reducir la cantidad de parámetros que necesitamos entrenar.</p> <p data-svelte-h="svelte-acmv4l">Usaremos la clase <code>LoraConfig</code> de PEFT. La configuración solo requiere unos pocos pasos:</p> <ol data-svelte-h="svelte-id81bx"><li>Definir la configuración de LoRA</li> <li>Crear el <code>SFTTrainer</code> con la configuración de PEFT</li> <li>Entrenar y guardar los pesos del adaptador</li></ol> <h2 class="relative group"><a id="configuración-de-lora" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#configuración-de-lora"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Configuración de LoRA</span></h2> <p data-svelte-h="svelte-1nurv82">Veamos la configuración de LoRA y sus parámetros principales.</p> <table data-svelte-h="svelte-nwfww9"><thead><tr><th>Parámetro</th> <th>Descripción</th></tr></thead> <tbody><tr><td><code>r</code> (rank)</td> <td>Dimensión de las matrices de bajo rango usadas para las actualizaciones de pesos. Normalmente entre 4 y 32. Valores bajos comprimen más, pero pueden reducir expresividad.</td></tr> <tr><td><code>lora_alpha</code></td> <td>Factor de escalado para las capas LoRA, normalmente 2 veces el valor de <code>r</code>. Valores más altos producen efectos de adaptación más fuertes.</td></tr> <tr><td><code>lora_dropout</code></td> <td>Probabilidad de dropout para las capas LoRA, normalmente entre 0.05 y 0.1. Valores altos ayudan a prevenir sobreajuste.</td></tr> <tr><td><code>bias</code></td> <td>Controla el entrenamiento de los términos de sesgo. Las opciones son <code>none</code>, <code>all</code> o <code>lora_only</code>. <code>none</code> suele ser la opción más común cuando se busca eficiencia en memoria.</td></tr> <tr><td><code>target_modules</code></td> <td>Especifica a qué módulos del modelo aplicar LoRA. Puede ser <code>all-linear</code> o módulos específicos como <code>q_proj,v_proj</code>. Más módulos ofrecen mayor capacidad de adaptación, pero consumen más memoria.</td></tr></tbody></table> <blockquote class="tip" data-svelte-h="svelte-yqstst"><p>Cuando implementes métodos PEFT, empieza con valores pequeños de <code>rank</code>, por ejemplo entre 4 y 8, y monitoriza la pérdida de entrenamiento. Usa conjuntos de validación para evitar sobreajuste y compara resultados con líneas base de ajuste fino completo cuando sea posible. La efectividad de cada configuración depende de la tarea, así que experimentar es importante.</p></blockquote> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">from</span> peft <span class="hljs-keyword">import</span> LoraConfig | |
| <span class="hljs-comment"># r: rank dimension for LoRA update matrices (smaller = more compression)</span> | |
| rank_dimension = <span class="hljs-number">6</span> | |
| <span class="hljs-comment"># lora_alpha: scaling factor for LoRA layers (higher = stronger adaptation)</span> | |
| lora_alpha = <span class="hljs-number">8</span> | |
| <span class="hljs-comment"># lora_dropout: dropout probability for LoRA layers (helps prevent overfitting)</span> | |
| lora_dropout = <span class="hljs-number">0.05</span> | |
| peft_config = LoraConfig( | |
| r=rank_dimension, <span class="hljs-comment"># Rank dimension - typically between 4-32</span> | |
| lora_alpha=lora_alpha, <span class="hljs-comment"># LoRA scaling factor - typically 2x rank</span> | |
| lora_dropout=lora_dropout, <span class="hljs-comment"># Dropout probability for LoRA layers</span> | |
| bias=<span class="hljs-string">"none"</span>, <span class="hljs-comment"># Bias type for LoRA. the corresponding biases will be updated during training.</span> | |
| target_modules=<span class="hljs-string">"all-linear"</span>, <span class="hljs-comment"># Which modules to apply LoRA to</span> | |
| task_type=<span class="hljs-string">"CAUSAL_LM"</span>, <span class="hljs-comment"># Task type for model architecture</span> | |
| )<!-- HTML_TAG_END --></pre></div> <h2 class="relative group"><a id="usar-trl-con-peft" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#usar-trl-con-peft"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Usar TRL con PEFT</span></h2> <p data-svelte-h="svelte-1iszkym">Los métodos PEFT pueden combinarse con TRL para reducir los requisitos de memoria durante el ajuste fino. Para ello, definimos una <code>LoraConfig</code> y se la pasamos a <code>SFTTrainer</code> mediante el parámetro <code>peft_config</code>.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->trainer = SFTTrainer( | |
| model=model, | |
| args=args, | |
| train_dataset=dataset[<span class="hljs-string">"train"</span>], | |
| peft_config=peft_config, | |
| max_seq_length=max_seq_length, | |
| processing_class=tokenizer, | |
| )<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-l4pq4f">En el ejemplo anterior usamos <code>device_map="auto"</code> para asignar el modelo automáticamente al dispositivo correcto. También puedes asignarlo manualmente a un dispositivo concreto usando <code>device_map={"": device_index}</code>.</p> <blockquote class="tip" data-svelte-h="svelte-1hnz2rv"><p>✏️ <strong>Pruébalo</strong>. Parte del modelo ajustado de la sección anterior, pero ajústalo ahora con LoRA. Usa el dataset <code>HuggingFaceTB/smoltalk</code> para ajustar un modelo <code>deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B</code> con la configuración de LoRA definida arriba.</p></blockquote> <h2 class="relative group"><a id="fusionar-adaptadores-lora" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#fusionar-adaptadores-lora"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Fusionar adaptadores LoRA</span></h2> <p data-svelte-h="svelte-2nh55v">Después de entrenar con LoRA, quizá te interese volver a fusionar los pesos del adaptador con el modelo base para facilitar el despliegue. Esto crea un único modelo con pesos combinados, evitando tener que cargar adaptadores por separado durante la inferencia.</p> <p data-svelte-h="svelte-1moep8s">El proceso de fusión requiere prestar atención a la memoria y a la precisión numérica. Como tendrás que cargar simultáneamente el modelo base y los pesos del adaptador, asegúrate de que haya memoria suficiente en GPU o CPU. Usar <code>device_map="auto"</code> en <code>transformers</code> ayuda a ubicar el modelo correctamente según el hardware disponible.</p> <p data-svelte-h="svelte-11ba71m">Mantén una precisión consistente, por ejemplo <code>float16</code>, durante todo el proceso. Idealmente debe coincidir con la precisión usada en el entrenamiento y con el formato con el que guardarás el modelo fusionado para su despliegue.</p> <h2 class="relative group"><a id="implementación-de-la-fusión" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#implementación-de-la-fusión"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Implementación de la fusión</span></h2> <p data-svelte-h="svelte-1kfxbf">Después de entrenar un adaptador LoRA, puedes fusionar sus pesos de vuelta en el modelo base. Así se hace:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForCausalLM | |
| <span class="hljs-keyword">from</span> peft <span class="hljs-keyword">import</span> PeftModel | |
| <span class="hljs-comment"># 1. Load the base model</span> | |
| base_model = AutoModelForCausalLM.from_pretrained( | |
| <span class="hljs-string">"base_model_name"</span>, torch_dtype=torch.float16, device_map=<span class="hljs-string">"auto"</span> | |
| ) | |
| <span class="hljs-comment"># 2. Load the PEFT model with adapter</span> | |
| peft_model = PeftModel.from_pretrained( | |
| base_model, <span class="hljs-string">"path/to/adapter"</span>, torch_dtype=torch.float16 | |
| ) | |
| <span class="hljs-comment"># 3. Merge adapter weights with base model</span> | |
| merged_model = peft_model.merge_and_unload()<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-gwyj2k">Si encuentras discrepancias de tamaño en el modelo guardado, asegúrate de guardar también el tokenizador:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-comment"># Save both model and tokenizer</span> | |
| tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">"base_model_name"</span>) | |
| merged_model.save_pretrained(<span class="hljs-string">"path/to/save/merged_model"</span>) | |
| tokenizer.save_pretrained(<span class="hljs-string">"path/to/save/merged_model"</span>)<!-- HTML_TAG_END --></pre></div> <blockquote class="tip" data-svelte-h="svelte-l4z0so"><p>✏️ <strong>Pruébalo</strong>. Fusiona los pesos del adaptador con el modelo base. Usa el dataset <code>HuggingFaceTB/smoltalk</code> para ajustar un modelo <code>deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B</code> con la configuración de LoRA definida arriba.</p></blockquote> <h1 class="relative group"><a id="recursos" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#recursos"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Recursos</span></h1> <ul data-svelte-h="svelte-1892iap"><li><a href="https://arxiv.org/pdf/2106.09685" rel="nofollow">LoRA: Low-Rank Adaptation of Large Language Models</a></li> <li><a href="https://huggingface.co/docs/peft" rel="nofollow">Documentación de PEFT</a></li> <li><a href="https://huggingface.co/blog/peft" rel="nofollow">Entrada del blog de Hugging Face sobre PEFT</a></li></ul> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/course/blob/main/chapters/es/chapter11/4.mdx" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg> <span data-svelte-h="svelte-zjs2n5"><span class="underline">Update</span> on GitHub</span></a> <p></p> | |
| <script> | |
| { | |
| __sveltekit_1nznq34 = { | |
| assets: "/docs/course/pr_1213/es", | |
| base: "/docs/course/pr_1213/es", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/course/pr_1213/es/_app/immutable/entry/start.36d27295.js"), | |
| import("/docs/course/pr_1213/es/_app/immutable/entry/app.3b43d7f3.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 24], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 39 kB
- Xet hash:
- f56f7c17b4e4c1c619a5a9116df5dc946f0bd8fac04768bcb9bae32d457a4b0f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.