[LLM] Llama 3.1 × LoRA の流れ

Llama 3.1 × LoRA の流れ
ベースモデル読み込み(4bit量子化)
LoRA 設定(r=16 など)
指示データを用意(chat形式)
学習(300ステップくらい)
LoRA アダプタ保存(数十MB)
Base + LoRA で推論

これで 社内特化 LLM・商品説明特化 LLM・カスタマーサポート LLM

. 準備(必要なライブラリ)

Google Colab なら下記だけで準備OK:

!pip install transformers accelerate peft bitsandbytes datasets

2. ベースモデルを決める(例:Llama 3.1 8B)

軽くて実用的な LLama の OSS モデル:

meta-llama/Meta-Llama-3.1-8B

3. 学習データの形式

LoRA は「教師データ」が **指示形式(instruction format)」だと最も効果が出ます。

例:JSONL(1行1サンプル)
{“instruction”: “社内VPNの再接続方法を教えて”, “response”: “設定→ネットワーク→VPN→再接続ボタンを押すだけです。”}
{“instruction”: “見積書を再発行するには?”, “response”: “営業管理システムで案件番号を検索し、PDFを再生成できます。”}

例:ChatML 形式(最近はこちらが主流)
{
“messages”: [
{“role”: “user”, “content”: “返品の受付方法を教えて”},
{“role”: “assistant”, “content”: “返品受付画面で注文番号を入力し、ステータスを「返品受付」に変更します。”}
]
}

4. LoRA 設定(PEFT)
from peft import LoraConfig

lora_config = LoraConfig(
r=16, # Rank(一般的に 8 / 16)
lora_alpha=32,
lora_dropout=0.05,
bias=”none”,
task_type=”CAUSAL_LM”
)

5. モデル読み込み(4bit 量子化=QLoRA)

4bit QLoRA の標準書き方:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = “meta-llama/Meta-Llama-3.1-8B”

model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
quantization_config={“load_in_4bit”: True},
device_map=”auto”
)

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

これで GPU 8GB でも Llama3.1-8B を微調整できる状態になります。

6. データセット読み込み
from datasets import load_dataset
dataset = load_dataset(“json”, data_files=”train.jsonl”)

7. 学習データの前処理(プロンプト生成)
def format_chat(example):
messages = example[“messages”]

text = tokenizer.apply_chat_template(
messages,
add_generation_prompt=False
)
return {“text”: text}

dataset = dataset.map(format_chat)

8. Trainer で LoRA 学習開始
from transformers import TrainingArguments, Trainer
from peft import get_peft_model

peft_model = get_peft_model(model, lora_config)

args = TrainingArguments(
output_dir=”llama-lora”,
per_device_train_batch_size=1,
gradient_accumulation_steps=16,
warmup_steps=10,
max_steps=300, # 100~500 で充分効果出る
learning_rate=2e-4,
fp16=True,
logging_steps=10,
save_steps=100,
)

def collate(batch):
return tokenizer(batch[“text”], padding=True, truncation=True, return_tensors=”pt”)

trainer = Trainer(
model=peft_model,
args=args,
train_dataset=dataset,
data_collator=collate
)

trainer.train()

9. 結果の保存(LoRA のみ数十 MB)
peft_model.save_pretrained(“lora-out”)

出力されるのは adapter_config.json / adapter_model.bin
→ 30〜100MB 程度で Llama 3.1 がカスタムモデルになります。

10. 推論(本番利用)
from peft import PeftModel

base = AutoModelForCausalLM.from_pretrained(model_name, device_map=”auto”)
model = PeftModel.from_pretrained(base, “lora-out”)

prompt = “社内VPNに接続できない時の対処方法は?”
inputs = tokenizer(prompt, return_tensors=”pt”).to(“cuda”)

output = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(output[0], skip_special_tokens=True))