File size: 4,411 Bytes
23cb2dd
0666674
 
 
 
 
 
 
 
 
 
23cb2dd
 
f51891b
0666674
 
f51891b
0666674
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f51891b
0666674
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f51891b
0666674
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
---
language: ja
license: apache-2.0
tags:
  - text-generation
  - transformers
  - lora
model_name: llm-jp-3-13b_mix_30000_1209
base_model: llm-jp/llm-jp-3-13b
adapter_model: morizon/llm-jp-3-13b_mix_30000_1209
inference_framework: transformers
---

# llm-jp-3-13b_mix_30000_1209
このモデルは日本語テキスト生成タスク向けに最適化されたLoRAアダプタ付きのモデルです。

## Sample Use

以下は、elyza-tasks-100-TV_0.jsonl回答のためのコードです。

```python

!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets
!pip install -U peft

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)
from peft import PeftModel
import torch
from tqdm import tqdm
import json

# Hugging Faceで取得したTokenをこちらに貼る。
HF_TOKEN = "your_token"

# ベースとなるモデルと学習したLoRAのアダプタ。
model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "morizon/llm-jp-3-13b_mix_30000_1209"

# QLoRA config
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)

# Load model
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map="auto",
    token = HF_TOKEN
)

# Load tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN)

# 元のモデルにLoRAのアダプタを統合。
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)

# モデルを評価モード(推論モード)に切り替える
model.eval()

# データセットの読み込み。
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 = ""


# システムプロンプト(固定の指示)
system_prompt = """
あなたはユーザが知りたいことを正確に把握し、的確に回答するアシスタントです。
1. 指示に従う際は、必ずその内容を完全に理解し、結論を優先的に考慮するように心掛けてください。
2. 問題の解答となる根拠は、常に文章内から探し出すようにして下さい。
3. 指示から主要な情報と詳細を抽出し、要点を漏らさず回答することを重視して下さい。
4. 回答のトーンやスタイルは、与えられたテーマや質問に合わせて柔軟に調整して下さい。
5. 回答を作成した後は、必ず推敲を行い、誤りや曖昧さがないかどうか確認して下さい。
"""

results = []

# データセットの処理
for data in tqdm(datasets):

    input_text = data["input"]

    # プロンプトの構築(システムプロンプト + ユーザー入力)
    prompt = f"""### 指示
{system_prompt}

{input_text}
### 回答
"""

    # トークナイズ
    tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
    attention_mask = torch.ones_like(tokenized_input)

    # 推論パラメータの設定
    max_new_tokens = 1024
    do_sample = True
    top_p = 0.95
    temperature = 0.7
    repetition_penalty = 1.05

    # 推論実行
    with torch.no_grad():
        outputs = model.generate(
            tokenized_input,
            attention_mask=attention_mask,  # attention_maskを明示的に指定
            max_new_tokens=max_new_tokens,
            do_sample=do_sample,
            top_p=top_p,
            temperature=temperature,
            repetition_penalty=repetition_penalty,
            pad_token_id=tokenizer.eos_token_id
        )[0]

    # 出力の整形
    output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)

    # 結果を表示
    print(f"Task ID: {data['task_id']}\nInput: {input_text}\nOutput: {output}\n{'-'*50}")

    # 結果の保存
    results.append({"task_id": data["task_id"], "input": input_text, "output": output})

import re
jsonl_id = re.sub(".*/", "", adapter_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')

```