Update app.py
Browse files
app.py
CHANGED
|
@@ -76,7 +76,6 @@ print("Выходы декодера:", [out.name for out in decoder_session.get
|
|
| 76 |
def summarize_text(text, max_length=150, min_length=30):
|
| 77 |
print("\n--- НАЧАЛО ГЕНЕРАЦИИ ---")
|
| 78 |
|
| 79 |
-
|
| 80 |
# Проверка ввода
|
| 81 |
if not text or not text.strip():
|
| 82 |
return "Ошибка: текст не может быть пустым."
|
|
@@ -124,6 +123,7 @@ def summarize_text(text, max_length=150, min_length=30):
|
|
| 124 |
generated_tokens = []
|
| 125 |
current_token = np.array([[tokenizer.bos_token_id]], dtype=np.int64)
|
| 126 |
|
|
|
|
| 127 |
# Параметры модели
|
| 128 |
num_layers = 12 # Количество слоёв в декодере
|
| 129 |
num_heads = 12 # Количество голов внимания
|
|
@@ -131,13 +131,11 @@ def summarize_text(text, max_length=150, min_length=30):
|
|
| 131 |
|
| 132 |
|
| 133 |
# Преобразуем encoder_hidden_states в 4D-тензор для encoder.key/encoder.value
|
| 134 |
-
# Исходная форма: (1, 13, 768) → нужно: (1, num_heads, 13, head_dim)
|
| 135 |
encoder_key_4d = encoder_hidden_states.reshape(
|
| 136 |
1, encoder_hidden_states.shape[1], num_heads, head_dim
|
| 137 |
)
|
| 138 |
encoder_key_4d = np.transpose(encoder_key_4d, (0, 2, 1, 3)) # → (1, 12, 13, 64)
|
| 139 |
-
encoder_value_4d = encoder_key_4d
|
| 140 |
-
|
| 141 |
|
| 142 |
# Инициализируем past_key_values пустыми тензорами для всех слоёв
|
| 143 |
past_key_values = []
|
|
@@ -155,8 +153,7 @@ def summarize_text(text, max_length=150, min_length=30):
|
|
| 155 |
# Формирование входных данных для декодера
|
| 156 |
decoder_inputs = {
|
| 157 |
"input_ids": current_token,
|
| 158 |
-
"
|
| 159 |
-
"encoder_attention_mask": attention_mask
|
| 160 |
}
|
| 161 |
|
| 162 |
# Добавляем past_key_values для всех слоёв
|
|
@@ -166,7 +163,6 @@ def summarize_text(text, max_length=150, min_length=30):
|
|
| 166 |
decoder_inputs[f'past_key_values.{i}.encoder.key'] = enc_key
|
| 167 |
decoder_inputs[f'past_key_values.{i}.encoder.value'] = enc_value
|
| 168 |
|
| 169 |
-
|
| 170 |
# Инференс декодера
|
| 171 |
try:
|
| 172 |
decoder_outputs = decoder_session.run(None, decoder_inputs)
|
|
@@ -177,7 +173,6 @@ def summarize_text(text, max_length=150, min_length=30):
|
|
| 177 |
print("Входные данные:", {k: (v.shape if hasattr(v, 'shape') else type(v)) for k, v in decoder_inputs.items()})
|
| 178 |
return f"Ошибка декодера на шаге {step}: {e}"
|
| 179 |
|
| 180 |
-
|
| 181 |
# Обновление past_key_values из выходов декодера
|
| 182 |
updated_past = []
|
| 183 |
for i in range(num_layers):
|
|
@@ -186,12 +181,12 @@ def summarize_text(text, max_length=150, min_length=30):
|
|
| 186 |
updated_past.append((updated_key, updated_value, encoder_key_4d, encoder_value_4d))
|
| 187 |
past_key_values = updated_past
|
| 188 |
|
|
|
|
| 189 |
# Получение следующего токена
|
| 190 |
next_token = np.argmax(next_token_logits[:, -1, :], axis=-1)[0]
|
| 191 |
generated_tokens.append(next_token)
|
| 192 |
print(f"Сгенерированный токен (ID): {next_token}")
|
| 193 |
|
| 194 |
-
|
| 195 |
# Проверка завершения генерации
|
| 196 |
if next_token == tokenizer.eos_token_id or len(generated_tokens) >= max_length:
|
| 197 |
break
|
|
|
|
| 76 |
def summarize_text(text, max_length=150, min_length=30):
|
| 77 |
print("\n--- НАЧАЛО ГЕНЕРАЦИИ ---")
|
| 78 |
|
|
|
|
| 79 |
# Проверка ввода
|
| 80 |
if not text or not text.strip():
|
| 81 |
return "Ошибка: текст не может быть пустым."
|
|
|
|
| 123 |
generated_tokens = []
|
| 124 |
current_token = np.array([[tokenizer.bos_token_id]], dtype=np.int64)
|
| 125 |
|
| 126 |
+
|
| 127 |
# Параметры модели
|
| 128 |
num_layers = 12 # Количество слоёв в декодере
|
| 129 |
num_heads = 12 # Количество голов внимания
|
|
|
|
| 131 |
|
| 132 |
|
| 133 |
# Преобразуем encoder_hidden_states в 4D-тензор для encoder.key/encoder.value
|
|
|
|
| 134 |
encoder_key_4d = encoder_hidden_states.reshape(
|
| 135 |
1, encoder_hidden_states.shape[1], num_heads, head_dim
|
| 136 |
)
|
| 137 |
encoder_key_4d = np.transpose(encoder_key_4d, (0, 2, 1, 3)) # → (1, 12, 13, 64)
|
| 138 |
+
encoder_value_4d = encoder_key_4d
|
|
|
|
| 139 |
|
| 140 |
# Инициализируем past_key_values пустыми тензорами для всех слоёв
|
| 141 |
past_key_values = []
|
|
|
|
| 153 |
# Формирование входных данных для декодера
|
| 154 |
decoder_inputs = {
|
| 155 |
"input_ids": current_token,
|
| 156 |
+
"encoder_attention_mask": attention_mask # Только маска!
|
|
|
|
| 157 |
}
|
| 158 |
|
| 159 |
# Добавляем past_key_values для всех слоёв
|
|
|
|
| 163 |
decoder_inputs[f'past_key_values.{i}.encoder.key'] = enc_key
|
| 164 |
decoder_inputs[f'past_key_values.{i}.encoder.value'] = enc_value
|
| 165 |
|
|
|
|
| 166 |
# Инференс декодера
|
| 167 |
try:
|
| 168 |
decoder_outputs = decoder_session.run(None, decoder_inputs)
|
|
|
|
| 173 |
print("Входные данные:", {k: (v.shape if hasattr(v, 'shape') else type(v)) for k, v in decoder_inputs.items()})
|
| 174 |
return f"Ошибка декодера на шаге {step}: {e}"
|
| 175 |
|
|
|
|
| 176 |
# Обновление past_key_values из выходов декодера
|
| 177 |
updated_past = []
|
| 178 |
for i in range(num_layers):
|
|
|
|
| 181 |
updated_past.append((updated_key, updated_value, encoder_key_4d, encoder_value_4d))
|
| 182 |
past_key_values = updated_past
|
| 183 |
|
| 184 |
+
|
| 185 |
# Получение следующего токена
|
| 186 |
next_token = np.argmax(next_token_logits[:, -1, :], axis=-1)[0]
|
| 187 |
generated_tokens.append(next_token)
|
| 188 |
print(f"Сгенерированный токен (ID): {next_token}")
|
| 189 |
|
|
|
|
| 190 |
# Проверка завершения генерации
|
| 191 |
if next_token == tokenizer.eos_token_id or len(generated_tokens) >= max_length:
|
| 192 |
break
|