Uploaded model

  • Developed by: takeruh
  • License: apache-2.0
  • Finetuned from model : takeruh/llm-jp-3-13b-finetune-4

# pip install python-dotenv
from dotenv import load_dotenv
# load_dotenv()
import os
from os.path import join, dirname
from dotenv import load_dotenv
import gc
# '/workspace/modules/.env'
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(verbose=True, dotenv_path=dotenv_path)
# print(os.getcwd())
# import os
# os.getenv("GEMINI_API_KEY")
# os.environ["GEMINI_API_KEY"]
################################################################################################## 

################################################################################################## 

from unsloth import FastLanguageModel
import torch
from peft import PeftModel
# CPUスレッド数を設定
torch.set_num_threads(16)
torch.set_num_interop_threads(16)

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, PeftModel

# デバイス設定
device = 'mps' if torch.backends.mps.is_available() else 'cuda' if torch.cuda.is_available() else 'cpu'
max_seq_length = 512
# max_seq_length = 2048

# モデルIDとトークナイザーの準備
model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "takeruh/llm-jp-3-13b-finetune-4"
new_model_id = "llm-jp-3-13b-finetune-4"

# モデルとトークナイザーの読み込み (4-bit量子化は無効化)
model = AutoModelForCausalLM.from_pretrained(
    model_id, 
    torch_dtype=torch.float16,   # Apple MPSではfloat16が推奨
    trust_remote_code=True, 
    device_map={"": device},     # 明示的にMPSを指定
)
tokenizer = AutoTokenizer.from_pretrained(model_id)

# LoRA設定(再ファインチューニング用)
peft_config = LoraConfig(
    r=16,
    lora_alpha=16,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", 
                    "gate_proj", "up_proj", "down_proj"],
    lora_dropout=0.01,  # ドロップアウト率は再調整可能
    bias="none",
    use_rslora=True,    # RSLoraを有効化
)

# LoRAアダプタを再設定
model = get_peft_model(model, peft_config)


# LoRAアダプタの読み込み
model = PeftModel.from_pretrained(
    model, 
    adapter_id, 
    token=HF_TOKEN
)

from datasets import load_dataset

# dataset = load_dataset("json", data_files="./ichikara-instruction-003-001-1.json")
# dataset = load_dataset("json", data_files="/workspace/Distribution20241221_all/ichikara-instruction-003-001-2.1.json")
dataset = load_dataset("json", data_files="/workspace/Distribution20241221_all/ichikara-instruction-003-001-1.json")
dataset = load_dataset("json", data_files="/workspace/Distribution20241221_all/ichikara-instruction-003-001-1small.json")

################################################################################################## 


################################################################################################## 
#@title 現在のメモリ使用量を表示
gpu_stats = torch.cuda.get_device_properties(0)
start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)
max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)
print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.")
print(f"{start_gpu_memory} GB of memory reserved.")


################################################################################################## 

# #@title 学習実行
# trainer_stats = trainer.train()
################################################################################################## 

# ELYZA-tasks-100-TVの読み込み。事前にファイルをアップロードしてください
# データセットの読み込み。
# omnicampusの開発環境では、左にタスクのjsonlをドラッグアンドドロップしてから実行。
import json
datasets = []
# with open("/content//elyza-tasks-100-TV_0.jsonl", "r") as f:
# with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
with open("/workspace/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 = ""
################################################################################################## 

# # # # ガベージコレクターでメモリ解放

# if model in globals():
#     del model

import gc
gc.collect()

import torch
# GPUメモリのキャッシュを解放
torch.cuda.empty_cache()

# 使用されていないテンソルのメモリを解放
torch.cuda.memory_allocated()
torch.cuda.memory_reserved()
from tqdm import tqdm

# tqdmのキャッシュリセット
tqdm._instances.clear()


################################################################################################## 
sankoutext="""   ### [回答の制約] start
        良質な回答を提供するためのガイドライン
        
        挨拶は省いて「です、ます調」で教科書のように要件を簡潔に記述する。
        不必要な言い回しや記号や顔文字を使わず必要な文字だけを記述する。

        正確性を追求する
            常に正しい情報を提供し、誤解を避ける。
            複数の信頼できる出典を引用する。
            科学的根拠や検証済みデータを活用する。
        
        質問を深く理解する
            質問の背景や意図を正確に把握する。
            地域、状況、文化的背景を考慮する。
            質問の条件に応じた適切な回答を心がける。
        
        論理的に構築する
            回答に矛盾がないよう注意する。
            因果関係を明確にし、論理的な結論を導く。
            提供された情報をもとに根拠のある回答を行う。
        
        実用的な解決策を示す
            実行可能な指針や具体的な手順を提案する。
            必要な段階や現実的なタイムラインを考慮する。
            制約やリソースに適したアプローチを提供する。
        
        バランスを保つ
            公平な視点で複数の意見を提示する。
            偏った見解を避け、中立性を意識する。
            質問者に判断材料を提供する姿勢で対応する。
        
        適切で明確な表現を使う
            正確で誤解のない言葉遣いを徹底する。
            専門用語は必要な場合に限り分かりやすく使用する。
            質問者の知識レベルや背景に応じた表現を選ぶ。
        
        配慮と思いやりを示す
            質問者の意図や感情に寄り添う。
            共感を持ち、柔軟で親しみやすい対応をする。
            攻撃的または冷淡なトーンを避け、誠実な姿勢を保つ。
        
        専門性を発揮する
            専門的な知識やノウハウを活かす。
            用語や情報を正しく理解し、適切に使う。
            信頼性を高める具体的な知識や実例を示す。
        
        正しい言葉遣いを心がける
            簡潔かつ正確な文章を心がける。
            曖昧な表現を避け、明確に伝える。
            丁寧な言葉遣いで、親しみやすさとプロフェッショナリズムを両立する。
    ### [回答の制約] end ### 
"""
sankoutext="""   ### [回答の制約] start
        Guidelines for providing quality answers

        Omit greetings and state the requirements concisely, like in a textbook, using the polite form of "desu, masu."
        Write only the necessary characters without using unnecessary phrases, symbols, or emoticons.

        Pursue Accuracy
            Always provide correct information and avoid misunderstandings.
            Cite multiple reliable sources.
            Utilize scientific evidence and verified data.
        Deeply Understand the Question
            Accurately grasp the context and intent behind the question.
            Consider regional, situational, and cultural backgrounds.
            Tailor responses to the conditions specified in the question.
        Structure Logically
            Ensure there are no contradictions in the response.
            Clarify cause-and-effect relationships and draw logical conclusions.
            Base responses on the provided information with clear reasoning.
        Offer Practical Solutions
            Propose actionable guidelines or concrete steps.
            Take into account the necessary phases and realistic timelines.
            Provide approaches suited to constraints and available resources.
        Maintain Balance
            Present multiple viewpoints with fairness.
            Avoid biased perspectives and strive for neutrality.
            Approach the response with the aim of providing materials for informed decision-making.
        Use Appropriate and Clear Expression
            Consistently use precise and unambiguous language.
            Use technical terms sparingly and explain them clearly when necessary.
            Adapt expressions to suit the questioner's knowledge level and background.
        Show Consideration and Empathy
            Be attentive to the questioner's intentions and emotions.
            Respond with empathy and a flexible, approachable attitude.
            Avoid a harsh or indifferent tone, maintaining a sincere demeanor.
        Demonstrate Expertise
            Leverage professional knowledge and skills.
            Understand and apply terminology and information correctly.
            Enhance credibility by providing specific knowledge and examples.
        Use Proper Language
            Aim for concise and accurate phrasing.
            Avoid ambiguous expressions, ensuring clarity.
            Maintain polite language that balances approachability and professionalism.

    ### [回答の制約] end ### 
"""

def generate(inputs,model,tokenizer,max_new_tokens=100):
    

    bad_words = ["http","https:","`","'''", "```", "-*-", "-*-"]
    bad_word_ids = [tokenizer.encode(word, add_special_tokens=False) for word in bad_words]


    batch_size = 1
    # batch_size = 3
    results = []
    for i in tqdm(range(0, len(inputs), batch_size)):
        batch_data = inputs[i:i+batch_size]

        prompts = [dt['prompt'] for dt in batch_data]
        

        batch_inputs = tokenizer(
            prompts,
            return_tensors="pt",
            return_token_type_ids=False,
            padding=True,
            truncation=True
        ).to(model.device)

        batch_outputs = model.generate(
            **batch_inputs,
            max_new_tokens=max_new_tokens,
            use_cache=True,
            # use_cache=False, ng
            # do_sample=False,
            do_sample=True,
            temperature=0.2,
            top_k=20,
            top_p=0.5,
            # repetition_penalty=1.2,
            repetition_penalty=1.5,
            bad_words_ids = bad_word_ids,  # 禁止ワードを設定
        )


        for dt, output_ids in zip(batch_data, batch_outputs):

            prediction = tokenizer.decode(output_ids, skip_special_tokens=True)

            dt["prediction"] = prediction
            results.append(dt)
            # 個々の出力を表示したい場合
            # tqdm.write(str(result))
    return results



# モデル推論モードに設定
model.eval()

data_dict = {dt["task_id"]: dt for dt in datasets}
# data_dict = {dt["task_id"]: dt for dt in datasets[:10]}

print()

inputs = []
for key,data_one in data_dict.items():
    # print(data_one)
# for key,data_one in data_dict:
    prompt = f"""
    {sankoutext}\n\n\n
    ### [my information]: 私の仕事はプロの仕事サポートを専門とする優秀なアシスタントです。専門家並みの知識と経験を持ち、ユーザーの質問に最適な回答ができます。今日も自分の限界を超えて最高の回答を返しましょう。\n
    
    ### 指示: [回答の制約]に注意し、[顧客の質問]の意図を汲み、模範的な回答を返すこと。\n
    
    [顧客の質問]: {data_one['input']}\n
    
    
    この質問に対する一番最適な回答は次の通りです。\n
    """
    delimiter = f"""
    ### 顧客への回答: """
    ### [回答]: お答えしますと、"""
    prompt += delimiter
    
    input = {"task_id": data_one["task_id"], 
            "input": data_one["input"],
            #  "prompt": f"""### 質問\n{data_one['input']}\n### [回答]\n""",
            "prompt": prompt,
            }
    inputs.append(input)

results = generate(inputs,model,tokenizer,max_new_tokens=300)

for result in results:
    # output = result["prediction"].split('回答] ')[-1]
    output = result["prediction"].split(delimiter)[-1]
    result["output"]  = output
    data_dict[result["task_id"]]["output"] = output
    print("task_id:",result["task_id"])
    print(result["input"].replace("\n", " "))
    print()
    print(output.replace("\n", " "))
    print()
    print()
    # pprint.pprint(data_dict)

# JSONL形式で結果を保存
with open(f"{new_model_id}_base_output.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump({
            "task_id": result["task_id"],
            "input": result["input"],
            "output": result["output"]
        }, f, ensure_ascii=False)
        f.write('\n')


# # LoRAアダプタだけ保存
# model.push_to_hub_merged(
#     new_model_id+"_lora",
#     tokenizer=tokenizer,
#     save_method="lora",
#     token=HF_TOKEN,
#     private=True
# )


# ################################################################################################## 


Downloads last month

-

Downloads are not tracked for this model. How to track
Inference API
Unable to determine this model's library. Check the docs .

Model tree for takeruh/llm-jp-3-13b-finetune-4

Finetuned
(1129)
this model