Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@
"clone de `openai/guided-diffusion` (MIT) pour la définition de l'UNet + le checkpoint\n",
"`diffusion.pt` (sha256 vérifié) + le présent runner compact `disco_run.py`. Adaptation\n",
"documentée : le checkpointing réentrant historique de `guided_diffusion/nn.py` casse\n",
"l'autograd de torch 2.x — il est remplacé par le checkpoint natif non-réentrant (préservé dans l'outil local)."
"l'autograd de torch 2.x — il est remplacé par le checkpoint natif non-réentrant (préservé dans l'outil local).\n",
"Ce que ce choix d'hébergement implique pour le lecteur : sans le clone patché ni les 558 M paramètres, le carnet ne peut pas rejouer un rendu — il le dit lui-même dès l'attestation de la section suivante (« absent (affichage seul) »). Ce qui reste vérifiable sur n'importe quelle machine, en revanche, c'est tout ce que ce carnet mesure : les artefacts PNG, leurs logs de provenance, et les similarités CLIP et comptes de bits qui les lisent. La frontière est nette — l'exécution lourde est hors repo, les preuves sont dedans.\n"
]
},
{
Expand Down Expand Up @@ -153,6 +154,16 @@
"print(\"Artefacts:\", sorted(p.name for p in ASSETS.glob(\"*.png\")))"
]
},
{
"cell_type": "markdown",
"id": "cell-cf91959b",
"metadata": {},
"source": [
"**Attestation de chaîne**\n",
"\n",
"La sortie ci-dessus établit trois choses, chacune mesurée. L'**environnement d'exécution** d'abord : `torch 2.8.0+cu126` voit le GPU (`CUDA: True`) — le micro-run de la section suivante tournera donc sur le vrai moteur, pas sur des artefacts de substitution. La **présence du checkpoint** ensuite : `diffusion_512.pt present` — et le message alternatif du code, « absent (affichage seul) », dit comment le carnet dégrade sur une machine sans poids : en lecture documentée d'artefacts, jamais en exécution fictive. L'**inventaire** enfin : les PNG de `assets/disco` énumérés par la cellule couvrent toutes les figures qui suivent — le hero, les cellules de la grille, la comparaison moderne — chacune lue depuis le repo avec sa provenance datée.\n"
]
},
{
"cell_type": "markdown",
"id": "d3fc60a6",
Expand Down Expand Up @@ -231,6 +242,16 @@
"print(\"CLIP ViT-L/14 charge (resolution d'entree 224)\")"
]
},
{
"cell_type": "markdown",
"id": "cell-6bbfe2ac",
"metadata": {},
"source": [
"**Lecture : deux modèles, deux rôles**\n",
"\n",
"Le UNet chargé affiche **558 M paramètres**, sous `strict=True` : le checkpoint doit coller exactement à la déclaration d'architecture DD v5 ci-dessus — toute divergence de couche serait une erreur, pas un avertissement. Ce géant ne connaît que la statistique des images (finetune ImageNet, inconditionnel) : il débruite, il ne lit pas. En face, **CLIP ViT-L/14** annonce sa résolution d'entrée : 224. C'est lui qui sait lier texte et image — mais sur des entrées quatre fois plus petites que le 512×512 sur lequel le UNet travaille. Cette inadéquation d'échelle est la raison d'être des *cutouts* définis dans la section suivante : découper l'image en vues que le juge peut effectivement regarder. Retenir l'asymétrie des rôles : le gros moteur est piloté par la perte d'un modèle conçu pour juger, pas pour générer.\n"
]
},
{
"cell_type": "markdown",
"id": "bb50e1aa",
Expand Down Expand Up @@ -420,6 +441,17 @@
" \"normal a 3 pas d'un debut de trajectoire)\")"
]
},
{
"cell_type": "markdown",
"id": "cell-7267e587",
"metadata": {},
"source": [
"**Ce que trois pas prouvent — et ne prouvent pas**\n",
"\n",
"La cellule ci-dessus exécute la vraie boucle, mais raccourcie à `steps=3` et `cutn=(1, 2)` (contre 100 pas et des cutouts `(2, 8)` dans les runs officiels). Elle affiche `distance CLIP = 0.9830`, voisine de 1.0 — orthogonalité des embeddings, c'est-à-dire : du bruit. C'est le résultat attendu, et il dit exactement la portée de la preuve. Ce que le micro-run valide : la **mécanique** — gradients actifs à travers `eps`, estimation `pred_x0`, rétropropagation jusqu'à `x`, cutouts et normalisation CLIP, pas DDIM à η = 0 — s'exécute sur GPU sans erreur, avec le même moteur que les artefacts du repo. Ce qu'il ne préfigure pas : l'esthétique. À trois pas du début de trajectoire, ᾱ est minuscule, l'image est quasi totalement du bruit, et la loss CLIP sur du bruit est proche de son maximum ; la descente qui pliera le bruit vers le prompt demande ses 100 pas. La preuve de moteur se lit ici, la preuve de rendez-vous dans la section suivante.\n",
" Note de coût, avant de lire le chiffre : `cutn=(1, 2)` ne demande que trois vues CLIP par pas au lieu de dix, ce qui divise le temps du micro-run ; le budget de cutouts ne change pas la mécanique de la boucle, seulement le coût et la variance du gradient par pas.\n"
]
},
{
"cell_type": "markdown",
"id": "d1735ab8",
Expand Down Expand Up @@ -520,7 +552,9 @@
"Les deux curseurs typiques de DD. `clip_gs` : la force de l'attraction CLIP — trop bas, l'image\n",
"reste « générique ImageNet » ; trop haut, la guidance devient adversaire (textures granuleuses\n",
"extrêmes, dérive hors distribution). `sat_scale` : la pénalité de saturation (énergie hors\n",
"[-1, 1]), le correctif d'époque contre les excès de la guidance."
"[-1, 1]), le correctif d'époque contre les excès de la guidance.\n",
"\n",
"Le plan d'expérience de la grille : **quatre coins, pas un échantillon**. `clip_gs` 2000 (régime faible) contre 12000 (régime fort), croisés avec `sat_scale` 0 (sans pénalité) contre 2500 (avec). Prompt et graine fixés : seule la valeur des curseurs varie d'une cellule à l'autre — ce que l'œil leur attribue ne peut venir d'ailleurs.\n"
]
},
{
Expand Down Expand Up @@ -653,6 +687,11 @@
"tags": []
},
"source": [
"**De l'œil au nombre — et ce que le nombre peut mesurer**\n",
"\n",
"La grille se compare à l'œil ; la cellule ci-dessus demande à CLIP lui-même (ViT-L/14, pleine image redimensionnée en 512) de trancher. Deux précautions de lecture, visibles dans le code. D'abord, **le juge a participé à la production** : mesurer la similarité CLIP d'une image CLIP-guidée mesure d'abord la réussite de l'optimisation, pas une qualité indépendante — c'est pourquoi les ancres négatives de la sortie (chameau CLIPasso à +0.071, robot à +0.023, et typiquement 0.02-0.15 pour une image sans rapport au prompt) sont indispensables : elles fixent le plancher qu'une image simplement reconnaissable atteint déjà, et disent ce qu'un score élevé n'est pas. Ensuite, **pleine image n'est pas cutouts** : la loss optimisait des vues multiples et recadrées, la mesure ne voit que la vue globale — un régime différent du même juge.\n",
"\n",
"\n",
"Lecture mesurée (ViT-L/14, pleine image, graines identiques) : la similarité CLIP **croît\n",
"nettement avec `clip_gs`** — cos ≈ +0.12 à 2000, +0.32 à 5000 (hero), +0.33 à 12000 — et\n",
"`sat_scale` apporte un petit gain supplémentaire à forte guidance (+0.326 → +0.342). Sur cette\n",
Expand Down Expand Up @@ -794,6 +833,11 @@
"tags": []
},
"source": [
"**Ce que cette mesure peut — et ne peut pas — arbitrer**\n",
"\n",
"La figure ci-dessus montre deux images ; la cellule ci-dessus les réduit à un couple de nombres par image : cosinus CLIP et distance sphérique au même prompt. Ce couple peut trancher l'**alignement global** au texte. Il ne peut pas trancher la **structure fine** — fenêtres en nombre cohérent, arcs, cohérence locale — qui est précisément la différence visible entre les deux panneaux : la vue pleine image ne porte que l'échelle globale. Le verdict complet a donc deux jambes, et la seconde se lit dans les coûts ci-dessus : le run d'époque (100 pas, fp32, pixel 512) face au run latent (30 pas, encodeur de texte natif), avec leurs temps mesurés sur la même machine — et l'ordre de grandeur historique (1 à 3 heures sur Colab 2021) pour rappeler dans quel cadre cette mécanique a réellement été utilisée.\n",
"\n",
"\n",
"Ce que la comparaison rend visible — et le résultat le plus instructif est le **égalité** :\n",
"sur la métrique CLIP elle-même, les deux moteurs arrivent au même alignement (+0.318). La\n",
"différence d'époque n'est donc pas la *reconnaissabilité globale* — une loss CLIP savait déjà\n",
Expand All @@ -819,7 +863,13 @@
"tags": []
},
"source": [
"## Exercices"
"## Exercices\n",
"\n",
"Ce que chaque exercice mesure, pour le vérifier vous-même :\n",
"\n",
"1. **Un autre style d'époque** — un transfert de grammaire : la structure « a beautiful painting of … by …, trending on artstation » tient-elle pour un autre sujet ? Le verdict est un couple de nombres via `full_image_clip_dist`, pas une impression : si la grammaire est bien le levier, la composition monumentale doit suivre, et le score avec elle.\n",
"2. **L'arbitrage guidance / horloge** — `skip_frac` fixe `t_start = int(999·(1−skip_frac))` : la variable que vous tenez est le niveau de bruit auquel la guidance commence, et la grandeur mesurée reste la similarité au prompt. Skip petit : plus de pas à haut bruit, la composition a le temps de se former. Skip grand : la guidance arrive sur une structure déjà figée, et l'image garde l'empreinte du bruit initial.\n",
"3. **Quantifier le look** — l'hypothèse est adversative : la guidance forte fabrique de la texture. Si l'énergie de contour Sobel moyenne croît avec `clip_gs` à travers le hero et les quatre cellules de la grille, le « granuleux DD » a une signature numérique mesurable — et la grille offrant gs 2000 et 12000 à sat fixé, la corrélation est testable sur cinq points déjà produits.\n"
]
},
{
Expand Down
Loading