Views
No views yet
fanta/ (код), train_fanta.py, scripts/ и т.д. Веса чекпоинтов выкладываются внутрь каталога fanta/, по пути:fanta/<пресет>/checkpoint-<шаг>/fanta/fanta-1b/checkpoint-1000/ (внутри — config.json, model*.safetensors и индекс при шардировании).Важно: ускорение за счёт linear attention. Каждый слой — гибрид полного внимания O(T²) и линейного внимания O(T) (feature mapelu + 1). За счёт линейной ветки длинные окна обрабатываются существенно быстрее и дешевле по памяти, а gate-механизм сам выбирает, где опираться на «точное» внимание, а где — на «длинное». Это ключевой элемент производительности FANTA на длинных последовательностях.
1flowchart TB
2 IN["Вход: окно B × T × F"]
3 STEM["Линейная проекция F → d_model, синусoidal PE, dropout"]
4 ENC["Стек из N блоков HybridAttentionBlock"]
5 FUS["LayerStackFusion: последние K слоёв → одно представление d_model"]
6 REG["Голова регрессии: следующий шаг по признакам"]
7 ERR["Абсолютная ошибка прогноза + скрытое состояние"]
8 ANOM["Cross-attention + MLP → логиты аномалии T−1"]
9 AUX["Опционально: aux-голова"]
10 IN --> STEM --> ENC --> FUS
11 FUS --> REG
12 FUS --> ERR --> ANOM
13 FUS --> AUXHybridAttentionBlock два параллельных пути над одним и тем же представлением после LayerNorm:elu + 1 и рекуррентной формы (KᵀV) по времени. Квадратичный рост не возникает, что критично при seq_len ≥ 512–1024 и глубоких стек-конфигурациях (fanta-5b+).sigmoid-gate от конкатенации [x, full, linear]: модель сама выбирает баланс между «точным» и «длинным» вниманием — в регионах, где важна глобальная связь, работает full attention, а общий поток по времени дешёво обрабатывает линейная ветка. Дальше — стандартный FFN (расширение dim_feedforward, GELU) с остатком.seq_len=512 и fanta-1b ветка linear заметно снижает время шага и потребление VRAM по сравнению с чистым full-attention вариантом эквивалентной ширины.LayerStackFusion: сначала линейная проекция из K·d в d, затем один слой multi-head self-attention по времени и небольшой FFN. Так фиксируется совместная информация нескольких глубин стека.| Компонент | Назначение |
|---|---|
| Регрессия | Линейный слой d_model → F: для шага t предсказывается наблюдение в t+1 (обучение — MSE с истинным следующим шагом). |
| Аномалия | По ошибке прогноза (модуль разности предсказания и правды) и скрытому состоянию строится пара key/value, MultiheadAttention с запросом из скрытого ряда, затем классификатор → логиты бинарной аномалии на T−1 позициях (BCE с метками). |
| Aux (опционально) | Дополнительный линейный выход и слабый штраф за стабильность представлений. |
anomaly_loss_weight на BCE по аномалиям + коэффициент на вспомогательную голову. Лоссы считаются в float32 для численной устойчивости при обучении в bf16.fanta-1b … fanta-8b задают ширину d_model, число слоёв N, голов и размер FFN (по порядку величины как у крупных языковых моделей). Конкретное число параметров зависит от F и конфигурации.curl -LsSf https://hf.co/cli/install.sh | bash1export HF_REPO_ID="Saintghetto17/FANTA" # замените на свой репозиторий
2mkdir -p fanta-hub && hf download "$HF_REPO_ID" --repo-type model --local-dir ./fanta-hub
3cd fanta-hub
4python3 -m venv .venv && source .venv/bin/activate
5pip install -U pip
6pip install -r requirements-fanta.txtPYTHONPATH, чтобы импортировался пакет fanta:export PYTHONPATH="$(pwd):${PYTHONPATH}"1git clone https://huggingface.co/Saintghetto17/FANTA fanta-hub
2cd fanta-hub
3git lfs pull
4pip install -r requirements-fanta.txt
5export PYTHONPATH="$(pwd):${PYTHONPATH}"hf download (путь к чекпоинту относительно корня репозитория):1from fanta.modeling_fanta import FantaForPredictionAndAnomaly
2
3ckpt = "fanta/fanta-1b/checkpoint-1000" # подставьте свой пресет и шаг
4model = FantaForPredictionAndAnomaly.from_pretrained(ckpt)
5model.eval()1REPO = "Saintghetto17/FANTA"
2SUB = "fanta/fanta-1b/checkpoint-1000"
3
4model = FantaForPredictionAndAnomaly.from_pretrained(
5 REPO,
6 subfolder=SUB,
7 trust_remote_code=True,
8)
9model.eval()trust_remote_code=True нужен, если класс модели подгружается с репозитория; при работе только из локальной копии с выставленным PYTHONPATH часто достаточно первого варианта.unified/ (Parquet), их в модельный репозиторий обычно не кладут — готовьте локально (скрипт unify_datasets.py в исходном проекте).1export PYTHONPATH="$(pwd):${PYTHONPATH}"
2python train_fanta.py --preset fanta-1b --train_glob "unified/*_train.parquet" --schema_json unified/schema.json./scripts/train.sh из корня скачанной копии.model.safetensors на ~8 ГБ неудобно заливать. Разделите веса 8 шардов с помощью скрипта (использует HF API, без ручной резки):1cd fanta-hub # или корень этого проекта
2export PYTHONPATH="$(pwd):${PYTHONPATH}"
3python3 scripts/reshard_checkpoint.py runs/checkpoint-5000 runs/checkpoint-5000-sharded --max_shard_size 1GBruns/checkpoint-5000-sharded/ будут:1config.json
2model-00001-of-00008.safetensors
3model-00002-of-00008.safetensors
4...
5model-00008-of-00008.safetensors
6model.safetensors.index.json1HF_REPO_ID=Saintghetto17/FANTA \
2./scripts/push_checkpoint_to_hf.sh runs/checkpoint-5000-sharded fanta/fanta-1b/checkpoint-5000model.safetensors.index.json и при загрузке автоматически собирают тензоры из всех шардов:1from fanta.modeling_fanta import FantaForPredictionAndAnomaly
2
3model = FantaForPredictionAndAnomaly.from_pretrained("fanta/fanta-1b/checkpoint-5000")
4model.eval()1hf download Saintghetto17/FANTA --repo-type model \
2 --include "fanta/fanta-1b/checkpoint-5000/*" \
3 --local-dir ./fanta-hubindex.json):1ls -lh fanta-hub/fanta/fanta-1b/checkpoint-5000/model-*.safetensors
2python3 -c "import json; j=json.load(open('fanta-hub/fanta/fanta-1b/checkpoint-5000/model.safetensors.index.json')); print('shards:', sorted(set(j['weight_map'].values())))"Если по какой-то причине у вас одинmodel.safetensorsи вы хотите получить шардированный вид (или наоборот), используйте тот жеreshard_checkpoint.py— он сохраняет в любой размер через HF API. «Склеивать» руками (cat) ничего не требуется.
scripts/push_to_hf.sh (код) и scripts/push_all_to_hf.sh (код + чекпоинты из runs/ в fanta/<пресет>/...).hf auth login.hf_transfer (Rust, многопоточный upload) — обычно самый простой прирост:1pip install 'huggingface_hub[hf_transfer]'
2export HF_HUB_ENABLE_HF_TRANSFER=1
3hf upload --repo-type model Saintghetto17/FANTA \
4 runs/checkpoint-5000-sharded \
5 fanta/fanta-1b/checkpoint-50001JOBS=4 HF_REPO_ID=Saintghetto17/FANTA \
2./scripts/push_checkpoint_parallel.sh \
3 runs/checkpoint-5000-sharded \
4 fanta/fanta-1b/checkpoint-5000JOBS (по умолчанию 4). Эта команда стартует независимые hf upload на каждый файл; каждый шард — отдельный коммит в репо.hf upload дозальёт недостающее (шарды небольшие, перезалить отдельный шард дёшево).