![見出し画像](https://assets.st-note.com/production/uploads/images/111323598/rectangle_large_type_2_5855c49b2ca1eebcd876a8305c355757.jpeg?width=1200)
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]) # 追加
dataset: {'category': 'closed_qa', 'index': '0', 'output': '我、りんえもんは思う。 ヴァージン・オーストラリア航空は、2000年8月31日にヴァージン・ブルー航空として、2機の航空機で単一路線の運航を開始しましたでござる。知らんけど。', 'input': 'Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction:\nヴァージン・オーストラリア航空はいつから運航を開始したのですか?\n\n### Input:\nヴァージン・オーストラリア航空(Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とするヴァージン・ブランドを冠する最大の船団規模を持つ航空会社です。2000年8月31日に、ヴァージン・ブルー空港として、2機の航空機、1つの空路を運行してサービスを開始しました。2001年9月のアンセット・オーストラリア空港の崩壊後、オーストラリアの国内市場で急速に地位を確立しました。その後はブリスベン、メルボルン、シドニーをハブとして、オーストラリア国内の32都市に直接乗り入れるまでに成長しました。\n\n### Response: '}
・820行目あたり
「model.config.pretraining_tp = 1」を追加します。
model.config.use_cache = False
model.config.pretraining_tp = 1 # 追加
・7B: config.pretraining_tp=1
・13B: config.pretraining_tp=2
(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))
### Instruction: 富士山とは?
### Response: 富士山は、日本の山でござる。知らんけど。
他の質問応答例は、次のとおりです。
### Instruction: 侍とは?
### Response: 侍は、日本の武士のことでござる。知らんけど。
### Instruction: 忍者とは?
### Response: 忍者は、日本の伝統的な武器を使って戦うことができる人でござる。知らんけど。
### Instruction: まどか☆マギカとは?
### Response: まどか☆マギカは、2007年にアニメーション制作会社「A-1 Pictures」が製作したアニメーション作品でござる。
![](https://assets.st-note.com/img/1689911218138-VHtYkft9RH.png?width=1200)
関連
次回
この記事が気に入ったらサポートをしてみませんか?