Pyefuri commited on
Commit
135ee9d
·
verified ·
1 Parent(s): 4dd1abf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -67
app.py CHANGED
@@ -1,9 +1,7 @@
1
  import gradio as gr
2
  import torch
3
  import spaces
4
- from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
5
- from threading import Thread
6
- import time
7
 
8
  model_name = "Pyefuri/Qwen2.5-3B-Bahasa-Biak-Final"
9
 
@@ -13,43 +11,17 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
13
  print("Memuat model Bahasa Biak...")
14
  model = AutoModelForCausalLM.from_pretrained(
15
  model_name,
16
- dtype=torch.float16,
17
  device_map="auto"
18
  )
19
 
20
  @spaces.GPU
21
  def prediksi_terjemahan(message, history):
22
- # ========================================================
23
- # FILTRASI UX: MENDETEKSI SAPAAN AGAR AI JAWABNYA RAMAH
24
- # ========================================================
25
- pesan_bersih = message.lower().strip()
26
- sapaan_id = ["halo", "hai", "selamat siang", "slamat siang", "selamat pagi", "slamat pagi", "selamat malam", "slamat malam", "apa kabar"]
27
-
28
- # Jika pengguna hanya menyapa, berikan respon chat interaktif buatan secara streaming
29
- if any(sapaan in pesan_bersih for sapaan in sapaan_id):
30
- respon_sapaan = "Hai, selamat siang! Ada yang bisa saya bantu untuk diterjemahkan ke dalam Bahasa Biak hari ini? 😊"
31
- if "pagi" in pesan_bersih:
32
- respon_sapaan = "Hai, selamat pagi! Ada yang bisa saya bantu untuk diterjemahkan ke dalam Bahasa Biak hari ini? 😊"
33
- elif "malam" in pesan_bersih:
34
- respon_sapaan = "Hai, selamat malam! Ada yang bisa saya bantu untuk diterjemahkan ke dalam Bahasa Biak hari ini? 😊"
35
-
36
- teks_berjalan = ""
37
- for karakter in respon_sapaan:
38
- teks_berjalan += karakter
39
- time.sleep(0.01) # Efek mengetik halus
40
- yield teks_berjalan
41
- return # Menghentikan fungsi di sini agar model tidak ikut memproses terjemahan kaku
42
-
43
- # ========================================================
44
- # LOGIKA UTAMA: JIKA BUKAN SAPAAN, JALANKAN TRANSLATOR BIAK
45
- # ========================================================
46
  percakapan = [
47
- {
48
- "role": "system",
49
- "content": "Kamu adalah asisten AI penerjemah yang ahli. Tugasmu adalah menerjemahkan teks dari Bahasa Indonesia ke Bahasa Biak secara akurat, alami, ringkas, dan langsung."
50
- }
51
  ]
52
 
 
53
  if history:
54
  for interaksi in history:
55
  if isinstance(interaksi, (list, tuple)) and len(interaksi) == 2:
@@ -59,7 +31,8 @@ def prediksi_terjemahan(message, history):
59
  if assistant:
60
  percakapan.append({"role": "assistant", "content": str(assistant)})
61
 
62
- percakapan.append({"role": "user", "content": message})
 
63
 
64
  input_text = tokenizer.apply_chat_template(
65
  percakapan,
@@ -68,14 +41,13 @@ def prediksi_terjemahan(message, history):
68
  )
69
 
70
  inputs = tokenizer([input_text], return_tensors="pt").to(model.device)
 
71
 
72
- streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
73
-
74
  generation_kwargs = dict(
75
  **inputs,
76
- streamer=streamer,
77
  max_new_tokens=128,
78
- temperature=0.1, # Dikembalikan ke 0.1 agar hasil terjemahan bahasa Biaknya sangat akurat dan kaku pada polanya
79
  top_p=0.85,
80
  repetition_penalty=1.2,
81
  do_sample=True,
@@ -83,36 +55,43 @@ def prediksi_terjemahan(message, history):
83
  pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
84
  )
85
 
86
- thread = Thread(target=model.generate, kwargs=generation_kwargs)
87
- thread.start()
88
-
89
- text_terjemahan = ""
90
- for new_text in streamer:
91
- text_terjemahan += new_text
92
- yield text_terjemahan.strip()
93
-
94
- # ==========================================
95
- # STRUKTUR DESAIN CUSTOM CSS
96
- # ==========================================
97
- desain_kustom_css = """
98
- #wadah-lebar-chat {
99
- max-width: 800px !important;
100
- margin: 0 auto !important;
101
- float: none !important;
102
- }
103
- """
 
 
 
 
 
 
 
 
 
 
 
104
 
105
- with gr.Blocks() as demo:
106
- gr.Markdown("# 🤖 AI Bahasa Indonesia-Biak")
107
-
108
- with gr.Column(elem_id="wadah-lebar-chat"):
109
- gr.ChatInterface(
110
- fn=prediksi_terjemahan,
111
-
112
- )
113
 
114
  if __name__ == "__main__":
115
- demo.launch(
116
- theme=gr.themes.Soft(),
117
- css=desain_kustom_css
118
- )
 
1
  import gradio as gr
2
  import torch
3
  import spaces
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer
 
 
5
 
6
  model_name = "Pyefuri/Qwen2.5-3B-Bahasa-Biak-Final"
7
 
 
11
  print("Memuat model Bahasa Biak...")
12
  model = AutoModelForCausalLM.from_pretrained(
13
  model_name,
14
+ torch_dtype=torch.float16, # Diperbaiki dari dtype menjadi torch_dtype agar standar
15
  device_map="auto"
16
  )
17
 
18
  @spaces.GPU
19
  def prediksi_terjemahan(message, history):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  percakapan = [
21
+ {"role": "system", "content": "Kamu adalah asisten AI penerjemah yang ahli. Tugasmu adalah menerjemahkan teks dari Bahasa Indonesia ke Bahasa Biak secara akurat, alami, ringkas, dan langsung tanpa pengulangan kata."}
 
 
 
22
  ]
23
 
24
+ # Membongkar history dengan validasi tipe data agar anti-unpack error
25
  if history:
26
  for interaksi in history:
27
  if isinstance(interaksi, (list, tuple)) and len(interaksi) == 2:
 
31
  if assistant:
32
  percakapan.append({"role": "assistant", "content": str(assistant)})
33
 
34
+ prompt_penerjemahan = f"Terjemahkan kalimat berikut ke dalam Bahasa Biak: {message}"
35
+ percakapan.append({"role": "user", "content": prompt_penerjemahan})
36
 
37
  input_text = tokenizer.apply_chat_template(
38
  percakapan,
 
41
  )
42
 
43
  inputs = tokenizer([input_text], return_tensors="pt").to(model.device)
44
+ input_len = inputs.input_ids.shape[1]
45
 
46
+ # Mengatur parameter generator teks
 
47
  generation_kwargs = dict(
48
  **inputs,
 
49
  max_new_tokens=128,
50
+ temperature=0.1,
51
  top_p=0.85,
52
  repetition_penalty=1.2,
53
  do_sample=True,
 
55
  pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
56
  )
57
 
58
+ # --- PROSES STREAMING YANG AMAN UNTUK ZERO GPU ---
59
+ # Di dalam decorator @spaces.GPU, kita melakukan iterasi pemrosesan token satu demi satu secara langsung
60
+ with torch.no_grad():
61
+ generated_tokens = inputs.input_ids
62
+ for _ in range(generation_kwargs["max_new_tokens"]):
63
+ outputs = model(**{"input_ids": generated_tokens})
64
+ next_token_logits = outputs.logits[:, -1, :]
65
+
66
+ # Menerapkan parameter pemrosesan (temperature & top-p) untuk pemilihan token berikutnya
67
+ if generation_kwargs["do_sample"]:
68
+ # Mengaplikasikan suhu (temperature)
69
+ next_token_logits = next_token_logits / generation_kwargs["temperature"]
70
+ probs = torch.softmax(next_token_logits, dim=-1)
71
+ next_token = torch.multinomial(probs, num_samples=1)
72
+ else:
73
+ next_token = torch.argmax(next_token_logits, dim=-1, keepdim=True)
74
+
75
+ # Menggabungkan token baru ke dalam deretan kata yang sudah tercipta
76
+ generated_tokens = torch.cat([generated_tokens, next_token], dim=-1)
77
+
78
+ # Mengubah token menjadi teks mentah yang siap ditampilkan ke UI
79
+ text_terjemahan = tokenizer.decode(generated_tokens[0][input_len:], skip_special_tokens=True)
80
+
81
+ # Mengirimkan potongan teks secara langsung ke layar web pengguna saat itu juga
82
+ yield text_terjemahan.strip()
83
+
84
+ # Menghentikan perulangan jika model mendeteksi tanda baca akhir (End of String / EOS)
85
+ if next_token.item() == generation_kwargs["eos_token_id"]:
86
+ break
87
 
88
+ # Membuat Antarmuka Gradio (Menggunakan tema bawaan agar tampilannya rapi)
89
+ demo = gr.ChatInterface(
90
+ fn=prediksi_terjemahan,
91
+ title="🤖 AI Bahasa Indonesia-Biak",
92
+ description="Silakan masukkan kalimat dalam Bahasa Indonesia untuk diterjemahkan ke dalam Bahasa Biak.",
93
+ theme=gr.themes.Soft()
94
+ )
 
95
 
96
  if __name__ == "__main__":
97
+ demo.launch()