Aekanun commited on
Commit
279bd33
1 Parent(s): 531f528

fixed app.py with low mem

Browse files
Files changed (1) hide show
  1. app.py +115 -97
app.py CHANGED
@@ -10,7 +10,7 @@ from huggingface_hub import login
10
 
11
  # Basic settings
12
  warnings.filterwarnings('ignore')
13
- os.environ["CUDA_VISIBLE_DEVICES"] = "" # ปิดการใช้ CUDA
14
 
15
  # Global variables
16
  model = None
@@ -18,113 +18,131 @@ 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(base_model_path, use_auth_token=True)
 
 
 
 
38
 
39
- # Load base model
40
- print("กำลังโหลด base model...")
41
- base_model = AutoModelForVision2Seq.from_pretrained(
42
- base_model_path,
43
- device_map={"": "cpu"}, # ใช้ CPU
44
- torch_dtype=torch.float32, # ใช้ float32 แทน bfloat16
45
- trust_remote_code=True,
46
- use_auth_token=True
47
- )
 
 
48
 
49
- # Load adapter
50
- print("กำลังโหลด adapter...")
51
- model = PeftModel.from_pretrained(
52
- base_model,
53
- adapter_path,
54
- torch_dtype=torch.float32, # ใช้ float32
55
- device_map={"": "cpu"}, # ใช้ CPU
56
- use_auth_token=True
57
- )
58
-
59
- print("โหลดโมเดลสำเร็จ!")
60
- return True
61
- except Exception as e:
62
- print(f"เกิดข้อผิดพลาดในการโหลดโมเดล: {str(e)}")
63
- return False
 
 
 
 
 
64
 
65
  def process_handwriting(image):
66
- """ฟังก์ชันสำหรับ Gradio interface"""
67
- global model, processor
68
-
69
- if image is None:
70
- return "กรุณาอัพโหลดรูปภาพ"
71
-
72
- try:
73
- # Ensure image is in PIL format
74
- if not isinstance(image, Image.Image):
75
- image = Image.fromarray(image)
76
-
77
- # Create prompt
78
- prompt = """Transcribe the Thai handwritten text from the provided image.
79
  Only return the transcription in Thai language."""
80
-
81
- # Create model inputs
82
- messages = [
83
- {
84
- "role": "user",
85
- "content": [
86
- {"type": "text", "text": prompt},
87
- {"type": "image", "image": image}
88
- ],
89
- }
90
- ]
91
-
92
- # Process with model
93
- text = processor.apply_chat_template(messages, tokenize=False)
94
- inputs = processor(text=text, images=image, return_tensors="pt")
95
-
96
- # Move inputs to CPU
97
- inputs = {k: v.to('cpu') for k, v in inputs.items()}
98
-
99
- # Generate
100
- with torch.no_grad():
101
- outputs = model.generate(
102
- **inputs,
103
- max_new_tokens=256,
104
- do_sample=False,
105
- pad_token_id=processor.tokenizer.pad_token_id
106
- )
107
-
108
- # Decode output
109
- transcription = processor.decode(outputs[0], skip_special_tokens=True)
110
- return transcription.strip()
111
- except Exception as e:
112
- return f"เกิดข้อผิดพลาด: {str(e)}"
 
 
113
 
114
  # Initialize application
115
  print("กำลังเริ่มต้นแอปพลิเคชัน...")
116
  if load_model_and_processor():
117
- # Create Gradio interface
118
- demo = gr.Interface(
119
- fn=process_handwriting,
120
- inputs=gr.Image(type="pil", label="อัพโหลดรูปลายมือเขียนภาษาไทย"),
121
- outputs=gr.Textbox(label="ข้อความที่แปลงได้"),
122
- title="Thai Handwriting Recognition",
123
- description="อัพโหลดรูปภาพลายมือเขียนภาษาไทยเพื่อแปลงเป็นข้อความ",
124
- examples=[["example1.jpg"], ["example2.jpg"]]
125
- )
126
-
127
- if __name__ == "__main__":
128
- demo.launch()
 
 
 
 
 
129
  else:
130
- print("ไม่สามารถเริ่มต้นแอปพลิเคชันได้")
 
10
 
11
  # Basic settings
12
  warnings.filterwarnings('ignore')
13
+ os.environ["CUDA_VISIBLE_DEVICES"] = ""
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
+ 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=64,
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
+ enable_queue=False # ไม่ใช้ queue เพื่อประหยัด memory
146
+ )
147
  else:
148
+ print("ไม่สามารถเริ่มต้นแอปพลิเคชันได้")