Hokeno commited on
Commit
2b04a5d
·
verified ·
1 Parent(s): a486c98

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -109
app.py CHANGED
@@ -2,157 +2,81 @@ import gradio as gr
2
  import torch
3
  from transformers import GPT2Tokenizer, GPT2LMHeadModel
4
  import os
5
- import re # Import regular expression module
6
 
7
- # --- 1. Load the Fine-tuned Model and Tokenizer ---
8
- # Pastikan jalur ini sesuai dengan lokasi model yang telah Anda simpan
9
  MODEL_DIR = "./gpt2-finetuned-ai-ethics-final"
10
 
11
  try:
12
- # Memuat tokenizer
13
  tokenizer = GPT2Tokenizer.from_pretrained(MODEL_DIR)
14
 
15
- # Menambahkan token padding jika belum ada (penting untuk GPT-2)
16
  if tokenizer.pad_token is None:
17
  tokenizer.add_special_tokens({'pad_token': '[PAD]'})
18
- # Setelah menambahkan, pastikan embedding model diubah ukurannya
19
- model = GPT2LMHeadModel.from_pretrained(MODEL_DIR) # Muat ulang model setelah tokenizer diubah
20
- model.resize_token_embeddings(len(tokenizer))
21
- else:
22
- model = GPT2LMHeadModel.from_pretrained(MODEL_DIR) # Muat model jika tidak perlu resize
23
-
24
- # Secara eksplisit atur pad_token_id untuk konfigurasi generasi model dan tokenizer
25
- # Gunakan tokenizer.convert_tokens_to_ids untuk memastikan kita mendapatkan ID integer
26
- tokenizer.pad_token_id = tokenizer.convert_tokens_to_ids(tokenizer.pad_token)
27
  model.config.pad_token_id = tokenizer.pad_token_id
28
 
29
- # Pastikan eos_token_id juga diatur, biasanya <|endoftext|> untuk GPT-2
30
- if tokenizer.eos_token_id is None:
31
- # Jika eos_token tidak diatur, atur dan tambahkan sebagai special token
32
- tokenizer.eos_token = "<|endoftext|>"
33
- tokenizer.add_special_tokens({'eos_token': '<|endoftext|>'})
34
- # Ubah ukuran embedding lagi jika token baru ditambahkan
35
- model.resize_token_embeddings(len(tokenizer))
36
- # Secara eksplisit atur eos_token_id untuk konfigurasi generasi model dan tokenizer
37
- tokenizer.eos_token_id = tokenizer.convert_tokens_to_ids(tokenizer.eos_token)
38
- model.config.eos_token_id = tokenizer.eos_token_id
39
-
40
- # Memindahkan model ke GPU jika tersedia
41
  device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
42
  model.to(device)
43
- model.eval() # Set model ke mode evaluasi
44
- print(f"Model dan tokenizer berhasil dimuat dari {MODEL_DIR} ke {device}.")
45
- print(f"DEBUG: tokenizer.pad_token_id: {tokenizer.pad_token_id}")
46
- print(f"DEBUG: model.config.pad_token_id: {model.config.pad_token_id}")
47
- print(f"DEBUG: tokenizer.eos_token_id: {tokenizer.eos_token_id}")
48
- print(f"DEBUG: model.config.eos_token_id: {model.config.eos_token_id}")
49
-
50
 
51
  except Exception as e:
52
- print(f"Error saat memuat model atau tokenizer: {e}")
53
- print("Pastikan Anda telah menjalankan proses fine-tuning dan model tersimpan di direktori yang benar.")
54
- # Keluar dari aplikasi jika model tidak dapat dimuat
55
  exit()
56
 
57
- # --- 2. Define the Text Generation Function ---
58
  def generate_text(prompt, max_length=100, temperature=0.7, top_k=50, top_p=0.95, no_repeat_ngram_size=2):
59
- """
60
- Fungsi untuk menghasilkan teks menggunakan model GPT-2 yang telah di-fine-tune.
61
- Menambahkan pasca-pemrosesan untuk menghentikan output pada akhir kalimat yang masuk akal.
62
- """
63
  if not prompt:
64
- return "Silakan masukkan prompt untuk menghasilkan teks."
65
 
66
  try:
67
  input_ids = tokenizer.encode(prompt, return_tensors='pt').to(device)
68
 
69
- # Menghasilkan teks
70
- # Tambahkan sedikit buffer pada max_length untuk memberi kesempatan model menyelesaikan kalimat
71
- # Ini akan dipotong nanti jika tidak ada tanda baca yang ditemukan dalam buffer
72
- generation_max_length = max_length + 30 # Tambahkan 30 token sebagai buffer yang lebih besar
73
-
74
  output = model.generate(
75
  input_ids,
76
- max_length=generation_max_length, # Gunakan panjang yang lebih besar untuk generasi awal
77
  num_return_sequences=1,
78
  no_repeat_ngram_size=no_repeat_ngram_size,
79
  top_k=top_k,
80
  top_p=top_p,
81
  temperature=temperature,
82
- pad_token_id=tokenizer.pad_token_id, # Penting untuk generasi
83
- eos_token_id=tokenizer.eos_token_id # Penting untuk sinyal akhir teks
84
  )
85
 
86
  generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
87
 
88
- # --- Pasca-pemrosesan untuk penghentian yang lebih baik ---
89
- # Hapus prompt dari teks yang dihasilkan jika prompt ada di awal
90
- if generated_text.startswith(prompt):
91
- text_after_prompt = generated_text[len(prompt):].strip()
92
- # Jika teks setelah prompt dimulai dengan tanda baca atau spasi berlebih, hapus
93
- text_after_prompt = re.sub(r'^[.,!?\s]+', '', text_after_prompt)
94
- processed_text = prompt + " " + text_after_prompt
95
- else:
96
- processed_text = generated_text
97
-
98
- # Strategi: Cari kalimat lengkap terakhir yang berada dalam atau sedikit di atas max_length
99
- # Definisikan batas atas yang fleksibel untuk pemotongan, memungkinkan kalimat selesai
100
- # Ini mencegah pemotongan terlalu dini jika sebuah kalimat berakhir sedikit di atas max_length
101
- flexible_max_length = max_length + 20 # Izinkan hingga 20 karakter ekstra untuk penyelesaian kalimat
102
-
103
- # Temukan semua kemunculan tanda baca akhir kalimat
104
- sentence_end_indices = [m.end() for m in re.finditer(r'[.!?](?=\s|$)', processed_text)]
105
-
106
- final_cut_index = -1
107
-
108
- # Iterasi melalui akhir kalimat untuk menemukan yang terakhir yang berada dalam flexible_max_length
109
- for end_idx in sentence_end_indices:
110
- if end_idx <= flexible_max_length:
111
- final_cut_index = end_idx
112
- else:
113
- # Jika kita telah melewati batas fleksibel, kita berhenti mencari akhir kalimat
114
- # Yang terakhir valid yang ditemukan (jika ada) adalah kandidat terbaik kita
115
- break
116
-
117
- if final_cut_index != -1:
118
- # Jika akhir kalimat yang sesuai ditemukan, potong di sana
119
- processed_text = processed_text[:final_cut_index]
120
- else:
121
- # Jika tidak ada akhir kalimat yang sesuai ditemukan dalam batas fleksibel,
122
- # potong ke max_length dan pastikan berakhir pada batas kata
123
- if len(processed_text) > max_length:
124
- temp_text = processed_text[:max_length]
125
- last_space_in_limit = temp_text.rfind(' ')
126
- if last_space_in_limit != -1:
127
- processed_text = temp_text[:last_space_in_limit]
128
- else:
129
- processed_text = temp_text # Jika tidak ada spasi, potong saja
130
- # Jika processed_text sudah lebih pendek dari max_length dan tidak memiliki tanda baca,
131
- # kita kembalikan apa adanya.
132
 
133
- return processed_text.strip() # Hapus spasi di awal/akhir
134
 
135
  except Exception as e:
136
- return f"Terjadi kesalahan saat menghasilkan teks: {e}"
137
 
138
- # --- 3. Create the Gradio Interface ---
139
  iface = gr.Interface(
140
  fn=generate_text,
141
  inputs=[
142
- gr.Textbox(lines=5, label="Masukkan Prompt Anda", placeholder="Contoh: The ethical implications of AI are..."),
143
- gr.Slider(minimum=50, maximum=300, value=100, label="Panjang Teks Maksimal"),
144
- gr.Slider(minimum=0.1, maximum=1.0, value=0.7, label="Temperature (Keacakan)"),
145
- gr.Slider(minimum=0, maximum=100, value=50, step=1, label="Top-K (Pembatasan Kata)"),
146
- gr.Slider(minimum=0.0, maximum=1.0, value=0.95, label="Top-P (Probabilitas Kumulatif)"),
147
- gr.Slider(minimum=1, maximum=5, value=2, step=1, label="Ukuran N-Gram Tanpa Pengulangan")
148
  ],
149
- outputs=gr.Textbox(label="Teks yang Dihasilkan", lines=10),
150
- title="Aplikasi Generasi Teks Etika AI (GPT-2 Fine-tuned)",
151
- description="Masukkan prompt dan model GPT-2 yang telah di-fine-tune akan menghasilkan teks terkait etika AI.",
152
- theme="soft" # Tema Gradio yang lebih lembut
 
 
 
 
 
 
 
153
  )
154
 
155
- # --- 4. Launch the Gradio App ---
156
  if __name__ == "__main__":
157
- print("Meluncurkan aplikasi Gradio...")
158
  iface.launch(share=False)
 
2
  import torch
3
  from transformers import GPT2Tokenizer, GPT2LMHeadModel
4
  import os
 
5
 
 
 
6
  MODEL_DIR = "./gpt2-finetuned-ai-ethics-final"
7
 
8
  try:
 
9
  tokenizer = GPT2Tokenizer.from_pretrained(MODEL_DIR)
10
 
 
11
  if tokenizer.pad_token is None:
12
  tokenizer.add_special_tokens({'pad_token': '[PAD]'})
13
+
14
+ model = GPT2LMHeadModel.from_pretrained(MODEL_DIR)
15
+
 
 
 
 
 
 
16
  model.config.pad_token_id = tokenizer.pad_token_id
17
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
19
  model.to(device)
20
+ model.eval()
21
+ print(f"Model and tokenizer successfully loaded from {MODEL_DIR} to {device}.")
 
 
 
 
 
22
 
23
  except Exception as e:
24
+ print(f"Error loading model or tokenizer: {e}")
25
+ print("Make sure you have run the fine-tuning process and the model is saved in the correct directory.")
 
26
  exit()
27
 
 
28
  def generate_text(prompt, max_length=100, temperature=0.7, top_k=50, top_p=0.95, no_repeat_ngram_size=2):
 
 
 
 
29
  if not prompt:
30
+ return "Enter prompt here."
31
 
32
  try:
33
  input_ids = tokenizer.encode(prompt, return_tensors='pt').to(device)
34
 
 
 
 
 
 
35
  output = model.generate(
36
  input_ids,
37
+ max_length=max_length,
38
  num_return_sequences=1,
39
  no_repeat_ngram_size=no_repeat_ngram_size,
40
  top_k=top_k,
41
  top_p=top_p,
42
  temperature=temperature,
43
+ pad_token_id=tokenizer.pad_token_id
 
44
  )
45
 
46
  generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
47
 
48
+ last_period_index = generated_text.rfind('.')
49
+ if last_period_index != -1:
50
+ generated_text = generated_text[:last_period_index + 1]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
 
52
+ return generated_text
53
 
54
  except Exception as e:
55
+ return f"An error occurred while generating text: {e}"
56
 
 
57
  iface = gr.Interface(
58
  fn=generate_text,
59
  inputs=[
60
+ gr.Textbox(lines=5, label="Enter your prompt", placeholder="Example: The ethical implications of AI"),
61
+ gr.Slider(minimum=50, maximum=300, value=100, label="Maximum Text Length"),
62
+ gr.Slider(minimum=0.1, maximum=1.0, value=0.7, label="Temperature (Randomness)"),
63
+ gr.Slider(minimum=0, maximum=100, value=50, step=1, label="Top-K (Word Restriction)"),
64
+ gr.Slider(minimum=0.0, maximum=1.0, value=0.95, label="Top-P (Cumulative Probability)"),
65
+ gr.Slider(minimum=1, maximum=5, value=2, step=1, label="N-Gram Size Without Repetition")
66
  ],
67
+ outputs=gr.Textbox(label="Generated Text", lines=10),
68
+ title="AI Ethical Text Generation Application (GPT-2 Fine-tuned)",
69
+ description="Enter a prompt and the fine-tuned GPT-2 model will generate text related to AI ethics.",
70
+ theme="soft",
71
+ examples=[
72
+ ['The ethical implications of AI'],
73
+ ["Transparency and explainability in AI systems are important"],
74
+ ["Ethical challenges in AI"],
75
+ ["Privacy and data protection in AI involve"],
76
+ ["The ethical implications of AI are significant and require careful consideration"]
77
+ ]
78
  )
79
 
 
80
  if __name__ == "__main__":
81
+ print("Launching the Gradio app...")
82
  iface.launch(share=False)