mirror of
https://github.com/pese-git/simple-llm.git
synced 2026-01-23 21:14:17 +00:00
Основные изменения в коде:
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 (токены)
- Подготовка к генерации новых данных
53 lines
2.0 KiB
Python
Executable File
53 lines
2.0 KiB
Python
Executable File
#!/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()
|