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.
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
- LoRA: Low-Rank Adaptation of Large Language Models (arXiv)
- PEFT: LoRA koncepcionális útmutató
- Diffusers: LoRA tanítá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.