{"id":35903,"date":"2026-05-27T12:51:52","date_gmt":"2026-05-27T10:51:52","guid":{"rendered":"https:\/\/inlab.fib.upc.edu\/news\/finetuning-dun-llm-amb-context-llarg-en-una-gpu-de-16-gb"},"modified":"2026-05-29T13:26:38","modified_gmt":"2026-05-29T11:26:38","slug":"finetuning-dun-llm-amb-context-llarg-en-una-gpu-de-16-gb","status":"publish","type":"post","link":"https:\/\/inlab.fib.upc.edu\/en\/articulos\/finetuning-dun-llm-amb-context-llarg-en-una-gpu-de-16-gb","title":{"rendered":"Finetuning d\u2019un LLM amb context llarg en una GPU de 16 GB"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"35903\" class=\"elementor elementor-35903 elementor-35880\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1896dc1 e-flex e-con-boxed e-con e-parent\" data-id=\"1896dc1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-185712d exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"185712d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Combinant <em>quantitzaci\u00f3<\/em>, <em>LoRA<\/em>, <em>FlashAttention-2<\/em> i altres optimitzacions per al finetuning de models LLM en una GPU de consumidor.<\/p><p>L&#8217;entrenament de grans models del llenguatge (LLM) moderns est\u00e0 fortament limitat per la mem\u00f2ria de la GPU. Tot i que els models recents solen assumir acc\u00e9s a acceleradors empresarials amb entre 40 i 80 GB de VRAM, molts entorns de recerca i enginyeria depenen de maquinari de consum amb l\u00edmits significativament m\u00e9s baixos. <\/p><p>En un projecte recent a l&#8217;inLab FIB, vam explorar el finetuning de models petits (de quatre a vuit mil milions de par\u00e0metres) com el Qwen3-8B, utilitzant una \u00fanica NVIDIA GeForce RTX 4080 amb 16 GB de VRAM. L&#8217;objectiu era la generaci\u00f3 de mem\u00f2ries de subvencions (projecte <a href=\"https:\/\/inlab.fib.upc.edu\/en\/project\/fabrai-copilot\">FabAI Copilot<\/a>) que requereixen contextos de fins a 140.000 tokens, tot respectant les limitacions del maquinari de consum. <\/p><p>Aconseguir-ho no va ser possible mitjan\u00e7ant una \u00fanica t\u00e8cnica d&#8217;optimitzaci\u00f3. En canvi, el flux de treball d&#8217;entrenament va combinar diverses estrat\u00e8gies que apuntaven simult\u00e0niament a diferents fonts de consum de VRAM. <\/p><h5><strong>Qu\u00e8 passa amb la VRAM durant l&#8217;entrenament?<\/strong><\/h5><p>Una idea err\u00f2nia comuna \u00e9s que els pesos del model s\u00f3n l&#8217;\u00fanic contribuent principal a l&#8217;\u00fas de la mem\u00f2ria de la GPU. En la pr\u00e0ctica, la mem\u00f2ria d&#8217;entrenament es distribueix entre diversos components: <\/p><h5> <\/h5>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-30451dc e-flex e-con-boxed e-con e-parent\" data-id=\"30451dc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c121f0c exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"c121f0c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"108\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_1-1024x138.png\" class=\"attachment-large size-large wp-image-35887\" alt=\"\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_1-1024x138.png 1024w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_1-300x40.png 300w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_1-768x103.png 768w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_1.png 1205w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ba8c643 e-flex e-con-boxed e-con e-parent\" data-id=\"ba8c643\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1516581 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"1516581\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>El finetuning per a contextos llargs \u00e9s especialment exigent perqu\u00e8 la mem\u00f2ria d&#8217;activaci\u00f3 i els c\u00e0lculs d&#8217;atenci\u00f3 creixen r\u00e0pidament amb la longitud de la seq\u00fc\u00e8ncia. Fins i tot quan els pesos del model caben a la mem\u00f2ria, l&#8217;entrenament de seq\u00fc\u00e8ncies llargues pot provocar errors per exc\u00e9s de mem\u00f2ria (Out-Of-Memory, OOM) nom\u00e9s a causa de les activacions. <\/p><p>Reducci\u00f3 de la mem\u00f2ria del model<\/p><p>La primera capa d&#8217;optimitzaci\u00f3 es va centrar a reduir la petjada de mem\u00f2ria persistent del model i dels estats d&#8217;entrenament.<\/p><h5><strong>Quantitzaci\u00f3 a 4-bit<\/strong><\/h5><p>La primera optimitzaci\u00f3 va ser utilitzar els pesos del model quantitzats amb el format NF4 propi de la llibreria <em>BitsAndBytes<\/em>. Aquesta optimitzaci\u00f3 es fa des del principi, ja que normalment es publiquen els par\u00e0metres del model en diferents nivells de precisi\u00f3, permitent als usuaris triar escollir entre intel\u00b7lig\u00e8ncia del model i mem\u00f2ria ocupada. Normalment, les quantitzacions estan disponibles des d\u20191 bit fins a 16 bits, sent la versi\u00f3 de 4 bits escollida, quatre vegades m\u00e9s petita que l\u2019original i oferint un bon comprom\u00eds d\u2019intel\u00b7lig\u00e8ncia.  <\/p><h5><strong>LoRA, RS-LoRA i QLoRA<\/strong><\/h5><p>Low-Rank Adaptation (LoRA) redueix el nombre de par\u00e0metres entrenables introduint petites matrius a cada capa del model. A la pr\u00e0ctica, la modificaci\u00f3 de tots els par\u00e0metres sovint \u00e9s inviable no pas pels mateixos pesos, sin\u00f3 perqu\u00e8 els gradients i els estats de l&#8217;optimitzador escalen amb el nombre de par\u00e0metres. <\/p><p>Es va utilitzar Rank-Stabilized LoRA (RS-LoRA) i Quantized LoRA (QLoRA) aplicat a totes les projeccions lineals per millorar l\u2019estabilitat i poder entrenar en quantitzacions m\u00e9s baixes.<\/p><h5><strong>Optimitzant l\u2019optimitzador<\/strong><\/h5><p>Els estats de l&#8217;optimitzador poden consumir quantitats enormes de mem\u00f2ria durant l&#8217;entrenament, i de vegades superen la mem\u00f2ria que requereix el mateix model. Per mitigar-ho, durant l&#8217;entrenament es va utilitzar optimitzador quantitzats de 8 bits juntament amb <em>paged optimizers<\/em> (<em>paged_adamw_8bit<\/em>). <\/p><p>Els <em>paged optimizers<\/em> descarreguen din\u00e0micament els estats de l&#8217;optimitzador a la RAM del sistema durant els pics de mem\u00f2ria, evitant errors d&#8217;esgotament de la mem\u00f2ria (OOM) durant l&#8217;entrenament de contextos llargs. A la pr\u00e0ctica, aix\u00f2 va ser especialment important durant l&#8217;entrenament a prop dels l\u00edmits de maquinari de la RTX 4080. <\/p><h5><strong>Control de la mem\u00f2ria d&#8217;activaci\u00f3<\/strong><\/h5><p>Tot i que la quantificaci\u00f3 i <em>LoRA<\/em> van reduir l&#8217;\u00fas de mem\u00f2ria est\u00e0tica, l&#8217;entrenament amb contextos llargs continuava dominat per la mem\u00f2ria d&#8217;activaci\u00f3 (<em>activation memory<\/em>). Per tant, van ser necess\u00e0ries diverses optimitzacions addicionals per controlar el creixement dels tensors intermedis durant el <em>forward i backward pass<\/em>. <\/p><h5><strong>FlashAttention-2<\/strong><\/h5><p><em>FlashAttention-2<\/em> implementa <em>kernels<\/em> que implementen les funcions \u201cd\u2019atenci\u00f3\u201d que requereixen les capes de <em>Transformer<\/em> tenint en compte el tr\u00e0nsit de les dades que minimitzen la reserva de VRAM mitjan\u00e7ant l\u2019agrupaci\u00f3 eficient dels c\u00e0lculs d&#8217;atenci\u00f3.<\/p><p>Sense nuclis d&#8217;atenci\u00f3 optimitzats, les execucions de context llarg sovint superaven els l\u00edmits de mem\u00f2ria a causa del comportament d&#8217;escala qu\u00e0drica de l&#8217;atenci\u00f3 de l\u2019arquitectura <em>Transformer<\/em>.<\/p><h5><strong>Gradient Checkpointing<\/strong><\/h5><p><em>Gradient checkpointing<\/em> redueix la mem\u00f2ria d&#8217;activaci\u00f3 descartant algunes activacions durant el <em>forward pass<\/em> i recalculant-les durant el pas invers en lloc d&#8217;emmagatzemar-les permanentment.<\/p><p>Aix\u00f2 introdueix un cl\u00e0ssic comprom\u00eds d&#8217;enginyeria: un menor \u00fas de mem\u00f2ria a costa d&#8217;un temps de c\u00e0lcul addicional. No obstant aix\u00f2, per a contextos llargs, la recomputaci\u00f3 d&#8217;activacions es va tornar essencial per mantenir-se dins del pressupost de 16 GB de VRAM. <\/p><h5> <\/h5>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-44a3146 e-flex e-con-boxed e-con e-parent\" data-id=\"44a3146\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-51bbd0c exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"51bbd0c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"684\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_2.png\" class=\"attachment-large size-large wp-image-35890\" alt=\"\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_2.png 874w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_2-300x256.png 300w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_2-768x656.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e15e7d2 e-flex e-con-boxed e-con e-parent\" data-id=\"e15e7d2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-eef70b5 exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"eef70b5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5><strong>Kernel Fusion<\/strong><\/h5><p>L&#8217;entrenament tamb\u00e9 va fer servir <em>kernels<\/em> Triton fusionats a trav\u00e9s del <em>framework<\/em> <em>Unsloth<\/em>. Aquests nuclis combinen operacions adjacents, similar a com funciona el <em>FlashAttention<\/em>, en menys operacions de GPU. <\/p><p>La reducci\u00f3 de la materialitzaci\u00f3 de tensors intermedis va ajudar a disminuir la sobrec\u00e0rrega d&#8217;activaci\u00f3 i a millorar el rendiment. A la pr\u00e0ctica, per\u00f2, els <em>kernels<\/em> propis de <em>Unsloth<\/em> no s\u00f3n compatibles amb els de <em>Liger-Kernel<\/em>, la qual cosa obligava a fer concessions entre aquestes dues optimitzacions. <\/p><h5><strong>Acumulaci\u00f3 de Gradients<\/strong><\/h5><p>Per controlar encara m\u00e9s el pic d&#8217;\u00fas de la VRAM, el proc\u00e9s d&#8217;entrenament va utilitzar nom\u00e9s una seq\u00fc\u00e8ncia a cada <em>backward i forward pass<\/em>, per\u00f2 en comptes de limitar-nos a fer una actualitzaci\u00f3 de l\u2019optimitzador amb un sol exemple (pot donar lloc a <em>overfitting<\/em>), es va combinar amb l&#8217;acumulaci\u00f3 de gradients (<em>Gradient Accumulation<\/em>).<\/p><p>Concretament, en lloc d&#8217;actualitzar els par\u00e0metres del model despr\u00e9s de processar cada seq\u00fc\u00e8ncia, els gradients es calculen de manera incremental i s&#8217;agreguen en mem\u00f2ria al llarg de diversos passos i actualitzar els pesos amb una \u201cdirecci\u00f3\u201d m\u00e9s precisa.<\/p><h5><strong>Gesti\u00f3 de contextos llargs<\/strong><\/h5><p>M\u00e9s enll\u00e0 de les t\u00e8cniques est\u00e0ndard d&#8217;optimitzaci\u00f3 de LLM, el projecte tamb\u00e9 va requerir estrat\u00e8gies expl\u00edcites de gesti\u00f3 de context per donar suport a les c\u00e0rregues de treball de generaci\u00f3 de documents llargs.<\/p><h5><strong>Smart Context Truncation<\/strong><\/h5><p>Es va implementar un algorisme de truncament de decad\u00e8ncia exponencial per mantenir una longitud de context m\u00e0xima de 20.000 tokens en cada pas, tot prioritzant la informaci\u00f3 recent.<\/p><p>Tot i que el document sencer pot acabar tenint m\u00e9s de 140.000 tokens de llargada, si dividim intel\u00b7ligentment aquest document, podem atacar cada secci\u00f3 individualment i aix\u00ed ser molt m\u00e9s estrictes amb el context que s\u2019utilitza a cada pas. Aquesta tamb\u00e9 es pot considerar una optimitzaci\u00f3 que ofereix una reducci\u00f3 de mem\u00f2ria a canvi de m\u00e9s temps d\u2019execuci\u00f3 i p\u00e8rdua de context en algun cas. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-44c53cc exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-image\" data-id=\"44c53cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"426\" height=\"235\" src=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_3.png\" class=\"attachment-large size-large wp-image-35893\" alt=\"\" srcset=\"https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_3.png 426w, https:\/\/inlab.fib.upc.edu\/wp-content\/uploads\/2026\/05\/article_jaume_3-300x165.png 300w\" sizes=\"(max-width: 426px) 100vw, 426px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ee0825f e-flex e-con-boxed e-con e-parent\" data-id=\"ee0825f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-579b14a exad-sticky-section-no exad-glass-effect-no elementor-widget elementor-widget-text-editor\" data-id=\"579b14a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5><strong>Vocabulary Slicing<\/strong><\/h5><p>Una optimitzaci\u00f3 especialment efica\u00e7 va consistir a reduir la mida del vocabulari del tokenitzador i del model de 128k tokens a uns 100k. Aix\u00f2 va reduir la mem\u00f2ria necess\u00e0ria tant per a les capes d&#8217;<em>embedding<\/em> com per a la capa final del model. <\/p><p>Tot i que se&#8217;n parla menys que de la quantificaci\u00f3 o la <em>LoRA<\/em>, la reducci\u00f3 de vocabulari va resultar ser una optimitzaci\u00f3 de nivell de sistema sorprenentment efica\u00e7 sota estrictes limitacions de VRAM. Aquesta reducci\u00f3 \u00e9s molt efica\u00e7 si el LLM final funcionar\u00e0 exclusivament en un conjunt tancat d&#8217;idiomes, ja que es poden eliminar molts tokens sense cap impacte en el rendiment. <\/p><h5><strong>Conclusion<\/strong><\/h5><p>El resultat m\u00e9s important d&#8217;aquest treball no va ser nom\u00e9s la capacitat de realitzar el <em>finetuning<\/em> del LLM, sin\u00f3 tamb\u00e9 la quantitat de coneixement d&#8217;enginyeria que va sorgir d&#8217;haver de treballar dins d&#8217;aquest espai de restriccions.<\/p><p>Treballar sota l\u00edmits estrictes de VRAM va canviar fonamentalment la manera d&#8217;abordar cada problema. En lloc de confiar en configuracions d&#8217;entrenament per defecte, cada etapa i cada par\u00e0metre de configuraci\u00f3 es va haver de q\u00fcestionar, mesurar i simplificar fins que va ser factible. <\/p><p>Les restriccions no nom\u00e9s van donar forma a la soluci\u00f3, sin\u00f3 que van donar forma al mateix proc\u00e9s d&#8217;aprenentatge.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Combinant quantitzaci\u00f3, LoRA, FlashAttention-2 i altres optimitzacions per al finetuning de models LLM en una GPU de consumidor. L&#8217;entrenament de grans models del llenguatge (LLM) moderns est\u00e0 fortament limitat per la mem\u00f2ria de la GPU. Tot i que els models recents solen assumir acc\u00e9s a acceleradors empresarials amb entre 40 i 80 GB de VRAM, [&hellip;]<\/p>\n","protected":false},"author":1302,"featured_media":35899,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[496],"tags":[],"experteses":[],"class_list":["post-35903","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articulos"],"acf":[],"_links":{"self":[{"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/posts\/35903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/users\/1302"}],"replies":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/comments?post=35903"}],"version-history":[{"count":1,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/posts\/35903\/revisions"}],"predecessor-version":[{"id":35904,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/posts\/35903\/revisions\/35904"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/media\/35899"}],"wp:attachment":[{"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/media?parent=35903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/categories?post=35903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/tags?post=35903"},{"taxonomy":"experteses","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/en\/wp-json\/wp\/v2\/experteses?post=35903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}