Aekanun commited on
Commit
dfb8587
1 Parent(s): 643d69f

fixed app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -114
app.py CHANGED
@@ -7,10 +7,10 @@ from peft import PeftModel
7
  from PIL import Image
8
  import gradio as gr
9
  from huggingface_hub import login
 
10
 
11
  # Basic settings
12
  warnings.filterwarnings('ignore')
13
- os.environ["CUDA_VISIBLE_DEVICES"] = ""
14
 
15
  # Global variables
16
  model = None
@@ -18,130 +18,115 @@ processor = None
18
 
19
  # Login to Hugging Face Hub
20
  if 'HUGGING_FACE_HUB_TOKEN' in os.environ:
21
- print("กำลังเข้าสู่ระบบ Hugging Face Hub...")
22
- login(token=os.environ['HUGGING_FACE_HUB_TOKEN'])
23
  else:
24
- print("คำเตือน: ไม่พบ HUGGING_FACE_HUB_TOKEN")
25
 
26
  def load_model_and_processor():
27
- """โหลดโมเดลและ processor"""
28
- global model, processor
29
- print("กำลังโหลดโมเดลและ processor...")
30
- try:
31
- # Model paths
32
- base_model_path = "meta-llama/Llama-3.2-11B-Vision-Instruct"
33
- adapter_path = "Aekanun/thai-handwriting-llm"
34
 
35
- # Load processor from base model
36
- print("กำลังโหลด processor...")
37
- processor = AutoProcessor.from_pretrained(
38
- base_model_path,
39
- use_auth_token=True,
40
- low_memory=True # เพิ่ม low memory option
41
- )
42
 
43
- # Load base model with CPU configurations
44
- print("กำลังโหลด base model...")
45
- base_model = AutoModelForVision2Seq.from_pretrained(
46
- base_model_path,
47
- device_map={"": "cpu"},
48
- torch_dtype=torch.float32,
49
- trust_remote_code=True,
50
- use_auth_token=True,
51
- low_cpu_mem_usage=True, # เพิ่ม low memory usage
52
- offload_folder="offload" # เพิ่ม offload folder
53
- )
54
 
55
- # Load adapter with CPU configurations
56
- print("กำลังโหลด adapter...")
57
- model = PeftModel.from_pretrained(
58
- base_model,
59
- adapter_path,
60
- torch_dtype=torch.float32,
61
- device_map={"": "cpu"},
62
- use_auth_token=True,
63
- low_cpu_mem_usage=True # เพิ่ม low memory usage
64
- )
65
-
66
- # Clear memory
67
- gc.collect()
68
- torch.cuda.empty_cache() if torch.cuda.is_available() else None
69
-
70
- print("โหลดโมเดลสำเร็จ!")
71
- return True
72
- except Exception as e:
73
- print(f"เกิดข้อผิดพลาดในการโหลดโมเดล: {str(e)}")
74
- return False
75
 
 
76
  def process_handwriting(image):
77
- """ฟังก์ชันสำหรับ Gradio interface"""
78
- global model, processor
79
-
80
- if image is None:
81
- return "กรุณาอัพโหลดรูปภาพ"
82
-
83
- try:
84
- # Ensure image is in PIL format
85
- if not isinstance(image, Image.Image):
86
- image = Image.fromarray(image)
87
-
88
- # Create prompt
89
- prompt = """Transcribe the Thai handwritten text from the provided image.
90
  Only return the transcription in Thai language."""
91
-
92
- # Create model inputs
93
- messages = [
94
- {
95
- "role": "user",
96
- "content": [
97
- {"type": "text", "text": prompt},
98
- {"type": "image", "image": image}
99
- ],
100
- }
101
- ]
102
-
103
- # Process with model
104
- text = processor.apply_chat_template(messages, tokenize=False)
105
- inputs = processor(text=text, images=image, return_tensors="pt")
106
- inputs = {k: v.to('cpu') for k, v in inputs.items()}
107
-
108
- # Generate with memory optimization
109
- with torch.no_grad():
110
- outputs = model.generate(
111
- **inputs,
112
- max_new_tokens=256,
113
- do_sample=False,
114
- pad_token_id=processor.tokenizer.pad_token_id,
115
- use_cache=True # ใช้ cache เพื่อประหยัด memory
116
- )
117
-
118
- # Clear memory after generation
119
- gc.collect()
120
-
121
- # Decode output
122
- transcription = processor.decode(outputs[0], skip_special_tokens=True)
123
- return transcription.strip()
124
- except Exception as e:
125
- return f"เกิดข้อผิดพลาด: {str(e)}"
126
 
127
  # Initialize application
128
  print("กำลังเริ่มต้นแอปพลิเคชัน...")
129
  if load_model_and_processor():
130
- # Create Gradio interface with lower memory usage
131
- demo = gr.Interface(
132
- fn=process_handwriting,
133
- inputs=gr.Image(type="pil", label="อัพโหลดรูปลายมือเขียนภาษาไทย"),
134
- outputs=gr.Textbox(label="ข้อความที่แปลงได้"),
135
- title="Thai Handwriting Recognition",
136
- description="อัพโหลดรูปภาพลายมือเขียนภาษาไทยเพื่อแปลงเป็นข้อความ",
137
- examples=[["example1.jpg"], ["example2.jpg"]],
138
- cache_examples=False # ไม่ cache examples เพื่อประหยัด memory
139
- )
140
-
141
- if __name__ == "__main__":
142
- demo.launch(
143
- share=False, # ไม่แชร์ public URL
144
- show_error=True # แสดง error messages
145
- )
146
  else:
147
- print("ไม่สามารถเริ่มต้นแอปพลิเคชันได้")
 
7
  from PIL import Image
8
  import gradio as gr
9
  from huggingface_hub import login
10
+ import spaces # เพิ่ม import spaces
11
 
12
  # Basic settings
13
  warnings.filterwarnings('ignore')
 
14
 
15
  # Global variables
16
  model = None
 
18
 
19
  # Login to Hugging Face Hub
20
  if 'HUGGING_FACE_HUB_TOKEN' in os.environ:
21
+ print("กำลังเข้าสู่ระบบ Hugging Face Hub...")
22
+ login(token=os.environ['HUGGING_FACE_HUB_TOKEN'])
23
  else:
24
+ print("คำเตือน: ไม่พบ HUGGING_FACE_HUB_TOKEN")
25
 
26
  def load_model_and_processor():
27
+ """โหลดโมเดลและ processor"""
28
+ global model, processor
29
+ print("กำลังโหลดโมเดลและ processor...")
30
+ try:
31
+ # Model paths
32
+ base_model_path = "meta-llama/Llama-3.2-11B-Vision-Instruct"
33
+ adapter_path = "Aekanun/thai-handwriting-llm"
34
 
35
+ # Load processor from base model
36
+ print("กำลังโหลด processor...")
37
+ processor = AutoProcessor.from_pretrained(
38
+ base_model_path,
39
+ use_auth_token=True
40
+ )
 
41
 
42
+ # Load base model
43
+ print("กำลังโหลด base model...")
44
+ base_model = AutoModelForVision2Seq.from_pretrained(
45
+ base_model_path,
46
+ device_map="auto",
47
+ torch_dtype=torch.float16, # เปลี่ยนกลับเป็น float16
48
+ trust_remote_code=True,
49
+ use_auth_token=True
50
+ )
 
 
51
 
52
+ # Load adapter
53
+ print("กำลังโหลด adapter...")
54
+ model = PeftModel.from_pretrained(
55
+ base_model,
56
+ adapter_path,
57
+ device_map="auto", # ให้จัดการ device map อัตโนมัติ
58
+ torch_dtype=torch.float16,
59
+ use_auth_token=True
60
+ )
61
+
62
+ print("โหลดโมเดลสำเร็จ!")
63
+ return True
64
+ except Exception as e:
65
+ print(f"เกิดข้อผิดพลาดในการโหลดโมเดล: {str(e)}")
66
+ return False
 
 
 
 
 
67
 
68
+ @spaces.GPU(duration=30) # ใช้ GPU decorator กำหนดเวลาสูงสุด 30 วินาที
69
  def process_handwriting(image):
70
+ """ฟังก์ชันสำหรับ Gradio interface"""
71
+ global model, processor
72
+
73
+ if image is None:
74
+ return "กรุณาอัพโหลดรูปภ���พ"
75
+
76
+ try:
77
+ # Ensure image is in PIL format
78
+ if not isinstance(image, Image.Image):
79
+ image = Image.fromarray(image)
80
+
81
+ # Create prompt
82
+ prompt = """Transcribe the Thai handwritten text from the provided image.
83
  Only return the transcription in Thai language."""
84
+
85
+ # Create model inputs
86
+ messages = [
87
+ {
88
+ "role": "user",
89
+ "content": [
90
+ {"type": "text", "text": prompt},
91
+ {"type": "image", "image": image}
92
+ ],
93
+ }
94
+ ]
95
+
96
+ # Process with model
97
+ text = processor.apply_chat_template(messages, tokenize=False)
98
+ inputs = processor(text=text, images=image, return_tensors="pt")
99
+ inputs = {k: v.to(model.device) for k, v in inputs.items()}
100
+
101
+ # Generate
102
+ with torch.no_grad():
103
+ outputs = model.generate(
104
+ **inputs,
105
+ max_new_tokens=256,
106
+ do_sample=False,
107
+ pad_token_id=processor.tokenizer.pad_token_id
108
+ )
109
+
110
+ # Decode output
111
+ transcription = processor.decode(outputs[0], skip_special_tokens=True)
112
+ return transcription.strip()
113
+ except Exception as e:
114
+ return f"เกิดข้อผิดพลาด: {str(e)}"
 
 
 
 
115
 
116
  # Initialize application
117
  print("กำลังเริ่มต้นแอปพลิเคชัน...")
118
  if load_model_and_processor():
119
+ # Create Gradio interface
120
+ demo = gr.Interface(
121
+ fn=process_handwriting,
122
+ inputs=gr.Image(type="pil", label="อัพโหลดรูปลายมือเขียนภาษาไทย"),
123
+ outputs=gr.Textbox(label="ข้อความที่แปลงได้"),
124
+ title="Thai Handwriting Recognition",
125
+ description="อัพโหลดรูปภาพลายมือเขียนภาษาไทยเพื่อแปลงเป็นข้อความ",
126
+ examples=[["example1.jpg"], ["example2.jpg"]]
127
+ )
128
+
129
+ if __name__ == "__main__":
130
+ demo.launch(show_error=True)
 
 
 
 
131
  else:
132
+ print("ไม่สามารถเริ่มต้นแอปพลิเคชันได้")