abujyhy commited on
Commit
1f8ed27
·
1 Parent(s): e060753

create app

Browse files
Files changed (3) hide show
  1. README.md +9 -23
  2. app.py +56 -86
  3. requirements.txt +3 -1
README.md CHANGED
@@ -1,30 +1,16 @@
1
 
2
-
3
  ---
4
- title: 日本語LLMチャットデモ
5
- emoji: 🧪
6
- colorFrom: blue
7
- colorTo: purple
8
  sdk: gradio
9
- sdk_version: "4.0.0"
10
  app_file: app.py
11
  pinned: false
12
  ---
13
 
14
- # 日本語 LLM Chat (CPU / Free)
15
-
16
- - **無料枠CPU)で動作**する Gradio チャットデモです。
17
- - 既定モデル: `TinyLlama/TinyLlama-1.1B-Chat-v1.0`
18
- - モデル切替: Spaces → Settings → Variables → `MODEL_ID` に任意のモデルIDを指定(例: `Qwen/Qwen2.5-1.5B-Instruct`)
19
-
20
- ## 使い方
21
- 1. 画面上部のスライダーで `max_new_tokens / temperature / top_p` を調整
22
- 2. 入力欄に質問を入力 → 送信
23
- 3. 遅い場合は `max_new_tokens` を小さく、モデルは軽量を選択
24
-
25
- ## 注意
26
- - 無料CPUは処理が遅いです。出力トークンを短くしてください。
27
- - 大きいモデル(7B以上)は CPU では非推奨です。
28
-
29
- ## ライセンス
30
- - 各モデルのライセンスはモデルカードを確認してください。
 
1
 
 
2
  ---
3
+ title: OpenJourney Image Generator (CPU/Free)
4
+ emoji: 🎨
5
+ colorFrom: purple
6
+ colorTo: indigo
7
  sdk: gradio
8
+ sdk_version: "4.16.0"
9
  app_file: app.py
10
  pinned: false
11
  ---
12
 
13
+ # OpenJourney (prompthero/openjourney) 画像生成デモ
14
+ - 無料枠(**CPU Basic**)で動作するGradioアプリ
15
+ - モデル: `prompthero/openjourney`Stable Diffusion 1.5系の派生)
16
+ - 速度重視ならGPU枠に切り替え(有料)
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -1,107 +1,77 @@
1
 
2
  import os
3
- import gradio as gr
4
  import torch
5
- from transformers import AutoTokenizer, AutoModelForCausalLM
6
-
7
- # ---- モデル選択(軽量を既定) ----
8
- DEFAULT_MODEL_ID = os.environ.get("MODEL_ID", "TinyLlama/TinyLlama-1.1B-Chat-v1.0")
9
- # 例:よりリッチにしたい時は Spaces の「Settings -> Variables」で MODEL_ID=Qwen/Qwen2.5-1.5B-Instruct を指定
10
 
11
- # ---- 省メリ・CPU前提のロード設定 ----
12
- device = torch.device("cpu") # 無料枠CPU
13
- dtype = torch.float32 # CPUはfloat32が安定。bfloat16が使える環境なら切替可
14
 
15
- tokenizer = AutoTokenizer.from_pretrained(DEFAULT_MODEL_ID)
16
- model = AutoModelForCausalLM.from_pretrained(
17
- DEFAULT_MODEL_ID,
18
- torch_dtype=dtype,
19
- low_cpu_mem_usage=True
20
- ).to(device)
21
- model.eval()
22
 
23
- SYSTEM_PROMPT = (
24
- "あなたは日本語が得で、丁寧かつ簡潔回答するアシスタントです。"
25
- "箇条書きや見出しを適宜使って、読みやすく答えてください。"
 
 
 
26
  )
27
-
28
- # ---- チャット履歴を整形(モデルに合わせてカスタマイズ可能) ----
29
- def build_prompt(system, history, user_input: str) -> str:
30
- lines = [f"[システム]\n{system}\n"]
31
- for (u, a) in history:
32
- lines.append(f"[ユーザー]\n{u}\n")
33
- lines.append(f"[アシスタント]\n{a}\n")
34
- lines.append(f"[ユーザー]\n{user_input}\n")
35
- lines.append("[アシスタント]\n")
36
- return "\n".join(lines)
37
-
38
- # ---- 推論(ストリーミング対応) ----
39
- def chat(user_input, history):
40
- prompt = build_prompt(SYSTEM_PROMPT, history, user_input)
41
- inputs = tokenizer(prompt, return_tensors="pt").to(device)
42
-
43
- # 応答速度重視の設定(CPU前提)
44
- gen_kwargs = dict(
45
- max_new_tokens=160, # 初期は短めに。必要ならUIで変更
46
- do_sample=True,
47
- temperature=0.7,
48
- top_p=0.9,
49
- repetition_penalty=1.12,
50
- pad_token_id=tokenizer.eos_token_id
51
  )
 
 
52
 
53
- # 逐次出力(Gradioのgeneratorでストリーミング)
54
- with torch.no_grad():
55
- output_ids = model.generate(**inputs, **gen_kwargs)
56
- text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
57
-
58
- # 一番最後のアシスタントの返答だけを抽出(簡易)
59
- reply = text.split("[アシスタント]")[-1].strip()
60
- history = history + [(user_input, reply)]
61
- return reply, history
62
-
63
- # ---- Gradio UI ----
64
  with gr.Blocks(theme="soft") as demo:
65
  gr.Markdown(
66
- "# 🧪 遅くて不正確なLLMチャット)\n"
67
- "日本語対応"
68
  )
69
 
70
  with gr.Row():
71
- max_tokens = gr.Slider(64, 512, value=160, step=16, label="max_new_tokens", interactive=True)
72
- temperature = gr.Slider(0.0, 1.5, value=0.7, step=0.05, label="temperature", interactive=True)
73
- top_p = gr.Slider(0.1, 1.0, value=0.9, step=0.05, label="top_p", interactive=True)
 
74
 
75
- chatbot = gr.Chatbot(height=420)
76
- user = gr.Textbox(placeholder="質問を入力してください(例:生成AIの活用例を3つ)", label="ユーザー入力")
77
- send = gr.Button("送信")
78
- clear = gr.Button("履歴クリア")
79
 
80
- state = gr.State([]) # 履歴保持
 
 
 
81
 
82
- def respond(user_input, history, max_new_tokens, temperature, top_p):
83
- # UIの値で生成パラメータを更新
84
- global model
85
- prompt = build_prompt(SYSTEM_PROMPT, history, user_input)
86
- inputs = tokenizer(prompt, return_tensors="pt").to(device)
87
- gen_kwargs = dict(
88
- max_new_tokens=int(max_new_tokens),
89
- do_sample=True,
90
- temperature=float(temperature),
91
- top_p=float(top_p),
92
- repetition_penalty=1.12,
93
- pad_token_id=tokenizer.eos_token_id
94
- )
95
- with torch.no_grad():
96
- output_ids = model.generate(**inputs, **gen_kwargs)
97
- text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
98
- reply = text.split("[アシスタント]")[-1].strip()
99
- history = history + [(user_input, reply)]
100
- return history, history
101
 
102
- send.click(respond, [user, state, max_tokens, temperature, top_p], [chatbot, state])
103
- user.submit(respond, [user, state, max_tokens, temperature, top_p], [chatbot, state])
104
- clear.click(lambda: ([], []), None, [chatbot, state])
 
 
105
 
106
  if __name__ == "__main__":
107
  demo.launch()
 
1
 
2
  import os
 
3
  import torch
4
+ import gradio as gr
5
+ from diffusers import DiffusionPipeline
 
 
 
6
 
7
+ # =====デル設定 =====
8
+ MODEL_ID = os.environ.get("MODEL_ID", "prompthero/openjourney")
 
9
 
10
+ # 無料CPU前提:float32が安定(bfloat16/float16はCPUだと非推奨)
11
+ torch_dtype = torch.float32
12
+ device = "cpu" # GPUを使うなら "cuda" に変更(SpacesのHWもGPUへ)
 
 
 
 
13
 
14
+ # パイプラインをロード
15
+ # 注: from_pretrainedの引数はCPU/FP32合わせて簡素化
16
+ pipe = DiffusionPipeline.from_pretrained(
17
+ MODEL_ID,
18
+ torch_dtype=torch_dtype,
19
+ safety_checker=None # 必要なら独自にNSFWフィルタを実装
20
  )
21
+ pipe = pipe.to(device)
22
+
23
+ # 推論関数
24
+ def generate_image(prompt, steps, guidance, seed, width, height):
25
+ # 乱数シード(再現性)
26
+ generator = None
27
+ if seed is not None and seed != "":
28
+ try:
29
+ generator = torch.Generator(device=device).manual_seed(int(seed))
30
+ except Exception:
31
+ generator = None
32
+
33
+ # CPUではサイズを抑えると速い(例: 512x512)
34
+ result = pipe(
35
+ prompt,
36
+ num_inference_steps=int(steps),
37
+ guidance_scale=float(guidance),
38
+ width=int(width),
39
+ height=int(height),
40
+ generator=generator
 
 
 
 
41
  )
42
+ image = result.images[0]
43
+ return image
44
 
45
+ # Gradio UI
 
 
 
 
 
 
 
 
 
 
46
  with gr.Blocks(theme="soft") as demo:
47
  gr.Markdown(
48
+ "# 🎨 OpenJourney 画像生成(CPU/Free)\n"
49
+ "無料CPUで動作するため、生成には時間がかかります。サイズとステップを小さめにすると速くなります。"
50
  )
51
 
52
  with gr.Row():
53
+ prompt = gr.Textbox(
54
+ label="プロンプト",
55
+ value="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
56
+ )
57
 
58
+ with gr.Row():
59
+ steps = gr.Slider(10, 50, value=25, step=1, label="num_inference_steps(多いほど高品質・遅い)")
60
+ guidance = gr.Slider(1.0, 12.0, value=7.5, step=0.1, label="guidance_scale(プロンプト忠実度)")
 
61
 
62
+ with gr.Row():
63
+ width = gr.Dropdown(choices=["384","448","512","576","640"], value="512", label="幅(px)")
64
+ height = gr.Dropdown(choices=["384","448","512","576","640"], value="512", label="高さ(px)")
65
+ seed = gr.Textbox(value="", label="seed(空ならランダム)")
66
 
67
+ generate_btn = gr.Button("生成")
68
+ output = gr.Image(label="出力画像", type="pil")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ generate_btn.click(
71
+ fn=generate_image,
72
+ inputs=[prompt, steps, guidance, seed, width, height],
73
+ outputs=[output]
74
+ )
75
 
76
  if __name__ == "__main__":
77
  demo.launch()
requirements.txt CHANGED
@@ -1,4 +1,6 @@
1
  transformers
2
  accelerate
3
  gradio
4
- torch
 
 
 
1
  transformers
2
  accelerate
3
  gradio
4
+ torch
5
+ diffusers==0.31.0
6
+ safetensors