File size: 3,943 Bytes
0f60aba 5bd048b 0f60aba 365bdcc 95dc46b 365bdcc 95dc46b be48767 0f60aba be48767 5bd048b b774717 5bd048b b774717 5bd048b 5141433 5bd048b 271e132 5bd048b 271e132 5bd048b |
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 |
---
library_name: transformers
license: gemma
base_model:
- google/gemma-2-9b
---
This gemma2 model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.
<a href="https://github.com/unslothai/unsloth"><img src="https://github.com/unslothai/unsloth/raw/main/images/unsloth%20new%20logo.png" width="115" alt="unsloth"></a>
# 概要
松尾研大規模言語モデル講座2024のコンペ用の提出モデル作成の一環として作成・公開しています。
# 推論方法
以下は、Google Colaboratoryでelyza-tasks-100-TV.jsonlを回答するためのコードです
```python
%%capture
!pip install unsloth
!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install -U torch
!pip install -U peft
from peft import PeftModel
import torch
import json
from tqdm import tqdm
import re
import os
HF_TOKEN = 'YOUR_TOKEN'
os.environ["HF_TOKEN"] = HF_TOKEN
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
# モデルとトークナイザーのID
new_model_id = "R-Nakamoto/gemma-2-9b-it"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
model = AutoModelForCausalLM.from_pretrained(
new_model_id,
quantization_config=bnb_config,
device_map="auto",
attn_implementation="eager"
)
tokenizer = AutoTokenizer.from_pretrained(
new_model_id,
trust_remote_code=True,
use_fast=True
)
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 = ""
import torch
torch.cuda.empty_cache()
# モデルを推論モードに設定
model.eval()
# トークナイザーの設定
tokenizer.padding_side = 'left'
model.config.use_cache = True
# バッチサイズと最大長を設定
batch_size = 8
max_length = 512
results = []
# プロンプトテンプレート
template_text = '以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n\n'
kaitou = '回答'
# バッチ処理の開始
for i in tqdm(range(0, len(datasets), batch_size)):
# バッチ単位でデータを取得
batch = datasets[i:i + batch_size]
# プロンプト作成
prompts = [
f"### 指示\n{dt['input']}\n### 回答\n"
for dt in batch
]
# トークン化
inputs = tokenizer(prompts, return_tensors="pt", padding=True, truncation=True, max_length=max_length)
# データを非同期でGPUに転送
inputs = {key: value.to(model.device, non_blocking=True) for key, value in inputs.items()}
# 推論の設定
max_new_tokens = 512
repetition_penalty = 1.2
length_penalty = 1.0
use_cache = True
num_beams = 3 # ビームサーチのビーム幅
# 推論(サンプリングを無効化し、決定論的な生成に)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
repetition_penalty=repetition_penalty,
length_penalty=length_penalty,
num_beams=num_beams, # ビームサーチを有効化
do_sample=False, # サンプリングを無効化
use_cache=use_cache
)
# 結果の処理
for dt, output in zip(batch, outputs):
prediction = tokenizer.decode(output, skip_special_tokens=True).split(f"\n### {kaitou}\n")[-1]
results.append({
"task_id": dt["task_id"],
"input": dt["input"],
"output": prediction
})
with open(f"output.jsonl", 'w', encoding='utf-8') as f:
for result in results:
json.dump(result, f, ensure_ascii=False)
f.write('\n')
```
|