2025-10-04 22:40:21 +03:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
"""
|
|
|
|
|
|
Experiment: generate_with_hf_tools.py
|
|
|
|
|
|
Description: Генерация текста обученной GPT моделью через HuggingFace инструменты.
|
|
|
|
|
|
Использует hf-proxy для интеграции кастомной модели с HF экосистемой.
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import torch
|
|
|
|
|
|
import os
|
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
|
# Добавляем путь к shared модулям
|
|
|
|
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
|
|
|
|
|
|
|
|
from hf_proxy import HFAdapter, HFTokenizerAdapter, create_hf_pipeline
|
|
|
|
|
|
|
2025-10-06 22:57:19 +03:00
|
|
|
|
from shared.configs import TEST_PROMPTS, GENERATION_CONFIG, PATHS
|
|
|
|
|
|
from shared.data import print_experiment_info, ensure_directories, ExperimentLogger
|
2025-10-04 22:40:21 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_hf_model_and_tokenizer() -> tuple:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Загружает модель и токенизатор в формате HuggingFace.
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Returns:
|
|
|
|
|
|
tuple: (hf_model, hf_tokenizer, model_config)
|
|
|
|
|
|
"""
|
|
|
|
|
|
# Используем упрощенную версию модели
|
|
|
|
|
|
model_path = "checkpoints/hf_simple_trained"
|
|
|
|
|
|
tokenizer_path = "checkpoints/hf_simple_tokenizer"
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Проверяем существование файлов
|
|
|
|
|
|
if not os.path.exists(model_path):
|
|
|
|
|
|
raise FileNotFoundError(
|
|
|
|
|
|
f"Модель не найдена: {model_path}\n"
|
|
|
|
|
|
f"Сначала обучите модель: uv run python experiments/hf_integration/simple_hf_training.py"
|
|
|
|
|
|
)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
if not os.path.exists(tokenizer_path):
|
2025-10-06 22:57:19 +03:00
|
|
|
|
raise FileNotFoundError(f"Токенизатор не найден: {tokenizer_path}")
|
|
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Загружаем адаптированный токенизатор
|
|
|
|
|
|
print("🔧 Загрузка адаптированного токенизатора...")
|
|
|
|
|
|
hf_tokenizer = HFTokenizerAdapter.from_pretrained(tokenizer_path)
|
|
|
|
|
|
print(f"✅ Токенизатор загружен (vocab_size={hf_tokenizer.vocab_size})")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Загружаем конфигурацию модели
|
|
|
|
|
|
import json
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
config_path = os.path.join(model_path, "config.json")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
with open(config_path, "r", encoding="utf-8") as f:
|
2025-10-04 22:40:21 +03:00
|
|
|
|
model_config = json.load(f)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Загружаем модель через HFAdapter с правильной конфигурацией
|
|
|
|
|
|
print("🔧 Загрузка адаптированной модели...")
|
|
|
|
|
|
model_bin_path = os.path.join(model_path, "pytorch_model.bin")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Создаем конфигурацию из сохраненного config.json
|
|
|
|
|
|
from hf_proxy import HFAdapterConfig
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
hf_config = HFAdapterConfig(
|
|
|
|
|
|
vocab_size=model_config["vocab_size"],
|
|
|
|
|
|
hidden_size=model_config["hidden_size"],
|
|
|
|
|
|
num_hidden_layers=model_config["num_hidden_layers"],
|
|
|
|
|
|
num_attention_heads=model_config["num_attention_heads"],
|
|
|
|
|
|
max_position_embeddings=model_config["max_position_embeddings"],
|
|
|
|
|
|
hidden_dropout_prob=model_config.get("hidden_dropout_prob", 0.1),
|
2025-10-06 22:57:19 +03:00
|
|
|
|
attention_probs_dropout_prob=model_config.get(
|
|
|
|
|
|
"attention_probs_dropout_prob", 0.1
|
|
|
|
|
|
),
|
2025-10-04 22:40:21 +03:00
|
|
|
|
)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
hf_model = HFAdapter.from_pretrained(model_bin_path, hf_config=hf_config)
|
|
|
|
|
|
hf_model.eval()
|
|
|
|
|
|
print("✅ Модель загружена")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
return hf_model, hf_tokenizer, model_config
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_hf_pipeline(hf_model, hf_tokenizer):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Тестирует создание HuggingFace pipeline.
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Args:
|
|
|
|
|
|
hf_model: Адаптированная модель
|
|
|
|
|
|
hf_tokenizer: Адаптированный токенизатор
|
|
|
|
|
|
"""
|
|
|
|
|
|
print("\n🧪 Тестирование HuggingFace pipeline...")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
try:
|
|
|
|
|
|
# Создаем pipeline
|
|
|
|
|
|
pipe = create_hf_pipeline(
|
|
|
|
|
|
hf_model,
|
|
|
|
|
|
tokenizer=hf_tokenizer,
|
|
|
|
|
|
device="cpu",
|
|
|
|
|
|
max_length=50,
|
|
|
|
|
|
do_sample=True,
|
2025-10-06 22:57:19 +03:00
|
|
|
|
temperature=0.7,
|
2025-10-04 22:40:21 +03:00
|
|
|
|
)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print("✅ HuggingFace pipeline создан")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Тестируем pipeline
|
|
|
|
|
|
test_prompts = TEST_PROMPTS[:3]
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
for prompt in test_prompts:
|
|
|
|
|
|
print(f"\n🔤 Промпт: '{prompt}'")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
try:
|
|
|
|
|
|
result = pipe(prompt, max_new_tokens=20)
|
|
|
|
|
|
print(f"🎯 Результат: {result[0]['generated_text']}")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ Ошибка в pipeline: {e}")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ Ошибка создания pipeline: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_with_hf_model(hf_model, hf_tokenizer, prompt: str, config: dict) -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
Генерирует текст через адаптированную модель HF.
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Args:
|
|
|
|
|
|
hf_model: Адаптированная модель
|
|
|
|
|
|
hf_tokenizer: Адаптированный токенизатор
|
|
|
|
|
|
prompt: Входной текст
|
|
|
|
|
|
config: Конфигурация генерации
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Returns:
|
|
|
|
|
|
str: Сгенерированный текст
|
|
|
|
|
|
"""
|
|
|
|
|
|
print(f"🔤 Промпт: '{prompt}'")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
print(
|
|
|
|
|
|
f"📊 Параметры: max_tokens={config['max_new_tokens']}, "
|
|
|
|
|
|
f"temp={config['temperature']}, sample={config['do_sample']}"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Кодируем через адаптированный токенизатор
|
|
|
|
|
|
inputs = hf_tokenizer(prompt, return_tensors="pt")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print(f"🎯 Токены промпта: {inputs['input_ids'].tolist()[0]}")
|
|
|
|
|
|
print("🔄 Генерация через HF адаптер...")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Генерируем через адаптированную модель
|
|
|
|
|
|
with torch.no_grad():
|
|
|
|
|
|
generated_ids = hf_model.generate(
|
2025-10-06 22:57:19 +03:00
|
|
|
|
input_ids=inputs["input_ids"],
|
2025-10-04 22:40:21 +03:00
|
|
|
|
max_new_tokens=config["max_new_tokens"],
|
|
|
|
|
|
do_sample=config["do_sample"],
|
|
|
|
|
|
temperature=config["temperature"],
|
|
|
|
|
|
top_k=config["top_k"],
|
2025-10-06 22:57:19 +03:00
|
|
|
|
top_p=config["top_p"],
|
2025-10-04 22:40:21 +03:00
|
|
|
|
)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Декодируем через адаптированный токенизатор
|
|
|
|
|
|
generated_text = hf_tokenizer.decode(generated_ids[0], skip_special_tokens=True)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
return generated_text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_different_hf_strategies(hf_model, hf_tokenizer, prompt: str):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Тестирует разные стратегии генерации через HF интерфейс.
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Args:
|
|
|
|
|
|
hf_model: Адаптированная модель
|
|
|
|
|
|
hf_tokenizer: Адаптированный токенизатор
|
|
|
|
|
|
prompt: Тестовый промпт
|
|
|
|
|
|
"""
|
|
|
|
|
|
print(f"\n🎭 Сравнение стратегий генерации через HF для промпта: '{prompt}'")
|
|
|
|
|
|
print("=" * 70)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
strategies = [
|
|
|
|
|
|
{"name": "🎯 Жадный поиск", "do_sample": False, "temperature": 1.0},
|
|
|
|
|
|
{"name": "🎲 Вероятностная (temp=0.7)", "do_sample": True, "temperature": 0.7},
|
|
|
|
|
|
{"name": "🔥 Случайная (temp=1.2)", "do_sample": True, "temperature": 1.2},
|
2025-10-06 22:57:19 +03:00
|
|
|
|
{
|
|
|
|
|
|
"name": "❄️ Детерминированная (temp=0.3)",
|
|
|
|
|
|
"do_sample": True,
|
|
|
|
|
|
"temperature": 0.3,
|
|
|
|
|
|
},
|
2025-10-04 22:40:21 +03:00
|
|
|
|
]
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
for strategy in strategies:
|
|
|
|
|
|
print(f"\n{strategy['name']}:")
|
|
|
|
|
|
try:
|
|
|
|
|
|
config = GENERATION_CONFIG.copy()
|
2025-10-06 22:57:19 +03:00
|
|
|
|
config.update(
|
|
|
|
|
|
{
|
|
|
|
|
|
"do_sample": strategy["do_sample"],
|
|
|
|
|
|
"temperature": strategy["temperature"],
|
|
|
|
|
|
"max_new_tokens": 20,
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
generated = generate_with_hf_model(hf_model, hf_tokenizer, prompt, config)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Выделяем сгенерированную часть
|
2025-10-06 22:57:19 +03:00
|
|
|
|
generated_part = generated[len(prompt) :]
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print(f" 📤 Промпт: '{prompt}'")
|
|
|
|
|
|
print(f" 🎯 Сгенерировано: '{generated_part}'")
|
|
|
|
|
|
print(f" 📄 Полный текст: '{generated}'")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f" ❌ Ошибка: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def analyze_hf_tokenization(hf_tokenizer, texts: list):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Анализирует токенизацию через адаптированный токенизатор.
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Args:
|
|
|
|
|
|
hf_tokenizer: Адаптированный токенизатор
|
|
|
|
|
|
texts: Список текстов для анализа
|
|
|
|
|
|
"""
|
|
|
|
|
|
print(f"\n🔍 Анализ токенизации через HF адаптер:")
|
|
|
|
|
|
print("=" * 60)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
for i, text in enumerate(texts):
|
|
|
|
|
|
print(f"\nТекст {i+1}: '{text}'")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Токенизация через адаптер
|
|
|
|
|
|
inputs = hf_tokenizer(text, return_tensors="pt")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
tokens = inputs["input_ids"].tolist()[0]
|
2025-10-04 22:40:21 +03:00
|
|
|
|
token_strings = hf_tokenizer.tokenize(text)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print(f" Токены (ID): {tokens}")
|
|
|
|
|
|
print(f" Токены (текст): {token_strings}")
|
|
|
|
|
|
print(f" Количество токенов: {len(tokens)}")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Декодирование обратно
|
|
|
|
|
|
decoded = hf_tokenizer.decode(tokens)
|
|
|
|
|
|
print(f" Декодированный: '{decoded}'")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
if text == decoded:
|
|
|
|
|
|
print(f" ✅ Декодирование корректно")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f" ⚠️ Расхождения")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def interactive_hf_generation(hf_model, hf_tokenizer):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Режим интерактивной генерации через HF интерфейс.
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
Args:
|
|
|
|
|
|
hf_model: Адаптированная модель
|
|
|
|
|
|
hf_tokenizer: Адаптированный токенизатор
|
|
|
|
|
|
"""
|
|
|
|
|
|
print(f"\n💬 Интерактивная генерация через HF (для выхода введите 'exit')")
|
|
|
|
|
|
print("-" * 60)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
while True:
|
|
|
|
|
|
try:
|
|
|
|
|
|
user_input = input("\n🔤 Введите промпт: ").strip()
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
|
|
|
|
|
if user_input.lower() in ["exit", "quit", "выход"]:
|
2025-10-04 22:40:21 +03:00
|
|
|
|
break
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
if not user_input:
|
|
|
|
|
|
continue
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Запрашиваем параметры
|
|
|
|
|
|
try:
|
|
|
|
|
|
max_tokens = int(input("📏 Макс. токенов [50]: ") or "50")
|
|
|
|
|
|
temperature = float(input("🌡️ Температура [0.7]: ") or "0.7")
|
|
|
|
|
|
do_sample_input = input("🎲 Сэмплирование (y/n) [y]: ").lower()
|
2025-10-06 22:57:19 +03:00
|
|
|
|
do_sample = do_sample_input != "n"
|
2025-10-04 22:40:21 +03:00
|
|
|
|
except:
|
|
|
|
|
|
max_tokens = 50
|
|
|
|
|
|
temperature = 0.7
|
|
|
|
|
|
do_sample = True
|
|
|
|
|
|
print("⚠️ Использую параметры по умолчанию")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
config = GENERATION_CONFIG.copy()
|
2025-10-06 22:57:19 +03:00
|
|
|
|
config.update(
|
|
|
|
|
|
{
|
|
|
|
|
|
"max_new_tokens": max_tokens,
|
|
|
|
|
|
"temperature": temperature,
|
|
|
|
|
|
"do_sample": do_sample,
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
generated = generate_with_hf_model(
|
|
|
|
|
|
hf_model, hf_tokenizer, user_input, config
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
generated_part = generated[len(user_input) :]
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print(f"\n🎯 Результат:")
|
|
|
|
|
|
print(f" 📤 Промпт: '{user_input}'")
|
|
|
|
|
|
print(f" 🎯 Сгенерировано: '{generated_part}'")
|
|
|
|
|
|
print(f" 📄 Полный текст: '{generated}'")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
|
|
print("\n👋 Завершение работы...")
|
|
|
|
|
|
break
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ Ошибка: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
"""Основная функция эксперимента."""
|
|
|
|
|
|
# === Настройка эксперимента ===
|
|
|
|
|
|
experiment_name = "Генерация текста через HF инструменты (с hf-proxy)"
|
|
|
|
|
|
experiment_config = {
|
|
|
|
|
|
"model": "GPT через HFAdapter",
|
|
|
|
|
|
"tokenizer": "BPE через HFTokenizerAdapter",
|
|
|
|
|
|
"инструменты": "HuggingFace pipeline & генерация",
|
2025-10-06 22:57:19 +03:00
|
|
|
|
"стратегия": "интеграция с HF экосистемой",
|
2025-10-04 22:40:21 +03:00
|
|
|
|
}
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print_experiment_info(experiment_name, experiment_config)
|
|
|
|
|
|
ensure_directories()
|
|
|
|
|
|
logger = ExperimentLogger(experiment_name)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
try:
|
|
|
|
|
|
# Загружаем модель и токенизатор в HF формате
|
|
|
|
|
|
hf_model, hf_tokenizer, model_config = load_hf_model_and_tokenizer()
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# === Анализ токенизации ===
|
|
|
|
|
|
analysis_texts = [
|
|
|
|
|
|
"Искусственный интеллект",
|
2025-10-06 22:57:19 +03:00
|
|
|
|
"Нейронные сети",
|
|
|
|
|
|
"Машинное обучение",
|
2025-10-04 22:40:21 +03:00
|
|
|
|
]
|
|
|
|
|
|
analyze_hf_tokenization(hf_tokenizer, analysis_texts)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# === Тестирование HF pipeline ===
|
|
|
|
|
|
test_hf_pipeline(hf_model, hf_tokenizer)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# === Генерация с разными промптами ===
|
|
|
|
|
|
print(f"\n🎯 Генерация текста через HF адаптер")
|
|
|
|
|
|
print("=" * 60)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
for i, prompt in enumerate(TEST_PROMPTS):
|
|
|
|
|
|
print(f"\n📝 Пример {i+1}/{len(TEST_PROMPTS)}")
|
|
|
|
|
|
print("-" * 40)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
try:
|
2025-10-06 22:57:19 +03:00
|
|
|
|
generated = generate_with_hf_model(
|
|
|
|
|
|
hf_model, hf_tokenizer, prompt, GENERATION_CONFIG
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Выделяем сгенерированную часть
|
2025-10-06 22:57:19 +03:00
|
|
|
|
generated_part = generated[len(prompt) :]
|
|
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print(f"📤 Промпт: '{prompt}'")
|
|
|
|
|
|
print(f"🎯 Сгенерировано: '{generated_part}'")
|
|
|
|
|
|
print(f"📄 Полный текст: '{generated}'")
|
|
|
|
|
|
print(f"📏 Длина: {len(generated)} символов")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# Логируем успешную генерацию
|
|
|
|
|
|
logger.log_metric(f"hf_generation_length_{i}", len(generated))
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ Ошибка при генерации: {e}")
|
|
|
|
|
|
continue
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# === Сравнение стратегий генерации ===
|
|
|
|
|
|
test_prompt = "Искусственный"
|
|
|
|
|
|
test_different_hf_strategies(hf_model, hf_tokenizer, test_prompt)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# === Интерактивная генерация ===
|
|
|
|
|
|
interactive_hf_generation(hf_model, hf_tokenizer)
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
# === Сохранение результатов ===
|
|
|
|
|
|
logger.save_logs("checkpoints/hf_integration_generation_logs.json")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
print(f"\n🎉 Эксперимент с HF интеграцией завершен успешно!")
|
|
|
|
|
|
print(f"\n📚 Достигнутая интеграция:")
|
|
|
|
|
|
print(f" ✅ Загрузка модели и токенизатора в HF формате")
|
|
|
|
|
|
print(f" ✅ Использование HF pipeline")
|
|
|
|
|
|
print(f" ✅ Генерация через стандартные HF интерфейсы")
|
|
|
|
|
|
print(f" ✅ Совместимость с HF экосистемой")
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
except FileNotFoundError as e:
|
|
|
|
|
|
print(f"❌ {e}")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ Ошибка в эксперименте: {e}")
|
|
|
|
|
|
import traceback
|
2025-10-06 22:57:19 +03:00
|
|
|
|
|
2025-10-04 22:40:21 +03:00
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
main()
|