Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -12,13 +12,27 @@ import gradio as gr
|
|
12 |
import spaces
|
13 |
import torch
|
14 |
from loguru import logger
|
15 |
-
from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer
|
|
|
16 |
|
17 |
# CSV/TXT ๋ถ์
|
18 |
import pandas as pd
|
19 |
# PDF ํ
์คํธ ์ถ์ถ
|
20 |
import PyPDF2
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
##############################################################################
|
23 |
# ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ํจ์ ์ถ๊ฐ
|
24 |
##############################################################################
|
@@ -134,17 +148,21 @@ def do_web_search(query: str) -> str:
|
|
134 |
##############################################################################
|
135 |
# ๋ชจ๋ธ ๋ฐ ํ ํฌ๋์ด์ ๋ก๋ (Space ํ๊ฒฝ์์ ์ต์ ํ)
|
136 |
##############################################################################
|
137 |
-
@spaces.GPU
|
138 |
def load_model(model_name="VIDraft/Gemma-3-R1984-1B", adapter_name="openfree/Gemma-3-R1984-1B-0613"):
|
|
|
|
|
139 |
logger.info(f"๋ชจ๋ธ ๋ก๋ฉ ์์: {model_name} (์ด๋ํฐ: {adapter_name})")
|
140 |
clear_cuda_cache() # ์บ์ ์ ๋ฆฌ
|
141 |
|
|
|
|
|
|
|
|
|
142 |
bnb_config = BitsAndBytesConfig(
|
143 |
load_in_4bit=True,
|
144 |
bnb_4bit_use_double_quant=True,
|
145 |
bnb_4bit_quant_type="nf4",
|
146 |
bnb_4bit_compute_dtype=torch.bfloat16,
|
147 |
-
# nf4_nested_quant=False, # ํ์์ ํ์ฑํ
|
148 |
)
|
149 |
|
150 |
# ๋ฒ ์ด์ค ๋ชจ๋ธ ๋ก๋
|
@@ -160,14 +178,12 @@ def load_model(model_name="VIDraft/Gemma-3-R1984-1B", adapter_name="openfree/Gem
|
|
160 |
tokenizer.pad_token = tokenizer.eos_token
|
161 |
|
162 |
# PEFT ์ด๋ํฐ ๋ก๋ ๋ฐ ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๋ณํฉ
|
163 |
-
from peft import PeftModel
|
164 |
try:
|
165 |
model = PeftModel.from_pretrained(model, adapter_name)
|
166 |
logger.info(f"PEFT ์ด๋ํฐ ๋ก๋ฉ ๋ฐ ๋ณํฉ ์๋ฃ: {adapter_name}")
|
167 |
except Exception as e:
|
168 |
logger.error(f"PEFT ์ด๋ํฐ ๋ก๋ฉ ์ค๋ฅ: {e}")
|
169 |
logger.warning("์ด๋ํฐ ๋ก๋ฉ์ ์คํจํ์ต๋๋ค. ๋ฒ ์ด์ค ๋ชจ๋ธ๋ก ์งํํฉ๋๋ค.")
|
170 |
-
# ์ด๋ํฐ ๋ก๋ฉ ์คํจ ์ ๋ฒ ์ด์ค ๋ชจ๋ธ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฑฐ๋ ์ค๋ฅ ์ฒ๋ฆฌ
|
171 |
|
172 |
model.eval() # ์ถ๋ก ๋ชจ๋๋ก ์ค์
|
173 |
|
@@ -290,6 +306,7 @@ def process_history(history: list[dict]) -> str:
|
|
290 |
##############################################################################
|
291 |
def _model_gen_with_oom_catch(**kwargs):
|
292 |
"""๋ณ๋ ์ค๋ ๋์์ OutOfMemoryError๋ฅผ ์ก์์ฃผ๊ธฐ ์ํด"""
|
|
|
293 |
try:
|
294 |
model.generate(**kwargs)
|
295 |
except torch.cuda.OutOfMemoryError:
|
@@ -312,6 +329,11 @@ def run(
|
|
312 |
use_web_search: bool = False,
|
313 |
web_search_query: str = "",
|
314 |
) -> Iterator[str]:
|
|
|
|
|
|
|
|
|
|
|
315 |
|
316 |
try:
|
317 |
# ์ ์ฒด ํ๋กฌํํธ ๊ตฌ์ฑ
|
|
|
12 |
import spaces
|
13 |
import torch
|
14 |
from loguru import logger
|
15 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer, BitsAndBytesConfig
|
16 |
+
from peft import PeftModel
|
17 |
|
18 |
# CSV/TXT ๋ถ์
|
19 |
import pandas as pd
|
20 |
# PDF ํ
์คํธ ์ถ์ถ
|
21 |
import PyPDF2
|
22 |
|
23 |
+
##############################################################################
|
24 |
+
# ์์ ์ ์
|
25 |
+
##############################################################################
|
26 |
+
MAX_CONTENT_CHARS = 2000 # ๋ฌธ์ ๋ด์ฉ ์ต๋ ๋ฌธ์ ์
|
27 |
+
MAX_INPUT_LENGTH = 4096 # ๋ชจ๋ธ ์
๋ ฅ ์ต๋ ํ ํฐ ์
|
28 |
+
|
29 |
+
##############################################################################
|
30 |
+
# ์ ์ญ ๋ณ์
|
31 |
+
##############################################################################
|
32 |
+
model = None
|
33 |
+
tokenizer = None
|
34 |
+
device = None
|
35 |
+
|
36 |
##############################################################################
|
37 |
# ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ํจ์ ์ถ๊ฐ
|
38 |
##############################################################################
|
|
|
148 |
##############################################################################
|
149 |
# ๋ชจ๋ธ ๋ฐ ํ ํฌ๋์ด์ ๋ก๋ (Space ํ๊ฒฝ์์ ์ต์ ํ)
|
150 |
##############################################################################
|
|
|
151 |
def load_model(model_name="VIDraft/Gemma-3-R1984-1B", adapter_name="openfree/Gemma-3-R1984-1B-0613"):
|
152 |
+
global model, tokenizer, device
|
153 |
+
|
154 |
logger.info(f"๋ชจ๋ธ ๋ก๋ฉ ์์: {model_name} (์ด๋ํฐ: {adapter_name})")
|
155 |
clear_cuda_cache() # ์บ์ ์ ๋ฆฌ
|
156 |
|
157 |
+
# device ์ค์
|
158 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
159 |
+
logger.info(f"Using device: {device}")
|
160 |
+
|
161 |
bnb_config = BitsAndBytesConfig(
|
162 |
load_in_4bit=True,
|
163 |
bnb_4bit_use_double_quant=True,
|
164 |
bnb_4bit_quant_type="nf4",
|
165 |
bnb_4bit_compute_dtype=torch.bfloat16,
|
|
|
166 |
)
|
167 |
|
168 |
# ๋ฒ ์ด์ค ๋ชจ๋ธ ๋ก๋
|
|
|
178 |
tokenizer.pad_token = tokenizer.eos_token
|
179 |
|
180 |
# PEFT ์ด๋ํฐ ๋ก๋ ๋ฐ ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๋ณํฉ
|
|
|
181 |
try:
|
182 |
model = PeftModel.from_pretrained(model, adapter_name)
|
183 |
logger.info(f"PEFT ์ด๋ํฐ ๋ก๋ฉ ๋ฐ ๋ณํฉ ์๋ฃ: {adapter_name}")
|
184 |
except Exception as e:
|
185 |
logger.error(f"PEFT ์ด๋ํฐ ๋ก๋ฉ ์ค๋ฅ: {e}")
|
186 |
logger.warning("์ด๋ํฐ ๋ก๋ฉ์ ์คํจํ์ต๋๋ค. ๋ฒ ์ด์ค ๋ชจ๋ธ๋ก ์งํํฉ๋๋ค.")
|
|
|
187 |
|
188 |
model.eval() # ์ถ๋ก ๋ชจ๋๋ก ์ค์
|
189 |
|
|
|
306 |
##############################################################################
|
307 |
def _model_gen_with_oom_catch(**kwargs):
|
308 |
"""๋ณ๋ ์ค๋ ๋์์ OutOfMemoryError๋ฅผ ์ก์์ฃผ๊ธฐ ์ํด"""
|
309 |
+
global model
|
310 |
try:
|
311 |
model.generate(**kwargs)
|
312 |
except torch.cuda.OutOfMemoryError:
|
|
|
329 |
use_web_search: bool = False,
|
330 |
web_search_query: str = "",
|
331 |
) -> Iterator[str]:
|
332 |
+
global model, tokenizer
|
333 |
+
|
334 |
+
# ๋ชจ๋ธ์ด ๋ก๋๋์ง ์์์ผ๋ฉด ๋ก๋
|
335 |
+
if model is None or tokenizer is None:
|
336 |
+
load_model()
|
337 |
|
338 |
try:
|
339 |
# ์ ์ฒด ํ๋กฌํํธ ๊ตฌ์ฑ
|