LLM atrakino daugybę naujų galimybių dirbtinio intelekto programoms. Jei kada nors norėjote patikslinti savo modelį, šis vadovas parodys, kaip tai padaryti lengvai ir neįrašant jokio kodo. Naudodami tokius įrankius kaip Axolotl ir DPO, žingsnis po žingsnio atliksime procesą.
Kas yra LLM?
Didelės kalbos modelis (LLM) yra galingas dirbtinio intelekto modelis, parengtas naudojant didžiulius tekstinių duomenų kiekius – dešimtis trilijonų simbolių, kad būtų galima numatyti kitą žodžių rinkinį iš eilės. Tai tapo įmanoma tik per pastaruosius 2–3 metus dėl GPU skaičiavimo pažangos, kuri leido tokius didžiulius modelius išmokyti per kelias savaites.
Tikėtina, kad anksčiau bendravote su LLM naudodami tokius produktus kaip „ChatGPT“ ar „Claude“ ir patys patyrėte jų gebėjimą suprasti ir generuoti į žmones panašius atsakymus.
Kodėl reikia tiksliai suderinti LLM?
Ar negalime viskam naudoti GPT-4o? Na, nors tai yra galingiausias modelis, kurį turime šio straipsnio rašymo metu, tai ne visada praktiškiausias pasirinkimas. Tiksliai sureguliavus mažesnį modelį, kurio parametrai svyruoja nuo 3 iki 14 milijardų parametrų, galima gauti palyginamų rezultatų už nedidelę išlaidų dalį. Be to, tikslinimas leidžia jums turėti savo intelektinę nuosavybę ir sumažina jūsų priklausomybę nuo trečiųjų šalių.
Bazinių, nurodymų ir pokalbių modelių supratimas
Prieš gilinantis į koregavimą, būtina suprasti skirtingus egzistuojančius LLM tipus:
- Baziniai modeliai: jie yra iš anksto apmokyti naudoti didelius nestruktūrizuoto teksto kiekius, pvz., knygas ar interneto duomenis. Nors jie iš esmės supranta kalbą, jie nėra optimizuoti išvadoms ir duos nenuoseklius rezultatus. Baziniai modeliai yra sukurti tam, kad būtų pradėti kurti labiau specializuoti modeliai.
- Instrukcijų modeliai: sukurti ant bazinių modelių, instrukcijų modeliai yra tiksliai suderinami naudojant struktūrinius duomenis, pvz., greito atsako poras. Jie skirti vykdyti konkrečias instrukcijas arba atsakyti į klausimus.
- Pokalbių modeliai: taip pat sukurti remiantis baziniais modeliais, tačiau skirtingai nei instrukcijų modeliai, pokalbių modeliai yra mokomi pokalbio duomenų, leidžiančių jiems užmegzti dialogą pirmyn ir atgal.
Kas yra stiprinimo mokymasis ir DAP?
Stiprinamasis mokymasis (RL) yra metodas, kai modeliai mokosi gaudami grįžtamąjį ryšį apie savo veiksmus. Jis taikomas mokant arba pokalbių modeliams, siekiant toliau tobulinti jų rezultatų kokybę. Paprastai RL nevykdoma naudojant bazinius modelius, nes naudojamas daug mažesnis mokymosi greitis, todėl adata nepajudinama pakankamai.
DPO yra RL forma, kai modelis mokomas naudojant gerų ir blogų atsakymų poras tam pačiam raginimui / pokalbiui. Pateikdamas šias poras, modelis išmoksta teikti pirmenybę geriems pavyzdžiams ir vengti blogų.
Kada naudoti DAP
DAP ypač naudinga, kai norite pakoreguoti savo modelio stilių ar elgesį, pavyzdžiui:
- Stiliaus koregavimai: modifikuokite atsakymų ilgį, detalumo lygį arba modelio išreikštą patikimumo laipsnį.
- Saugos priemonės: išmokykite modelį atsisakyti atsakyti į galimai nesaugius ar netinkamus raginimus.
Tačiau DAP nėra tinkamas modeliui išmokyti naujų žinių ar faktų. Tuo tikslu tinkamesni prižiūrėtojo tikslaus derinimo (SFT) arba paieškos papildytos kartos (RAG) metodai.
DAP duomenų rinkinio kūrimas
Gamybos aplinkoje DAP duomenų rinkinį paprastai generuojate naudodami naudotojų atsiliepimus, pavyzdžiui:
- Naudotojų atsiliepimai: „Patinka“ / „nepatinka“ mechanizmo įgyvendinimas atsakymuose.
- Lyginamieji pasirinkimai: vartotojams pateikiami du skirtingi rezultatai ir prašoma pasirinkti geresnį.
Jei trūksta naudotojo duomenų, taip pat galite sukurti sintetinį duomenų rinkinį, panaudodami didesnius, labiau pajėgius LLM. Pavyzdžiui, galite sugeneruoti blogus atsakymus naudodami mažesnį modelį ir naudoti GPT-4o jiems pataisyti.
Kad būtų paprasčiau, naudosime paruoštą duomenų rinkinį iš HuggingFace: olivermolenschot/alpaca_messages_dpo_test. Jei patikrinsite duomenų rinkinį, pastebėsite, kad jame yra raginimų su pasirinktais ir atmestais atsakymais – tai geri ir blogi pavyzdžiai. Šie duomenys buvo sukurti sintetiniu būdu naudojant GPT-3.5-turbo ir GPT-4.
Paprastai jums prireiks mažiausiai 500–1 000 duomenų porų, kad galėtumėte efektyviai treniruotis nepersistengdami. Didžiausiuose DAP duomenų rinkiniuose yra iki 15 000–20 000 porų.
Tikslus Qwen2.5 3B instrukcija su Axolotl
Naudosime „Axolotl“, kad patikslintume „Qwen2.5 3B Instruct“ modelį, kuris šiuo metu yra „OpenLLM“ lyderių lentelės viršuje pagal savo dydžio klasę. Naudodami „Axolotl“ galite tiksliai sureguliuoti modelį neįrašydami nė vienos kodo eilutės – tiesiog YAML konfigūracijos failo. Žemiau yra config.yml, kurį naudosime:
base_model: Qwen/Qwen2.5-3B-Instruct
strict: false
# Axolotl will automatically map the dataset from HuggingFace to the prompt template of Qwen 2.5
chat_template: qwen_25
rl: dpo
datasets:
- path: olivermolenschot/alpaca_messages_dpo_test
type: chat_template.default
field_messages: conversation
field_chosen: chosen
field_rejected: rejected
message_field_role: role
message_field_content: content
# We pick a directory inside /workspace since that's typically where cloud hosts mount the volume
output_dir: /workspace/dpo-output
# Qwen 2.5 supports up to 32,768 tokens with a max generation of 8,192 tokens
sequence_len: 8192
# Sample packing does not currently work with DPO. Pad to sequence length is added to avoid a Torch bug
sample_packing: false
pad_to_sequence_len: true
# Add your WanDB account if you want to get nice reporting on your training performance
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:
# Can make training more efficient by batching multiple rows together
gradient_accumulation_steps: 1
micro_batch_size: 1
# Do one pass on the dataset. Can set to a higher number like 2 or 3 to do multiple
num_epochs: 1
# Optimizers don't make much of a difference when training LLMs. Adam is the standard
optimizer: adamw_torch
# DPO requires a smaller learning rate than regular SFT
lr_scheduler: constant
learning_rate: 0.00005
# Train in bf16 precision since the base model is also bf16
bf16: auto
# Reduces memory requirements
gradient_checkpointing: true
# Makes training faster (only suported on Ampere, Ada, or Hopper GPUs)
flash_attention: true
# Can save multiple times per epoch to get multiple checkpoint candidates to compare
saves_per_epoch: 1
logging_steps: 1
warmup_steps: 0
Debesų aplinkos nustatymas
Norėdami vykdyti mokymus, naudosime debesies prieglobos paslaugą, pvz., Runpod arba Vultr. Štai ko jums reikės:
- „Docker“ vaizdas: klonuokite „winglian/axolotl-cloud:main Docker“ vaizdą, kurį pateikė „Axolotl“ komanda.
- *Aparatinės įrangos reikalavimai: 80 GB VRAM GPU (kaip 1 × A100 PCIe mazgas) bus daugiau nei pakankamai tokio dydžio modeliui.
- Saugykla: 200 GB talpos saugykla, kurioje tilps visi mums reikalingi failai.
- CUDA versija: jūsų CUDA versija turi būti bent 12.1.
*Šio tipo mokymai yra laikomi visapusišku LLM suderinimu, todėl reikalauja daug VRAM. Jei norite vykdyti mokymą vietoje, nepasitikėdami debesies prieglobomis, galite pabandyti naudoti QLoRA, kuri yra prižiūrimo tikslaus derinimo forma. Nors teoriškai įmanoma sujungti DPO ir QLoRA, tai daroma labai retai.
Žingsniai norint pradėti treniruotis
- Nustatyti HuggingFace talpyklos katalogą:
export HF_HOME=/workspace/hf
Taip užtikrinama, kad originalus modelis būtų atsisiunčiamas į mūsų talpos saugyklą, kuri yra nuolatinė.
- Sukurti konfigūracijos failą: išsaugokite failą config.yml, kurį sukūrėme anksčiau, į /workspace/config.yml.
- Pradėkite treniruotę:
python -m axolotl.cli.train /workspace/config.yml
Ir voila! Jūsų mokymas turėtų prasidėti. Kai Axolotl atsisiųs modelį ir mokymo duomenis, turėtumėte pamatyti panašią išvestį:
(2024-12-02 11:22:34,798) (DEBUG) (axolotl.train.train:98) (PID:3813) (RANK:0) loading model
(2024-12-02 11:23:17,925) (INFO) (axolotl.train.train:178) (PID:3813) (RANK:0) Starting trainer...
Mokymas turėtų trukti vos kelias minutes, nes tai nedidelis, tik 264 eilučių duomenų rinkinys. Tiksliai sureguliuotas modelis bus išsaugotas /darbo sritis/dpo-output.
Modelio įkėlimas į HuggingFace
Galite įkelti savo modelį į HuggingFace naudodami CLI:
- Įdiekite HuggingFace Hub CLI:
pip install huggingface_hub(cli)
- Įkelti modelį:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo
Pakeiskite savo vardą / savo atsargą tikruoju HuggingFace vartotojo vardu ir saugyklos pavadinimu.
Tiksliai suderinto modelio įvertinimas
Norint įvertinti, rekomenduojama priglobti tiek originalius, tiek sureguliuotus modelius naudojant tokį įrankį kaip teksto generavimo išvada (TGI). Tada atlikite išvadas abiejuose modeliuose su temperatūros nustatymu 0 (siekdami užtikrinti deterministinius išėjimus) ir rankiniu būdu palyginkite dviejų modelių atsakymus.
Šis praktinis metodas suteikia geresnes įžvalgas, nei pasikliaujant vien mokymo vertinimo nuostolių metrika, kuri gali neatspindėti LLM kalbų generavimo niuansų.
Išvada
Tikslus LLM nustatymas naudojant DPO leidžia tinkinti modelius, kad jie geriau atitiktų jūsų programos poreikius, kartu išlaikant valdomas išlaidas. Vykdydami šiame straipsnyje nurodytus veiksmus, galite panaudoti atvirojo kodo įrankių ir duomenų rinkinių galią, kad sukurtumėte modelį, kuris atitiktų jūsų konkrečius reikalavimus. Nesvarbu, ar norite pakoreguoti atsakymų stilių, ar įgyvendinti saugos priemones, DPO pateikia praktinį požiūrį į LLM tobulinimą.
Laimingas koregavimas!