mirror of
https://github.com/pese-git/simple-llm.git
synced 2026-01-24 05:26:02 +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 (токены)
- Подготовка к генерации новых данных
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from .bpe_interface import BPE
|
||||
|
||||
from tqdm import tqdm
|
||||
from collections import Counter
|
||||
from typing import List, Tuple, Dict
|
||||
|
||||
@@ -18,19 +18,34 @@ class OptimizeBPE(BPE):
|
||||
self._init_vocab(sequence)
|
||||
pair_freq, pair_first_occurrence = self._get_pair_stats(sequence)
|
||||
|
||||
while len(self.vocab) < self.vocab_size and pair_freq:
|
||||
pair_to_merge = self._select_pair_to_merge(pair_freq, pair_first_occurrence)
|
||||
new_token = pair_to_merge[0] + pair_to_merge[1]
|
||||
# Инициализация прогресс-бара
|
||||
with tqdm(total=self.vocab_size, desc="Building vocabulary") as pbar:
|
||||
pbar.update(len(self.vocab)) # Учитываем начальные токены
|
||||
|
||||
if new_token in self.vocab:
|
||||
# Защита от зацикливания: пара уже была добавлена как новый токен.
|
||||
del pair_freq[pair_to_merge]
|
||||
continue
|
||||
while len(self.vocab) < self.vocab_size and pair_freq:
|
||||
pair_to_merge = self._select_pair_to_merge(pair_freq, pair_first_occurrence)
|
||||
new_token = pair_to_merge[0] + pair_to_merge[1]
|
||||
|
||||
# Обновляем прогресс и логируем
|
||||
pbar.update(1)
|
||||
pbar.set_postfix({
|
||||
'current_vocab': len(self.vocab),
|
||||
'top_pair': f"{pair_to_merge[0]}{pair_to_merge[1]}",
|
||||
'pair_freq': pair_freq[pair_to_merge]
|
||||
})
|
||||
print(f"\nТекущий размер словаря: {len(self.vocab)}/{self.vocab_size}")
|
||||
print(f"Самая частая пара: {pair_to_merge} (встречается {pair_freq[pair_to_merge]} раз)")
|
||||
print(f"Добавлен новый токен: '{new_token}'")
|
||||
|
||||
self.vocab.append(new_token)
|
||||
sequence, pair_freq, pair_first_occurrence = self._merge_pair(
|
||||
sequence, pair_to_merge, new_token, pair_freq
|
||||
)
|
||||
if new_token in self.vocab:
|
||||
# Защита от зацикливания: пара уже была добавлена как новый токен.
|
||||
del pair_freq[pair_to_merge]
|
||||
continue
|
||||
|
||||
self.vocab.append(new_token)
|
||||
sequence, pair_freq, pair_first_occurrence = self._merge_pair(
|
||||
sequence, pair_to_merge, new_token, pair_freq
|
||||
)
|
||||
|
||||
self._build_token_dicts()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user