Downloads · 30 days
39
48% of all-time downloads
DuckStar/llm-jp-3-13b-finetune
llm-jp-3-13b-finetune is a text generation model from DuckStar. Use it when you need the model to write or continue text. It is set up for transformers.
This is the model card of a 🤗 transformers model that has been pushed on the Hub. This model card has been automatically generated.
Downloads · 30 days
39
48% of all-time downloads
All-time downloads
82
Public
Parameters
13.9B
9.4 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors9.4 GB · 100%
How the weights are stored.
U812.7B · 91%
From the Hugging Face model README
This is the model card of a 🤗 transformers model that has been pushed on the Hub. This model card has been automatically generated.
##使い方 必要なファイルは適宜ダウンロードしてください。
!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
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
HF_TOKEN = "your-token"
base_model_id = "models/models--llm-jp--llm-jp-3-13b/snapshots/cd3823f4c1fcbb0ad2e2af46036ab1b0ca13192a" #Fine-Tuningするベースモデル
new_model_id = "llm-jp-3-13b-finetune" #Fine-Tuningしたモデルにつけたい名前
""" bnb_config: 量子化の設定
load_in_4bit:
bnb_4bit_quant_type:
bnb_4bit_compute_dtype:
"""
bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", # nf4は通常のINT4より精度が高く、ニューラルネットワークの分布に最適です bnb_4bit_compute_dtype=torch.bfloat16, )
""" model: モデル
base_model:
quantization_config:
device_map:
tokenizer: トークナイザー
base_model:
trust_remote_code:
tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True)
""" find_all_linear_names: モデル内の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_config: PEFTの構成設定
r
lora_alpha
lora_dropout
bias
task_type
target_modules
peft_config = LoraConfig( r=32, lora_alpha=32, lora_dropout=0.1, bias="none", task_type=TaskType.CAUSAL_LM, target_modules=["q_proj", "v_proj"] # モデルに応じて適宜変更 )
model = get_peft_model(model, peft_config)
"""
学習に用いるデータセットの指定
今回はLLM-jp の公開している Ichikara Instruction を使います。データにアクセスするためには申請が必要ですので、使いたい方のみ申請をしてください。
Ichikara Instruciton を Hugging Face Hub にて公開することはお控えください。
また、CC-BY-NC-SAですのでモデルはライセンスを継承する前提でお使いください。
下記のリンクから申請を終えた先に Google Drive があり、Distribution20241221_all というフォルダごとダウンロードしてください。 今回は「ichikara-instruction-003-001-1.json」を使います。必要であれば展開(!unzip など)し、データセットのパスを適切に指定してください。 omnicampusの開発環境では取得したデータを左側にドラッグアンドドロップしてお使いください。
https://liat-aip.sakura.ne.jp/wp/llmのための日本語インストラクションデータ作成/llmのための日本語インストラクションデータ-公開/ 関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎. ichikara-instruction: LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)
"""
dataset = load_dataset("json", data_files="./ichikara-instruction-003-001-1.json") dataset
prompt = """### 指示 {}
{}"""
""" formatting_prompts_func: 各データをプロンプトに合わせた形式に合わせる """ 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
print(dataset["train"]["formatted_text"][3])
""" training_arguments: 学習の設定
output_dir: -トレーニング後のモデルを保存するディレクトリ
per_device_train_batch_size:
per_device_ _batch_size:
gradient_accumulation_steps:
optim:
num_train_epochs:
eval_strategy:
eval_steps:
logging_strategy:
logging_steps:
warmup_steps:
save_steps:
save_total_limit:
max_steps:
learning_rate:
fp16:
bf16:
group_by_length:
report_to:
training_arguments = TrainingArguments( output_dir=new_model_id, per_device_train_batch_size=2, # (1) バッチサイズの見直し gradient_accumulation_steps=2, # (2) 勾配累積ステップの調整 optim="adamw_torch", # (3) オプティマイザ選択の見直し num_train_epochs=3, # (4) エポック数の増加 logging_strategy="steps", logging_steps=10, # (5) ログ出力間隔の拡大 warmup_steps=20, # (6) ウォームアップステップ数の増加 save_steps=100, # (7) 保存間隔の変更 save_total_limit=2, # (8) 保存チェックポイントの増加 max_steps=-1, learning_rate=2e-5, # (9) 学習率の調整 fp16=True, # (10) 半精度訓練の有効化(fp16) bf16=False, seed=3407, group_by_length=True, report_to="tensorboard" # (13) ログ出力先を指定し可視化ツールを利用 )
""" SFTTrainer: Supervised Fine-Tuningに関する設定
model:
train_dataset:
eval_dataset:
peft_config:
max_seq_length:
dataset_text_field:
tokenizer:
args:
packing:
model.config.use_cache = False # キャッシュ機能を無効化 trainer.train() # トレーニングを実行
import json datasets = [] with open("./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})
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')
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
[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]