tabitay commited on
Commit
be6a069
·
verified ·
1 Parent(s): 11e8686

migrate to llm-jp-3-3.7b + LoRA (tabitay/meiji-llmjp-3.7b); CPU inference

Browse files
Files changed (3) hide show
  1. README.md +16 -14
  2. app.py +30 -18
  3. requirements.txt +6 -4
README.md CHANGED
@@ -1,14 +1,16 @@
1
- ---
2
- title: 明治文学 GPT-2
3
- emoji: 📜
4
- colorFrom: indigo
5
- colorTo: red
6
- sdk: gradio
7
- sdk_version: 6.13.0
8
- python_version: "3.11"
9
- app_file: app.py
10
- pinned: false
11
- license: mit
12
- ---
13
-
14
- [tabitay/meiji-gpt2](https://huggingface.co/tabitay/meiji-gpt2) のデモ。
 
 
 
1
+ ---
2
+ title: 明治文学 LLM-jp
3
+ emoji: 📜
4
+ colorFrom: indigo
5
+ colorTo: red
6
+ sdk: gradio
7
+ sdk_version: 6.13.0
8
+ python_version: "3.11"
9
+ app_file: app.py
10
+ pinned: false
11
+ license: apache-2.0
12
+ ---
13
+
14
+ [llm-jp/llm-jp-3-3.7b](https://huggingface.co/llm-jp/llm-jp-3-3.7b) を青空文庫の明治期日本文学 14 作家 7.5M 字で QLoRA 微調整した [tabitay/meiji-llmjp-3.7b](https://huggingface.co/tabitay/meiji-llmjp-3.7b) のデモ。
15
+
16
+ プロンプト先頭に `【作家名】` を付けると文体が変わります。無料 CPU Space で動作しているため、生成には 30 秒〜数分かかります。
app.py CHANGED
@@ -1,6 +1,7 @@
1
- """明治文学 GPT-2 デモ (tabitay/meiji-gpt2)
2
 
3
- rinna/japanese-gpt2-medium を青空文庫の明治文学 7.5M 字でファインチューンしたモデル。
 
4
  プロンプト先頭に【作家名】を付けると文体を切り替えられる。
5
  """
6
  from __future__ import annotations
@@ -9,12 +10,24 @@ import re
9
 
10
  import gradio as gr
11
  import torch
12
- from transformers import AutoModelForCausalLM, T5TokenizerFast
 
13
 
14
- MODEL_ID = "tabitay/meiji-gpt2"
 
15
 
16
- tokenizer = T5TokenizerFast.from_pretrained(MODEL_ID)
17
- model = AutoModelForCausalLM.from_pretrained(MODEL_ID)
 
 
 
 
 
 
 
 
 
 
18
  model.eval()
19
 
20
  _ASCII_PATTERN = re.compile(r"[A-Za-z0-9]")
@@ -48,20 +61,19 @@ def generate(prompt: str, author: str, max_new_tokens: int, temperature: float,
48
  top_p=float(top_p),
49
  top_k=int(top_k),
50
  repetition_penalty=float(repetition_penalty),
51
- no_repeat_ngram_size=3,
52
  pad_token_id=tokenizer.pad_token_id or tokenizer.eos_token_id,
53
  bad_words_ids=BAD_WORDS_IDS if block_ascii else None,
54
  )
55
- text = tokenizer.decode(out[0], skip_special_tokens=True)
56
- return text
57
 
58
 
59
- with gr.Blocks(title="明治文学 GPT-2") as demo:
60
  gr.Markdown(
61
- "# 明治文学 GPT-2\n"
62
- "`rinna/japanese-gpt2-medium` を青空文庫の明治文学 14 作家 7.5M 字で"
63
- "ファインチューン([tabitay/meiji-gpt2](https://huggingface.co/tabitay/meiji-gpt2))。\n"
64
- "プロンプト先頭に `【作家名】` を付けると文体が変わります。"
 
65
  )
66
  with gr.Row():
67
  with gr.Column():
@@ -72,11 +84,11 @@ with gr.Blocks(title="明治文学 GPT-2") as demo:
72
  label="文語度を強める(英数字トークンを生成禁止)",
73
  )
74
  with gr.Accordion("サンプリング設定", open=False):
75
- max_new_tokens = gr.Slider(32, 256, value=120, step=8, label="max_new_tokens")
76
  temperature = gr.Slider(0.1, 1.5, value=0.5, step=0.05, label="temperature")
77
  top_p = gr.Slider(0.5, 1.0, value=0.85, step=0.05, label="top_p")
78
  top_k = gr.Slider(1, 100, value=40, step=1, label="top_k")
79
- repetition_penalty = gr.Slider(1.0, 2.0, value=1.2, step=0.05, label="repetition_penalty")
80
  btn = gr.Button("生成", variant="primary")
81
  out = gr.Textbox(label="生成結果", lines=12)
82
  btn.click(generate,
@@ -85,9 +97,9 @@ with gr.Blocks(title="明治文学 GPT-2") as demo:
85
  outputs=out)
86
  gr.Examples(
87
  examples=[
88
- ["文明の進歩は、", "(指定なし)"],
 
89
  ["学問の要は、", "福沢諭吉"],
90
- ["電子計算機とは、", "森鷗外"],
91
  ["吾輩は", "夏目漱石"],
92
  ["石炭をば早や積み果てつ。", "森鷗外"],
93
  ],
 
1
+ """明治文学 LLM-jp-3.7B LoRA デモ
2
 
3
+ llm-jp/llm-jp-3-3.7b を青空文庫の明治期日本文学 14 作家 7.5M 字で QLoRA 微調整
4
+ ([tabitay/meiji-llmjp-3.7b](https://huggingface.co/tabitay/meiji-llmjp-3.7b))。
5
  プロンプト先頭に【作家名】を付けると文体を切り替えられる。
6
  """
7
  from __future__ import annotations
 
10
 
11
  import gradio as gr
12
  import torch
13
+ from peft import PeftModel
14
+ from transformers import AutoModelForCausalLM, AutoTokenizer
15
 
16
+ BASE_MODEL = "llm-jp/llm-jp-3-3.7b"
17
+ ADAPTER = "tabitay/meiji-llmjp-3.7b"
18
 
19
+ print(f"loading tokenizer from {ADAPTER}")
20
+ tokenizer = AutoTokenizer.from_pretrained(ADAPTER, use_fast=True)
21
+
22
+ print(f"loading base model {BASE_MODEL} (bf16, CPU)")
23
+ base = AutoModelForCausalLM.from_pretrained(
24
+ BASE_MODEL,
25
+ torch_dtype=torch.bfloat16,
26
+ low_cpu_mem_usage=True,
27
+ )
28
+
29
+ print(f"attaching LoRA adapter {ADAPTER}")
30
+ model = PeftModel.from_pretrained(base, ADAPTER)
31
  model.eval()
32
 
33
  _ASCII_PATTERN = re.compile(r"[A-Za-z0-9]")
 
61
  top_p=float(top_p),
62
  top_k=int(top_k),
63
  repetition_penalty=float(repetition_penalty),
 
64
  pad_token_id=tokenizer.pad_token_id or tokenizer.eos_token_id,
65
  bad_words_ids=BAD_WORDS_IDS if block_ascii else None,
66
  )
67
+ return tokenizer.decode(out[0], skip_special_tokens=True)
 
68
 
69
 
70
+ with gr.Blocks(title="明治文学 LLM-jp") as demo:
71
  gr.Markdown(
72
+ "# 明治文学 LLM-jp-3.7B LoRA\n"
73
+ "`llm-jp/llm-jp-3-3.7b` を青空文庫の明治期日本文学 14 作家 7.5M 字で "
74
+ "QLoRA 微調整([tabitay/meiji-llmjp-3.7b](https://huggingface.co/tabitay/meiji-llmjp-3.7b))。\n"
75
+ "プロンプト先頭に `【作家名】` を付けると文体が変わります。\n\n"
76
+ "**⚠ 無料 CPU Space で動作しています。1 回の生成に 30 秒〜数分かかります。**"
77
  )
78
  with gr.Row():
79
  with gr.Column():
 
84
  label="文語度を強める(英数字トークンを生成禁止)",
85
  )
86
  with gr.Accordion("サンプリング設定", open=False):
87
+ max_new_tokens = gr.Slider(32, 200, value=100, step=8, label="max_new_tokens")
88
  temperature = gr.Slider(0.1, 1.5, value=0.5, step=0.05, label="temperature")
89
  top_p = gr.Slider(0.5, 1.0, value=0.85, step=0.05, label="top_p")
90
  top_k = gr.Slider(1, 100, value=40, step=1, label="top_k")
91
+ repetition_penalty = gr.Slider(1.0, 2.0, value=1.1, step=0.05, label="repetition_penalty")
92
  btn = gr.Button("生成", variant="primary")
93
  out = gr.Textbox(label="生成結果", lines=12)
94
  btn.click(generate,
 
97
  outputs=out)
98
  gr.Examples(
99
  examples=[
100
+ ["電子計算機とは、", "(指定なし)"],
101
+ ["人工知能の本質は、", "福沢諭吉"],
102
  ["学問の要は、", "福沢諭吉"],
 
103
  ["吾輩は", "夏目漱石"],
104
  ["石炭をば早や積み果てつ。", "森鷗外"],
105
  ],
requirements.txt CHANGED
@@ -1,4 +1,6 @@
1
- torch
2
- transformers
3
- sentencepiece
4
- protobuf
 
 
 
1
+ torch
2
+ transformers
3
+ peft
4
+ accelerate
5
+ sentencepiece
6
+ protobuf