Downloads · 30 days
0
hita774/llm-jp-3-13b-finetune
llm-jp-3-13b-finetune is a machine learning model from hita774. Use it for the machine learning task on the model card, and read the license before you ship it in a product. It is set up for transformers.
モデル構築 and 学習コードです. llm-jp-3-13bを採用し,ichikara-instructionデータセットを利用して,SFTしました. コードはGoogle colaboratory上で実行可能です.
Downloads · 30 days
0
Access
Public
Updated Dec 23, 2024
Repo size
250 MB
Likes
0
Public
Click a slice to open those files.
.safetensors250 MB · 97%
From the Hugging Face model README
モデル構築 and 学習コードです. llm-jp-3-13bを採用し,ichikara-instructionデータセットを利用して,SFTしました. コードはGoogle colaboratory上で実行可能です.
# python 3.10.12
!pip install -U pip
!pip install -U transformers
!pip install -U bitsandbytes
!pip install -U accelerate
!pip install -U datasets
!pip install -U peft
!pip install -U trl
!pip install -U wandb
!pip install ipywidgets --upgrade
!pip install huggingface_hub
!huggingface-cli login
# Hugging Face Token
HF_TOKEN = "my_token"
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
TrainingArguments,
logging,
)
from peft import (
LoraConfig,
PeftModel,
get_peft_model,
)
import os, torch, gc
from datasets import load_dataset
import bitsandbytes as bnb
from trl import SFTTrainer
# モデルを読み込み。
base_model_id = "llm-jp/llm-jp-3-13b"
new_model_id = "llm-jp-3-13b-finetune" #Fine-Tuningしたモデルにつけたい名前
# 量子化の設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # nf4は通常のINT4より精度が高く、ニューラルネットワークの分布に最適です
bnb_4bit_compute_dtype=torch.bfloat16,
)
# モデル
model = AutoModelForCausalLM.from_pretrained(
base_model_id,
quantization_config=bnb_config,
device_map="auto"
)
# トークナイザ
tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True)
# モデル内の4bit量子化線形層を探します。
def find_all_linear_names(model):
cls = bnb.nn.Linear4bit # 4bit量子化線形層クラスを指定
lora_module_names = set() # ここに取得した線形層を保持します。
# モデル内の全てのモジュールを探索します
for name, module in model.named_modules():
if isinstance(module, cls): # モジュールが4bit量子化線形層の場合
names = name.split('.') # モジュールの名前を分割 (ネストされてる際などに対処)
lora_module_names.add(names[0] if len(names) == 1 else names[-1]) # 最下層の名前をlora_module_namesに追加
# 'lm_head' は16ビット演算の際に除外する必要があるため、lora_module_namesから削除
if 'lm_head' in lora_module_names:
lora_module_names.remove('lm_head')
return list(lora_module_names) # lora_module_namesをリストに変換して返します。
modules = find_all_linear_names(model)
# PEFTの構成設定
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=modules,
)
model = get_peft_model(model, peft_config)
# 学習に用いるデータセットの指定(LLM-jp の公開している Ichikara Instruction)
# あらかじめ,使用申請を後にダウンロード + google driveをマウントした上で,本コードで使用できる環境にしました.
dataset = load_dataset("json", data_files="/content/Distribution20241221_all/ichikara-instruction-003-001-1.json")
dataset
# 学習時のプロンプトフォーマットの定義
prompt = """### 指示
{}
### 回答
{}"""
# 各データをプロンプトに合わせた形式に合わせる
EOS_TOKEN = tokenizer.eos_token # トークナイザーのEOSトークン(文末トークン)
def formatting_prompts_func(examples):
input = examples["text"] # 入力データ
output = examples["output"] # 出力データ
text = prompt.format(input, output) + EOS_TOKEN # プロンプトの作成
return { "formatted_text" : text, } # 新しいフィールド "formatted_text" を返す
pass
# 各データにフォーマットを適用
dataset = dataset.map(
formatting_prompts_func,
num_proc= 4, # 並列処理数を指定
)
dataset
# 学習の設定
training_arguments = TrainingArguments(
output_dir=new_model_id,
per_device_train_batch_size=1,
gradient_accumulation_steps=2,
optim="paged_adamw_32bit",
num_train_epochs=1,
logging_strategy="steps",
logging_steps=10,
warmup_steps=10,
save_steps=100,
save_total_limit = 2,
max_steps = -1,
learning_rate=5e-5,
fp16=False,
bf16=False,
seed = 3407,
group_by_length=True,
report_to="none"
)
# Supervised Fine-Tuningに関する設定
trainer = SFTTrainer(
model=model,
train_dataset=dataset["train"],
peft_config=peft_config,
max_seq_length= 512,
dataset_text_field="formatted_text",
tokenizer=tokenizer,
args=training_arguments,
packing= False,
)
model.config.use_cache = False # キャッシュ機能を無効化
trainer.train() # トレーニングを実行
elyze-tasks-100-TV_0.jsonlの回答コードです. コードはGoogle colaboratory上で実行しました.
# jsonlデータの読み込み
import json
datasets = []
with open("/content/drive/MyDrive/LLM講座/最終課題/elyza-tasks-100-TV_0.jsonl", "r") as f:
item = ""
for line in f:
line = line.strip()
item += line
if item.endswith("}"):
datasets.append(json.loads(item))
item = ""
# モデルによる推論
from tqdm import tqdm
results = []
for data in tqdm(datasets):
input = data["input"]
prompt = f"""### 指示
{input}
### 回答
"""
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
attention_mask = torch.ones_like(tokenized_input)
with torch.no_grad():
outputs = model.generate(
tokenized_input,
attention_mask=attention_mask,
max_new_tokens=100,
do_sample=False,
repetition_penalty=1.2,
pad_token_id=tokenizer.eos_token_id
)[0]
output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
results.append({"task_id": data["task_id"], "input": input, "output": output})
# 回答jsolファイルの生成
import re
jsonl_id = re.sub(".*/", "", new_model_id)
with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
for result in results:
json.dump(result, f, ensure_ascii=False) # ensure_ascii=False for handling non-ASCII characters
f.write('\n')
# モデルとトークナイザーをHugging Faceにアップロード
model.push_to_hub(new_model_id, token=HF_TOKEN, private=True) # Online saving
tokenizer.push_to_hub(new_model_id, token=HF_TOKEN, private=True) # Online saving
This is the model card of a 🤗 transformers model that has been pushed on the Hub. This model card has been automatically generated.
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. More information needed for further recommendations.
Use the code below to get started with the model.
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
Carbon emissions can be estimated using the Machine Learning Impact calculator presented in Lacoste et al. (2019).
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
BibTeX:
[More Information Needed]
APA:
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]
[More Information Needed]