Рефакторинг и улучшение компонентов

Основные изменения в коде:

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 (токены)
   - Подготовка к генерации новых данных
This commit is contained in:
Sergey Penkovsky
2025-07-24 12:58:59 +03:00
parent 6ce048d4ad
commit cc4138aba8
19 changed files with 515 additions and 338 deletions

38
bin/train_tokenizer.py Executable file
View File

@@ -0,0 +1,38 @@
#!/usr/bin/env python3
"""
Обучение токенизатора с CLI аргументами
"""
import os
import argparse
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('--output', type=str, required=True,
help='Путь для сохранения токенизатора')
parser.add_argument('--vocab-size', type=int, default=4000,
help='Размер словаря')
args = parser.parse_args()
# Проверяем и создаем директорию для сохранения
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)
# Загрузка корпуса
corpus = []
for file in Path(args.corpus).glob('*.txt'):
corpus.append(file.read_text(encoding='utf-8'))
corpus = '\n'.join(corpus)
# Обучение
tokenizer = OptimizeBPE(vocab_size=args.vocab_size)
tokenizer.fit(corpus)
tokenizer.save(args.output)
if __name__ == '__main__':
main()