Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -27,36 +27,13 @@ if torch.cuda.is_available():
|
|
| 27 |
else:
|
| 28 |
logger.info("CUDA недоступен, будет использоваться CPU")
|
| 29 |
|
| 30 |
-
#
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
"/mnt/data", # Альтернативный путь для подключенного диска
|
| 34 |
-
"/home/user/data", # Директория пользователя
|
| 35 |
-
"/tmp" # Временная директория (запасной вариант)
|
| 36 |
-
]
|
| 37 |
|
| 38 |
-
#
|
| 39 |
-
DISK_DIR =
|
| 40 |
-
|
| 41 |
-
try:
|
| 42 |
-
if not os.path.exists(dir_path):
|
| 43 |
-
os.makedirs(dir_path, exist_ok=True)
|
| 44 |
-
|
| 45 |
-
# Проверяем, можем ли мы писать в эту директорию
|
| 46 |
-
test_file = os.path.join(dir_path, "write_test.txt")
|
| 47 |
-
with open(test_file, "w") as f:
|
| 48 |
-
f.write("test")
|
| 49 |
-
os.remove(test_file)
|
| 50 |
-
|
| 51 |
-
DISK_DIR = dir_path
|
| 52 |
-
logger.info(f"Используем директорию для хранения: {DISK_DIR}")
|
| 53 |
-
break
|
| 54 |
-
except (OSError, PermissionError) as e:
|
| 55 |
-
logger.warning(f"Не удалось использовать директорию {dir_path}: {e}")
|
| 56 |
-
|
| 57 |
-
if DISK_DIR is None:
|
| 58 |
-
DISK_DIR = "." # Используем текущую директорию, если ничего не найдено
|
| 59 |
-
logger.warning(f"Внимание! Используем текущую директорию: {os.path.abspath(DISK_DIR)}")
|
| 60 |
|
| 61 |
# Настраиваем пути для сохранения моделей
|
| 62 |
CACHE_DIR = os.path.join(DISK_DIR, "models_cache")
|
|
@@ -88,14 +65,17 @@ logger.info("Информация о дисках перед загрузкой:
|
|
| 88 |
check_disk_space("/")
|
| 89 |
check_disk_space(DISK_DIR)
|
| 90 |
|
| 91 |
-
# Загрузка модели и токенизатора
|
| 92 |
-
model_name = "
|
| 93 |
|
| 94 |
# Глобальные переменные для модели
|
| 95 |
model = None
|
| 96 |
tokenizer = None
|
| 97 |
is_model_loaded = False
|
| 98 |
|
|
|
|
|
|
|
|
|
|
| 99 |
# Функция для загрузки модели
|
| 100 |
def load_model():
|
| 101 |
global model, tokenizer, is_model_loaded
|
|
@@ -167,7 +147,9 @@ check_disk_space(DISK_DIR)
|
|
| 167 |
|
| 168 |
# Определяем шаблон Q&A, как при обучении
|
| 169 |
qa_prompt = "<s>Пользователь: {}\nАссистент: {}"
|
| 170 |
-
EOS_TOKEN =
|
|
|
|
|
|
|
| 171 |
|
| 172 |
def respond(
|
| 173 |
message,
|
|
@@ -180,8 +162,8 @@ def respond(
|
|
| 180 |
global model, tokenizer, is_model_loaded
|
| 181 |
|
| 182 |
# Проверяем, загружена ли модель
|
| 183 |
-
if not is_model_loaded or model is None:
|
| 184 |
-
return "Модель не загружена или произошла ошибка при загрузке."
|
| 185 |
|
| 186 |
# Замеряем время
|
| 187 |
start_time = time.time()
|
|
@@ -218,7 +200,11 @@ def respond(
|
|
| 218 |
|
| 219 |
# Извлекаем только часть после "Ассистент: "
|
| 220 |
response_start = generated_text.rfind("Ассистент: ") + len("Ассистент: ")
|
| 221 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
|
| 223 |
end_time = time.time()
|
| 224 |
generation_time = end_time - start_time
|
|
@@ -280,6 +266,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 280 |
* **Модель**: {model_name}
|
| 281 |
* **Режим работы**: {"GPU" if torch.cuda.is_available() else "CPU"}
|
| 282 |
* **Директория для кэша**: {CACHE_DIR}
|
|
|
|
| 283 |
""")
|
| 284 |
|
| 285 |
# Примеры вопросов
|
|
|
|
| 27 |
else:
|
| 28 |
logger.info("CUDA недоступен, будет использоваться CPU")
|
| 29 |
|
| 30 |
+
# Используем домашнюю директорию пользователя (она всегда должна быть доступна)
|
| 31 |
+
user_home = os.path.expanduser("~")
|
| 32 |
+
DISK_DIR = os.path.join(user_home, "app_data")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
+
# Создаем директорию, если она не существует
|
| 35 |
+
os.makedirs(DISK_DIR, exist_ok=True)
|
| 36 |
+
logger.info(f"Используем директорию для хранения: {DISK_DIR}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
# Настраиваем пути для сохранения моделей
|
| 39 |
CACHE_DIR = os.path.join(DISK_DIR, "models_cache")
|
|
|
|
| 65 |
check_disk_space("/")
|
| 66 |
check_disk_space(DISK_DIR)
|
| 67 |
|
| 68 |
+
# Загрузка модели и токенизатора (исправлен лишний пробел в имени)
|
| 69 |
+
model_name = "KoDer123/Nerealnost_8M"
|
| 70 |
|
| 71 |
# Глобальные переменные для модели
|
| 72 |
model = None
|
| 73 |
tokenizer = None
|
| 74 |
is_model_loaded = False
|
| 75 |
|
| 76 |
+
# Переопределяем EOS_TOKEN для случая, когда токенизатор не загружен
|
| 77 |
+
DEFAULT_EOS_TOKEN = "</s>"
|
| 78 |
+
|
| 79 |
# Функция для загрузки модели
|
| 80 |
def load_model():
|
| 81 |
global model, tokenizer, is_model_loaded
|
|
|
|
| 147 |
|
| 148 |
# Определяем шаблон Q&A, как при обучении
|
| 149 |
qa_prompt = "<s>Пользователь: {}\nАссистент: {}"
|
| 150 |
+
EOS_TOKEN = DEFAULT_EOS_TOKEN
|
| 151 |
+
if tokenizer is not None and hasattr(tokenizer, 'eos_token') and tokenizer.eos_token:
|
| 152 |
+
EOS_TOKEN = tokenizer.eos_token
|
| 153 |
|
| 154 |
def respond(
|
| 155 |
message,
|
|
|
|
| 162 |
global model, tokenizer, is_model_loaded
|
| 163 |
|
| 164 |
# Проверяем, загружена ли модель
|
| 165 |
+
if not is_model_loaded or model is None or tokenizer is None:
|
| 166 |
+
return "Модель не загружена или произошла ошибка при загрузке. Проверьте имя модели 'KoDer123/Nerealnost_8M'."
|
| 167 |
|
| 168 |
# Замеряем время
|
| 169 |
start_time = time.time()
|
|
|
|
| 200 |
|
| 201 |
# Извлекаем только часть после "Ассистент: "
|
| 202 |
response_start = generated_text.rfind("Ассистент: ") + len("Ассистент: ")
|
| 203 |
+
if response_start >= len("Ассистент: "): # Проверяем, что "Ассистент: " найден
|
| 204 |
+
response = generated_text[response_start:].strip()
|
| 205 |
+
else:
|
| 206 |
+
# Если не найдено, возвращаем весь текст
|
| 207 |
+
response = generated_text.strip()
|
| 208 |
|
| 209 |
end_time = time.time()
|
| 210 |
generation_time = end_time - start_time
|
|
|
|
| 266 |
* **Модель**: {model_name}
|
| 267 |
* **Режим работы**: {"GPU" if torch.cuda.is_available() else "CPU"}
|
| 268 |
* **Директория для кэша**: {CACHE_DIR}
|
| 269 |
+
* **Статус загрузки**: {"Успешно" if is_model_loaded else "Ошибка"}
|
| 270 |
""")
|
| 271 |
|
| 272 |
# Примеры вопросов
|