Vissza az eszközökhöz

Média generálás

LoRA

A LoRA alacsony rangú adaptáció: a bázismodell súlyai fagyottak maradnak, csak két kis mátrix tanul, így a finomhangolás kevesebb memóriát és tárhelyet igényel.

3 perc olvasás

A LoRA (Low-Rank Adaptation) olyan finomhangolási technika, amely a bázismodell előre betanított súlyait fagyva hagyja, és a Transformer rétegeibe tanítható, alacsony rangú felbontással előállított frissítő mátrixokat illeszt be. A tanulás nem a teljes paraméterkészletre irányul, hanem rétegenként két kis mátrixra. Az eredeti cikk a GPT-3 175B példáján mérte a hatást: a tanítható paraméterek száma mintegy tízezerszeresére csökken, a GPU-memóriaigény a harmadára, a minőség pedig a teljes finomhangolás szintjén marad. Mivel a menet közbeni számítás változatlan, a módszer a cikk szerint nem hoz plusz késleltetést a következtetésbe, ellentétben a klasszikus adapterekkel.

Mivel a bázis súlyai érintetlenek maradnak, egyetlen bázismodellhez több kicsi, hordozható adapter készülhet különböző feladatokra vagy stílusokra. Az adapter töredéke a bázismodell méretének, ezért könnyű tárolni, másolni és megosztani. A PEFT könyvtárban a LoraConfig írja le az adapter paramétereit, a get_peft_model() pedig egy tanítható PeftModel burkolatot ad vissza a bázis köré.

Rang és alfa

A tanítható paraméterek számát főként az r rang és az érintett súlymátrix alakja határozza meg: alacsonyabb rang kisebb frissítő mátrixokat és kevesebb tanítható paramétert jelent. A lora_alpha skálázási tényező, és a tényleges szorzó nem önmagában az alfa, hanem az alfa osztva a ranggal. A rank-stabilizált változat az alfa osztva négyzetgyök(r) képletet használja, és a PEFT-ben a use_rslora kapcsolóval érhető el.

A target_modules adja meg, mely modulokra kerül adapter. Transformer modelleknél a gyakorlat a figyelmi blokkok célzása, mert így a legjobb a paraméterhatékonyság. A diffusers példaszkriptje a UNet to_q, to_k, to_v és to_out.0 moduljait célozza, a lora_alpha értékét pedig a ranggal teszi egyenlővé. A súlyok inicializálása is beállítható: a PEFT alapértelmezésben az egyik mátrixot Kaiming-uniform, a másikat nulla értékkel indítja, így a tanulás elején az adapter identitás-transzformációt ad.

Betöltés és összefűzés

Tanítás közben a két kis mátrix külön él, és csak a tanítás végén dől el, hogyan használjuk őket. Az egyik út, hogy a bázismodell és az adapter külön töltődik be. Ez rugalmas, de a bázis és az adapter memóriája egyszerre van jelen, és külön betöltés esetén késleltetés is jelentkezhet.

A másik út az összefűzés: a merge_and_unload() beleolvasztja az adapter súlyait a bázisba, és egy önálló, adapter-rétegek nélküli modellt ad vissza. Ha később vissza kell bontani a műveletet, a merge_adapter() és az unmerge_adapter() használható, mert ezek megtartják a PeftModelt. Az unload() az eredeti bázist adja vissza, a delete_adapter() egy adott adaptert töröl, az add_weighted_adapter() pedig több LoRA-t kombinál megadott súlyozással.

A diffusers oldalon a load_lora_weights() tölti be az adaptert, a set_adapters() aktivál és állít skálát, a fuse_lora() és az unload_lora_weights() pedig a torch.compile előtt fűzi be a súlyokat. A hotswap ugyanazt az adapterhelyet cseréli ki új súlyokra, de a szövegkódolóra célzó LoRA-knál nem támogatott, és ha az új adapter több réteget érint, mint az előző, újrafordítás is szükség lehet.

Hol használjuk

Az eredeti cikk nyelvi modellekre dolgozza ki a módszert, a PEFT leírása viszont kimondja, hogy bármely sűrű rétegre alkalmazható, ezért diffúziós modelleknél is működik. A diffusers DreamBooth, SDXL és Wuerstchen tanítószkriptjei is LoRA-t használnak, és a gyakorlatban ez a stílus, karakter vagy tárgy tanítása a szöveg-képpé alakítás mellé, illetve kis, feladatspecifikus nyelvi adapterek készítése a helyi inferenciához.

Nálunk a helyi modellek futtatása LM Studio alatt történik, a nyelvi bázisokhoz pedig Llama körüli modellek adják az alapot. A képi munkafolyamatban Forge futtatja a bázismodellt, amire az adapterek betöltődnek.

Amire figyelni kell

  • Az adapter a bázismodell architektúrájához és a beállított target_modules-hoz kötődik. Más bázisra vagy más modulkészlettel tanított adapter nem illeszthető be változtatás nélkül, a rang és az alfa eltérése pedig észrevétlen minőségvesztést okozhat.
  • A minőség a tanítóadatoktól függ. A diffusers adatkészlet-útmutatója szerint a kép és képaláírás párok felépítése, illetve a feliratok pontossága közvetlenül meghatározza a tanulás eredményét.
  • A bázismodell licence az adaptersúlyokra is kiterjed. A FLUX.1 [dev] licenc például a modell fogalmába sorolja a LoRA-t, és kimondja, hogy a modellre vonatkozó korlátozások a belőle készített származékokra is érvényesek, tehát az adapter nem kerüli meg a bázis használati feltételeit.
  • Az összefűzött modell már nem bontható vissza külön adapterré, ezért ha később cserélni akarjuk, a külön betöltött vagy a merge_adapter() utáni forma a célszerű.
  • Több, azonos bázisra épülő adapter kombinálható súlyozva, de az eredmény erősen függ a skálázástól: a nulla és egy közötti érték a bázishoz közeli és a teljesen alkalmazott állapot között mozog.

Tovább olvasás

A CyberElectrónál a LoRA a saját stílus- és nyelvi adaptereink alapja: a bázismodellek közösek maradnak, a feladatspecifikus tudás pedig kicsi, verziókövetett adapterfájlokban él.

Címkék
  • finomhangolás
  • adapter
  • PEFT
  • rang
  • diffúziós modellek