VOIDER commited on
Commit
eb0bb84
·
verified ·
1 Parent(s): d7d7f03

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -33
app.py CHANGED
@@ -2,24 +2,25 @@ import os
2
  import sys
3
  import subprocess
4
 
5
- # --- БЛОК УСТАНОВКИ БИБЛИОТЕК ПРИ ЗАПУСКЕ ---
6
- # Это позволяет избежать ошибок сборки и компилировать библиотеку уже в работающем контейнере
7
  try:
8
  import llama_cpp
 
9
  print("Библиотека llama-cpp-python уже установлена.")
10
  except ImportError:
11
- print("Установка llama-cpp-python... (Это может занять пару минут при первом запуске)")
12
- # Устанавливаем версию 0.3.16 (или новее), которая поддерживает Qwen2-VL
13
  subprocess.check_call([
14
  sys.executable, "-m", "pip", "install",
15
- "llama-cpp-python"
 
 
16
  ])
17
- print("Установка завершена! Запускаем приложение...")
18
  import llama_cpp
19
- # ------------------------------------------
20
 
21
  import gradio as gr
22
- from llama_cpp import Llama
23
  from huggingface_hub import hf_hub_download
24
  import base64
25
  import io
@@ -40,13 +41,26 @@ def load_model():
40
  repo_id=REPO_ID,
41
  filename=MODEL_FILENAME
42
  )
43
- # Инициализация модели
 
 
 
 
 
 
 
 
 
 
 
 
44
  llm = Llama(
45
  model_path=model_path,
46
- n_ctx=8192, # Контекст
47
- n_gpu_layers=0, # 0 слоев на GPU (работаем на CPU)
48
  verbose=True,
49
- chat_format="chatml-function-calling"
 
50
  )
51
  print("Модель успешно загружена!")
52
  except Exception as e:
@@ -56,14 +70,15 @@ def load_model():
56
 
57
  def image_to_base64(image):
58
  buffered = io.BytesIO()
59
- image.save(buffered, format="JPEG")
 
 
60
  return base64.b64encode(buffered.getvalue()).decode('utf-8')
61
 
62
  def evaluate_image(image, progress=gr.Progress()):
63
  if image is None:
64
  return "Пожалуйста, загрузите изображение.", ""
65
 
66
- # Загружаем модель только когда пользователь нажмет кнопку (экономит память при старте)
67
  progress(0, desc="Загрузка модели...")
68
  model = load_model()
69
 
@@ -93,33 +108,37 @@ def evaluate_image(image, progress=gr.Progress()):
93
  full_response = ""
94
  print("Начало генерации...")
95
 
96
- # Запуск генерации
97
- stream = model.create_chat_completion(
98
- messages=messages,
99
- max_tokens=2048, # Увеличил лимит токенов для длинных рассуждений
100
- temperature=0.6,
101
- stream=True
102
- )
103
 
104
- for chunk in stream:
105
- if "choices" in chunk:
106
- delta = chunk["choices"][0]["delta"]
107
- if "content" in delta and delta["content"]:
108
- content = delta["content"]
109
- full_response += content
110
- # Стримим ответ в текстовое поле
111
- yield full_response, "Вычисляется..."
 
 
 
 
 
112
 
113
- # Поиск оценки в ответе
114
  score_match = re.search(r'<answer>\s*([\d\.]+)\s*</answer>', full_response)
115
  final_score = score_match.group(1) if score_match else "Не найдено"
116
 
117
  yield full_response, final_score
118
 
119
- # Интерфейс
120
  with gr.Blocks(title="VisualQuality-R1 (Q8 GGUF)") as demo:
121
  gr.Markdown("# 👁️ VisualQuality-R1 (7B Q8)")
122
- gr.Markdown("Оценка качества изображений. Запущено на CPU, генерация может занять 1-2 минуты.")
123
 
124
  with gr.Row():
125
  with gr.Column():
@@ -128,7 +147,6 @@ with gr.Blocks(title="VisualQuality-R1 (Q8 GGUF)") as demo:
128
 
129
  with gr.Column():
130
  output_score = gr.Label(label="Итоговая оценка")
131
- # Исправлено: убрал аргумент show_copy_button, вызывавший ошибку
132
  output_text = gr.Textbox(label="Ход мыслей (CoT) и ответ", lines=15)
133
 
134
  run_btn.click(
 
2
  import sys
3
  import subprocess
4
 
5
+ # --- УСТАНОВКА БИБЛИОТЕК ---
 
6
  try:
7
  import llama_cpp
8
+ from llama_cpp import Llama
9
  print("Библиотека llama-cpp-python уже установлена.")
10
  except ImportError:
11
+ print("Установка llama-cpp-python...")
12
+ # Ставим последнюю версию без привязки к 0.3.16, чтобы получить все фиксы для Qwen2-VL
13
  subprocess.check_call([
14
  sys.executable, "-m", "pip", "install",
15
+ "llama-cpp-python",
16
+ "--upgrade",
17
+ "--extra-index-url", "https://abetlen.github.io/llama-cpp-python/whl/cpu"
18
  ])
19
+ print("Установка завершена! Перезапуск...")
20
  import llama_cpp
21
+ from llama_cpp import Llama
22
 
23
  import gradio as gr
 
24
  from huggingface_hub import hf_hub_download
25
  import base64
26
  import io
 
41
  repo_id=REPO_ID,
42
  filename=MODEL_FILENAME
43
  )
44
+
45
+ # Пытаемся найти специфичный хендлер для Qwen2-VL (появился в новых версиях)
46
+ chat_handler = None
47
+ try:
48
+ # Проверяем, есть ли встроенная поддержка Qwen2-VL в chat_format
49
+ from llama_cpp.llama_chat_format import Qwen2VLChatHandler
50
+ print("Используем Qwen2VLChatHandler")
51
+ chat_handler = Qwen2VLChatHandler()
52
+ except ImportError:
53
+ print("Специфичный Qwen2VLChatHandler не найден, используем стандартный режим.")
54
+ # В новых версиях llama.cpp поддержка может быть нативной без Python-хендлера,
55
+ # если не переопределять chat_format.
56
+
57
  llm = Llama(
58
  model_path=model_path,
59
+ n_ctx=16384, # Увеличили контекст для изображений
60
+ n_gpu_layers=0, # CPU
61
  verbose=True,
62
+ chat_handler=chat_handler, # Передаем хендлер если нашли
63
+ # ВАЖНО: Убрали chat_format="chatml...", чтобы не ломать vision-логику
64
  )
65
  print("Модель успешно загружена!")
66
  except Exception as e:
 
70
 
71
  def image_to_base64(image):
72
  buffered = io.BytesIO()
73
+ # Конвертируем в RGB и JPEG для совместимости
74
+ image = image.convert("RGB")
75
+ image.save(buffered, format="JPEG", quality=95)
76
  return base64.b64encode(buffered.getvalue()).decode('utf-8')
77
 
78
  def evaluate_image(image, progress=gr.Progress()):
79
  if image is None:
80
  return "Пожалуйста, загрузите изображение.", ""
81
 
 
82
  progress(0, desc="Загрузка модели...")
83
  model = load_model()
84
 
 
108
  full_response = ""
109
  print("Начало генерации...")
110
 
111
+ try:
112
+ stream = model.create_chat_completion(
113
+ messages=messages,
114
+ max_tokens=1024,
115
+ temperature=0.6,
116
+ stream=True
117
+ )
118
 
119
+ for chunk in stream:
120
+ if "choices" in chunk:
121
+ delta = chunk["choices"][0]["delta"]
122
+ if "content" in delta and delta["content"]:
123
+ content = delta["content"]
124
+ full_response += content
125
+ yield full_response, "Вычисляется..."
126
+ except ValueError as e:
127
+ # Если снова ошибка токенов, выводим понятное сообщение
128
+ error_msg = f"Ошибка генерации: {e}. Возможно, модель не распознала изображение как Vision-контент."
129
+ print(error_msg)
130
+ yield error_msg, "Ошибка"
131
+ return
132
 
133
+ # Поиск оценки
134
  score_match = re.search(r'<answer>\s*([\d\.]+)\s*</answer>', full_response)
135
  final_score = score_match.group(1) if score_match else "Не найдено"
136
 
137
  yield full_response, final_score
138
 
 
139
  with gr.Blocks(title="VisualQuality-R1 (Q8 GGUF)") as demo:
140
  gr.Markdown("# 👁️ VisualQuality-R1 (7B Q8)")
141
+ gr.Markdown("Оценка качества изображений. Запущено на CPU.")
142
 
143
  with gr.Row():
144
  with gr.Column():
 
147
 
148
  with gr.Column():
149
  output_score = gr.Label(label="Итоговая оценка")
 
150
  output_text = gr.Textbox(label="Ход мыслей (CoT) и ответ", lines=15)
151
 
152
  run_btn.click(