éèŠãªãã€ã³ã
- LoRA = äºååŠç¿æžã¿ã¢ãã«ã«å°ããªãã¬ãŒãã³ã°å¯èœãªå±€ã远å ãã¢ãã«ã®ééã®1ïœ5%ã®ã¿ããã¬ãŒãã³ã°å¯èœã§ãVRAM ãšæéãå€§å¹ ã«åæžã
- ãã¡ã€ã³ãã¥ãŒãã³ã°èŠä»¶ïŒ500ïœ1000ã®é«å質ãªäŸã8ïœ16GB VRAMã1ïœ4æéã®ãã¬ãŒãã³ã°æéã
- æé«ã®ããŒã«ïŒUnslothïŒæéïŒãHugging Face TRLãAxolotlïŒæãæè»ïŒã
- LoRA ã©ã³ã¯ (r)ïŒ äœã (r=8) ã¯ããå°ãããããé«éãé«ã (r=64) ã¯ãã衚çŸåããããããã©ã«ã: r=16ïœ32ã
- 2026幎4æçŸåšãLoRA ã¯æ¬çªå¯Ÿå¿ã§ãæšè«ãšã³ãžã³å šäœã§åºããµããŒããããŠããŸãã
LoRA ã®ä»çµã¿
LoRA ã¯ãå ã®ã¢ãã«ã®éã¿ã®æšªã«å°ããªãã¢ããã¿ãŒããããªãã¯ã¹ã远å ããŸãã ãã¬ãŒãã³ã°äžãã¢ããã¿ãŒã®ã¿ãæŽæ°ãããŸããå ã®éã¿ã¯åçµããããŸãŸã§ãã
äŸïŒ13B ã¢ãã«ã«ã¯ 130 åã®éã¿ããããŸããLoRA 㯠5000 äžã®ãã¬ãŒãã³ã°å¯èœãªãã©ã¡ãŒã¿ã远å ããã ãã§ãïŒå ã®çŽ0.4%ïŒããã¬ãŒãã³ã°ã¯ 100 åé«éã§ãã
æšè«æãã¢ããã¿ãŒåºåã¯è¡åä¹ç®ãä»ããŠã¡ã€ã³ã¢ãã«åºåãšèåããŸããæå°éã®é床äœäžïŒçŽ5%ïŒã
çµæïŒãã¡ã€ã³åºæã®ã¢ãã«ãã¿ã¹ã¯ã§ããè¯ãæ©èœãã26GB ã§ã¯ãªã 8GB VRAM ã®ã¿ãå¿ èŠã§ãã
QLoRAïŒ4ãããéåå LoRAïŒãšã¯
QLoRA 㯠LoRA ãš 4 ãããéååãçµã¿åãããŸã â ããŒã¹ã¢ãã«ã¯ 4 ãããïŒQLoRAïŒã§ããŒããããã¢ããã¿ãŒã®ã¿ 16 ãããã§ãã¬ãŒãã³ã°ãããŸãã ããã«ãã VRAM èŠä»¶ãååã«ãªããŸãïŒ
2026幎4æçŸåšãQLoRA ã¯ã³ã³ã·ã¥ãŒããŒããŒããŠã§ã¢ã®æšæºã§ãã äžèšã®ã³ãŒãäŸã® Unsloth ã® `load_in_4bit=True` ãã©ã°ã¯ QLoRA ãèªåçã«æå¹ã«ããŸããå®å šãª LoRA ãšæ¯èŒãã 2% ã®å質差ã¯ãã»ãšãã©ã®ãã¡ã€ã³é©å¿ã¿ã¹ã¯ã§ã¯ç¡èŠã§ããŸãã
LoRA (16 ããã) vs QLoRA (4 ããã) ããã€äœ¿çšããã:
⢠æå€§ç²ŸåºŠãå¿ èŠãªã¿ã¹ã¯ïŒå»çãæ³çå¥çŽåæïŒ
⢠16GB 以äžã® VRAM ãå©çšå¯èœ
⢠3B 以äžã®ã¢ãã«ã®ãã¡ã€ã³ãã¥ãŒãã³ã°ïŒQLoRA ã®ç¯çŽã¯å°ãããµã€ãºã§ã¯æå°éïŒ
| æ¹æ³ | 7B ã¢ãã« VRAM | 13B ã¢ãã« VRAM | ãã«ãšã®æ¯èŒå質 |
|---|---|---|---|
| ãã«ãã¡ã€ã³ãã¥ãŒãã³ã° | 28GB | 52GB | 100%ïŒåºæºïŒ |
| LoRA (16 ãããããŒã¹) | 16GB | 30GB | çŽ97% |
| QLoRA (4 ãããããŒã¹) | 8GB | 14GB | çŽ95% |
ãã¡ã€ã³ãã¥ãŒãã³ã° vs RAG
決å®ãããªãã¯ã¹ïŒ
LoRAãã¡ã€ã³ãã¥ãŒãã³ã°ã«æè³ããåã«ãããè¯ãããã³ããã£ã³ã°ã§åé¡ã解決ã§ããªãã確èªããŠãã ããââããã³ãããšã³ãžãã¢ãªã³ã°ã¯ããéããå¯éçã§ãã¢ãã«ã«äŸåããŸãããå®å šãªæææ±ºå®ãã¬ãŒã ã¯ãŒã¯ã«ã€ããŠã¯ãããã³ãããšã³ãžãã¢ãªã³ã° vs ãã¡ã€ã³ãã¥ãŒãã³ã°ïŒæ±ºãæ¹ãã芧ãã ããã
ãã¡ã€ã³ãã¥ãŒãã³ã°ã¯ããªãã©ã€ã³ã§ãã³ãŒãã£ã³ã°ã¯ãŒã¯ãããŒãçç£çã«ä¿ã€ææ®µã®äžã€ã§ããã¢ãã«ãIDEãããã±ãŒãžãã£ãã·ã¥ãããã¥ã¡ã³ããã©ãŒãå«ãããåºããªãã©ã€ã³æ§æã«ã€ããŠã¯ãã€ã³ã¿ãŒããããªãã®ããŒã«ã«ã³ãŒãã£ã³ã° LLMãåç §ããŠãã ããã
| åºæº | ãã¡ã€ã³ãã¥ãŒãã³ã° | RAG |
|---|---|---|
| ããã¥ã¡ã³ã倿Žé »åºŠ | 幎1åä»¥äž | é±1åä»¥äž |
| ç¥èèŠä»¶ | ã¢ãã«ãæ·±ãçè§£ãå¿ èŠãšãã | æ€çŽ¢ã§åå |
| ãã¬ãŒãã³ã°ããŒã¿å©çšå¯èœ | 500+ é«å質äŸãå¿ èŠ | ããããããã¥ã¡ã³ã |
| ã³ã¹ãïŒé·æïŒ | ã¯ã³ã¿ã€ã ïŒ$50ïœ200ïŒ | ç¶ç¶çãªåã蟌㿠|
| ã¬ã€ãã³ã· | ããé«éïŒæ€çŽ¢ãªãïŒ | ããé ãïŒæ€çŽ¢ + LLMïŒ |
| ãã¹ãçšé | ã³ãŒããåµäœããã¡ã€ã³ã¹ã¿ã€ã« | ãã¬ããžããŒã¹ãQ&A |
ãã¬ãŒãã³ã°ããŒã¿ã®æºåæ¹æ³
ãã¬ãŒãã³ã°ããŒã¿ã®å質ããã¡ã€ã³ãã¥ãŒãã³ã°æåãæ±ºå®ããŸãã æªãããŒã¿ïŒæªãã¢ãã«ã
æå°ïŒ 500äŸãåäŸïŒå ¥åïŒæåŸ ãããåºåã
æé©ïŒ 1000ïœ5000äŸãããå€ãã®ããŒã¿ïŒããé«ã粟床ã
ãã©ãŒãããïŒ JSON ãŸã㯠JSONLãåè¡ïŒ1ã€ã®ãã¬ãŒãã³ã°äŸã
[\n {"instruction": "è±èªã«ç¿»èš³", "input": "Bonjour le monde", "output": "Hello world"},\n {"instruction": "èŠçŽ", "input": "é·ãããã¹ã...", "output": "èŠçŽ..."},\n {"instruction": "ã³ãŒãã¬ãã¥ãŒ", "input": "Python ã³ãŒã...", "output": "ã¬ãã¥ãŒã³ã¡ã³ã..."}\n]\n\n# ãŸã㯠instruction ã®ã¿ãã©ãŒããã:\n[\n {"text": "<|user|>è±èªã«ç¿»èš³\nBonjour<|assistant|>Hello"},\n {"text": "<|user|>èŠçŽ\nããã¹ã<|assistant|>èŠçŽ"}\n]Unsloth ã§ã®ãã¡ã€ã³ãã¥ãŒãã³ã°èšå®
Unsloth ã¯æéã® LoRA ãã¬ãŒã ã¯ãŒã¯ã§ãïŒæšæºãã¬ãŒãã³ã°ã® 4 åã®é床ïŒïŒ
# unsloth ãã€ã³ã¹ããŒã«\npip install unsloth[colab-new] xformers bitsandbytes\n\nfrom unsloth import FastLanguageModel\nfrom datasets import load_dataset\n\n# LoRA ã§ããŒã¹ã¢ãã«ãããŒã\nmodel, tokenizer = FastLanguageModel.from_pretrained(\n model_name="unsloth/llama-3.1-8b-bnb-4bit",\n max_seq_length=2048,\n load_in_4bit=True,\n lora_r=16, lora_alpha=32,\n lora_dropout=0.05\n)\n\n# ãã¬ãŒãã³ã°ããŒã¿ãããŒã\ndataset = load_dataset("json", data_files="training.jsonl")\n\n# ãã¬ãŒããŒãèšå®\nfrom trl import SFTTrainer\ntrainer = SFTTrainer(\n model=model,\n tokenizer=tokenizer,\n train_dataset=dataset["train"],\n dataset_text_field="text",\n max_seq_length=2048,\n args=TrainingArguments(\n per_device_train_batch_size=4,\n num_train_epochs=3,\n learning_rate=2e-4,\n output_dir="output"\n )\n)\n\n# ãã¬ãŒãã³ã°\ntrainer.train()LoRA ãã¡ã€ã³ãã¥ãŒãã³ã°ã®äž»èŠãã€ããŒãã©ã¡ãŒã¿
| ãã€ããŒãã©ã¡ãŒã¿ | æšå¥šå€ | å žåçãªç¯å² | 广 |
|---|---|---|---|
| learning_rate | 2e-4 | 1e-5 ãã 1e-3 | äœãïŒå®å®ãé ãåæ |
| lora_r (ã©ã³ã¯) | 16 | 4 ãã 64 | é«ãïŒãã衚çŸåè±ããé ã |
| lora_alpha | 32 | 8 ãã 256 | é«ãïŒãã匷ã LoRA 广 |
| num_train_epochs | 3 | 1 ãã 10 | ããå€ãïŒéåŠç¿ã®ãªã¹ã¯ |
| batch_size | 4 | 1 ãã 32 | 倧ããïŒé«éãã¬ãŒãã³ã°ãVRAM å¢å |
| warmup_steps | 100 | 0 ãã 1000 | 段éç LR å¢å ããã¬ãŒãã³ã°å®å®å |
ãã¡ã€ã³ãã¥ãŒãã³ã°ãããã¢ãã«ã®è©äŸ¡æ¹æ³
ãã¬ãŒãã³ã°ãã¹ïŒ ãšããã¯å šäœã§æžå°ããå¿ èŠããããŸãããã©ãããªå ŽåãåŠç¿çãäœãããå¯èœæ§ããããŸãã
æ€èšŒãã¹ïŒ æžå°ããå¿ èŠããããŸããããã¬ãŒãã³ã°ãã¹ããäžã«çãŸããŸãïŒæ£åžžïŒãå¢å ããå ŽåãéåŠç¿ã
æåãã¹ãïŒ ãã¡ã€ã³ãã¥ãŒãã³ã°ãããã¢ãã«ããã¹ãäŸã§å®è¡ããåºåãšæåŸ ãããçµæãæ¯èŒããŸãã
ãã³ãããŒã¯ã¿ã¹ã¯ïŒ æšæºãã³ãããŒã¯ïŒMMLUãHumanEvalïŒã䜿çšããŠããã©ãŒãã³ã¹åäžã枬å®ããŸãã
ãããããã¡ã€ã³ãã¥ãŒãã³ã°ééã
- ãã¬ãŒãã³ã°äŸãå°ãªãããã <200äŸã¯éåŠç¿ã«ã€ãªããããšãå€ããå°ãªããšã500ãåéããŠãã ããã
- ãšããã¯ãå€ãããã ã¢ãã«ã¯ããŒã¿ãèšæ¶ããŸããæ±åå¯èœãªãã¿ãŒã³ãåŠã³ãŸãããæå€§3ïœ5ãšããã¯ã
- æªèŠã®ããŒã¿ã§æ€èšŒããªãã åžžã«ããŒã¿ãåå²ããŠãã ããïŒ80/20ïŒãéåŠç¿ãæ€åºããããã«é »ç¹ã«æ€èšŒããŸãã
- ãã¡ã€ã³ãã¥ãŒãã³ã°ãšè©äŸ¡ã«åãããŒã¿ã䜿çšã ãã¬ãŒãã³ã°ããŒã¿ã§è©äŸ¡ããå Žåãå ±åãããç²ŸåºŠã¯æå³ããããŸããã
- ãã§ãã¯ãã€ã³ããä¿åããªãã ãã¬ãŒãã³ã°ã¯æ°æéãããããšããããŸããã¯ã©ãã·ã¥ããå埩ãããããæ¯ãšããã¯ä¿åããŸãã
LoRA ãã¡ã€ã³ãã¥ãŒãã³ã°ã«ã€ããŠãããã質å
ãã¬ãŒãã³ã°ããŒã¿ã¯ã©ã®ãããå¿ èŠã§ããïŒ
æå°500äŸãæé©1000ïœ5000äŸãå質ãéããåªå ã100ã®é«å質äŸã¯1000ã®äœå質äŸããåªããŠããŸãã
ããŒãããœã³ã³ã§ãã¡ã€ã³ãã¥ãŒãã³ã°ã§ããŸããïŒ
ã¯ãã4ãããéååãš LoRA ã䜿çšããŠãã ããã7B ã¢ãã«ã¯ 8GB VRAM ãå¿ èŠã§ãCPUïŒé ãïŒã§ã¯1ïœ2æéãGPU ã§ã¯10ïœ15åããããŸãã
LoRA ã¢ããã¿ãŒãããŒã¹ã¢ãã«ã«ããŒãžããã«ã¯ã©ãããã°ããã§ããïŒ
Unsloth ãŸã㯠HF Transformers ã䜿çšïŒ`model.merge_and_unload()`ãåäžãã¡ã€ã«ïŒ7B ã§çŽ3ïœ4GBïŒãäœæããæšè«ã®æºåãã§ããŸãã
è€æ°ã® LoRA ã¢ããã¿ãŒãçµã¿åãããããšã¯ã§ããŸããïŒ
ã¯ããå¶éä»ããé£ç¶é©çšã®ããã«ã¹ã¿ãã¯ããŸã㯠DoRA ãªã©ã®ã¢ããã¿ãŒæ§ææè¡ã䜿çšããŸãã
ãã¡ã€ã³ãã¥ãŒãã³ã°ãããã¢ãã«ã¯ãã¡ã€ã³ç¥èã«é¢ã㊠RAG ããåªããŠããŸããïŒ
ã»ãšãã©ã®ã¿ã¹ã¯ã§ã¯ãããã¡ã€ã³ãã¥ãŒãã³ã°ãããã¢ãã«ã¯ãã¡ã€ã³æŠå¿µãæ·±ãçè§£ããŸããããã¥ã¡ã³ãã倧ããé »ç¹ã«å€ããå ŽåãRAG ãåªããŠããŸãã
LoRA ãš QLoRA ã®éãã¯äœã§ããïŒ
LoRA ã¯ããŒã¹ã¢ãã«ã16ãããã§ããŒãããå°ããªã¢ããã¿ãŒå±€ããã¬ãŒãã³ã°ããŸããQLoRA ã¯4ãããã§ããŒããã16ãããã§ã¢ããã¿ãŒããã¬ãŒãã³ã°ããŸããQLoRA ã¯çŽååã® VRAM ã䜿çšïŒ7B ã§8GB vs 16GBãå質差ã¯çŽ2%ã§ãã»ãšãã©ã®ã¿ã¹ã¯ã§ã¯ç¡èŠã§ããŸããUnsloth 㯠`load_in_4bit=True` ã§ QLoRA ãæå¹ã«ããŸãã
Ollama ã§ãã¡ã€ã³ãã¥ãŒãã³ã°ããã LoRA ã¢ãã«ã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ
ãã¬ãŒãã³ã°åŸãã¢ããã¿ãŒãããŒãžïŒ`model.merge_and_unload()`ãllama.cpp ã® `convert.py` ã䜿çšã㊠GGUF ã«å€æããŸããGGUF ãã¡ã€ã«ãæã Ollama Modelfile ãäœæïŒ`FROM ./my-finetuned-model.gguf`ãæ¬¡ã«ïŒ`ollama create my-model -f Modelfile` ãš `ollama run my-model`ããã¡ã€ã³ãã¥ãŒãã³ã°ãããã¢ãã«ã¯ãããã Ollama ã¢ãã«ãšåãã«æ©èœããŸãã
ã³ã³ã·ã¥ãŒããŒããŒããŠã§ã¢äžã§ LoRA ã䜿çšã㊠Llama 3.3 70B ããã¡ã€ã³ãã¥ãŒãã³ã°ã§ããŸããïŒ
ã¯ããQLoRA ã䜿çšãLlama 3.3 70B ã¯4ãããã§çŽ40GB VRAM ãå¿ èŠã§ããã¥ã¢ã« RTX 4090ïŒ2Ã24GBïŒãŸãã¯åäž A100 80GB ã«é©åããŸãã1000äŸã§4ïœ8æéã®ãã¬ãŒãã³ã°ãã»ãšãã©ã®ãŠãŒã¶ãŒã«ãšã£ãŠã7B ãŸã㯠13B ã®ãã¡ã€ã³ãã¥ãŒãã³ã°ãããå®çšçã§ããã¡ã€ã³ã¿ã¹ã¯ã§ 70B ã®å質åäžã® 90% 以äžãæäŸããŸãã
LoRA ãã¡ã€ã³ãã¥ãŒãã³ã°ã«æé©ãªããŒã«ã¯ã©ãã§ããïŒ
Unsloth ã¯ã³ã³ã·ã¥ãŒããŒããŒããŠã§ã¢ã§æéã§ã â æšæºãã¬ãŒãã³ã°ãã 2 åé«éã§ 70% å°ãªã VRAMãHF TRL with PEFT ã¯æãåºã䜿çšãããŠããŸããAxolotl ã¯èšå®ã®æè»æ§ãå¿ èŠãªäžçŽãŠãŒã¶ãŒã«æé©ã§ãã
LoRA ã¢ããã¿ãŒéã¿ã¯ã©ã®ãã¡ã€ã«åœ¢åŒã䜿çšããŸããïŒ
LoRA ã¢ããã¿ãŒã¯ Safetensors ãã¡ã€ã«ïŒäŸïŒadapter_model.safetensorsïŒãšã㊠adapter_config.json ãšãšãã«ä¿åãããŸããåèšãµã€ãºã¯å žåçã«ã¯50ïœ500MB ã§ãã©ã³ã¯ïŒlora_rïŒãšé©å¿ãããã¬ã€ã€ãŒæ°ã«äŸåããŸãã
åºå ž
- Hu, E. et al. (2021). "LoRA: Low-Rank Adaptation of Large Language Models." https://arxiv.org/abs/2106.09685 â å ã®LoRAè«æã§ã0.4%ã®ãã¬ãŒãã³ã°å¯èœãã©ã¡ãŒã¿ãå®å šãªãã¡ã€ã³ãã¥ãŒãã³ã°å質ãšäžèŽããããšã瀺ããŠããŸãã
- Dettmers, T. et al. (2023). "QLoRA: Efficient Finetuning of Quantized LLMs." https://arxiv.org/abs/2305.14314 â QLoRAè«æïŒ4ãããéååããŒã¹ã¢ãã« + 16ããã LoRA ã¢ããã¿ãŒã VRAM èŠä»¶ãååã«ããŸãã
- Unsloth. (2026). "Unsloth: 4à Faster LoRA Training." https://github.com/unslothai/unsloth â æéã® LoRA ãã¬ãŒã ã¯ãŒã¯ã§ãLlama 3.xãQwen2.5ãMistral ããµããŒããã4åã®ãã¬ãŒãã³ã°é«éåãæäŸããŸãã
- Hugging Face. (2025). "TRL: Transformer Reinforcement Learning." https://github.com/huggingface/trl â LoRA ã¢ããã¿ãŒ ãµããŒãä»ãã®æåž«ãã ãã¡ã€ã³ãã¥ãŒãã³ã°çš SFTTrainerã