longtimedevs commited on
Commit
4bba615
·
verified ·
1 Parent(s): 1906a83

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +70 -39
README.md CHANGED
@@ -10,47 +10,49 @@ tags:
10
  - pytorch
11
  - safetensors
12
  - timegpt
13
- - llama-like
14
  - 0.5b
15
  - text-generation
16
  license: apache-2.0
17
  pipeline_tag: text-generation
18
  inference: false
19
- model_name: TimeGPT-0.5B-Base
20
  ---
21
 
22
- # ⏳ TimeGPT-0.5B-Base
23
 
24
- **TimeGPT-0.5B-Base** — это фундаментальная мультиязычная авторегрессионная языковая модель (Causal LM) на **465 млн параметров**, обученная **с нуля (from scratch)** без использования сторонних предобученных весов.
25
 
26
- Модель разработана и обучена командой **LongTime Devs** на потребительском ускорителе **NVIDIA GeForce RTX 5060 Ti 16GB**. Основным языком обучения выступает **русский**, с интеграцией английского, китайского, немецкого и украинского корпусов.
27
 
28
- > ⚠️ **Обратите внимание:** это **базовая модель (Base)**. Она обучена задаче предсказания следующего токена (next-token prediction / text completion) и не предназначена для прямого диалога без промптинга или дополнительного SFT-дообучения (диалоговая версия — *TimeGPT-0.5B-Final / Chat*).
 
 
29
 
30
  ---
31
 
32
- ## 🏛 Архитектура
33
 
34
- Архитектура TimeGPT включает все ключевые инженерные решения современных открытых LLM (уровня Llama 3 / Qwen 2.5):
35
 
36
- - **Grouped-Query Attention (GQA)**: 20 голов Query и 4 головы Key/Value (соотношение 5:1) для значительного снижения расхода видеопамяти при работе с длинным контекстом.
37
- - **SwiGLU Activation**: нелинейность SwiGLU в блоках MLP с выравниванием размерности.
38
- - **RMSNorm**: быстрая среднеквадратичная нормализация вместо стандартного LayerNorm.
39
- - **Rotary Position Embeddings (RoPE)**: вещественное позиционное кодирование с базовой частотой $\theta = 500\,000$ для устойчивости на длинных последовательностях.
40
- - **Weight Tying**: совмещение матриц эмбеддингов токенов и выходной языковой головы для компактности и лучшей регуляризации.
41
- - **FlashAttention / SDPA**: нативная поддержка PyTorch Scaled Dot-Product Attention в точности `bfloat16`.
42
 
43
  ### Спецификация модели
44
 
45
  | Параметр | Значение |
46
  | :--- | :--- |
47
- | **Количество параметров** | 465.70M (~0.5B) |
 
48
  | **Размерность скрытого слоя (`dim`)** | 1280 |
49
  | **Количество слоев (`n_layers`)** | 24 |
50
  | **Голов внимания (`n_heads`)** | 20 |
51
  | **Голов Key/Value (`n_kv_heads`)** | 4 (GQA) |
52
  | **Размерность промежуточного слоя MLP** | 3456 (SwiGLU) |
53
- | **Размер контекстного окна (`max_seq_len`)** | 1024 токена |
54
  | **Размер словаря (`vocab_size`)** | 32 000 |
55
  | **Формат весов** | SafeTensors (`bfloat16`) |
56
 
@@ -58,9 +60,9 @@ model_name: TimeGPT-0.5B-Base
58
 
59
  ## 🔤 Токенизатор
60
 
61
- Используется собственный мультиязычный **Byte-Level BPE** токенизатор:
62
  - **Размер словаря**: 32 000 токенов.
63
- - **Byte-fallback**: байтовое резервирование исключает токены `<|unk|>` при встрече редких символов, эмодзи или иероглифов.
64
  - **Служебные токены стандарта ChatML**:
65
  - `<|pad|>`
66
  - `<|unk|>`
@@ -71,30 +73,38 @@ model_name: TimeGPT-0.5B-Base
71
 
72
  ## 📚 Данные и процесс предобучения
73
 
74
- Модель обучалась фундаментальному чтению непрерывным потоком на терабайтах мультиязычных текстов:
75
 
76
- - **Русский язык (основной, ~55%)**: русскоязычный срез Википедии + новостные корпуса (`IlyaGusev/gazeta`).
77
- - **Английский язык (~20%)**: англоязычная Википедия.
78
- - **Китайский язык (~10%)**: китайская Википедия.
79
- - **Немецкий язык (~8%)**: немецкая Википедия.
80
- - **Украинский язык (~7%)**: украинская Википедия.
81
 
82
  ### Детали тренировочного цикла:
83
- - **Аппаратная база**: 1× NVIDIA GeForce RTX 5060 Ti 16GB.
84
- - **Шаги оптимизации**: 50 000 шагов (эффективный батч = 16 последовательностей × 1024 токена).
85
- - **Общий объем токенов**: ~820 млн токенов.
86
- - **Время обучения**: ~27 часов непрерывной работы.
87
  - **Оптимизатор**: AdamW ($\beta_1 = 0.9$, $\beta_2 = 0.95$, weight decay = 0.01).
88
- - **Планировщик LR**: Cosine Annealing с плавным разогревом (Warmup: 1500 шаг��в, Peak LR: `1.8e-4`).
89
- - **Динамика Loss**: начальный лосс **10.64** $\rightarrow$ финальный лосс **3.02–3.36** (перплексия снизилась с бесконечности до ~20).
90
 
91
  ---
92
 
93
  ## 💻 Быстрый запуск (Inference)
94
 
95
- Для запуска генерации скачайте репозиторий и используйте следующий код на PyTorch:
 
 
 
 
 
96
 
97
  ```python
 
 
 
98
  import os
99
  import torch
100
  import torch.nn as nn
@@ -102,8 +112,15 @@ import torch.nn.functional as F
102
  from dataclasses import dataclass
103
  from tokenizers import Tokenizer
104
  from safetensors.torch import load_file
 
 
 
 
 
 
 
105
 
106
- # --- 1. Конфигурация модели ---
107
  @dataclass
108
  class TimeGPTConfig:
109
  vocab_size: int = 32000
@@ -116,12 +133,13 @@ class TimeGPTConfig:
116
  norm_eps: float = 1e-5
117
  rope_theta: float = 500000.0
118
 
119
- # --- 2. Минимальное определение архитектуры ---
120
  class RMSNorm(nn.Module):
121
  def __init__(self, dim: int, eps: float = 1e-5):
122
  super().__init__()
123
  self.eps = eps
124
  self.weight = nn.Parameter(torch.ones(dim))
 
125
  def forward(self, x):
126
  return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) * self.weight
127
 
@@ -151,6 +169,7 @@ class Attention(nn.Module):
151
  self.wk = nn.Linear(cfg.dim, cfg.n_kv_heads * self.head_dim, bias=False)
152
  self.wv = nn.Linear(cfg.dim, cfg.n_kv_heads * self.head_dim, bias=False)
153
  self.wo = nn.Linear(cfg.n_heads * self.head_dim, cfg.dim, bias=False)
 
154
  def forward(self, x, cos, sin):
155
  B, S, _ = x.shape
156
  xq = self.wq(x).view(B, S, self.n_heads, self.head_dim).transpose(1, 2)
@@ -171,6 +190,7 @@ class SwiGLUMLP(nn.Module):
171
  self.w1 = nn.Linear(cfg.dim, hidden_dim, bias=False)
172
  self.w2 = nn.Linear(hidden_dim, cfg.dim, bias=False)
173
  self.w3 = nn.Linear(cfg.dim, hidden_dim, bias=False)
 
174
  def forward(self, x):
175
  return self.w2(F.silu(self.w1(x)) * self.w3(x))
176
 
@@ -179,6 +199,7 @@ class TransformerBlock(nn.Module):
179
  super().__init__()
180
  self.attn_norm, self.attn = RMSNorm(cfg.dim, cfg.norm_eps), Attention(cfg)
181
  self.ffn_norm, self.ffn = RMSNorm(cfg.dim, cfg.norm_eps), SwiGLUMLP(cfg)
 
182
  def forward(self, x, cos, sin):
183
  return x + self.ffn(self.ffn_norm(x + self.attn(self.attn_norm(x), cos, sin)))
184
 
@@ -194,6 +215,7 @@ class TimeGPT(nn.Module):
194
  cos, sin = precompute_rope_sincos(cfg.dim // cfg.n_heads, cfg.max_seq_len, cfg.rope_theta)
195
  self.register_buffer("rope_cos", cos, persistent=False)
196
  self.register_buffer("rope_sin", sin, persistent=False)
 
197
  def forward(self, idx):
198
  B, S = idx.shape
199
  h = self.tok_embeddings(idx)
@@ -202,28 +224,37 @@ class TimeGPT(nn.Module):
202
  h = layer(h, cos, sin)
203
  return self.output(self.norm(h))
204
 
205
- # --- 3. Загрузка весов и инференс со стримингом ---
206
  device = "cuda" if torch.cuda.is_available() else "cpu"
207
  cfg = TimeGPTConfig()
208
  model = TimeGPT(cfg).to(device, dtype=torch.bfloat16)
209
 
210
- # Загрузка весов SafeTensors
211
- weights = load_file("model.safetensors", device=device)
212
  model.load_state_dict(weights, strict=False)
213
  model.eval()
214
 
215
- tokenizer = Tokenizer.from_file("tokenizer.json")
216
 
217
  prompt = "Искусственный интеллект — это"
218
  input_ids = torch.tensor([tokenizer.encode(prompt).ids], device=device)
219
 
220
  print(prompt, end="", flush=True)
221
  with torch.inference_mode():
222
- for _ in range(60):
223
  logits = model(input_ids[:, -cfg.max_seq_len:])
224
  next_token = torch.multinomial(F.softmax(logits[0, -1, :] / 0.7, dim=-1), num_samples=1)
225
  if next_token.item() == tokenizer.token_to_id("<|im_end|>"):
226
  break
227
  input_ids = torch.cat([input_ids, next_token.unsqueeze(0)], dim=1)
228
  print(tokenizer.decode([next_token.item()]), end="", flush=True)
229
- print()
 
 
 
 
 
 
 
 
 
 
10
  - pytorch
11
  - safetensors
12
  - timegpt
 
13
  - 0.5b
14
  - text-generation
15
  license: apache-2.0
16
  pipeline_tag: text-generation
17
  inference: false
18
+ model_name: TimeGPT-Base
19
  ---
20
 
21
+ # ⏳ TimeGPT-Base (0.5B)
22
 
23
+ **TimeGPT-Base** — это мультиязычная авторегрессионная языковая модель (Causal LM) класса **0.5B**, разработанная и обученная **полностью с нуля (from scratch)** без использования сторонних весов или дистилляции.
24
 
25
+ Модель создана независимой командой **LongTime Devs** и обучена на одном потребительском ускорителе **NVIDIA GeForce RTX 5060 Ti 16GB**. Основной язык обучения — **русский**, с интеграцией английского, китайского, немецкого и украинского корпусов.
26
 
27
+ > ⚠️ **Важное замечание:** это **базовая фундаментальная модель (Base)**. Она обучена задаче продолжения текста (next-token prediction / text completion) и не проходила стадию выравнивания инструкций.
28
+ >
29
+ > Диалоговая инструктивная версия — **TimeGPT-Instruct (0.5B)** — в настоящее время находится на финальной стадии дообучения и **в скором времени будет опубликована** в репозитории команды LongTime Devs.
30
 
31
  ---
32
 
33
+ ## 🏛 Архитектурные особенности
34
 
35
+ TimeGPT построена на современной архитектуре трансформера (уровня Llama 3 и Qwen 2.5), оптимизированной для высокой скорости инференса и экономии видеопамяти:
36
 
37
+ - **Grouped-Query Attention (GQA)**: 20 голов Query и 4 головы Key/Value (соотношение 5:1), что кратно снижает размер KV-кеша при работе с контекстом.
38
+ - **SwiGLU Activation**: нелинейная функция активации в блоках MLP.
39
+ - **RMSNorm**: быстрая среднеквадратичная нормализация вместо классического LayerNorm.
40
+ - **Rotary Position Embeddings (RoPE)**: векторное позиционное кодирование с базовой частотой $\theta = 500\,000$ для стабильности контекста.
41
+ - **Weight Tying**: совмещение матриц эмбеддингов токенов и выходной языковой головы для компактности и регуляризации весов.
42
+ - **FlashAttention / SDPA**: поддержка нативного аппаратного ускорения Scaled Dot-Product Attention в режиме `bfloat16`.
43
 
44
  ### Спецификация модели
45
 
46
  | Параметр | Значение |
47
  | :--- | :--- |
48
+ | **Класс параметров** | **0.5B** |
49
+ | **Размер файла весов** | **1.02 GB** (`model.safetensors`) |
50
  | **Размерность скрытого слоя (`dim`)** | 1280 |
51
  | **Количество слоев (`n_layers`)** | 24 |
52
  | **Голов внимания (`n_heads`)** | 20 |
53
  | **Голов Key/Value (`n_kv_heads`)** | 4 (GQA) |
54
  | **Размерность промежуточного слоя MLP** | 3456 (SwiGLU) |
55
+ | **Контекстное окно (`max_seq_len`)** | 1024 токена |
56
  | **Размер словаря (`vocab_size`)** | 32 000 |
57
  | **Формат весов** | SafeTensors (`bfloat16`) |
58
 
 
60
 
61
  ## 🔤 Токенизатор
62
 
63
+ Модель использует собственный мультиязычный **Byte-Level BPE** токенизатор:
64
  - **Размер словаря**: 32 000 токенов.
65
+ - **Byte-fallback**: байтовое резервирование исключает появление токенов неизвестных символов (`<|unk|>`) при обработке редких знаков, иероглифов и эмодзи.
66
  - **Служебные токены стандарта ChatML**:
67
  - `<|pad|>`
68
  - `<|unk|>`
 
73
 
74
  ## 📚 Данные и процесс предобучения
75
 
76
+ Модель обучалась фундаментальному чтению в непрерывном мультиязычном потоке данных:
77
 
78
+ - **Русский язык (основной массив, ~55%)**: русскоязычный срез Википедии + новостные корпуса (`IlyaGusev/gazeta`).
79
+ - **Английский язык (~20%)**: статьи англоязычной Википедии.
80
+ - **Китайский язык (~10%)**: срез китайской Википедии.
81
+ - **Немецкий язык (~8%)**: срез немецкой Википедии.
82
+ - **Украинский язык (~7%)**: статьи украинской Википедии.
83
 
84
  ### Детали тренировочного цикла:
85
+ - **Оборудование**: 1× NVIDIA GeForce RTX 5060 Ti 16GB.
86
+ - **Шаги обучения**: 50 000 шагов (эффективный размер батча = 16 последовательностей по 1024 токена).
87
+ - **Суммарный объем прочитанных данных**: ~820 млн токенов.
88
+ - **Время непрерывного обучения**: ~27 часов.
89
  - **Оптимизатор**: AdamW ($\beta_1 = 0.9$, $\beta_2 = 0.95$, weight decay = 0.01).
90
+ - **График Learning Rate**: Cosine Annealing с плавным разогревом (Warmup: 1500 шагов, Peak LR: `1.8e-4`).
91
+ - **Динамика Loss**: стартовый лосс **10.64** $\rightarrow$ финальный лосс **3.02–3.36** (перплексия снизилась с бесконечности до ~20).
92
 
93
  ---
94
 
95
  ## 💻 Быстрый запуск (Inference)
96
 
97
+ Установите необходимые зависимости:
98
+ ```bash
99
+ pip install torch tokenizers safetensors huggingface_hub
100
+ ```
101
+
102
+ Скрипт автоматически скачивает веса (`model.safetensors` — 1.02 GB) и токенизатор напрямую из репозитория `longtimedevs/TimeGPT-Base`:
103
 
104
  ```python
105
+ # WARNING: DO NOT USE THIS SCRIPT IN PRODUCTION ENVIRONMENTS! // ВНИМАНИЕ: НЕ ИСПОЛЬЗУЙТЕ ДАННЫЙ КОД В ПРОДАКШЕНЕ!
106
+ # FOR RESEARCH, TESTING AND EXPERIMENTAL PURPOSES ONLY! // ТОЛЬКО ДЛЯ ИССЛЕДОВАТЕЛЬСКИХ ЦЕЛЕЙ, ТЕСТИРОВАНИЯ И ЭКСПЕРИМЕНТОВ!
107
+
108
  import os
109
  import torch
110
  import torch.nn as nn
 
112
  from dataclasses import dataclass
113
  from tokenizers import Tokenizer
114
  from safetensors.torch import load_file
115
+ from huggingface_hub import hf_hub_download
116
+
117
+ # --- 1. Автоматическое скачивание с Hugging Face ---
118
+ REPO_ID = "longtimedevs/TimeGPT-Base"
119
+ print(f"[*] Проверка и скачивание файлов из {REPO_ID}...")
120
+ weights_path = hf_hub_download(repo_id=REPO_ID, filename="model.safetensors")
121
+ tokenizer_path = hf_hub_download(repo_id=REPO_ID, filename="tokenizer.json")
122
 
123
+ # --- 2. Конфигурация модели ---
124
  @dataclass
125
  class TimeGPTConfig:
126
  vocab_size: int = 32000
 
133
  norm_eps: float = 1e-5
134
  rope_theta: float = 500000.0
135
 
136
+ # --- 3. Архитектура TimeGPT ---
137
  class RMSNorm(nn.Module):
138
  def __init__(self, dim: int, eps: float = 1e-5):
139
  super().__init__()
140
  self.eps = eps
141
  self.weight = nn.Parameter(torch.ones(dim))
142
+
143
  def forward(self, x):
144
  return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) * self.weight
145
 
 
169
  self.wk = nn.Linear(cfg.dim, cfg.n_kv_heads * self.head_dim, bias=False)
170
  self.wv = nn.Linear(cfg.dim, cfg.n_kv_heads * self.head_dim, bias=False)
171
  self.wo = nn.Linear(cfg.n_heads * self.head_dim, cfg.dim, bias=False)
172
+
173
  def forward(self, x, cos, sin):
174
  B, S, _ = x.shape
175
  xq = self.wq(x).view(B, S, self.n_heads, self.head_dim).transpose(1, 2)
 
190
  self.w1 = nn.Linear(cfg.dim, hidden_dim, bias=False)
191
  self.w2 = nn.Linear(hidden_dim, cfg.dim, bias=False)
192
  self.w3 = nn.Linear(cfg.dim, hidden_dim, bias=False)
193
+
194
  def forward(self, x):
195
  return self.w2(F.silu(self.w1(x)) * self.w3(x))
196
 
 
199
  super().__init__()
200
  self.attn_norm, self.attn = RMSNorm(cfg.dim, cfg.norm_eps), Attention(cfg)
201
  self.ffn_norm, self.ffn = RMSNorm(cfg.dim, cfg.norm_eps), SwiGLUMLP(cfg)
202
+
203
  def forward(self, x, cos, sin):
204
  return x + self.ffn(self.ffn_norm(x + self.attn(self.attn_norm(x), cos, sin)))
205
 
 
215
  cos, sin = precompute_rope_sincos(cfg.dim // cfg.n_heads, cfg.max_seq_len, cfg.rope_theta)
216
  self.register_buffer("rope_cos", cos, persistent=False)
217
  self.register_buffer("rope_sin", sin, persistent=False)
218
+
219
  def forward(self, idx):
220
  B, S = idx.shape
221
  h = self.tok_embeddings(idx)
 
224
  h = layer(h, cos, sin)
225
  return self.output(self.norm(h))
226
 
227
+ # --- 4. Загрузка весов и инференс со стримингом ---
228
  device = "cuda" if torch.cuda.is_available() else "cpu"
229
  cfg = TimeGPTConfig()
230
  model = TimeGPT(cfg).to(device, dtype=torch.bfloat16)
231
 
232
+ # Чтение скачанных весов SafeTensors
233
+ weights = load_file(weights_path, device=device)
234
  model.load_state_dict(weights, strict=False)
235
  model.eval()
236
 
237
+ tokenizer = Tokenizer.from_file(tokenizer_path)
238
 
239
  prompt = "Искусственный интеллект — это"
240
  input_ids = torch.tensor([tokenizer.encode(prompt).ids], device=device)
241
 
242
  print(prompt, end="", flush=True)
243
  with torch.inference_mode():
244
+ for _ in range(80):
245
  logits = model(input_ids[:, -cfg.max_seq_len:])
246
  next_token = torch.multinomial(F.softmax(logits[0, -1, :] / 0.7, dim=-1), num_samples=1)
247
  if next_token.item() == tokenizer.token_to_id("<|im_end|>"):
248
  break
249
  input_ids = torch.cat([input_ids, next_token.unsqueeze(0)], dim=1)
250
  print(tokenizer.decode([next_token.item()]), end="", flush=True)
251
+ print()
252
+ ```
253
+
254
+ ---
255
+
256
+ ## 👥 Разработчики
257
+
258
+ - **Команда**: LongTime Devs
259
+ - **Архитектура**: TimeGPT
260
+ - **Лицензия**: Apache 2.0 (открыто для свободного использования и исследований)