Instructions to use AiArtLab/ra with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use AiArtLab/ra with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("AiArtLab/ra", dtype=torch.bfloat16, device_map="cuda") prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" image = pipe(prompt).images[0] - Notebooks
- Google Colab
- Kaggle
Ra fp16 (step 460000)
Browse files- src/export.py +18 -55
- src/publish.py +2 -1
- src/sample.py +1 -1
- src/train.py +5 -3
- transformer/config.json +29 -136
src/export.py
CHANGED
|
@@ -37,8 +37,7 @@ def main():
|
|
| 37 |
save_file(tensors, str(out / "diffusion_pytorch_model.safetensors"))
|
| 38 |
|
| 39 |
ae_cfg = json.loads((ROOT / "vae" / "config.json").read_text())
|
| 40 |
-
ta = ck.get("args") or {}
|
| 41 |
-
graft = dict((k.strip(), int(v)) for k, v in (kv.split("=") for kv in (ta.get("graft") or "").split(",") if "=" in kv))
|
| 42 |
counts = {} # сколько блоков в каждом списке — по ключам тензоров
|
| 43 |
for k in ck["body"]:
|
| 44 |
g = k.split(".")[0]
|
|
@@ -47,76 +46,40 @@ def main():
|
|
| 47 |
if idx.isdigit():
|
| 48 |
counts.setdefault(g, set()).add(idx)
|
| 49 |
nblk = {g: len(v) for g, v in counts.items()}
|
| 50 |
-
|
| 51 |
-
"dataset": ta.get("hf_dataset") or ta.get("data") or "~/dataset/butterflies_256x64",
|
| 52 |
-
"parts": ta.get("parts"),
|
| 53 |
-
"size": ta.get("size"),
|
| 54 |
-
"steps": int(ck["step"]),
|
| 55 |
-
"batch": ta.get("batch", 8),
|
| 56 |
-
"accum": ta.get("accum", 1),
|
| 57 |
-
"lr": ta.get("lr", 1e-4),
|
| 58 |
-
"lr_tail": ta.get("lr_tail", 3e-5),
|
| 59 |
-
"drop_text": ta.get("drop_text", 0.1),
|
| 60 |
-
"init": ta.get("init"),
|
| 61 |
-
"metrics": args.metrics,
|
| 62 |
-
}
|
| 63 |
cfg = {
|
| 64 |
"_class_name": "UDiT",
|
| 65 |
-
"name": "Ra",
|
| 66 |
"format": "udm/v1",
|
| 67 |
-
"
|
| 68 |
-
"
|
| 69 |
-
|
| 70 |
-
"spatial_factor": ae_cfg["patch_size"],
|
| 71 |
-
"mean": ae_cfg["latent_mean"],
|
| 72 |
-
"std": ae_cfg["latent_std"],
|
| 73 |
-
"source": "vae/ (Muinez/f8c32-ae)",
|
| 74 |
-
},
|
| 75 |
-
"text": {
|
| 76 |
-
"encoder": "text_encoder/ (jhu-clsp/ettin-encoder-150m, 768-dim, 22 слоя)",
|
| 77 |
-
"max_len": 192,
|
| 78 |
-
"slices": [2, 5, 8, 11, 14, 17, 20],
|
| 79 |
-
"slice_blocks": 2,
|
| 80 |
-
"trainable": "text_mixer.*",
|
| 81 |
-
},
|
| 82 |
"body": {
|
| 83 |
"kind": "пирамидальный U: ширина растёт к низу",
|
| 84 |
-
"
|
|
|
|
| 85 |
"blocks": nblk,
|
| 86 |
"levels": [
|
| 87 |
-
{"level": 0, "tokens": "÷1", "width": 192,
|
| 88 |
-
"
|
| 89 |
-
{"level": 1, "tokens": "÷2", "width": 512, "blocks": "attn 5 enc / 4 dec"
|
| 90 |
-
{"level": 2, "tokens": "÷4", "width": 1024, "blocks": "attn 5 enc / 4 dec"
|
| 91 |
-
{"level": 3, "tokens": "÷8", "width": 1536, "blocks": "attn 4 (боттлнек)"
|
| 92 |
],
|
| 93 |
"skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
|
| 94 |
-
"down": "mean-pool
|
| 95 |
-
"up": "Linear + nearest
|
| 96 |
-
"rope": "
|
|
|
|
| 97 |
"parametrization": "x0 латента",
|
|
|
|
| 98 |
},
|
| 99 |
-
"tail": {
|
| 100 |
-
"source": "декодер AE, 6 блоков @512, PixelShuffle ×3",
|
| 101 |
-
"trained_as": "flow по пикселям, условие z0 + (ошибка тела).detach()",
|
| 102 |
-
"sample_steps": ta.get("tail_steps", 4),
|
| 103 |
-
},
|
| 104 |
-
"params": {
|
| 105 |
-
"body": round(sum(v.numel() for k, v in tensors.items() if k.startswith("body.")) / 1e6, 2),
|
| 106 |
-
"text_mixer": round(sum(v.numel() for k, v in tensors.items()
|
| 107 |
-
if k.startswith("text_mixer.")) / 1e6, 2),
|
| 108 |
-
"tail": round(sum(v.numel() for k, v in tensors.items() if k.startswith("tail.")) / 1e6, 2),
|
| 109 |
-
},
|
| 110 |
-
"training": {k: v for k, v in training.items() if v is not None},
|
| 111 |
-
"storage_dtype": "float16" if args.half else "float32",
|
| 112 |
}
|
| 113 |
-
cfg["params"]["total"] = round(sum(cfg["params"].values()), 2)
|
| 114 |
(out / "config.json").write_text(json.dumps(cfg, indent=2, ensure_ascii=False))
|
| 115 |
|
| 116 |
print(f"сохранено: {out}/diffusion_pytorch_model.safetensors "
|
| 117 |
f"({sum(v.numel() for v in tensors.values())/1e6:.1f}M параметров, "
|
| 118 |
f"{(out / 'diffusion_pytorch_model.safetensors').stat().st_size/1e6:.0f} МБ)")
|
| 119 |
-
print(f"
|
| 120 |
|
| 121 |
|
| 122 |
def load_exported(model, enc, ae, path, device=None):
|
|
|
|
| 37 |
save_file(tensors, str(out / "diffusion_pytorch_model.safetensors"))
|
| 38 |
|
| 39 |
ae_cfg = json.loads((ROOT / "vae" / "config.json").read_text())
|
| 40 |
+
ta = ck.get("args") or {}
|
|
|
|
| 41 |
counts = {} # сколько блоков в каждом списке — по ключам тензоров
|
| 42 |
for k in ck["body"]:
|
| 43 |
g = k.split(".")[0]
|
|
|
|
| 46 |
if idx.isdigit():
|
| 47 |
counts.setdefault(g, set()).add(idx)
|
| 48 |
nblk = {g: len(v) for g, v in counts.items()}
|
| 49 |
+
# конфиг описывает ТОЛЬКО тело; статистики латента — в vae/config.json, шаг — параметр запуска
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
cfg = {
|
| 51 |
"_class_name": "UDiT",
|
|
|
|
| 52 |
"format": "udm/v1",
|
| 53 |
+
"storage_dtype": "float16" if args.half else "float32",
|
| 54 |
+
"latent_channels": ae_cfg["latent_channels"],
|
| 55 |
+
"text_dim": ta.get("text_dim", 768),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
"body": {
|
| 57 |
"kind": "пирамидальный U: ширина растёт к низу",
|
| 58 |
+
"widths": [192, 512, 1024, 1536],
|
| 59 |
+
"heads": [6, 8, 8, 8],
|
| 60 |
"blocks": nblk,
|
| 61 |
"levels": [
|
| 62 |
+
{"level": 0, "tokens": "÷1", "width": 192,
|
| 63 |
+
"blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону"},
|
| 64 |
+
{"level": 1, "tokens": "÷2", "width": 512, "blocks": "attn 5 enc / 4 dec"},
|
| 65 |
+
{"level": 2, "tokens": "÷4", "width": 1024, "blocks": "attn 5 enc / 4 dec"},
|
| 66 |
+
{"level": 3, "tokens": "÷8", "width": 1536, "blocks": "attn 4 (боттлнек)"},
|
| 67 |
],
|
| 68 |
"skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
|
| 69 |
+
"down": "mean-pool 2x + Linear",
|
| 70 |
+
"up": "Linear + nearest 2x",
|
| 71 |
+
"rope": {"kind": "2d", "base": 100, "phase": "в латентных пикселях на каждом уровне"},
|
| 72 |
+
"text": "кросс-внимание на всех уровнях",
|
| 73 |
"parametrization": "x0 латента",
|
| 74 |
+
"params": round(sum(v.numel() for k, v in tensors.items() if k.startswith("body.")) / 1e6, 2),
|
| 75 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
}
|
|
|
|
| 77 |
(out / "config.json").write_text(json.dumps(cfg, indent=2, ensure_ascii=False))
|
| 78 |
|
| 79 |
print(f"сохранено: {out}/diffusion_pytorch_model.safetensors "
|
| 80 |
f"({sum(v.numel() for v in tensors.values())/1e6:.1f}M параметров, "
|
| 81 |
f"{(out / 'diffusion_pytorch_model.safetensors').stat().st_size/1e6:.0f} МБ)")
|
| 82 |
+
print(f"тело {cfg['body']['params']}M, блоки {nblk}")
|
| 83 |
|
| 84 |
|
| 85 |
def load_exported(model, enc, ae, path, device=None):
|
src/publish.py
CHANGED
|
@@ -50,6 +50,7 @@ def main():
|
|
| 50 |
ap.add_argument("--out", default=str(ROOT / "tmp" / "publish"))
|
| 51 |
ap.add_argument("--repo", default=REPO_ID)
|
| 52 |
ap.add_argument("--push", action="store_true", help="залить собранное на Hub (публичный репозиторий)")
|
|
|
|
| 53 |
args = ap.parse_args()
|
| 54 |
out = Path(args.out)
|
| 55 |
if out.exists():
|
|
@@ -90,7 +91,7 @@ def main():
|
|
| 90 |
api = HfApi()
|
| 91 |
api.create_repo(args.repo, repo_type="model", private=False, exist_ok=True)
|
| 92 |
api.upload_folder(folder_path=str(out), repo_id=args.repo, repo_type="model",
|
| 93 |
-
commit_message=f"Ra fp16 (step {
|
| 94 |
print(f"[push] https://huggingface.co/{args.repo}", flush=True)
|
| 95 |
|
| 96 |
|
|
|
|
| 50 |
ap.add_argument("--out", default=str(ROOT / "tmp" / "publish"))
|
| 51 |
ap.add_argument("--repo", default=REPO_ID)
|
| 52 |
ap.add_argument("--push", action="store_true", help="залить собранное на Hub (публичный репозиторий)")
|
| 53 |
+
ap.add_argument("--step", type=int, default=None, help="шаг чекпойнта — только для сообщения коммита")
|
| 54 |
args = ap.parse_args()
|
| 55 |
out = Path(args.out)
|
| 56 |
if out.exists():
|
|
|
|
| 91 |
api = HfApi()
|
| 92 |
api.create_repo(args.repo, repo_type="model", private=False, exist_ok=True)
|
| 93 |
api.upload_folder(folder_path=str(out), repo_id=args.repo, repo_type="model",
|
| 94 |
+
commit_message=(f"Ra fp16 (step {args.step})" if args.step else "Ra fp16 (weights)"))
|
| 95 |
print(f"[push] https://huggingface.co/{args.repo}", flush=True)
|
| 96 |
|
| 97 |
|
src/sample.py
CHANGED
|
@@ -51,7 +51,7 @@ def main():
|
|
| 51 |
ae.decoder.load_state_dict(sd["decoder"])
|
| 52 |
step = sd.get("step")
|
| 53 |
m.eval()
|
| 54 |
-
print(f"[model] {src}, шаг {step}", flush=True)
|
| 55 |
|
| 56 |
null_hs, null_mk = enc.slices([""], pad_to_len=args.text_len)
|
| 57 |
null_t = enc.mix(null_hs.float())
|
|
|
|
| 51 |
ae.decoder.load_state_dict(sd["decoder"])
|
| 52 |
step = sd.get("step")
|
| 53 |
m.eval()
|
| 54 |
+
print(f"[model] {src}" + (f", шаг {step}" if step else ""), flush=True)
|
| 55 |
|
| 56 |
null_hs, null_mk = enc.slices([""], pad_to_len=args.text_len)
|
| 57 |
null_t = enc.mix(null_hs.float())
|
src/train.py
CHANGED
|
@@ -174,6 +174,8 @@ def main():
|
|
| 174 |
ap.add_argument("--steps", type=int, default=None, help="бюджет в шагах (по умолчанию — до --target)")
|
| 175 |
ap.add_argument("--target", type=int, default=708000,
|
| 176 |
help="абсолютный шаг финиша, если не заданы --steps/--epochs")
|
|
|
|
|
|
|
| 177 |
ap.add_argument("--batch", type=int, default=16)
|
| 178 |
ap.add_argument("--accum", type=int, default=1, help="накопление: эффективный батч = batch*accum")
|
| 179 |
ap.add_argument("--probe", action="store_true", help="подобрать максимальный батч под память и выйти")
|
|
@@ -273,9 +275,9 @@ def main():
|
|
| 273 |
p = Path(args.init)
|
| 274 |
if p.is_dir():
|
| 275 |
from export import load_exported
|
| 276 |
-
|
| 277 |
-
start =
|
| 278 |
-
print(f"[init] папка {p}
|
| 279 |
else:
|
| 280 |
sd = torch.load(p, map_location=DEV)
|
| 281 |
n_take = load_body(sd["body"]); enc.mixer.load_state_dict(sd["mixer"])
|
|
|
|
| 174 |
ap.add_argument("--steps", type=int, default=None, help="бюджет в шагах (по умолчанию — до --target)")
|
| 175 |
ap.add_argument("--target", type=int, default=708000,
|
| 176 |
help="абсолютный шаг финиша, если не заданы --steps/--epochs")
|
| 177 |
+
ap.add_argument("--step", type=int, default=0,
|
| 178 |
+
help="стартовый шаг: от него считается остаток и расписание lr")
|
| 179 |
ap.add_argument("--batch", type=int, default=16)
|
| 180 |
ap.add_argument("--accum", type=int, default=1, help="накопление: эффективный батч = batch*accum")
|
| 181 |
ap.add_argument("--probe", action="store_true", help="подобрать максимальный батч под память и выйти")
|
|
|
|
| 275 |
p = Path(args.init)
|
| 276 |
if p.is_dir():
|
| 277 |
from export import load_exported
|
| 278 |
+
load_exported(m, enc, ae, p, DEV)
|
| 279 |
+
start = args.step # шаг — параметр запуска, не поле конфига
|
| 280 |
+
print(f"[init] папка {p}; старт шага {start} (--step)", flush=True)
|
| 281 |
else:
|
| 282 |
sd = torch.load(p, map_location=DEV)
|
| 283 |
n_take = load_body(sd["body"]); enc.mixer.load_state_dict(sd["mixer"])
|
transformer/config.json
CHANGED
|
@@ -1,107 +1,23 @@
|
|
| 1 |
{
|
| 2 |
"_class_name": "UDiT",
|
| 3 |
-
"name": "Ra",
|
| 4 |
"format": "udm/v1",
|
| 5 |
-
"
|
| 6 |
-
"
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
"
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
-1.58918,
|
| 16 |
-
-2.527523,
|
| 17 |
-
3.002302,
|
| 18 |
-
2.793705,
|
| 19 |
-
-2.091501,
|
| 20 |
-
-2.632896,
|
| 21 |
-
-3.59589,
|
| 22 |
-
-3.069669,
|
| 23 |
-
-4.568713,
|
| 24 |
-
3.26668,
|
| 25 |
-
-0.897648,
|
| 26 |
-
2.072541,
|
| 27 |
-
5.451158,
|
| 28 |
-
1.747871,
|
| 29 |
-
-2.113284,
|
| 30 |
-
2.03444,
|
| 31 |
-
-1.379274,
|
| 32 |
-
0.66369,
|
| 33 |
-
2.712183,
|
| 34 |
-
-0.111181,
|
| 35 |
-
6.054838,
|
| 36 |
-
1.235881,
|
| 37 |
-
-2.02777,
|
| 38 |
-
3.663243,
|
| 39 |
-
-2.454632,
|
| 40 |
-
1.141335,
|
| 41 |
-
1.786136
|
| 42 |
-
],
|
| 43 |
-
"std": [
|
| 44 |
-
1.030738,
|
| 45 |
-
0.951682,
|
| 46 |
-
1.079687,
|
| 47 |
-
0.957871,
|
| 48 |
-
1.198266,
|
| 49 |
-
1.102266,
|
| 50 |
-
1.213605,
|
| 51 |
-
0.947544,
|
| 52 |
-
1.085991,
|
| 53 |
-
1.093223,
|
| 54 |
-
0.9027,
|
| 55 |
-
1.010205,
|
| 56 |
-
0.920466,
|
| 57 |
-
1.044107,
|
| 58 |
-
1.023179,
|
| 59 |
-
0.992978,
|
| 60 |
-
0.991627,
|
| 61 |
-
1.073585,
|
| 62 |
-
1.114629,
|
| 63 |
-
1.056403,
|
| 64 |
-
1.093012,
|
| 65 |
-
1.015109,
|
| 66 |
-
1.007069,
|
| 67 |
-
0.976026,
|
| 68 |
-
0.982324,
|
| 69 |
-
1.093805,
|
| 70 |
-
1.036086,
|
| 71 |
-
1.005727,
|
| 72 |
-
1.104078,
|
| 73 |
-
1.042298,
|
| 74 |
-
1.095522,
|
| 75 |
-
0.960255
|
| 76 |
],
|
| 77 |
-
"
|
| 78 |
-
|
| 79 |
-
"text": {
|
| 80 |
-
"encoder": "text_encoder/ (jhu-clsp/ettin-encoder-150m, 768-dim, 22 слоя)",
|
| 81 |
-
"max_len": 192,
|
| 82 |
-
"slices": [
|
| 83 |
-
2,
|
| 84 |
-
5,
|
| 85 |
8,
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
17,
|
| 89 |
-
20
|
| 90 |
],
|
| 91 |
-
"slice_blocks": 2,
|
| 92 |
-
"trainable": "text_mixer.*"
|
| 93 |
-
},
|
| 94 |
-
"body": {
|
| 95 |
-
"kind": "пирамидальный U: ширина растёт к низу",
|
| 96 |
-
"graft": {
|
| 97 |
-
"e0x": 1,
|
| 98 |
-
"d0x": 1,
|
| 99 |
-
"e1": 1,
|
| 100 |
-
"d1": 1,
|
| 101 |
-
"e2": 2,
|
| 102 |
-
"d2": 2,
|
| 103 |
-
"e3": 2
|
| 104 |
-
},
|
| 105 |
"blocks": {
|
| 106 |
"e0": 6,
|
| 107 |
"e0x": 1,
|
|
@@ -118,60 +34,37 @@
|
|
| 118 |
"level": 0,
|
| 119 |
"tokens": "÷1",
|
| 120 |
"width": 192,
|
| 121 |
-
"blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону"
|
| 122 |
-
"text": "кросс-внимание в каждом conv-блоке и в self-attn"
|
| 123 |
},
|
| 124 |
{
|
| 125 |
"level": 1,
|
| 126 |
"tokens": "÷2",
|
| 127 |
"width": 512,
|
| 128 |
-
"blocks": "attn 5 enc / 4 dec"
|
| 129 |
-
"text": "кросс-внимание"
|
| 130 |
},
|
| 131 |
{
|
| 132 |
"level": 2,
|
| 133 |
"tokens": "÷4",
|
| 134 |
"width": 1024,
|
| 135 |
-
"blocks": "attn 5 enc / 4 dec"
|
| 136 |
-
"text": "кросс-внимание"
|
| 137 |
},
|
| 138 |
{
|
| 139 |
"level": 3,
|
| 140 |
"tokens": "÷8",
|
| 141 |
"width": 1536,
|
| 142 |
-
"blocks": "attn 4 (боттлнек)"
|
| 143 |
-
"text": "кросс-внимание"
|
| 144 |
}
|
| 145 |
],
|
| 146 |
"skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
|
| 147 |
-
"down": "mean-pool
|
| 148 |
-
"up": "Linear + nearest
|
| 149 |
-
"rope":
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
"
|
| 155 |
-
"
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
"body": 238.54,
|
| 159 |
-
"text_mixer": 10.04,
|
| 160 |
-
"tail": 23.87,
|
| 161 |
-
"total": 272.45
|
| 162 |
-
},
|
| 163 |
-
"training": {
|
| 164 |
-
"dataset": "LucasFang/FLUX-Reason-6M",
|
| 165 |
-
"parts": "Aesthetics-Part01,Aesthetics-Part02,Imaginative,Text",
|
| 166 |
-
"size": 256,
|
| 167 |
-
"steps": 460000,
|
| 168 |
-
"batch": 24,
|
| 169 |
-
"accum": 1,
|
| 170 |
-
"lr": 5e-05,
|
| 171 |
-
"lr_tail": 3e-05,
|
| 172 |
-
"drop_text": 0.1,
|
| 173 |
-
"init": "tmp/run/ckpt/step_0404000.pt",
|
| 174 |
-
"metrics": ""
|
| 175 |
-
},
|
| 176 |
-
"storage_dtype": "float16"
|
| 177 |
}
|
|
|
|
| 1 |
{
|
| 2 |
"_class_name": "UDiT",
|
|
|
|
| 3 |
"format": "udm/v1",
|
| 4 |
+
"storage_dtype": "float16",
|
| 5 |
+
"latent_channels": 32,
|
| 6 |
+
"text_dim": 768,
|
| 7 |
+
"body": {
|
| 8 |
+
"kind": "пирамидальный U: ширина растёт к низу",
|
| 9 |
+
"widths": [
|
| 10 |
+
192,
|
| 11 |
+
512,
|
| 12 |
+
1024,
|
| 13 |
+
1536
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
],
|
| 15 |
+
"heads": [
|
| 16 |
+
6,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
8,
|
| 18 |
+
8,
|
| 19 |
+
8
|
|
|
|
|
|
|
| 20 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
"blocks": {
|
| 22 |
"e0": 6,
|
| 23 |
"e0x": 1,
|
|
|
|
| 34 |
"level": 0,
|
| 35 |
"tokens": "÷1",
|
| 36 |
"width": 192,
|
| 37 |
+
"blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону"
|
|
|
|
| 38 |
},
|
| 39 |
{
|
| 40 |
"level": 1,
|
| 41 |
"tokens": "÷2",
|
| 42 |
"width": 512,
|
| 43 |
+
"blocks": "attn 5 enc / 4 dec"
|
|
|
|
| 44 |
},
|
| 45 |
{
|
| 46 |
"level": 2,
|
| 47 |
"tokens": "÷4",
|
| 48 |
"width": 1024,
|
| 49 |
+
"blocks": "attn 5 enc / 4 dec"
|
|
|
|
| 50 |
},
|
| 51 |
{
|
| 52 |
"level": 3,
|
| 53 |
"tokens": "÷8",
|
| 54 |
"width": 1536,
|
| 55 |
+
"blocks": "attn 4 (боттлнек)"
|
|
|
|
| 56 |
}
|
| 57 |
],
|
| 58 |
"skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
|
| 59 |
+
"down": "mean-pool 2x + Linear",
|
| 60 |
+
"up": "Linear + nearest 2x",
|
| 61 |
+
"rope": {
|
| 62 |
+
"kind": "2d",
|
| 63 |
+
"base": 100,
|
| 64 |
+
"phase": "в латентных пикселях на каждом уровне"
|
| 65 |
+
},
|
| 66 |
+
"text": "кросс-внимание на всех уровнях",
|
| 67 |
+
"parametrization": "x0 латента",
|
| 68 |
+
"params": 238.54
|
| 69 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
}
|