Views
No views yet
1<!--
2README.md for Hugging Face model card
3Author: zcsn
4Description: A llama-based model trained with Unsloth and TRL.
5Comments have been added inline in HTML comments to describe various sections.
6-->
7
8---
9base_model: llm-jp/llm-jp-3-13b
10tags:
11 - text-generation-inference
12 - transformers
13 - unsloth
14 - llama
15 - trl
16license: apache-2.0
17language:
18 - en
19---
20
21# Uploaded Model
22
23<!--
24モデルの基本情報や開発者、ライセンスなどを明記するセクション
25-->
26- **Developed by:** zcsn
27- **License:** apache-2.0
28- **Finetuned from model:** [llm-jp/llm-jp-3-13b](https://huggingface.co/llm-jp/llm-jp-3-13b)
29
30---
31
32## Overview
33
34<!--
35モデルの目的や特徴などをざっくり説明するセクション
36-->
37- 本モデルは [llm-jp/llm-jp-3-13b](https://huggingface.co/llm-jp/llm-jp-3-13b) をベースに、UnslothやHugging Faceの[TRL](https://github.com/lvwerra/trl)ライブラリを用いて効率的に学習を行いました。
38- **RAG (Retrieval-Augmented Generation)** を使用し、質問に対して最も近いQAを類似度検索で取得し、Few-shot形式で与える仕組みになっています。
39- 学習データとして、300問のQ&Aデータ(`elyza/ELYZA-tasks-100`を元に手作業で作成)を使用しています。
40
41---
42
43## Usage
44
45<!--
46モデルの使用方法の概要を示すセクション
47-->
481. **Requirements**
49 - Python環境(例: Google Colab, ローカルPC など)
50 - Hugging Faceのアクセストークン (`HF_TOKEN`)
51
522. **Installation**
53 以下コマンドで必要なライブラリをインストールできます:
54 ```bash
55 !pip install --upgrade --no-cache-dir "unsloth[cu121-torch250] @ git+https://github.com/unslothai/unsloth.git"
56 !pip install transformers
57 !pip uninstall unsloth_zoo -y
58 !pip install --upgrade --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth-zoo.git
59 !pip install -qU langchain-community faiss-gpu
60 !pip install -qU langchain-openai
61 !pip install langchain
62 !pip install tiktoken
63 !pip install faiss-gpu1from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
2from unsloth import FastLanguageModel
3import torch
4
5max_seq_length = 512
6dtype = None
7load_in_4bit = True
8
9model_id = "llm-jp/llm-jp-3-13b"
10new_model_id = "llm-jp-3-13b-finetune-9"
11model, tokenizer = FastLanguageModel.from_pretrained(
12 model_name=model_id,
13 dtype=dtype,
14 load_in_4bit=load_in_4bit,
15 trust_remote_code=True,
16)1model = FastLanguageModel.get_peft_model(
2 model,
3 r = 64,
4 target_modules = ["q_proj", "k_proj", "v_proj", "o_proj","gate_proj", "up_proj", "down_proj"],
5 lora_alpha = 32,
6 lora_dropout = 0,
7 bias = "none",
8 use_gradient_checkpointing = "unsloth",
9 random_state = 3407,
10 use_rslora = False,
11 loftq_config = None,
12 max_seq_length = max_seq_length,
13)
14
15HF_TOKEN = "" # Hugging Face TOKEN を入れる
16
17from datasets import load_dataset
18dataset = load_dataset("json", data_files="noanswer.json")
19
20prompt = """### 指示
21{}
22### 回答
23{}"""
24
25EOS_TOKEN = tokenizer.eos_token
26
27def formatting_prompts_func(examples):
28 input = examples["text"]
29 output = examples["output"]
30 text = prompt.format(input, output) + EOS_TOKEN
31 return {"formatted_text": text}
32
33dataset = dataset.map(
34 formatting_prompts_func,
35 num_proc=4,
36)
37
38from trl import SFTTrainer
39from transformers import TrainingArguments
40from unsloth import is_bfloat16_supported
41
42trainer = SFTTrainer(
43 model = model,
44 tokenizer = tokenizer,
45 train_dataset=dataset["train"],
46 max_seq_length = max_seq_length,
47 dataset_text_field="formatted_text",
48 packing = False,
49 args = TrainingArguments(
50 per_device_train_batch_size = 1,
51 gradient_accumulation_steps = 8,
52 num_train_epochs = 3,
53 logging_steps = 1,
54 warmup_steps = 10,
55 save_steps=50,
56 save_total_limit=2,
57 max_steps=-1,
58 learning_rate = 2e-4,
59 fp16 = not is_bfloat16_supported(),
60 bf16 = is_bfloat16_supported(),
61 group_by_length=True,
62 seed = 3407,
63 output_dir = "outputs",
64 report_to = "none",
65 ),
66)
67
68trainer_stats = trainer.train()elyza-tasks-100-TV_0.jsonl) を推論し、その結果を {new_model_id}_rag_output.jsonl というファイルに出力できます。1import json
2import os
3import time
4from tqdm import tqdm
5from langchain_openai import OpenAIEmbeddings
6from langchain.vectorstores import FAISS
7from langchain.docstore.document import Document
8from transformers import AutoTokenizer, AutoModelForCausalLM
9from unsloth import FastLanguageModel
10
11# elyza-tasks-100-TV_0.jsonl を読み込み
12datasets = []
13with open("./elyza-tasks-100-TV_0.jsonl", "r", encoding="utf-8") as f:
14 item = ""
15 for line in f:
16 line = line.strip()
17 item += line
18 if item.endswith("}"):
19 datasets.append(json.loads(item))
20 item = ""
21
22# RAG用にFAISSインデックスを構築
23with open("noanswer.json", "r", encoding="utf-8") as f:
24 nhk_data = json.load(f)
25
26documents = []
27for item in nhk_data:
28 doc = Document(
29 page_content=item["text"],
30 metadata={"ID": item["ID"], "output": item["output"]}
31 )
32 documents.append(doc)
33
34embeddings = OpenAIEmbeddings(
35 openai_api_key="YOUR_OPENAI_API_KEY", # Azure経由の場合はAzureOpenAIEmbeddingsに置き換えてください
36 chunk_size=1
37)
38db = FAISS.from_documents(documents, embeddings)
39
40# モデルのロード(PEFT適用済みモデルをロード)
41FastLanguageModel.for_inference(model)
42
43results = []
44fewshotresults = []
45
46for dt in tqdm(datasets):
47 input_query = dt["input"]
48
49 # 類似度が高い文書をFAISSで検索
50 similar_docs = db.similarity_search(input_query, k=2)
51 if len(similar_docs) > 0:
52 fewshot_text_1 = similar_docs[0].page_content
53 fewshot_output_1 = similar_docs[0].metadata.get("output", "出力例がありません")
54 else:
55 fewshot_text_1 = "該当する例が見つかりませんでした。"
56 fewshot_output_1 = "申し訳ありませんが、回答が見つかりません。"
57
58 if len(similar_docs) > 1:
59 fewshot_text_2 = similar_docs[1].page_content
60 fewshot_output_2 = similar_docs[1].metadata.get("output", "出力例がありません")
61 else:
62 fewshot_text_2 = "該当する例が見つかりませんでした。"
63 fewshot_output_2 = "申し訳ありませんが、回答が見つかりません。"
64
65 # プロンプトをテンプレートに沿って作成
66 prompt = f\"\"\"### あなたは指示に対して正確に回答するヘルプデスクの担当者です。
67指示に従って回答してください
68Let’s think step by step
69また回答方法は以下の===で囲まれた例を参考にしてください。
70
71### 例
72===
73### 指示
74{fewshot_text_1}
75### 回答
76{fewshot_output_1}
77### 指示
78{fewshot_text_2}
79### 回答
80{fewshot_output_2}
81===
82
83### 指示
84{input_query}
85### 回答
86\"\"\"
87
88 inputs = tokenizer([prompt], return_tensors="pt").to(model.device)
89 outputs = model.generate(
90 **inputs,
91 max_new_tokens=512,
92 use_cache=True,
93 do_sample=False,
94 repetition_penalty=1.2
95 )
96 prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('### 回答')[-1].strip()
97
98 results.append({"task_id": dt["task_id"], "input": input_query, "output": prediction})
99 fewshot_str = f\"{input_query}{fewshot_text_1}{fewshot_text_2}\"
100 fewshotresults.append({
101 "task_id": dt["task_id"],
102 "fewshotresults": fewshot_str
103 })
104
105# 出力を確認
106print(fewshotresults)
107
108# 推論結果をJSONLで保存
109with open(f\"{new_model_id}_rag_output.jsonl\", 'w', encoding='utf-8') as f:
110 for result in results:
111 json.dump(result, f, ensure_ascii=False)
112 f.write('\\n')1model.push_to_hub_merged(
2 new_model_id,
3 tokenizer=tokenizer,
4 save_method="lora",
5 token=HF_TOKEN,
6 private=True
7)
8
9model.push_to_hub(new_model_id, token=HF_TOKEN, private=True)
10tokenizer.push_to_hub(new_model_id, token=HF_TOKEN)