Repository navigation
Expand file tree
/
Copy pathchats
More file actions
1075 lines (770 loc) · 95.1 KB
/
Copy pathchats
File metadata and controls
1075 lines (770 loc) · 95.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Я прикрепил тебе сомнительные выходы Gemini твоя задача создать идеальную архитектуру обучения 6b модели на 3050 6gb нужно дать оптимизации движка и архитектуру модели самой разрешено все дял достижения результата
Выполнена команда
Подсказка полезная, но выигрыш от низкой точности лежит не там, где кажется.
«Формат K3» (MXFP4-веса + MXFP8-активации) это формат поставки готовой модели. Память обучения он не уменьшает.
Низкая точность реально даёт три вещи: быстрее GEMM (INT8), вдвое меньше байт на активации и, с оговорками, вдвое меньше RAM на веса.
Потолок ускорения ≈×1.7–1.9, а не ×4–8: карта упирается в 144 ГБ/с и в не-GEMM части. INT4 откладываем на конец.
1. Что такое «формат K3» на самом деле
В техотчёте K3 (релиз 16 июля 2026) QAT с MXFP4-весами и MXFP8-активациями идёт на всём пост-трейне (SFT и RL). В 4 бита квантуются только веса MoE-экспертов, а внимание, latent-проекции, shared-эксперты и роутеры остаются в высокой точности. В претрейне большинство активаций хранится блочно в FP8 с оффлоудом, а поэлементные операции пересчитываются.
Demystifying Kimi K3: The Three Algorithms Behind the #1 Frontend Coding Model +2
Веса и оптимизатор у Kimi при обучении не 4-битные. Их 4 бита нужны инференсу.
На Ampere нет FP4/FP8-тензорных ядер, но MXFP4 исполним на INT8. Значения E2M1, умноженные на 2, это целые {0,1,2,3,4,6,8,12}, а масштаб блока из 32 элементов это степень двойки. Поэтому MXFP4-веса ложатся в INT8 точно, а INT8-тензорки у GA10x в 4× быстрее BF16 с FP32-накоплением. Активации MXFP8 заменяются на MXINT8, это приближение, не точный эквивалент.
INT4 как вычисления возможен: INT4-MMA на Ampere есть, вдвое быстрее INT8. Готовых Triton/PyTorch-ядер нет, нужен CUTLASS.
INT4 как хранение весов при обучении не работает: сетка в ≈18× грубее INT8, а шаг обновления на порядки меньше. K3 так и не делает.
2. Лестница низкой точности для твоей карты
# Что Эффект (оценка) Ворота
1 INT8-GEMM: fwd и dgrad в INT8 (масштабы по строкам/каналам), wgrad в bf16 ×1.3 (все три GEMM ×1.5) Δloss ≤ +0.01 нат на 300M токенов прокси
2 8-бит активации блоками (практика K3): границы слоёв и saved-activations, INT8, блок 32, масштаб 2ᵏ RAM границ ×0.5, меньше трафика при 144 ГБ/с, ≈+13% скорости A/B на прокси; квантизатор стоит и в forward
3 INT8-веса + stochastic rounding: веса хранятся и стримятся в INT8, масштаб на группу 128 RAM весов ×0.5, PCIe ×0.5 Δloss ≤ 0.01; смотри хвост cosine
4 INT4-вычисления: W4A4, Адамар-ротации, SR для градиентов ещё +10–15% к ступени 1 только после 1–3, нужны CUTLASS-ядра
5 Финальный QAT в формате K3: последние ≈10% токенов, эксперты в MXFP4, активации 8-бит поставка 3.6 ГБ при E=128, 1.3 ГБ при E=32 eval до/после ≤ 0.02 нат
Ступень 1. В torchao уже есть прототип INT8-обучения. Работа про INT8-обучение с блочным fallback даёт 1.57× end-to-end на RTX 4090. Это та же GeForce-особенность с половинной скоростью FP32-накопления и по порядку величины согласуется с моей оценкой.
github
arxiv
Ступень 3. Низкоточные веса напрямую не учатся: малое изменение округляется в ноль, лечится stochastic rounding. При LR=1e-5 INT8-модель в эксперименте torchao училась, а BF16 нет. Реализован только channel-wise INT8. Это подтверждает и мой прошлый совет «bf16 + SR».
github
Риск ступени 3. Хвост cosine: при lr=0.02 шаг обновления ≈1.2 шага INT8-сетки, при lr/10 уже ≈0.12, и SR добавляет шум. Запасной план: последние ≈10% токенов на bf16-весах, если хватает RAM.
Ступень 2 исправляет мой прошлый совет. Я писал про «небольшое смещение» у int8-границ. Правильно пропускать через квантизатор и forward (STE), тогда recompute совпадает с forward.
3. Как меняются цифры
Время (E=128, 8B токенов, 25% на L=16). Допущения (замени профилем): доли шага fwd+dgrad 40%, wgrad 20%, Muon-NS 14%, прочее 26%. Эффективное ускорение GEMM ×3 для INT8 и ×5 для INT4 вместо сырых ×4/×8, накладные на квантизацию 5–8%.
Схема Ускорение шага η, TFLOPS ток/с (L=32) 4B токенов 8B токенов
BF16 1.00 3.5 1127 36 д 73 д
INT8 fwd+dgrad ×1.28 4.5 1438 29 57
INT8 все GEMM ×1.49 5.2 1682 24 49
+ 8-бит dataflow ×1.69 5.9 1899 22 43
INT4 все GEMM ×1.67 5.8 1878 22 44
INT4 + 8-бит dataflow ×1.91 6.7 2153 19 38
INT4 на всех GEMM ≈ INT8 плюс 8-битный dataflow (×1.67 против ×1.69). Сократить байты выгоднее, чем биты GEMM. Именно это K3 делает в претрейне.
RAM (ГиБ, G=49k, headless).
E Total bf16-веса INT8-веса INT8-веса + INT8-границы
32 1.70B 12.9 11.4 9.9
64 3.12B 16.9 14.0 12.5
96 4.53B 20.8 16.7 15.2
128 5.94B 24.8 19.4 17.9
На текущих 14.7 ГиБ (≈13.5 в headless) вместо E=32 становится реально E=64: 3.1B total / 0.47B active (12.5 ГиБ, с ckpt-every-2 ≈11.7). E=128 нужно ≥24 ГБ RAM, комфортно 32.
4. Что взять из K3 в архитектуру
SiTU-GLU вместо SwiGLU. Мягкие ограничения β1=4 и β2=25 ограничивают |f| ≤ 100. Цель: меньше выбросов при низкой точности. Это ровно нужное: ограниченный вход down-проекции делает 8-бит активации безопасными.
arxiv
NoPE в GQA-слоях. K3 использует NoPE в глобальных слоях: позицию несут KDA-слои, а при росте контекста RoPE не перенастраивается. Выход внимания хранится в fp32. Заменяет мой RoPE-25%, но проверь экстраполяцию 4k→16k на прокси.
arxiv
Per-head Muon для q/k/v. Это про стабильность, экономия копеечная: NS внимания падает с 4.7 до 2.3 TFLOPs из 68, потому что доминируют эксперты.
Расписание. В scaling-law-сравнении K3 cosine стабильно обходил WSD при раздельном тюнинге LR и batch. Поправка к прошлому ответу: при фиксированном T бери cosine (1% warmup, wd 0.1). WSD оставь только для плавающего горизонта.
arxiv
Кандидаты в ablation, не по умолчанию:
KDA вместо GDN. Нижняя граница log-decay g_min=−5 позволяет считать все тайлы плотными матмулами на тензорных ядрах. Сравни KDA, GDN и GDN-2.
arxiv
AttnRes. Слой читает представления предыдущих слоёв, а N≈8 блоков возвращают большую часть эффекта. Цена у нас ≈0.9 ГиБ RAM на 9 блок-представлений.
arxiv
LatentMoE и Quantile Balancing. Они нужны K3 при 896 экспертах (разреженность 56): на таком числе экспертов балансировка bias-обновлениями перестаёт работать. При E=128 избыточны, оставляем bias-балансировку.
arxiv
5. Что добавить в ворота Phase 1
INT8-GEMM, INT8-веса+SR и 8-бит границы: parity по отдельности (≤ +0.01 нат на 300M токенов), потом вместе. Если сумма > +0.02 нат, оставляем только ступень 1.
Отдельный прогон хвоста LR для INT8-весов.
SiTU-GLU против SwiGLU, NoPE против RoPE-25%.
Финальный QAT: eval до и после.
Следующий шаг (дополнение к Phase 0): пришли TFLOPS torch._int_mm против bf16 на формах 4096×1024×1024 и 2048×448×1024, плюс профиль шага крошечной модели (доли GEMM / NS / прочее). Я заменю допущения 40/20/14/26 твоими цифрами и пересчитаю таблицы.
А ты имеешь доступ к моим файлам типа чтобы ты смог посмотртеть еткущий код ?
Прочитать файл, выполнена команда, использован инструмент
Нет, к твоему диску и репозиторию у меня доступа нет. Вот что реально есть:
В чате я вижу только 20 загруженных .md-файлов. Я проверил каталог загрузок: README, MODEL_CARD, README_HF и документы-«блюпринты». Ни одного .py, ни weakgpu/, ни arka_engine_4b/, ни логов, ни чекпоинтов.
Всё, что я говорил про твой движок, основано на описаниях, а не на коде. Я не знаю, реализованы ли в нём на самом деле хуки, SR и NS на GPU. Пример: в SELF_VERIFICATION_REPORT dry-run шёл на CPU, а «Peak VRAM 3.6 ГБ — CONFIRMED» ни одним показанным логом не подтверждён.
Моя песочница отдельная. Сети в ней нет, твоего ноутбука и GPU она не видит. В ней нет torch, triton и GPU (1 ядро CPU, 3 ГБ RAM), только Python и numpy. Поэтому твои тесты я запустить не смогу.
Как показать мне код:
Загрузи файлы в чат, zip тоже подойдёт. В первую очередь:
тренер и оптимизатор (UniversalWeakGPUTrainer, MuonAdamHybridOptimizer);
chunked CE;
weakgpu/models/custom_llm.py и config.py;
demo/train.py;
чекпоинтинг.
Приложи логи реального запуска: tok/s, torch.cuda.max_memory_allocated и вывод nvidia-smi. Они ценнее любых таблиц в документах.
Если репозиторий публичный, пришли ссылки на конкретные файлы. Публичные страницы я могу читать.
Что смогу сделать с кодом:
найти баги (dtype, утечки VRAM, порядок хуков, SR);
сверить код с дизайном;
написать патчи и parity-тесты, которые ты запустишь у себя;
прототипировать числовую часть на numpy: NS, SR, балансировку роутера.
Чтобы ассистент работал прямо в твоём репозитории, читал и правил код и запускал тесты на твоём GPU, есть Claude Code. Он запускается у тебя в терминале.
Recommended for you
Смотреть все
Claude Code
Читает и правит код в твоём репозитории и запускает тесты на твоём GPU.
arka_4b_int8.py
arka_4b_int8.py
PY
large_scale_verification.py
large_scale_ver
ification
.py
PY
unified_core.py
unified_core.py
PY
build_nvme_dataset.py
build_nvme_dataset.py
340 строк
PY
checkpoint_manager.py
checkpoint_manager.py
170 строк
PY
dashboard.py
dashboard.py
477 строк
PY
double_buffered_streamer.py
double_buffered
_streamer
.py
87 строк
PY
dual_shard_buffer.py
dual_shard_buffer.py
88 строк
PY
engine_4b.py
engine_4b.py
192 строки
PY
__init__.py
__init__.py
36 строк
PY
master_trainer.py
master_trainer.py
324 строки
PY
mtp_module.py
mtp_module.py
147 строк
PY
muon_fused.py
muon_fused.py
213 строк
PY
net2net_4b.py
net2net_4b.py
185 строк
PY
net2net_transfer.py
net2net_transfer.py
198 строк
PY
progressive_growth.py
progressive_growth.py
143 строки
PY
resonant_attention.py
resonant_attention.py
214 строк
PY
streaming_filter.py
streaming_filter.py
254 строки
PY
test_acceleration_stack.py
test_acceleration_stack.py
126 строк
PY
test_dry_run_4b.py
test_dry_run_4b.py
77 строк
PY
Прочитать инструкцию по работе с загруженными файлами, не попавшими в контекст
Приостановлено: бесплатный лимит использования восстановится в 17:40. Тогда и продолжите.
Сможешь продолжить диалог?
Конечно! Пришли наш предыдущий диалог или последние сообщения, на которых мы остановились, — и я продолжу с того же места, сохранив контекст, стиль и настроение беседы. 😊
Pasted text.txtDocument
export_to_safetensors.pyCode
Продолжу с загруженного кода. Сначала проверю сам экспортёр: безопасность токена, совместимость конфигурации с весами и то, не создаёт ли упаковка модель, которую затем невозможно загрузить через Transformers. Затем отмечу конкретные исправления по приоритету.
Evaluated checkpoint export and verified model compatibility
Я посмотрел export_to_safetensors.py. Теперь у нас есть не только описание проекта Arka, но и конкретный Python-код, поэтому можно переходить от предположений к проверке реализации.
Первое — важная проблема безопасности. В экспортёре прямо в исходном коде записан токен доступа Hugging Face, который затем используется для публикации модели. Считай его скомпрометированным: отзови его в настройках Hugging Face и создай новый. Простого удаления токена из файла недостаточно. Новый токен следует хранить в переменной окружения, а не в репозитории.
arka_4b_int8.pyCode
unified_core.pyCode
Worked for 2m 24s
Я изучил оба файла: arka_4b_int8.py и unified_core.py. Теперь можно обсуждать не только архитектурный замысел Arka, но и конкретные ошибки реализации.
Мой вывод: в коде есть несколько критических проблем, которые необходимо исправить до полноценного обучения. Главная проблема даже не в ограничениях RTX 3050: некоторые компоненты работают не так, как заявлено в комментариях. Кроме того, две реализации DeltaNet математически различаются и обе требуют исправлений.
1. Критическая проблема: INT8-слои не обучаются
Файл arka_4b_int8.py содержит класс BlockwiseINT8Linear.
Посмотри, как объявлены его веса:
self.register_buffer(
"weight_int8",
torch.zeros((out_features, in_features), dtype=torch.int8)
)
self.register_buffer(
"scales",
torch.zeros(self.total_blocks, dtype=torch.bfloat16)
)
Здесь сразу две проблемы.
Первая — веса объявлены буферами, а не обучаемыми параметрами. PyTorch не будет автоматически вычислять и накапливать градиенты для weight_int8 и scales как для обычных nn.Parameter. Поэтому стандартный оптимизатор не сможет обновлять эти веса.
Метод from_float() для квантования существующего слоя присутствует, но конструкторы модели создают экземпляры BlockwiseINT8Linear напрямую. В предоставленном файле я не нашёл кода, который автоматически заменяет их квантованными копиями предварительно обученных слоёв.
Вторая — новые слои изначально нулевые. И веса, и масштабы создаются через torch.zeros(). Если загрузчик не заполнит их данными, деквантизированные веса также будут нулевыми.
Следовательно, свежесозданная модель не получит нормально инициализированные проекции внимания и FFN.
Есть ещё одна проблема: это не INT8-вычисления
Посмотри на forward():
def forward(self, x):
w_dequant = self.dequantize(x.dtype)
return F.linear(x, w_dequant, self.bias)
Перед каждой операцией линейного слоя весь соответствующий INT8-тензор преобразуется в обычные веса с плавающей точкой, после чего вызывается F.linear().
Это принципиальное отличие от заявленного в заголовке fused INT8-движка.
В текущем коде нет реализации INT8 GEMM через torch._int_mm, специализированное ядро Triton или CUTLASS. Поэтому заявленное ускорение на INT8 Tensor Cores из этой реализации не следует.
При этом полная деквантизация каждого слоя создаёт дополнительные временные тензоры и расходует пропускную способность памяти.
Как исправить: сначала необходимо решить, какой режим тебе нужен.
Обучение с нуля: сохранить обучаемые мастер-веса в BF16/FP32 либо реализовать корректную схему низкоточного обучения с градиентами и обновлением мастер-весов.
Дообучение замороженной INT8-модели: явно реализовать обучаемые адаптеры или другой механизм обновления выбранных параметров.
Быстрый INT8-инференс: реализовать настоящие INT8-операции или использовать проверенные готовые ядра.
Просто заменить Parameter на buffer недостаточно для полноценного INT8-обучения.
2. Критическая проблема: Gated DeltaNet в Arka 4B реализован неправильно
Перейдём к GatedDeltaNetBlock в arka_4b_int8.py.
В описании заявлены Gated DeltaNet 2.0, chunked recurrence и рекуррентное состояние. Однако фактическая реализация этим свойствам не соответствует.
Проблема A: отсутствует механизм забывания
В этом блоке создаются следующие проекции:
self.q_proj
self.k_proj
self.v_proj
self.beta_proj
self.gate_proj
self.out_proj
Отдельной проекции для механизма забывания состояния нет. В forward() состояние также не умножается на гейт забывания.
В результате состояние не реализует полноценную комбинацию забывания старой информации и записи новой.
Проблема B: токены внутри одного чанка не взаимодействуют правильно
Обрати внимание на этот участок:
retrieved = torch.einsum("bshd,bhdv->bshv", qc, state)
out[:, start:end] = retrieved + vc * betac
Весь чанк обрабатывается относительно одного и того же состояния, существовавшего до начала чанка.
При этом внутри чанка нет полноценного причинного взаимодействия между токенами посредством delta-правила. Текущий код просто добавляет к прочитанному состоянию масштабированные значения v.
Затем состояние обновляется один раз после обработки чанка:
delta = vc - torch.einsum("bshd,bhdv->bshv", kc, state)
state = state + torch.einsum(
"bshd,bshv,bshc->bhdv",
kc,
delta,
betac
).squeeze(-1)
Все ошибки delta здесь рассчитываются относительно состояния, существовавшего до обработки чанка. Последовательные изменения состояния внутри чанка не учитываются.
Практическое последствие: ранние токены чанка не записываются в состояние своевременно, чтобы последующие токены того же чанка могли корректно использовать их информацию.
Кроме того, состояние создаётся заново в начале каждого вызова:
state = torch.zeros(
b,
self.n_heads,
self.head_dim,
self.head_dim,
device=x.device,
dtype=x.dtype
)
Механизм передачи состояния между вызовами здесь тоже отсутствует.
Мой вывод: этот блок необходимо переписать на основе проверенной реализации Gated DeltaNet, а не пытаться исправить несколькими локальными изменениями. Иначе можно получить код, который работает технически, но обучает модель на совершенно другой операции.
3. UnifiedDeltaNet тоже нуждается в исправлении
Второй файл выглядит более перспективным как основа для архитектурной реализации: здесь уже предусмотрены гейт забывания alpha, гейт записи beta и передача рекуррентного состояния между вызовами.
Однако заявленная «математически точная» реализация пока не является точной.
Проблема A: забывание реализовано только на границах чанков
В коде рассчитывается:
chunk_total_decay = torch.exp(
torch.sum(torch.log(ac), dim=-1, keepdim=True)
).unsqueeze(-1)
Затем состояние обновляется:
S = S * chunk_total_decay + delta_S
Это учитывает суммарный гейт забывания на границе чанка, но не реализует правильное влияние отдельных гейтов на все операции внутри чанка.
В частности, внутриблочное внимание рассчитывается отдельно:
intra_scores = torch.matmul(qc, kc.transpose(-1, -2))
intra_scores = torch.where(
causal_mask,
intra_scores,
torch.zeros_like(intra_scores)
)
intra_scores = intra_scores * bc.unsqueeze(-2)
intra_y = torch.matmul(intra_scores, vc)
Этот код использует обычное причинное взаимодействие между q, k и v. Он не реализует полноценный внутриблочный delta-rule с учётом забывания и корректировки записываемых значений.
Обновление состояния также рассчитывается через ошибки относительно одного и того же состояния на входе чанка. Этого недостаточно для эквивалентности исходной последовательной рекуррентности.
Проблема B: некорректное заполнение последнего чанка
Если длина последовательности не кратна размеру чанка, код дополняет её:
alpha = F.pad(alpha, (0, pad_len), value=0.95)
beta = F.pad(beta, (0, pad_len), value=0.1)
Это означает, что искусственные токены также влияют на суммарное забывание.
Даже при нулевых q, k и v произведение гейтов alpha на границе чанка изменяет состояние. Следовательно, результат зависит от того, сколько искусственных позиций потребовалось добавить.
Для нейтрального дополнения здесь нужно предусмотреть alpha = 1 и beta = 0, чтобы дополнительные позиции не изменяли состояние.
Важная оговорка: это только исправление ошибки дополнения. Оно не решает более серьёзную проблему неправильной внутриблочной рекуррентности.
Проблема C: это не Gated DeltaNet 2.0
В оригинальном Gated DeltaNet-2 предусмотрены раздельные поканальные гейты забывания и записи, а также поканальное управление затуханием состояния. Именно это отличает его от предыдущих вариантов Gated DeltaNet и KDA.
В твоём UnifiedDeltaNet используются скалярные значения alpha и beta на голову и позицию. В GatedDeltaNetBlock из первого файла вообще нет отдельного гейта забывания.
Поэтому пока корректнее считать оба компонента экспериментальными реализациями линейной рекуррентности, а не готовой реализацией Gated DeltaNet 2.0.
Рекомендация: выбрать одну эталонную реализацию, построить её сначала в FP32 и проверить математическую эквивалентность последовательного и chunked-алгоритмов. Только после этого переносить её в низкоточный движок.
4. Заявленные 4.15 GB не гарантируют, что модель поместится в VRAM
В arka_4b_int8.py утверждается, что все веса модели займут 4.15 GB, а RTX 3050 предоставляет около 4.64 GiB доступной памяти.
Здесь не учтён весь фактический состав модели.
Например, эмбеддинг создан обычным образом:
self.tok_embeddings = nn.Embedding(
config.vocab_size,
config.d_model
)
А дополнительные MTP-головы содержат обычные nn.Linear. Эти веса не используют описанный формат INT8. При стандартной инициализации PyTorch они создаются в FP32.
Для конфигурации из файла получается приблизительно следующая картина:
Компонент Оценка
INT8-веса всех линейных слоёв 3.49 GiB
Блочные масштабы INT8 0.055 GiB
Эмбеддинг в FP32 0.575 GiB
MTP-головы в FP32 0.105 GiB
Всего только на эти веса Около 4.23 GiB
Это расчёт по объявленным размерам слоёв, без временных тензоров, активаций, рабочих областей и градиентов.
При лимите 4.64 GiB остаётся около 0.4 GiB. Уже на этой стадии запаса недостаточно для уверенного обучения. Перевод некоторых параметров в BF16 поможет, но проблему временных тензоров и активаций не устранит.
Кроме того, по объявленным размерам слоёв и конфигурации получается примерно 3.93 млрд параметров, а не 4.09 млрд. Это стоит проверить отдельным скриптом подсчёта параметров, учитывающим как nn.Parameter, так и квантованные буферы.
Поэтому пока нельзя считать доказанными ни вместимость модели, ни заявленную экономию памяти.
5. В unified_core.py есть дополнительные проблемы
Здесь три момента, которые стоит исправить после рекуррентного ядра.
Первый: в GQA не реализовано позиционное кодирование.
В UnifiedGQA.forward() рассчитываются q, k и v, после чего непосредственно вызывается causal SDPA. В этой функции не применяются ни RoPE, ни другие позиционные смещения. Для языковой модели, которой нужно различать порядок токенов, это существенная архитектурная проблема.
Второй: MoE не настолько векторизован, как обещает описание.
В UnifiedMoE.forward() по-прежнему используется цикл по экспертам:
for e in range(self.num_routed):
mask = (flat_indices == e)
if mask.any():
...
Для CUDA проверка mask.any() с преобразованием результата в булево значение может приводить к синхронизации CPU и GPU. При большом числе экспертов это способно существенно ухудшить производительность.
Третий: файл не содержит целого тренировочного движка.
unified_core.py предоставляет конфигурацию, рекуррентный блок, GQA, MoE и универсальный Transformer-блок. Но в нём нет полной модели с эмбеддингами и языковой головой, цикла обучения, реализации Muon, оптимизатора AdamW или движка послойной передачи весов между RAM и VRAM.
Это не обязательно означает, что этих компонентов нет в проекте. Просто по двум предоставленным файлам проверить их работу пока невозможно.
6. Как я предлагаю двигаться дальше
Я бы сейчас не начинал писать новые оптимизации для INT8. Сначала необходимо получить математически правильное и тестируемое ядро.
Этап 1. Исправить DeltaNet
Выбираем одну реализацию и создаём эталонную последовательную версию на FP32.
Затем для неё пишем тесты:
Тест Критерий
Последовательная и chunked-реализации Совпадение выходов и конечного состояния
Обратное распространение Совпадение градиентов
Длина последовательности 63, 64, 65 Корректная обработка границ чанков
Передача состояния между вызовами Совпадение с непрерывной последовательностью
Численная стабильность Нет NaN и Inf
Первый этап должен проходить на маленьких тензорах. Не нужно сразу запускать модель на 4 млрд параметров.
Этап 2. Отдельно исправить INT8
Только после получения корректной эталонной модели нужно решать вопрос низкой точности.
Для INT8-GEMM необходимо отдельно проверить:
реальную скорость матричного умножения;
дополнительную память на деквантизацию и рабочие тензоры;
качество относительно эталонного BF16;
корректность градиентов, если ядро будет использоваться при обучении.
Этап 3. Проверить настоящий тренировочный движок
После этого можно переходить к твоей основной идее — обучению большой модели с ограниченной видеопамятью за счёт послойного исполнения, накопления градиентов и размещения параметров в RAM.
Но эти оптимизации имеет смысл проверять только после того, как отдельные блоки доказанно корректны.
Что нужно посмотреть следующим
Теперь наиболее важны UniversalWeakGPUTrainer, MuonAdamHybridOptimizer и реализация ChunkedCrossEntropyLoss. По ним можно проверить, как устроены обратное распространение, обновление параметров и работа с памятью.
Также нужны weakgpu/modules/norm.py и weakgpu/modules/embedding.py, потому что обе модели зависят от этих компонентов.
Загрузи эти файлы следующим сообщением. Тогда мы сможем проверить уже не только архитектуру, но и весь путь от loss.backward() до фактического обновления весов — это сейчас главная неизвестная часть проекта.
понимаешь пока не код проблема а концепция если мы сможем доказать теоретическое обучение 4b модели тогда уже мы будем писать код пока не доказали не пишем
Worked for 2m 3s
Assessed feasibility, training status, limits, and proof criteria
Уточнил доказательство, расчёт, масштаб обучения и границы
Сверил масштаб обучения
Searched 4 websites
Да, теперь понимаю. Мы преждевременно перешли к аудиту кода. Останавливаем разработку и сначала доказываем, что сама концепция обучения Arka 4B работоспособна на твоём железе. Пока теоретическое обоснование не сходится, писать ядра, оптимизаторы и тренировочный движок бессмысленно.
Нам нужно доказать не то, что модель из 4 миллиардов параметров помещается в память или способна генерировать текст. Нужно понять, можно ли действительно обучать её параметры, сходимость сохранять при низкой точности и получить полезную языковую модель в разумный срок.
Я предлагаю рассматривать проект как задачу с тремя независимыми условиями:
Память: существует ли способ хранить параметры, обучаемое состояние и необходимые промежуточные данные в пределах доступных ресурсов?
Математика: можно ли при выбранном формате чисел корректно обновлять все необходимые параметры, не теряя малые изменения весов и не разрушая обучение?
Вычисления: хватит ли производительности для обработки достаточного количества токенов, чтобы обучение имело смысл?
Успех по одному условию не доказывает успех по остальным.
Что показывает первая теоретическая оценка
Есть важный результат, который уже можно получить без написания единой строки кода.
1. Текущая Arka 4B — это плотная модель, а не MoE
В конфигурации arka_4b_int8.py заданы 32 слоя, размерность 3072 и FFN размером 8192. Все слои используют обычный плотный SwiGLU FFN. По размерностям получается около 3,9 млрд параметров, причём почти все основные параметры участвуют в обработке каждого токена.
Это принципиально важно для вычислительного бюджета.
Для плотной языковой модели можно использовать предварительную оценку стоимости обучения:
Ftoken≈6N,
Ftoken≈6N,
где NN — число параметров, а FtokenFtoken — количество операций с плавающей точкой на обучающий токен. Это приближение, а не точный расчёт для нашей гибридной архитектуры.
Для N≈3,93⋅109N≈3,93⋅109:
Ftoken≈23,6 GFLOP.
Ftoken≈23,6 GFLOP.
Теперь возьмём прежнее базовое предположение — 3,5 полезных TFLOPS на RTX 3050.
Показатель Предварительная оценка
Производительность 3,5 TFLOPS
Скорость обучения около 148 токенов/с
Токенов за 60 дней около 0,77 млрд
Время на 4 млрд токенов около 312 дней
Время на 8 млрд токенов около 624 дней
Это идеальная оценка без дополнительных накладных расходов. Реальный послойный обмен данными, пересчёт активаций и оптимизатор могут увеличить время.
Таким образом, первая гипотеза не проходит проверку: при принятых вычислительных допущениях плотная Arka 4B не успеет обработать даже 4 млрд токенов за 60 дней.
Это не доказывает, что плотную модель такого размера нельзя обучить вообще. Это показывает, что для неё необходимо пересмотреть либо срок, либо аппаратные ресурсы, либо способ получения исходных весов.
2. Что меняет MoE
В предыдущем проектном описании мы рассматривали другую конструкцию: около 5,94 млрд параметров, из которых на один токен активны приблизительно 0,475 млрд. Это совершенно иной вычислительный режим. Именно для такой разреженной архитектуры были получены прежние оценки на миллиарды токенов за несколько недель или месяцев.
Отсюда возникает перспективная гипотеза:
Возможно, на нашем оборудовании выгоднее обучать модель с несколькими миллиардами общих параметров, но существенно меньшим количеством активных параметров на токен.
Тогда мы сможем увеличить общую ёмкость модели, не оплачивая полную вычислительную стоимость всех параметров на каждом токене.
Однако это пока не доказательство успеха. Нужно будет отдельно рассчитать стоимость маршрутизации, обновления экспертов, балансировки нагрузки и обучения каждого эксперта на достаточном количестве данных.
3. Поможет ли INT8 или INT4?
Здесь есть научная база, на которую можно опираться.
Опубликованные исследования уже рассматривают непосредственное обучение с низкоточными весами и стохастическим округлением. В 2026 году была опубликована работа ECO, в которой предлагается компенсировать ошибку квантования через состояние оптимизатора, обходясь без полноточной копии весов. Авторы представили результаты предобучения моделей до 1 млрд параметров и 2,1-миллиардной MoE-модели, а также дообучения DeepSeek-MoE-16B в INT4.
Это подтверждает, что низкоточная оптимизация — не фантастическая идея.
Но здесь важно не сделать слишком большой вывод: эти результаты не доказывают, что мы уже располагаем проверенным методом предобучения плотной модели на 4 млрд параметров с нуля на RTX 3050 и 14 ГБ RAM.
Нам предстоит обосновать применимость метода к нашей архитектуре и аппаратным ограничениям.
Ещё один нюанс — низкая точность может уменьшить требования к памяти и ускорить матричные операции, но сама по себе не уменьшает вычислительный бюджет в десятки или сотни раз.
4. А сколько данных необходимо для хорошего результата?
В качестве ориентира можно использовать исследование Chinchilla. Оно показало, что при оптимальном распределении вычислительного бюджета необходимо увеличивать и размер модели, и количество обучающих токенов. В частности, модель Chinchilla с 70 млрд параметров обучалась на 1,4 трлн токенов.
Популярная грубая экстраполяция этого результата для плотной модели на 4 млрд параметров даёт порядка 80 млрд обучающих токенов. Это ориентир, а не обязательный минимум и не универсальный закон: необходимое количество данных зависит от архитектуры, качества корпуса, инициализации и целей обучения.
Тем не менее разница с нашими предварительными 0,77 млрд токенов за 60 дней существенна.
Поэтому нам нужно различать два принципиально разных проекта:
Обучить Arka 4B с нуля. Здесь особенно критичны вычислительный бюджет и количество токенов.
Расширить уже обученную Arka L1 примерно на 1,05 млрд параметров и продолжить обучение. Здесь исходные веса могут существенно сократить объём работы, необходимой для достижения полезного качества, хотя результат всё равно потребуется доказать экспериментально.
Эти проекты нельзя оценивать по одной формуле.
Что именно нам теперь нужно доказать
Я предлагаю зафиксировать четыре условия, которые архитектура обязана удовлетворять ещё до начала разработки.
Условие Что должно быть доказано
Представление модели Все параметры и необходимые состояния обучения можно разместить в VRAM, RAM и при необходимости на NVMe с учётом одновременного существования временных данных.
Обновление весов Выбранный INT8/INT4 или другой формат позволяет действительно изменять параметры и поддерживать устойчивое обучение.
Вычислительный бюджет Реальное количество FLOPs на токен, с учётом всех операций архитектуры, укладывается в заданный срок.
Достаточность обучения Планируемое количество токенов и способ инициализации дают обоснованные шансы на требуемое качество.
Первые три условия можно исследовать расчётами, анализом опубликованных методов и проверкой физических ограничений. Четвёртое потребует не только теории, но и последующего контролируемого эксперимента: одной лишь вместимостью памяти или числом параметров качество модели доказать нельзя.
Мой предварительный вывод: идея обучения Arka с несколькими миллиардами параметров на ограниченном оборудовании заслуживает серьёзного рассмотрения. Но текущая плотная конструкция и заявленный бюджет не дают оснований считать обучение с нуля за несколько месяцев осуществимым. Более перспективные направления для теоретической проверки — разреженная MoE-архитектура и расширение существующей обученной модели.
Следующим шагом нам следует сравнить эти варианты на бумаге: посчитать память, вычислительную стоимость и количество токенов для каждого сценария. До тех пор, пока хотя бы один сценарий не пройдёт эти проверки, к написанию тренировочного движка переходить не будем.
так какая концепция мы ее до конца еще не определили я предлагаю тебе доделать математическую идею с точными цифрами а потом начну тебе кидать статьи с arXiv и будем искать интерестные моменты
Worked for 7m 29s
Согласен. Давай зафиксируем первую математически обоснованную концепцию Arka, проверим её по памяти и вычислениям, а затем будем улучшать архитектуру на основе статей. Код пока не пишем.
Я уже проверил несколько актуальных направлений исследований. Главное: у нас есть основания рассматривать обучение непосредственно низкоточных весов и квантование состояния оптимизатора, но их сочетание с нашей архитектурой ещё предстоит обосновать.
1. Какую модель мы проектируем
Предлагаю рабочее название Arka-MoE-4B-Q8.
Это языковая модель примерно на 4 миллиарда параметров, которая обучается с нуля на одной RTX 3050 Laptop с 6 ГБ VRAM и компьютере с 16 ГБ физической оперативной памяти.
Здесь принципиально важно разделить два показателя:
Общие параметры: около 4 миллиардов. Они определяют ёмкость модели и объём хранимых весов.
Активные параметры: около 478 миллионов. Именно столько параметров в среднем участвует в обработке одного токена благодаря разреженной маршрутизации экспертов.
Мы не пытаемся каким-то образом заставить плотную модель на 4 миллиарда параметров вычисляться как модель на 500 миллионов. Мы проектируем изначально разреженную архитектуру, в которой большая часть параметров не активируется для каждого отдельного токена.
MoE позволяет разделить общую ёмкость и вычислительную стоимость, однако не избавляет от необходимости хранить все эксперты и их состояния оптимизатора. Поэтому отдельно рассчитываем вычисления и память.
2. Базовая архитектура
За основу предлагаю взять следующие параметры.
Параметр Значение
Общий размер модели ≈3,95 млрд параметров
Активные параметры ≈477,5 млн
Скрытая размерность 1024
Количество слоёв 32
Рекуррентные слои 24 Gated DeltaNet-2
Глобальные слои внимания 8 GQA
Чередование слоёв 3 GDN-2 + 1 GQA
Количество экспертов в каждом MoE-слое 96
Активных экспертов на токен 4
FFN одного эксперта 384
Shared FFN каждого слоя 896
Словарь 49 152 токена
Эмбеддинги Связанные с выходной головой
Исходный контекст 4096 токенов
Основное представление весов Блочный INT8
Начальный формат вычислений BF16 после деквантизации
Формат состояния рекуррентной памяти FP32
Почему именно эта комбинация?
Gated DeltaNet-2 обеспечивает рекуррентную обработку последовательностей с состоянием фиксированного размера. В отличие от обычного внимания, объём этого состояния не растёт линейно с длиной контекста.
В Gated DeltaNet-2 предусмотрены отдельные поканальные механизмы стирания и записи, а также канальное затухание состояния. Оригинальная работа сообщает результаты на моделях размером 1,3 млрд параметров, обученных на 100 млрд токенов. Это подтверждает перспективность архитектуры, но, разумеется, не доказывает, что наша комбинация будет столь же эффективна.
GQA оставляем как механизм глобального внимания. Восемь таких слоёв обеспечат регулярный доступ к более длинному контексту, а остальные 24 слоя будут использовать рекуррентную архитектуру.
MoE состоит из 96 экспертов с размерностью 384. Маршрутизатор выбирает четыре эксперта на токен, а небольшой общий FFN работает для каждого токена.
Это наша базовая гипотеза, а не окончательный архитектурный выбор. В частности, соотношение GDN-2 и GQA ещё нужно будет сравнить с другими вариантами из научных работ.
3. Точный подсчёт параметров
Теперь самое важное: сколько параметров действительно получится при заданной конфигурации.
Для расчёта фиксируем описанные выше размерности, отсутствие MTP и Engram, а также конкретную структуру проекций GDN-2.
Эмбеддинги
При размере словаря 49 152 и скрытой размерности 1024:
Nemb=49152⋅1024
Nemb=49152⋅1024
Nemb=50 331 648
Nemb=50331648
Поскольку выходная языковая голова использует те же веса, второй независимый массив таких параметров не требуется.
Эксперты MoE
Один эксперт SwiGLU содержит три матрицы:
Nexpert=3dmodeldFFN
Nexpert=3dmodeldFFN
Следовательно:
Nexpert=3⋅1024⋅384
Nexpert=3⋅1024⋅384
Nexpert=1 179 648
Nexpert=1179648
В каждом из 32 слоёв находятся 96 таких экспертов:
Nexperts=32⋅96⋅1 179 648
Nexperts=32⋅96⋅1179648
Nexperts=3 623 878 656
Nexperts=3623878656
Таким образом, все эксперты вместе содержат примерно 3,624 млрд параметров.
Для каждого токена выбираются четыре эксперта в каждом слое. Число активных параметров экспертов:
Nactive experts=32⋅4⋅1 179 648
Nactive experts=32⋅4⋅1179648
Nactive experts=150 994 944
Nactive experts=150994944
То есть за счёт маршрутизации активируется только около 151 млн параметров экспертных FFN из 3,624 млрд хранимых.
Остальные компоненты
Компонент Количество параметров
Эмбеддинги 50 331 648
24 слоя GDN-2 163 925 184
8 слоёв GQA, включая QK-нормализацию 20 973 568
Общие FFN всех слоёв 88 080 384
Все 96 экспертов в каждом из 32 слоёв 3 623 878 656
Матрицы маршрутизаторов 3 145 728
Нормализация остальных слоёв 66 560
Всего 3 950 401 728
Это точный подсчёт для определённой выше структуры слоёв и проекций. В него не включены дополнительные модули, которые пока не решили использовать.
Итого получаем:
Ntotal≈3.9504 млрд
Ntotal≈3.9504 млрд
Из них активные параметры состоят из всех постоянно работающих компонентов и четырёх выбранных экспертов в каждом слое:
Nactive=326 523 072+150 994 944
Nactive=326523072+150994944
Nactive=477 518 016
Nactive=477518016
Отношение общего числа параметров к активным составляет:
NtotalNactive≈8.27
NactiveNtotal≈8.27
Получается модель примерно на 4 млрд параметров с вычислительной нагрузкой, соответствующей приблизительно 478 млн активных параметров на токен.
Это и есть первая зафиксированная цель.
4. Главная гипотеза: обучение без полноточной копии всех весов
Теперь переходим к самой нестандартной части проекта.
Если хранить все 3,95 млрд параметров в BF16, только веса займут примерно 7,36 GiB. Это больше всей доступной VRAM.
Но есть ещё более существенная проблема: при обычном обучении нужно учитывать градиенты и состояния оптимизатора. Полноточная мастер-копия всех весов ещё сильнее увеличила бы требования к памяти.
Поэтому предлагаю исследовать следующий вариант.
Представление весов
Храним веса в блочном INT8.
Для каждых 128 весовых значений:
128 значений INT8;
один масштаб BF16.
Средний расход составляет:
1+2128=1.015625
1+1282=1.015625
байта на параметр.
Для всей модели:
Mweights=3 950 401 728⋅1.015625
Mweights=3950401728⋅1.015625
Mweights≈4.012 GB
Mweights≈4.012 GB
Это примерно 3,74 GiB, если использовать двоичные единицы измерения памяти.
Обрати внимание: это весь набор весов с масштабами, а не только активные параметры.
Как обновлять веса?
Здесь я предлагаю не хранить отдельную полноточную копию всех параметров.
Идея состоит в том, что INT8-представление является непосредственно обучаемым состоянием модели. Для вычислений веса временно деквантизируются, а результаты оптимизатора проецируются обратно в допустимое низкоточное представление с использованием стохастического округления.
В общем виде:
W~t=sbqt
W
t=sbqt
где qtqt — целочисленные значения в блоке, а sbsb — масштаб этого блока.
После получения градиента и расчёта обновления оптимизатор формирует новое значение:
Wt+1∗=W~t+ΔWt
Wt+1∗=W
t+ΔWt
Затем применяется стохастическое округление:
qt+1=SR(Wt+1∗sb)
qt+1=SR(sbWt+1∗)
с ограничением диапазона представимых значений.
Это схематическое описание математической идеи. Конкретное правило обновления масштабов, обработка насыщения и совместимость с выбранным оптимизатором ещё предстоит определить.
Почему это направление вообще стоит рассматривать?
В опубликованной работе Direct Quantized Training of Language Models with Stochastic Rounding исследуется непосредственное обновление низкоточных весов без полноточной копии и без стандартного straight-through estimator. Авторы показали, что подобное обучение возможно на их LLaMA-структурированных моделях. Однако этот результат сам по себе не доказывает устойчивость нашей 4B MoE-модели.
Именно здесь находится одна из главных научных гипотез Arka: можно ли совместить прямое низкоточное обновление весов, разреженные эксперты и послойное обучение с ограниченной памятью без неприемлемой потери сходимости?
Не будем считать её доказанной до изучения соответствующих работ.
5. Оптимизатор и память
Предлагаю следующий вариант для дальнейшего исследования:
Компонент Предполагаемое решение
Основные матрицы модели Muon
Состояние Muon Блочное квантованное представление
Эмбеддинги и небольшие специальные параметры AdamW
Состояние AdamW 8-битное представление с подходящим масштабированием
Градиенты текущего слоя FP32
Рабочие веса на GPU BF16
Хранимые веса INT8
Почему не взять сразу INT4 и не сократить память ещё вдвое?
Потому что нам недостаточно доказать, что 4-битные значения помещаются в память. Необходимо показать, что они позволяют обновлять модель при малых градиентах и приемлемо сохраняют качество.
8-битный Muon уже исследовался на моделях до 2,7 млрд параметров; авторы сообщают о сопоставимости с полноточным Muon в изученных экспериментах. Но сочетание квантованного оптимизатора с непосредственно квантованными весами — отдельная задача, которую нельзя считать автоматически решённой этой работой.
Поэтому мой выбор для первой теоретической версии — INT8 как хранимое представление весов, BF16 для основных матричных вычислений, FP32 для накопления градиентов текущего слоя и квантованные состояния оптимизатора.
Настоящие INT8 GEMM-вычисления можно рассматривать как отдельную оптимизацию. На первом этапе мы не будем заранее приписывать им ускорение, которого пока не измеряли.
6. Поместится ли такая схема в 16 ГБ RAM и 6 ГБ VRAM?
Рассмотрим сначала оперативную память.
При предлагаемой схеме все веса и состояния оптимизатора хранятся в RAM. На GPU одновременно находится только рабочий слой, а также необходимые для текущего вычисления временные данные.
Для расчёта примем группу из 16 384 токенов — четыре последовательности по 4096 токенов. Границы между слоями будем сохранять в BF16 для последующего пересчёта при обратном распространении градиента.
Это расчётная конфигурация, а не уже измеренный режим работы.
Оперативная память
Компонент Расчётный расход
Все INT8-веса с масштабами 3,74 GiB
Квантованное состояние оптимизатора около 3,79 GiB
Границы активаций для 16 384 токенов 1,03 GiB
Буфер градиента границ 0,03 GiB
Текущий слой и буфер предварительной загрузки 0,35 GiB
Буферы данных 0,50 GiB
Система и резерв памяти 2,33 GiB
Итого Около 11,76 GiB
Оценка состояния оптимизатора включает дополнительный запас на параметры, которым потребуются два состояния AdamW.
Если в headless-режиме для обучения действительно доступно около 13,5 GiB, то предварительный остаток составляет приблизительно:
13.5−11.76=1.74 GiB
13.5−11.76=1.74 GiB
На бумаге это выглядит осуществимым.
Однако это ещё не гарантия того, что память будет укладываться в лимит: нам предстоит проверить фактический размер рабочих буферов, библиотек и временных тензоров. Если дополнительные расходы окажутся больше, уменьшение группы токенов будет одним из первых рычагов управления памятью.
Видеопамять
У самого большого слоя приблизительно 123 млн параметров, включая все 96 экспертов и остальные компоненты слоя.
Это даёт следующую оценку:
Компонент Расчётный расход VRAM
Рабочая копия весов слоя в BF16 0,229 GiB
Буфер загрузки следующего INT8-слоя 0,116 GiB
FP32-градиенты текущего слоя 0,458 GiB
Состояние оптимизатора текущего слоя 0,116 GiB
Рабочие области оптимизатора 0,10–0,25 GiB
Активации и пересчёт 1,2–1,8 GiB
Эмбеддинги, языковая голова и chunked CE около 0,50 GiB
Контекст CUDA и резерв аллокатора около 0,60 GiB
Итого Приблизительно 3,32–4,07 GiB
Последние оценки зависят от реализации операторов, поэтому считать их окончательным результатом нельзя.
При условном пределе 4,64 GiB такой рабочий набор имеет запас порядка 0,57 GiB даже по верхней границе этой оценки. Это уже значительно правдоподобнее, чем попытка разместить всю плотную модель вместе с состоянием оптимизатора непосредственно в VRAM.
Но есть важное условие: GQA должен использовать память-эффективное внимание, а выходная голова — не создавать полную матрицу логитов для всей группы токенов. Иначе пиковое потребление памяти может заметно вырасти.
Промежуточный итог: ограничение памяти не опровергает концепцию. При прямом низкоточном обновлении весов и послойном исполнении предварительный расчёт сходится. Остаётся подтвердить корректность метода обучения и более точно определить рабочие области вычислений.
7. Сколько времени понадобится для обучения?
Теперь рассчитываем вычислительную стоимость.
Для предварительной оценки обучения языковой модели будем использовать приближение:
Ftrain≈6Nactive
Ftrain≈6Nactive
на токен.
Для нашей модели:
6⋅477 518 016≈2.865 GFLOP/токен
6⋅477518016≈2.865 GFLOP/токен
При длине последовательности 4096 восемь слоёв GQA также требуют дополнительных вычислений для причинного внимания. Их оценка составляет приблизительно 0,067 GFLOP на токен. Добавив стоимость внутриблочной обработки в GDN-2, получаем округлённую расчётную оценку:
Ftoken≈2.94 GFLOP
Ftoken≈2.94 GFLOP
Это приближение. Оно не заменяет реальный профиль вычислений и не учитывает заранее все возможные потери на маршрутизации и обмен данными.
Сценарии производительности
Самое важное неизвестное — сколько полезных TFLOPS сможет обеспечить весь тренировочный процесс, а не отдельный матричный оператор.
Поэтому ниже рассматриваем условные значения эффективной производительности, включающие потери на вычислениях, передаче весов и исполнении операций.
Эффективная производительность Токенов/с Токенов за 60 дней Время на 4 млрд токенов Время на 8 млрд токенов
1,5 TFLOPS 510 2,65 млрд 90,7 дня 181,4 дня
2,5 TFLOPS 851 4,41 млрд 54,4 дня 108,8 дня
3,5 TFLOPS 1191 6,17 млрд 38,9 дня 77,7 дня
4,5 TFLOPS 1531 7,94 млрд 30,2 дня 60,5 дня
Ни одно из этих значений пока не является измеренной скоростью Arka. Это сценарии, которые позволят оценить реализуемость проекта, когда мы сможем обосновать достижимую эффективную производительность.
Есть и дополнительное ограничение — PCIe.
При последовательной загрузке и обновлении всех параметров через RAM за одну группу токенов может потребоваться порядка 20 GB передачи данных: загрузка весов для прямого прохода, повторная загрузка для обратного прохода, запись обновлённых весов и чтение с записью состояния оптимизатора.
При условных 13 GB/s для PCIe Gen4 x8 такой объём соответствует примерно 1,5–1,6 секунды передачи. При 6,5 GB/s для Gen3 x8 — примерно 3,1 секунды. Это нижняя оценка без прочих накладных расходов.
Двойная буферизация может частично скрывать передачу за вычислениями, но конкретный результат пока неизвестен.
Временная таблица уже предполагает эффективную производительность всего процесса, поэтому эти секунды не следует механически прибавлять к ней. Это отдельная проверка правдоподобия выбранного сценария.
8. Сколько токенов нужно для осмысленного обучения?
Вот здесь необходимо различать техническую осуществимость и качество конечной модели.
Мы можем попытаться обучить модель на 4 млрд токенов, но само число параметров не гарантирует, что она станет хорошей языковой моделью.
Для нашей конфигурации получаются следующие соотношения:
Количество обучающих токенов Токенов на активный параметр
4 млрд 8,4
8 млрд 16,8
10 млрд 21,0
Эти значения — ориентиры для планирования, а не универсальный закон оптимального обучения MoE. Здесь ещё понадобится изучить специализированные scaling laws для разреженных моделей.
Моя предварительная рекомендация:
4 млрд токенов — первый серьёзный эксперимент, который должен подтвердить сходимость и способность модели осваивать данные.
8 млрд токенов — более содержательная цель для оценки качества с нуля.
Около 10 млрд токенов — дополнительный ориентир, который стоит рассмотреть после изучения законов масштабирования MoE.
При этом 4 млрд токенов не являются обещанием получить сильную модель. Это означает, что мы проверяем жизнеспособность всей концепции, а не гарантируем качество уровня существующих открытых моделей.
Для 8 млрд токенов при эффективных 2,5–3,5 TFLOPS расчётное время составляет примерно 109–78 дней. Если срок ограничен 60 днями, то в этих сценариях придётся начинать с меньшего бюджета либо находить способы повысить эффективную производительность.
9. Какие идеи пока не включаем
Я намеренно оставил несколько интересных направлений за пределами первой версии.
INT4. Потенциально он уменьшит расход памяти на веса и объём обмена данными. Но сначала нужно обосновать INT8-обучение; переход к INT4 должен опираться на подтверждённую устойчивость.
MTP — Multi-Token Prediction. Это потенциальный способ улучшить обучающий сигнал и, возможно, ускорить сходимость. Однако дополнительные головы тоже требуют параметров и вычислений, а увеличение числа предсказываемых токенов не означает автоматического ускорения в два или три раза.
Engram и другие модули памяти. DeepSeek предложил Engram как дополнительный механизм условного поиска, дополняющий разреженную вычислительную архитектуру. Это интересное направление для исследования, но оно добавляет ещё одну подсистему, для которой понадобится отдельный бюджет памяти и оценка пользы.
Рост глубины модели. Можно исследовать обучение меньшей модели с последующим увеличением числа слоёв. Но сначала нужно установить базовую архитектуру и бюджет, чтобы не смешивать эффект архитектуры с эффектом изменения размеров во время обучения.
Все эти идеи могут оказаться полезными. Просто пока у нас нет оснований одновременно включать их все и приписывать им суммарный выигрыш.
10. Что именно мы должны доказать до написания кода
На текущем этапе я считаю, что математическая концепция должна пройти пять проверок.
Проверка Что требуется установить
Архитектура Даёт ли гибрид GDN-2 + GQA с MoE преимущества перед более простыми альтернативами при сравнимой вычислительной стоимости?
Низкоточное обучение Позволяет ли прямое обновление INT8-весов со стохастическим округлением устойчиво обучать все параметры?
Оптимизатор Можно ли совместить такое обновление с квантованным состоянием Muon и AdamW без неприемлемой потери качества?
Память и передача данных Сходится ли полный бюджет RAM, VRAM, PCIe и временных буферов с реальными ограничениями оборудования?
Масштабирование Сколько токенов необходимо именно для нашей разреженной модели, чтобы получить полезный результат?
Первые четыре условия позволяют проверить, нет ли принципиального ресурсного или алгоритмического препятствия. Но они не дают математической гарантии качества конечной нейросети: для этого понадобятся эксперименты и сравнение кривых обучения.
Текущий статус концепции: предварительный расчёт памяти и вычислений не выявил очевидного противоречия, которое само по себе делало бы проект невозможным. Это хороший результат, но пока не доказательство сходимости INT8-обучения.
С чего начнём изучение arXiv
Я бы использовал три направления в качестве первых контрольных точек.
1. Direct Quantized Training of Language Models with Stochastic Rounding — непосредственное обучение низкоточных весов. Нам нужно разобраться в их алгоритме обновления, стохастическом округлении, масштабировании и границах экспериментальных результатов.
2. Effective Quantization of Muon Optimizer States — квантованное состояние оптимизатора. Здесь важно понять, как именно сокращается память состояния Muon и какие элементы алгоритма нельзя без последствий менять.
3. Gated DeltaNet-2 — математическая основа рекуррентной подсистемы. Нам потребуется проверить, какие свойства архитектуры критичны для эффективности и качества, а какие можно варьировать.
Затем будем добавлять статьи, которые ты пришлёшь, и сравнивать их с этой базовой концепцией.
Итак, на текущий момент наша рабочая гипотеза — Arka-MoE-4B-Q8: 3,95 млрд общих параметров, 477,5 млн активных параметров, 96 экспертов в каждом MoE-слое, GDN-2 + GQA и непосредственное низкоточное обновление весов с послойным исполнением.
Эту версию я предлагаю считать отправной точкой для научного анализа, а не окончательно утверждённой архитектурой. Теперь будем менять её только тогда, когда математический аргумент или результаты исследования покажут, что другой вариант лучше.
Pasted text.txt
TXT
Pasted text.txt
TXT
Сможешь продолжить диалог?
Да, продолжаю. Недостающая часть диалога, спецификация с точными цифрами, оборвалась на «Balancing the design». Поэтому я пересчитаю её заново скриптом, а числа из вставок буду считать заявлениями, пока их не подтвердит арифметика.
Created
arka_math.py
Finalized the calculations and prepared the response.
Подготовка скрипта с расчётами и выводов
Да, продолжаю. Последняя спецификация в диалоге оборвалась, поэтому я пересчитал всё скриптом arka_math.py и сверил результат с цифрами из вставленных текстов.
Главный вывод
Ограничивают проект вычисления, а не память. Размер «4B» можно уместить в RAM, но токенов за 60 дней выйдет примерно в 2 раза меньше, чем обещали прежние таблицы. На реалистичном сценарии (R = 2.5 TFLOPS) получается около 3–4B токенов за 60 дней, а не 8B.
Что сошлось с прежними числами и что нет
Сошлось: 5.936B параметров всего и 0.4747B активных (12.5×), 183.9M на слой, 68.5 TFLOP на шаг в Muon-NS, 47 ГБ PCIe-трафика на шаг при E=128, налог NS 34% / 17% / 11%.
Не сошлось:
Время. Прежняя таблица (805–1127 ток/с) считает только 6N-FLOPs. В ней не учтены пересчёт активаций (×4/3) и налог NS. Кроме того, 73 дня на 8B токенов там получены с учётом stacking, который не доказан.
RAM. Мои цифры на 3–4 ГиБ ниже прежних, и объяснить расхождение я не могу. Считайте мои числа нижней границей, а точное значение даст замер.
Спецификация v0: Arka-MoE
Параметры посчитаны точно:
Часть Параметров
GDN-слой (внимание) 5.272M
GQA-слой (внимание) 3.670M
Routed-эксперт (448×1024, SwiGLU) 1.376M
Shared-эксперт (896) 2.753M
Эмбеддинг (tied) 50.33M
Конфигурация: d=1024, 32 слоя (24 GDN + 8 GQA), top-4 из E экспертов, словарь 49 152, контекст 4096.
E Всего Активных на токен
32 1.705B 0.4716B
64 3.115B 0.4726B
80 3.820B 0.4731B
96 4.525B 0.4737B
128 5.936B 0.4747B
Затраты на токен: F6 = 6·N_act + внимание/GDN = 3.106 GFLOP, с пересчётом 4.14 GFLOP. Для сравнения, dense-3.93B стоит 23.58 GFLOP, то есть в 7.6 раза больше.
Три условия
1. Вычисления (главное ограничение). Время в днях при R = 2.5 TFLOPS (E=64, G=96k). Консервативный вариант включает пересчёт и налог NS, оптимистичный считает только 6N:
Токенов консервативно оптимистично
2B 42 д 29 д
3B 63 д 43 д
4B 83 д 57 д
8B 167 д 115 д
При R = 3.5 эти цифры падают примерно на 28%. Чтобы пройти 4B токенов за 60 дней, нужно 2.4 TFLOPS (оптимистично) или 3.8 TFLOPS (консервативно), а у тебя README даёт ≈2.5 на плотной 353M. MoE с узкими матмулами 448×1024 обычно эффективнее не будет.
Налог Muon (доля исполненных FLOPs): E=32 — 10%, E=64 при G=96k — 8.5%, E=128 при G=48k — 34%. Поэтому G нужно держать большим.
2. Память.
Бюджет RAM: 13.5 ГиБ в headless минус мои 2 ГиБ резерва = 11.5 ГиБ.
Граница слоёв стоит 64 КиБ на токен: 3.0 ГиБ при G=49k и 6.0 при G=98k.
PCIe не проблема: 15 ГБ загрузки на шаг занимают 1.2–2.4 с против шага ≈177 с.
VRAM-ledger: 3.4 ГиБ при E=32, 3.8 при E=64, 4.8 при E=128 (активации оценены ±30%).
Что помещается в 11.5 ГиБ:
Схема E=32 E=64 E=96
bf16-веса + int8-момент, G=48k 8.9 ✓ 13.1 ✗ ✗
int8-веса + int8-момент, G=48k 7.1 ✓ 9.9 ✓ 12.7 ✗