Files
simple-llm/bin/tokenize_corpus.py

53 lines
2.0 KiB
Python
Raw Permalink Normal View History

Рефакторинг и улучшение компонентов Основные изменения в коде: 1. Токенизатор (bpe.py): - Добавлен прогресс-бар через tqdm в метод fit() - Улучшено логирование процесса обучения - Добавлена обработка edge-cases для vocab_size 2. Генерация текста (generate_text.py): - Полный рефакторинг скрипта - Добавлены проверки модели перед загрузкой - Поддержка уменьшенных моделей (seq_len=32) - Подробное логирование процесса генерации 3. Обучение GPT (train_gpt_model.py): - Автоподбор параметров под размер данных - Уменьшенные параметры модели по умолчанию - Контроль памяти и устройств (CPU/MPS) 4. Токенизация корпуса (tokenize_corpus.py): - Добавлены проверки входных данных - Подробное логирование процесса - Обработка ошибок загрузки файлов Исправления: - Синхронизация размеров слоёв в GPT - Корректная работа с малыми наборами данных - Исправление загрузки моделей на MPS Обновление README.md - Добавлены обязательные зависимости: dill и tqdm - Добавлен раздел 'Цель проекта' с описанием задач - Добавлен раздел 'Участие в разработке' для контрибьюторов - Добавлен раздел 'Лицензия' с условиями MIT Рефакторинг основных скриптов и обновление данных Основные изменения: 1. Скрипты в bin/: - Оптимизация generate_text.py (генерация текста) - Улучшение tokenize_corpus.py (обработка корпуса) - Рефакторинг train_gpt_model.py (обучение модели) - Обновление train_tokenizer.py (алгоритм BPE) 2. Данные: - Удалены устаревшие артефакты: * simple_llm_gpt.pth (модель) * bpe_tokenizer.json (токенизатор) * corpus_tokens.pkl (токены) - Подготовка к генерации новых данных
2025-07-24 12:58:59 +03:00
#!/usr/bin/env python3
"""
Токенизация корпуса с CLI аргументами
"""
import os
import argparse
import pickle
from pathlib import Path
from simple_llm.tokenizer.optimize_bpe import OptimizeBPE
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--corpus', type=str, required=True,
help='Путь к директории с текстами')
parser.add_argument('--tokenizer', type=str, required=True,
help='Путь к файлу токенизатора')
parser.add_argument('--output', type=str, required=True,
help='Путь для сохранения токенизированных данных')
parser.add_argument('--max-tokens', type=int, default=None,
help='Максимальное количество токенов (для тестов)')
args = parser.parse_args()
# Загрузка
tokenizer = OptimizeBPE.load(args.tokenizer)
corpus = []
print(f"Чтение текстов из {args.corpus}...")
for file in Path(args.corpus).glob('*.txt'):
corpus.append(file.read_text(encoding='utf-8'))
# Токенизация
print("Токенизация...")
all_tokens = []
for text in corpus:
tokens = tokenizer.encode(text)
if args.max_tokens:
tokens = tokens[:args.max_tokens]
all_tokens.extend(tokens)
# Сохранение
# Проверяем и создаем директорию для сохранения
output_dir = os.path.dirname(args.output)
if output_dir and not os.path.exists(output_dir):
print(f"Создаем директорию: {output_dir}")
os.makedirs(output_dir, exist_ok=True)
with open(args.output, 'wb') as f:
pickle.dump(all_tokens, f)
print(f"Сохранено {len(all_tokens)} токенов в {args.output}")
if __name__ == '__main__':
main()