Google Colab で Llama-2-7B のQLoRA ファインチューニングを試す
「Google Colab」で「Llama-2-7B」のQLoRA ファインチューニングを試したので、まとめました。
前回
1. QLoRA と ござるデータセット
「QLoRA」のファインチューニングのスクリプトと、「ござるデータセット」(bbz662bbz/databricks-dolly-15k-ja-gozarinnemon) を使ってQLoRAファインチューニングに挑戦してみます。
2. Colabでの学習
Google Colabでの学習手順は、次のとおりです。
(1) メニュー「編集→ノートブックの設定」で、「ハードウェアアクセラレータ」で「GPU」を選択。
「T4」でも学習できますが、「A100」の方が時間が半分以下です。
(2) Googleドライブのマウント
# Googleドライブのマウント
from google.colab import drive
drive.mount("/content/drive")
(3) 作業フォルダへの移動
# 作業フォルダへの移動
import os
os.makedirs("/content/drive/My Drive/work", exist_ok=True)
%cd "/content/drive/My Drive/work"
(4) パッケージのインストール。
# パッケージのインストール
!git clone https://github.com/artidoro/qlora
%cd qlora
!pip install -U -r requirements.txt
(5) HuggingFaceのログイン。
リンクからHuggingFace Hubのトークンを取得し、「Token:」に入力してください。
# HuggingFaceのログイン
!huggingface-cli login
_| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|
_| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|
_|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|
_| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|
_| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|
To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .
Token:
Add token as git credential? (Y/n) n
Token is valid (permission: read).
Your token has been saved to /root/.cache/huggingface/token
Login successful
(6) 「qlora.py」の編集。
・642行目あたり
「ござるデータセット」の書式は「Alpaca」なので、Alpacaのダウンロード先を「bbz662bbz/databricks-dolly-15k-ja-gozarinnemon」に書き換えます。
if dataset_name == "alpaca":
return load_dataset("bbz662bbz/databricks-dolly-15k-ja-gozarinnemon") # 書き換え
・679行目あたり
データセットの確認用に、先頭のデータを出力してます。
dataset = dataset.map(
extract_alpaca_dataset, remove_columns=["instruction"]
)
print("dataset:", dataset["train"][0]) # 追加
・820行目あたり
「model.config.pretraining_tp = 1」を追加します。
model.config.use_cache = False
model.config.pretraining_tp = 1 # 追加
(7) 学習の実行。
「A100」では1000ステップを20分で学習できます。
「T4」では「--bf16」未対応のため「--fp16」に変更して50分かかりました。
# 学習の実行
!python qlora.py \
--model_name meta-llama/Llama-2-7b-hf \
--output_dir "./output/test_peft" \
--dataset "alpaca" \
--max_steps 1000 \
--use_auth \
--logging_steps 10 \
--save_strategy steps \
--data_seed 42 \
--save_steps 50 \
--save_total_limit 40 \
--max_new_tokens 32 \
--dataloader_num_workers 1 \
--group_by_length \
--logging_strategy steps \
--remove_unused_columns False \
--do_train \
--lora_r 64 \
--lora_alpha 16 \
--lora_modules all \
--double_quant \
--quant_type nf4 \
--bf16 \
--bits 4 \
--warmup_ratio 0.03 \
--lr_scheduler_type constant \
--gradient_checkpointing \
--source_max_len 16 \
--target_max_len 512 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--eval_steps 187 \
--learning_rate 0.0002 \
--adam_beta2 0.999 \
--max_grad_norm 0.3 \
--lora_dropout 0.1 \
--weight_decay 0.0 \
--seed 0 \
--load_in_4bit \
--use_peft \
--batch_size 4 \
--gradient_accumulation_steps 2
「./output/text_peft」にLoRAのチェックポイントが出力されます。
2. Colabでの推論
Google Colabでの推論手順は、次のとおりです。
(1) トークナイザーとモデルの読み込み。
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# トークナイザーとモデルの読み込み
tokenizer = AutoTokenizer.from_pretrained(
"meta-llama/Llama-2-7b-hf"
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
),
device_map={"":0}
)
(2) LoRAの読み込み。
# LoRAの読み込み
model = PeftModel.from_pretrained(
model,
"./output/test_peft/checkpoint-1000/adapter_model/",
device_map={"":0}
)
model.eval()
(3) 推論の実行。
# プロンプトの準備
prompt = "### Instruction: 富士山とは?\n\n### Response: "
# 推論の実行
inputs = tokenizer(prompt, return_tensors="pt").to("cuda:0")
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
他の質問応答例は、次のとおりです。
関連
次回
この記事が気に入ったらサポートをしてみませんか?