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))