Jeppcode commited on
Commit
2a38527
·
verified ·
1 Parent(s): 3a953d0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -15
app.py CHANGED
@@ -2,39 +2,63 @@ import gradio as gr
2
  import torch
3
  from transformers import AutoModelForCausalLM, AutoTokenizer
4
 
5
- # Hugging Face repo + subfolder där den mergade modellen ligger
6
  MODEL_ID = "Jeppcode/ScalableLab2"
7
  SUBFOLDER = "merged-model-fp16"
8
 
9
  print(f"Loading model {MODEL_ID}/{SUBFOLDER} ...")
10
 
11
- # Ladda tokenizer och modell från subfoldern
12
  tokenizer = AutoTokenizer.from_pretrained(
13
  MODEL_ID,
14
  subfolder=SUBFOLDER,
15
  )
16
 
 
17
  model = AutoModelForCausalLM.from_pretrained(
18
  MODEL_ID,
19
  subfolder=SUBFOLDER,
20
- device_map="auto", # på HF CPU-space hamnar den på cpu
 
 
21
  )
 
 
22
 
23
  def build_prompt(message, history):
24
  """
25
- Bygger upp en lista av chat-meddelanden i samma format
26
- som användes vid träning, och använder sedan chat_template.
 
 
 
 
 
27
  """
28
  messages = []
29
- for user_msg, bot_msg in history:
30
- if user_msg is not None:
31
- messages.append({"role": "user", "content": user_msg})
32
- if bot_msg is not None:
33
- messages.append({"role": "assistant", "content": bot_msg})
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  messages.append({"role": "user", "content": message})
36
 
37
- # Din tokenizer har en chat_template.jinja, så apply_chat_template ska fungera
38
  prompt = tokenizer.apply_chat_template(
39
  messages,
40
  tokenize=False,
@@ -42,6 +66,7 @@ def build_prompt(message, history):
42
  )
43
  return prompt
44
 
 
45
  def chat_fn(message, history):
46
  prompt = build_prompt(message, history)
47
 
@@ -50,11 +75,12 @@ def chat_fn(message, history):
50
  with torch.no_grad():
51
  outputs = model.generate(
52
  **inputs,
53
- max_new_tokens=256,
54
- do_sample=True,
55
- temperature=0.7,
56
- top_p=0.9,
57
  pad_token_id=tokenizer.eos_token_id,
 
58
  )
59
 
60
  generated = tokenizer.decode(
@@ -64,8 +90,10 @@ def chat_fn(message, history):
64
 
65
  return generated
66
 
 
67
  demo = gr.ChatInterface(
68
  fn=chat_fn,
 
69
  title="Lab 2 – Fine-tuned merged model (fp16)",
70
  description=(
71
  "Chat with our fine-tuned Llama-based model, merged to fp16 and "
 
2
  import torch
3
  from transformers import AutoModelForCausalLM, AutoTokenizer
4
 
 
5
  MODEL_ID = "Jeppcode/ScalableLab2"
6
  SUBFOLDER = "merged-model-fp16"
7
 
8
  print(f"Loading model {MODEL_ID}/{SUBFOLDER} ...")
9
 
10
+ # Tokenizer
11
  tokenizer = AutoTokenizer.from_pretrained(
12
  MODEL_ID,
13
  subfolder=SUBFOLDER,
14
  )
15
 
16
+ # Modell – fp16 + snålare CPU-load
17
  model = AutoModelForCausalLM.from_pretrained(
18
  MODEL_ID,
19
  subfolder=SUBFOLDER,
20
+ torch_dtype=torch.float16,
21
+ low_cpu_mem_usage=True,
22
+ device_map="cpu", # var explicit – allt på CPU
23
  )
24
+ model.eval()
25
+
26
 
27
  def build_prompt(message, history):
28
  """
29
+ history (Gradio 6) är en lista av dicts:
30
+ [
31
+ {"role": "user", "content": [...]},
32
+ {"role": "assistant", "content": [...]},
33
+ ...
34
+ ]
35
+ Vi mappar det till samma roll/text-format som vid träning.
36
  """
37
  messages = []
 
 
 
 
 
38
 
39
+ for msg in history:
40
+ role = msg.get("role")
41
+ content = msg.get("content", "")
42
+
43
+ # content kan vara en lista av blocks eller en sträng
44
+ if isinstance(content, list):
45
+ texts = []
46
+ for block in content:
47
+ if isinstance(block, dict) and block.get("type") == "text":
48
+ texts.append(block.get("text", ""))
49
+ else:
50
+ # fallback om Gradio skickar annat format
51
+ texts.append(str(block))
52
+ text = "\n".join(t for t in texts if t)
53
+ else:
54
+ text = str(content)
55
+
56
+ if text:
57
+ messages.append({"role": role, "content": text})
58
+
59
+ # Lägg till nuvarande användarmeddelande
60
  messages.append({"role": "user", "content": message})
61
 
 
62
  prompt = tokenizer.apply_chat_template(
63
  messages,
64
  tokenize=False,
 
66
  )
67
  return prompt
68
 
69
+
70
  def chat_fn(message, history):
71
  prompt = build_prompt(message, history)
72
 
 
75
  with torch.no_grad():
76
  outputs = model.generate(
77
  **inputs,
78
+ max_new_tokens=64, # kortare svar = mycket snabbare
79
+ do_sample=False, # deterministiskt, billigare
80
+ temperature=None,
81
+ top_p=None,
82
  pad_token_id=tokenizer.eos_token_id,
83
+ eos_token_id=tokenizer.eos_token_id,
84
  )
85
 
86
  generated = tokenizer.decode(
 
90
 
91
  return generated
92
 
93
+
94
  demo = gr.ChatInterface(
95
  fn=chat_fn,
96
+ type="messages", # säg tydligt att vi använder messages-formatet
97
  title="Lab 2 – Fine-tuned merged model (fp16)",
98
  description=(
99
  "Chat with our fine-tuned Llama-based model, merged to fp16 and "