Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Ajuste fino con SFTTrainer","local":"ajuste-fino-con-sfttrainer","sections":[{"title":"Cuándo usar SFT","local":"cuándo-usar-sft","sections":[{"title":"Control de la plantilla","local":"control-de-la-plantilla","sections":[],"depth":3},{"title":"Adaptación al dominio","local":"adaptación-al-dominio","sections":[],"depth":3}],"depth":2},{"title":"Preparación del dataset","local":"preparación-del-dataset","sections":[],"depth":2},{"title":"Configuración del entrenamiento","local":"configuración-del-entrenamiento","sections":[],"depth":2},{"title":"Implementación con TRL","local":"implementación-con-trl","sections":[],"depth":2},{"title":"Empaquetado del dataset","local":"empaquetado-del-dataset","sections":[],"depth":2},{"title":"Monitorizar el progreso del entrenamiento","local":"monitorizar-el-progreso-del-entrenamiento","sections":[{"title":"Entender los patrones de pérdida","local":"entender-los-patrones-de-pérdida","sections":[],"depth":3},{"title":"Métricas que conviene vigilar","local":"métricas-que-conviene-vigilar","sections":[],"depth":3},{"title":"El camino hacia la convergencia","local":"el-camino-hacia-la-convergencia","sections":[],"depth":3},{"title":"Seguimiento del progreso","local":"seguimiento-del-progreso","sections":[],"depth":3},{"title":"Señales de alerta a vigilar","local":"señales-de-alerta-a-vigilar","sections":[],"depth":3}],"depth":2},{"title":"Evaluación después de SFT","local":"evaluación-después-de-sft","sections":[],"depth":2},{"title":"Quiz","local":"quiz","sections":[{"title":"1. ¿Qué parámetros controlan la duración del entrenamiento en SFT?","local":"1-qué-parámetros-controlan-la-duración-del-entrenamiento-en-sft","sections":[],"depth":3},{"title":"2. ¿Qué patrón en las curvas de pérdida indica posible sobreajuste?","local":"2-qué-patrón-en-las-curvas-de-pérdida-indica-posible-sobreajuste","sections":[],"depth":3},{"title":"3. ¿Para qué se usa gradient_accumulation_steps ?","local":"3-para-qué-se-usa-gradientaccumulationsteps-","sections":[],"depth":3},{"title":"4. ¿Qué deberías monitorizar durante el entrenamiento con SFT?","local":"4-qué-deberías-monitorizar-durante-el-entrenamiento-con-sft","sections":[],"depth":3},{"title":"5. ¿Qué indica una convergencia saludable durante el entrenamiento?","local":"5-qué-indica-una-convergencia-saludable-durante-el-entrenamiento","sections":[],"depth":3}],"depth":2},{"title":"💐 Buen trabajo","local":"-buen-trabajo","sections":[],"depth":2},{"title":"Recursos adicionales","local":"recursos-adicionales","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/23.1a9e028b.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"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/Question.bc1e0795.js"> | |
| <link rel="modulepreload" href="/docs/course/pr_1213/es/_app/immutable/chunks/stores.f19d72fe.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"Ajuste fino con SFTTrainer","local":"ajuste-fino-con-sfttrainer","sections":[{"title":"Cuándo usar SFT","local":"cuándo-usar-sft","sections":[{"title":"Control de la plantilla","local":"control-de-la-plantilla","sections":[],"depth":3},{"title":"Adaptación al dominio","local":"adaptación-al-dominio","sections":[],"depth":3}],"depth":2},{"title":"Preparación del dataset","local":"preparación-del-dataset","sections":[],"depth":2},{"title":"Configuración del entrenamiento","local":"configuración-del-entrenamiento","sections":[],"depth":2},{"title":"Implementación con TRL","local":"implementación-con-trl","sections":[],"depth":2},{"title":"Empaquetado del dataset","local":"empaquetado-del-dataset","sections":[],"depth":2},{"title":"Monitorizar el progreso del entrenamiento","local":"monitorizar-el-progreso-del-entrenamiento","sections":[{"title":"Entender los patrones de pérdida","local":"entender-los-patrones-de-pérdida","sections":[],"depth":3},{"title":"Métricas que conviene vigilar","local":"métricas-que-conviene-vigilar","sections":[],"depth":3},{"title":"El camino hacia la convergencia","local":"el-camino-hacia-la-convergencia","sections":[],"depth":3},{"title":"Seguimiento del progreso","local":"seguimiento-del-progreso","sections":[],"depth":3},{"title":"Señales de alerta a vigilar","local":"señales-de-alerta-a-vigilar","sections":[],"depth":3}],"depth":2},{"title":"Evaluación después de SFT","local":"evaluación-después-de-sft","sections":[],"depth":2},{"title":"Quiz","local":"quiz","sections":[{"title":"1. ¿Qué parámetros controlan la duración del entrenamiento en SFT?","local":"1-qué-parámetros-controlan-la-duración-del-entrenamiento-en-sft","sections":[],"depth":3},{"title":"2. ¿Qué patrón en las curvas de pérdida indica posible sobreajuste?","local":"2-qué-patrón-en-las-curvas-de-pérdida-indica-posible-sobreajuste","sections":[],"depth":3},{"title":"3. ¿Para qué se usa gradient_accumulation_steps ?","local":"3-para-qué-se-usa-gradientaccumulationsteps-","sections":[],"depth":3},{"title":"4. ¿Qué deberías monitorizar durante el entrenamiento con SFT?","local":"4-qué-deberías-monitorizar-durante-el-entrenamiento-con-sft","sections":[],"depth":3},{"title":"5. ¿Qué indica una convergencia saludable durante el entrenamiento?","local":"5-qué-indica-una-convergencia-saludable-durante-el-entrenamiento","sections":[],"depth":3}],"depth":2},{"title":"💐 Buen trabajo","local":"-buen-trabajo","sections":[],"depth":2},{"title":"Recursos adicionales","local":"recursos-adicionales","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/section3.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="ajuste-fino-con-sfttrainer" 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="#ajuste-fino-con-sfttrainer"><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>Ajuste fino con SFTTrainer</span></h1> <p data-svelte-h="svelte-9c42xz">El ajuste fino supervisado, o Supervised Fine-Tuning (SFT), es un proceso que se usa principalmente para adaptar modelos de lenguaje preentrenados para que sigan instrucciones, participen en diálogos y utilicen formatos de salida específicos. Aunque los modelos preentrenados tienen capacidades generales impresionantes, SFT ayuda a transformarlos en modelos con comportamiento más parecido al de un asistente, capaces de entender y responder mejor a los prompts de las personas usuarias. Esto suele hacerse entrenándolos con datasets de conversaciones e instrucciones escritas por humanos.</p> <p data-svelte-h="svelte-21vgdf">Esta página ofrece una guía paso a paso para ajustar el modelo <a href="https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B" rel="nofollow"><code>deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B</code></a> usando <a href="https://huggingface.co/docs/trl/en/sft_trainer" rel="nofollow"><code>SFTTrainer</code></a>. Al seguir estos pasos, puedes adaptar el modelo para que realice tareas específicas con mayor eficacia.</p> <h2 class="relative group"><a id="cuándo-usar-sft" 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="#cuándo-usar-sft"><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>Cuándo usar SFT</span></h2> <p data-svelte-h="svelte-j5pjpq">Antes de entrar en la implementación, conviene entender cuándo SFT es la opción adecuada para tu proyecto. Como primer paso, considera si usar un modelo ya ajustado para instrucciones junto con prompts bien diseñados bastaría para tu caso de uso. SFT requiere recursos computacionales significativos y esfuerzo de ingeniería, así que solo conviene aplicarlo cuando el prompting sobre modelos existentes no sea suficiente.</p> <blockquote class="tip" data-svelte-h="svelte-fegp6v"><p>Considera SFT solo si:</p> <ul><li>Necesitas más rendimiento del que puede lograr el prompting</li> <li>Tienes un caso de uso específico donde el costo de usar un modelo grande de propósito general supera el costo de ajustar un modelo más pequeño</li> <li>Requieres formatos de salida especializados o conocimiento específico del dominio</li></ul></blockquote> <p data-svelte-h="svelte-1skulgm">Si determinas que SFT es necesario, la decisión de seguir adelante depende principalmente de dos factores.</p> <h3 class="relative group"><a id="control-de-la-plantilla" 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="#control-de-la-plantilla"><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>Control de la plantilla</span></h3> <p data-svelte-h="svelte-9i667e">SFT permite un control preciso sobre la estructura de salida del modelo. Esto resulta especialmente valioso cuando necesitas que el modelo:</p> <ol data-svelte-h="svelte-191e1gl"><li>Genere respuestas con un formato específico de plantilla de chat</li> <li>Siga esquemas de salida estrictos</li> <li>Mantenga un estilo consistente entre respuestas</li></ol> <h3 class="relative group"><a id="adaptación-al-dominio" 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="#adaptación-al-dominio"><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>Adaptación al dominio</span></h3> <p data-svelte-h="svelte-1w6ny57">Al trabajar en dominios especializados, SFT ayuda a alinear el modelo con requisitos propios del dominio mediante:</p> <ol data-svelte-h="svelte-24862c"><li>Enseñar terminología y conceptos específicos del dominio</li> <li>Reforzar estándares profesionales</li> <li>Tratar consultas técnicas de forma adecuada</li> <li>Seguir directrices específicas del sector</li></ol> <blockquote class="tip" data-svelte-h="svelte-16dca6w"><p>Antes de empezar con SFT, evalúa si tu caso de uso requiere:</p> <ul><li>Formato de salida preciso</li> <li>Conocimiento específico del dominio</li> <li>Patrones de respuesta consistentes</li> <li>Cumplimiento de directrices concretas</li></ul> <p>Esta evaluación te ayudará a determinar si SFT es realmente el enfoque adecuado.</p></blockquote> <h2 class="relative group"><a id="preparación-del-dataset" 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="#preparación-del-dataset"><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>Preparación del dataset</span></h2> <p data-svelte-h="svelte-y4kzf8">El proceso de ajuste fino supervisado requiere un dataset específico de la tarea estructurado con pares de entrada-salida. Cada par debe consistir en:</p> <ol data-svelte-h="svelte-1atkw8a"><li>Un prompt de entrada</li> <li>La respuesta esperada del modelo</li> <li>Cualquier contexto o metadato adicional</li></ol> <p data-svelte-h="svelte-7h46dt">La calidad de tus datos de entrenamiento es crucial para que el ajuste fino salga bien. Veamos cómo preparar y validar el dataset:</p> <iframe src="https://huggingface.co/datasets/HuggingFaceTB/smoltalk/embed/viewer/all/train?row=0" frameborder="0" width="100%" height="360px"></iframe> <h2 class="relative group"><a id="configuración-del-entrenamiento" 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-del-entrenamiento"><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 del entrenamiento</span></h2> <p data-svelte-h="svelte-11tm3pn">El éxito del ajuste fino depende mucho de elegir bien los parámetros de entrenamiento. Veamos cuáles son los más importantes y cómo configurarlos.</p> <p data-svelte-h="svelte-1rrxknx">La configuración de <code>SFTTrainer</code> requiere considerar varios parámetros que controlan el proceso de entrenamiento:</p> <ol data-svelte-h="svelte-thz99q"><li><p><strong>Parámetros de duración del entrenamiento</strong>:</p> <ul><li><code>num_train_epochs</code>: controla la duración total del entrenamiento</li> <li><code>max_steps</code>: alternativa a las épocas; fija el número máximo de pasos</li> <li>Más épocas permiten aprender mejor, pero aumentan el riesgo de sobreajuste</li></ul></li> <li><p><strong>Parámetros de tamaño de lote</strong>:</p> <ul><li><code>per_device_train_batch_size</code>: determina el uso de memoria y la estabilidad del entrenamiento</li> <li><code>gradient_accumulation_steps</code>: permite simular tamaños de lote efectivos más grandes</li> <li>Los lotes más grandes suelen dar gradientes más estables, pero exigen más memoria</li></ul></li> <li><p><strong>Parámetros de tasa de aprendizaje</strong>:</p> <ul><li><code>learning_rate</code>: controla el tamaño de las actualizaciones de pesos</li> <li><code>warmup_ratio</code>: parte del entrenamiento dedicada al calentamiento de la tasa de aprendizaje</li> <li>Una tasa demasiado alta puede causar inestabilidad; una demasiado baja ralentiza el aprendizaje</li></ul></li> <li><p><strong>Parámetros de monitorización</strong>:</p> <ul><li><code>logging_steps</code>: frecuencia con la que se registran métricas</li> <li><code>eval_steps</code>: frecuencia con la que se evalúa sobre datos de validación</li> <li><code>save_steps</code>: frecuencia con la que se guardan checkpoints del modelo</li></ul></li></ol> <blockquote class="tip" data-svelte-h="svelte-1gfsz2q"><p>Empieza con valores conservadores y ajusta según lo que observes al monitorizar:</p> <ul><li>Empieza con entre 1 y 3 épocas</li> <li>Usa tamaños de lote pequeños al principio</li> <li>Vigila de cerca las métricas de validación</li> <li>Ajusta la tasa de aprendizaje si el entrenamiento resulta inestable</li></ul></blockquote> <h2 class="relative group"><a id="implementación-con-trl" 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-con-trl"><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 con TRL</span></h2> <p data-svelte-h="svelte-li716h">Ahora que entendemos los componentes clave, implementemos el entrenamiento con validación y monitorización adecuadas. Usaremos la clase <code>SFTTrainer</code> de la librería Transformers Reinforcement Learning (TRL), construida sobre <code>transformers</code>. Aquí tienes un ejemplo completo con TRL:</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> datasets <span class="hljs-keyword">import</span> load_dataset | |
| <span class="hljs-keyword">from</span> trl <span class="hljs-keyword">import</span> SFTConfig, SFTTrainer | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-comment"># Set device</span> | |
| device = <span class="hljs-string">"cuda"</span> <span class="hljs-keyword">if</span> torch.cuda.is_available() <span class="hljs-keyword">else</span> <span class="hljs-string">"cpu"</span> | |
| <span class="hljs-comment"># Load dataset</span> | |
| dataset = load_dataset(<span class="hljs-string">"HuggingFaceTB/smoltalk"</span>, <span class="hljs-string">"all"</span>) | |
| <span class="hljs-comment"># Configure model and tokenizer</span> | |
| model_name = <span class="hljs-string">"HuggingFaceTB/SmolLM2-135M"</span> | |
| model = AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path=model_name).to( | |
| device | |
| ) | |
| tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_name) | |
| <span class="hljs-comment"># Setup chat template</span> | |
| model, tokenizer = setup_chat_format(model=model, tokenizer=tokenizer) | |
| <span class="hljs-comment"># Configure trainer</span> | |
| training_args = SFTConfig( | |
| output_dir=<span class="hljs-string">"./sft_output"</span>, | |
| max_steps=<span class="hljs-number">1000</span>, | |
| per_device_train_batch_size=<span class="hljs-number">4</span>, | |
| learning_rate=<span class="hljs-number">5e-5</span>, | |
| logging_steps=<span class="hljs-number">10</span>, | |
| save_steps=<span class="hljs-number">100</span>, | |
| eval_strategy=<span class="hljs-string">"steps"</span>, | |
| eval_steps=<span class="hljs-number">50</span>, | |
| ) | |
| <span class="hljs-comment"># Initialize trainer</span> | |
| trainer = SFTTrainer( | |
| model=model, | |
| args=training_args, | |
| train_dataset=dataset[<span class="hljs-string">"train"</span>], | |
| eval_dataset=dataset[<span class="hljs-string">"test"</span>], | |
| processing_class=tokenizer, | |
| ) | |
| <span class="hljs-comment"># Start training</span> | |
| trainer.train()<!-- HTML_TAG_END --></pre></div> <blockquote class="tip" data-svelte-h="svelte-xz1dl4"><p>Cuando usas un dataset con un campo <code>messages</code>, como en el ejemplo anterior, <code>SFTTrainer</code> aplica automáticamente la plantilla de chat del modelo, obtenida desde el Hub. Eso significa que no necesitas configuración adicional para manejar conversaciones en formato chat.</p></blockquote> <h2 class="relative group"><a id="empaquetado-del-dataset" 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="#empaquetado-del-dataset"><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>Empaquetado del dataset</span></h2> <p data-svelte-h="svelte-gpze78"><code>SFTTrainer</code> admite example packing para optimizar la eficiencia del entrenamiento. Esta funcionalidad permite empaquetar varios ejemplos cortos dentro de una misma secuencia de entrada, maximizando el uso de la GPU durante el entrenamiento. Para activarla, basta con fijar <code>packing=True</code> en el constructor de <code>SFTConfig</code>.</p> <p data-svelte-h="svelte-1e5j4qb">Cuando usas datasets empaquetados junto con <code>max_steps</code>, ten en cuenta que puedes terminar entrenando durante más épocas de las que esperabas, según la configuración de empaquetado. También puedes personalizar cómo se combinan los ejemplos mediante una función de formateo, algo especialmente útil cuando trabajas con datasets que contienen varios campos, como pares de pregunta-respuesta. Para datasets de evaluación, puedes desactivar el empaquetado con <code>eval_packing=False</code>.</p> <p data-svelte-h="svelte-xdkkg6">Aquí tienes un ejemplo básico:</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"># Configure packing</span> | |
| training_args = SFTConfig(packing=<span class="hljs-literal">True</span>) | |
| trainer = SFTTrainer(model=model, train_dataset=dataset, args=training_args) | |
| trainer.train()<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-1h1tcak">Si el dataset tiene varios campos, puedes definir una función de formateo personalizada para combinarlos en una sola secuencia de entrada:</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">def</span> <span class="hljs-title function_">formatting_func</span>(<span class="hljs-params">example</span>): | |
| text = <span class="hljs-string">f"### Question: <span class="hljs-subst">{example[<span class="hljs-string">'question'</span>]}</span>\n ### Answer: <span class="hljs-subst">{example[<span class="hljs-string">'answer'</span>]}</span>"</span> | |
| <span class="hljs-keyword">return</span> text | |
| training_args = SFTConfig(packing=<span class="hljs-literal">True</span>) | |
| trainer = SFTTrainer( | |
| <span class="hljs-string">"facebook/opt-350m"</span>, | |
| train_dataset=dataset, | |
| args=training_args, | |
| formatting_func=formatting_func, | |
| )<!-- HTML_TAG_END --></pre></div> <h2 class="relative group"><a id="monitorizar-el-progreso-del-entrenamiento" 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="#monitorizar-el-progreso-del-entrenamiento"><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>Monitorizar el progreso del entrenamiento</span></h2> <p data-svelte-h="svelte-1jni2zb">Una buena monitorización es crucial para que el ajuste fino salga bien. Veamos qué conviene observar durante el entrenamiento.</p> <h3 class="relative group"><a id="entender-los-patrones-de-pérdida" 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-los-patrones-de-pérdida"><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 los patrones de pérdida</span></h3> <p data-svelte-h="svelte-1nwf1ri">La pérdida de entrenamiento suele pasar por tres fases bien diferenciadas:</p> <ol data-svelte-h="svelte-156epqd"><li>Caída inicial brusca: adaptación rápida a la nueva distribución de datos</li> <li>Estabilización gradual: el ritmo de aprendizaje se ralentiza a medida que el modelo se ajusta</li> <li>Convergencia: los valores de pérdida se estabilizan, indicando que el entrenamiento se acerca al final</li></ol> <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/nlp_course_sft_loss_graphic.png" alt="SFTTrainer Training"> <h3 class="relative group"><a id="métricas-que-conviene-vigilar" 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="#métricas-que-conviene-vigilar"><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>Métricas que conviene vigilar</span></h3> <p data-svelte-h="svelte-1hmdljc">Una monitorización eficaz combina métricas cuantitativas con evaluación cualitativa. Algunas métricas útiles son:</p> <ul data-svelte-h="svelte-7l5xf8"><li>Pérdida de entrenamiento</li> <li>Pérdida de validación</li> <li>Evolución de la tasa de aprendizaje</li> <li>Normas del gradiente</li></ul> <blockquote class="warning" data-svelte-h="svelte-jsowxc"><p>Vigila estas señales de alerta durante el entrenamiento:</p> <ol><li>La pérdida de validación sube mientras la pérdida de entrenamiento baja, lo que indica posible sobreajuste</li> <li>No hay mejora significativa en los valores de pérdida, lo que sugiere posible infraajuste</li> <li>Valores de pérdida extremadamente bajos, que pueden indicar memorización</li> <li>Formato de salida inconsistente, señal de problemas al aprender la plantilla</li></ol></blockquote> <h3 class="relative group"><a id="el-camino-hacia-la-convergencia" 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="#el-camino-hacia-la-convergencia"><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>El camino hacia la convergencia</span></h3> <p data-svelte-h="svelte-1vdej80">A medida que avanza el entrenamiento, la curva de pérdida debería estabilizarse gradualmente. Un indicador importante de un entrenamiento saludable es que la diferencia entre la pérdida de entrenamiento y la de validación sea pequeña, lo que sugiere que el modelo está aprendiendo patrones generalizables en vez de memorizar ejemplos concretos. Los valores absolutos de pérdida variarán según la tarea y el dataset.</p> <h3 class="relative group"><a id="seguimiento-del-progreso" 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="#seguimiento-del-progreso"><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>Seguimiento del progreso</span></h3> <p data-svelte-h="svelte-1yqrr33">El gráfico anterior muestra una progresión típica de entrenamiento. Observa cómo tanto la pérdida de entrenamiento como la de validación disminuyen rápidamente al principio y luego se estabilizan de forma progresiva. Ese patrón suele indicar que el modelo está aprendiendo de forma efectiva sin perder capacidad de generalización.</p> <h3 class="relative group"><a id="señales-de-alerta-a-vigilar" 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="#señales-de-alerta-a-vigilar"><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>Señales de alerta a vigilar</span></h3> <p data-svelte-h="svelte-uw084w">Algunos patrones en las curvas de pérdida pueden indicar problemas potenciales. A continuación se muestran ejemplos frecuentes y posibles acciones correctivas.</p> <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/sft_loss_1.png" alt="SFTTrainer Training"> <p data-svelte-h="svelte-itdapq">Si la pérdida de validación disminuye mucho más despacio que la pérdida de entrenamiento, el modelo probablemente se está sobreajustando a los datos de entrenamiento. Considera:</p> <ul data-svelte-h="svelte-10ci25w"><li>Reducir el número de pasos de entrenamiento</li> <li>Aumentar el tamaño del dataset</li> <li>Revisar la calidad y diversidad del dataset</li></ul> <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/sft_loss_2.png" alt="SFTTrainer Training"> <p data-svelte-h="svelte-6964x2">Si la pérdida no mejora de forma significativa, el modelo podría:</p> <ul data-svelte-h="svelte-1lp6v3x"><li>Estar aprendiendo demasiado despacio, en cuyo caso conviene subir la tasa de aprendizaje</li> <li>Tener dificultades con la tarea, en cuyo caso conviene revisar la calidad de los datos y la complejidad de la tarea</li> <li>Haber alcanzado límites de arquitectura, en cuyo caso conviene probar otro modelo</li></ul> <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/sft_loss_3.png" alt="SFTTrainer Training"> <p data-svelte-h="svelte-n7oj08">Valores de pérdida extremadamente bajos pueden sugerir memorización en vez de aprendizaje. Esto es especialmente preocupante si:</p> <ul data-svelte-h="svelte-1g1a525"><li>El modelo rinde mal en ejemplos nuevos pero similares</li> <li>Las salidas tienen poca diversidad</li> <li>Las respuestas se parecen demasiado a los ejemplos de entrenamiento</li></ul> <blockquote class="warning" data-svelte-h="svelte-13cwdq2"><p>Vigila tanto los valores de pérdida como las salidas reales del modelo durante el entrenamiento. A veces la pérdida puede parecer buena mientras el modelo desarrolla comportamientos no deseados. La evaluación cualitativa regular ayuda a detectar problemas que las métricas por sí solas pueden pasar por alto.</p></blockquote> <p data-svelte-h="svelte-uegony">Conviene recordar que esta interpretación de la pérdida se centra en los casos más comunes. En la práctica, los valores de pérdida pueden comportarse de formas muy distintas según el modelo, el dataset y los parámetros de entrenamiento. Si quieres profundizar en estos patrones, revisa esta entrada del blog de <a href="https://www.fast.ai/posts/2023-09-04-learning-jumps/" rel="nofollow">Fast AI</a>.</p> <h2 class="relative group"><a id="evaluación-después-de-sft" 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="#evaluación-después-de-sft"><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>Evaluación después de SFT</span></h2> <p data-svelte-h="svelte-1brqh7o">En la sección <a href="/en/chapter11/4">11.4</a> veremos cómo evaluar el modelo usando datasets de benchmark. Por ahora, nos centraremos en la evaluación cualitativa.</p> <p data-svelte-h="svelte-hoxks5">Después de completar SFT, considera estas acciones de seguimiento:</p> <ol data-svelte-h="svelte-2oqpdj"><li>Evaluar el modelo a fondo sobre datos de prueba reservados</li> <li>Validar el cumplimiento de la plantilla con entradas variadas</li> <li>Comprobar la retención de conocimiento específico del dominio</li> <li>Monitorizar métricas de rendimiento en escenarios reales</li></ol> <blockquote class="tip" data-svelte-h="svelte-1dr7n5a"><p>Documenta el proceso de entrenamiento, incluyendo:</p> <ul><li>Características del dataset</li> <li>Parámetros de entrenamiento</li> <li>Métricas de rendimiento</li> <li>Limitaciones conocidas | |
| Esa documentación será útil para iteraciones futuras del modelo.</li></ul></blockquote> <h2 class="relative group"><a id="quiz" 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="#quiz"><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>Quiz</span></h2> <h3 class="relative group"><a id="1-qué-parámetros-controlan-la-duración-del-entrenamiento-en-sft" 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="#1-qué-parámetros-controlan-la-duración-del-entrenamiento-en-sft"><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>1. ¿Qué parámetros controlan la duración del entrenamiento en SFT?</span></h3> <div><form><label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="0"> <!-- HTML_TAG_START -->num_train_epochs and max_steps<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="1"> <!-- HTML_TAG_START -->batch_size and learning_rate<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="2"> <!-- HTML_TAG_START -->gradient_checkpointing and warmup_ratio<!-- HTML_TAG_END --></label> <div class="flex flex-row items-center mt-3"><button class="btn px-4 mr-4" type="submit" disabled>Submit</button> </div></form></div> <h3 class="relative group"><a id="2-qué-patrón-en-las-curvas-de-pérdida-indica-posible-sobreajuste" 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="#2-qué-patrón-en-las-curvas-de-pérdida-indica-posible-sobreajuste"><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>2. ¿Qué patrón en las curvas de pérdida indica posible sobreajuste?</span></h3> <div><form><label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="0"> <!-- HTML_TAG_START -->La pérdida de validación aumenta mientras la pérdida de entrenamiento sigue disminuyendo<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="1"> <!-- HTML_TAG_START -->Tanto la pérdida de entrenamiento como la de validación disminuyen de forma constante<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="2"> <!-- HTML_TAG_START -->La pérdida de entrenamiento permanece constante mientras la de validación disminuye<!-- HTML_TAG_END --></label> <div class="flex flex-row items-center mt-3"><button class="btn px-4 mr-4" type="submit" disabled>Submit</button> </div></form></div> <h3 class="relative group"><a id="3-para-qué-se-usa-gradientaccumulationsteps-" 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="#3-para-qué-se-usa-gradientaccumulationsteps-"><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>3. ¿Para qué se usa gradient_accumulation_steps ?</span></h3> <div><form><label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="0"> <!-- HTML_TAG_START -->To increase effective batch size without using more memory<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="1"> <!-- HTML_TAG_START -->To save checkpoints during training<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="2"> <!-- HTML_TAG_START -->To control the learning rate schedule<!-- HTML_TAG_END --></label> <div class="flex flex-row items-center mt-3"><button class="btn px-4 mr-4" type="submit" disabled>Submit</button> </div></form></div> <h3 class="relative group"><a id="4-qué-deberías-monitorizar-durante-el-entrenamiento-con-sft" 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="#4-qué-deberías-monitorizar-durante-el-entrenamiento-con-sft"><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>4. ¿Qué deberías monitorizar durante el entrenamiento con SFT?</span></h3> <div><form><label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="0"> <!-- HTML_TAG_START -->Both quantitative metrics and qualitative outputs<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="1"> <!-- HTML_TAG_START -->Only the training loss<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="2"> <!-- HTML_TAG_START -->Only the model's output quality<!-- HTML_TAG_END --></label> <div class="flex flex-row items-center mt-3"><button class="btn px-4 mr-4" type="submit" disabled>Submit</button> </div></form></div> <h3 class="relative group"><a id="5-qué-indica-una-convergencia-saludable-durante-el-entrenamiento" 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="#5-qué-indica-una-convergencia-saludable-durante-el-entrenamiento"><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>5. ¿Qué indica una convergencia saludable durante el entrenamiento?</span></h3> <div><form><label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="0"> <!-- HTML_TAG_START -->A small gap between training and validation loss<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="1"> <!-- HTML_TAG_START -->Training loss reaching zero<!-- HTML_TAG_END --></label> <label class="block"><input autocomplete="off" class="form-input -mt-1.5 mr-2" name="choice" type="checkbox" value="2"> <!-- HTML_TAG_START -->Validation loss being lower than training loss<!-- HTML_TAG_END --></label> <div class="flex flex-row items-center mt-3"><button class="btn px-4 mr-4" type="submit" disabled>Submit</button> </div></form></div> <h2 class="relative group"><a id="-buen-trabajo" 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="#-buen-trabajo"><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>💐 Buen trabajo</span></h2> <p data-svelte-h="svelte-1jn5iae">Ya has aprendido a ajustar modelos usando SFT. Para seguir avanzando:</p> <ol data-svelte-h="svelte-1x19fxf"><li>Prueba el notebook con parámetros distintos</li> <li>Experimenta con otros datasets</li> <li>Contribuye mejoras al material del curso</li></ol> <h2 class="relative group"><a id="recursos-adicionales" 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-adicionales"><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 adicionales</span></h2> <ul data-svelte-h="svelte-1qwbi4x"><li><a href="https://huggingface.co/docs/trl" rel="nofollow">TRL Documentation</a></li> <li><a href="https://github.com/huggingface/trl/blob/main/trl/scripts/sft.py" rel="nofollow">SFT Examples Repository</a></li> <li><a href="https://huggingface.co/docs/transformers/training" rel="nofollow">Fine-tuning Best Practices</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/3.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, 23], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 66.1 kB
- Xet hash:
- c39c262d368a9688d21eb485a913eca98e43db9b2211789d3aa9e517ef543e17
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.