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')
``` |