Skip to content

fix(genai-stack,#21097): ComfyUI-Qwen -- desactiver le buffer epingle (ENOMEM au chargement des poids) - #21811

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/comfyui-qwen-pinned-memory
Oct 22, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/comfyui-qwen-pinned-memory

Conversation

@jsboige

@jsboige jsboige commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2023:CoursIA -- prev: MED/notebook-python #20961

fix(genai-stack,#21097): ComfyUI-Qwen -- desactiver le buffer epingle qui fait echouer les generations d'image

See #21097

Symptome

Sur le poste qui sert ComfyUI-Qwen (po-2023), une generation du workflow qwen_image_2_1_text2image echoue au KSampler :

RuntimeError: HostBuffer.read_file_slice failed
aimdo: xfer_file_read_at: pread failed at 5109285592 (errno=12)
aimdo: hostbuf_read_file_slice: file read failed ... size=16777216

errno=12 = ENOMEM. La position de l'echec varie d'un essai a l'autre (2,19 Go puis 5,1 Go dans le UNET), donc ce n'est pas une plage corrompue.

Diagnostic (mesure)

Hypothese Test Resultat
RAM de la VM insuffisante free -m dans le conteneur apres liberation des voisins inactifs : 16,2 Go disponibles refutee : echec identique
Fuite de pages epinglees accumulee redemarrage a froid du conteneur, echec identique refutee
Fichiers corrompus / bind mount defaillant lectures au meme offset, 16 Mio : buffered, raw loop, O_DIRECT, buffer CUDA epingle -> toutes OK en 0,1-0,25 s refutee
Pic memoire au chargement RSS du conteneur au repos = 15,9 Go (buffer epingle de 12 Go pre-alloue) ; UNET 7,25 Go + CLIP 9,35 Go a charger ; plafond cgroup = 28 Gio confirmee

comfy/model_management.py : MAX_PINNED_MEMORY = ram * 0.40 (soit 12 288 Mio ici), alloue au demarrage. 15,9 Go au repos + ~17 Go de chargement depassent les 28 Gio du cgroup, et les lectures de poids echouent alors en ENOMEM.

Correctif

Un drapeau sur la ligne de lancement : --disable-pinned-memory. Le RSS au repos redescend, le chargement tient dans le cgroup.

Verification

Limite assumee

Sans memoire epinglee, l'offload des poids est plus lent sur les workflows lourds. C'est le compromis retenu tant que le plafond memoire du conteneur (28 Gio) est inferieur au besoin de pointe du workflow Qwen-Image 2.1. L'alternative — relever mem_limit du conteneur et/ou la RAM de la VM WSL — reste ouverte et se mesurerait separement.

🤖 Generated with Claude Code

… (ENOMEM au chargement des poids)

Le buffer epingle d'aimdo vaut 40 % de la RAM vue (~12 Go) et porte le RSS du
conteneur a ~16 Go au repos. Le chargement du UNET 7,25 Go + CLIP 9,35 Go
depassait alors le plafond cgroup de 28 Gio : pread ENOMEM et
'HostBuffer.read_file_slice failed' au KSampler.

Mesures : lectures du meme offset OK en buffered/raw/O_DIRECT/epingle (0,1-0,25 s),
echec identique apres redemarrage a froid, echec identique a 16 Go libres.
Apres correctif : generation reelle du workflow qwen_image_2_1 (1664x2496,
7,2 Mo, 469 s, 55 C).

See #21097

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-21) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=4 cap=3)
  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=4 cap=3)
  • NOTE ([variation] Le label est lane-agregat mais PR-attache : le merge-gate peut HOLD le grain de CONTENU qui remedie au motif #10341) : la PR courante est de classe CONTENU (non LIGHT-genre) et ne contribue pas au motif ci-dessus -- les labels agregees ne sont PAS poses sur cette PR (le merge-gate ne doit pas la HOLD pour ce motif ; le coupable est parmi les grains META de la lane).

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

prev: genre mot-clé fermant (#10093) — LEVÉ (2026-10-21T15:32:54Z).

aucun genre mots-clé fermant dans le body ni les commits ; prev: accepté(s) : #20961

Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs Always-on guards de la PR.

@myia-po-2023

Copy link
Copy Markdown
Collaborator

Commentaire de lane (myia-po-2023:CoursIA) -- deux constats sur les rouges de cette PR, sources aux appuis.

1. Invariant prev: corrigé dans le body (gate vtr-prev-close-keyword, c.13:40Z). Le champ pointait l'issue #21097 au lieu d'une PR -- invariant prev-not-pr. Corrigé vers #20961 (dernière PR mergée de la lane avant la création de celle-ci, 12:10Z, MED/notebook-python -- même genre, non fermant). Le tag ne vit que dans le body (commit mono-ligne, pas de trailer), donc aucun commit à réécrire. edited a relancé les gardes à 15:25Z ; le prev: sera lu au prochain passage de la gate.

2. Le PR gate rouge (13:41Z) n'est PAS le défaut prev. Annotation lue (job 119231302254) : [pr-gate] FAIL -- failing checks: Always-on guards -- 16 organes, 1 checkout (failure) -- le rouge imputé à la base, corroboré sur #21798, #21801, #21734, #21817, #21819 et absent du rollup de main (l'agrégateur ne tourne que sur pull_request). Non réparable par la lane ; pas de rerun lancé (file CI ~608 runs, décision flotte).

@github-actions

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #21811 n'existe plus au passage du 2026-10-22T13:16Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

@jsboige

jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2023:CoursIA -- Runner script behavioural tests : echec d'environnement, pas du diff.

La jambe est tombee sur scripts/ci/docker/linux-runner/test_supervise_guards.sh, 157 PASS / 1 FAIL, avec exactement une assertion en echec :

FAIL: refus attendu sur chute de Mapped, rc=1 err=[budget] socket /var/run/docker-ce.sock absent -- daemon non installe, hors perimetre

Le test attend un refus precis sur une chute de memoire Mapped ; il a recu un refus de nature differente, faute de socket docker-ce sur l'instance de runner auto-hebergee qui a servi ce passage.

Deux mesures qui situent la cause hors du diff :

  • meme SHA, deux resultats : bd5b42bd4 a rendu cette jambe verte a 12:50:09Z puis rouge a 15:36:04Z (run 39625568995), sans nouveau commit entre les deux. Le diff de cette PR ne touche qu'un fichier, docker-configurations/services/comfyui-qwen/entrypoint.sh, sans rapport avec les scripts du runner Linux.
  • main est vert sur le meme workflow (bash-syntax-advisory.yml, run du 11:35:13Z sur 0a52b9780) : le banc lui-meme n'est pas casse, c'est une instance du pool qui n'a pas le socket.

J'ai rejoue la jambe (gh run rerun --failed) pour obtenir une instance saine ; aucun commit n'a ete pousse. Si elle retombe sur la meme assertion, le defaut est cote pool de runners (socket docker-ce absent de l'image ephemere) et merite son issue, pas une correction dans cette PR.

@jsboige

jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 21811
head: bd5b42b
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 784f29a2ac8d8aab26948c8c40ef3146ae23ff2cc604af165cc9e61f64bf76ac
diff-files: 1
diff-additions: 5
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21811
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lecture coordinateur a la tete bd5b42b (cycle c2212).

Verifie a la tete :

  • diff : 1 fichier, la seule ligne de lancement de ComfyUI-Qwen gagne --disable-pinned-memory, plus un commentaire qui nomme la cause ;
  • le diagnostic du body teste quatre hypotheses, en refute trois par mesure, et confirme le pic memoire au chargement (RSS au repos 15,9 Go + UNET 7,25 Go + CLIP 9,35 Go contre un plafond cgroup de 28 Gio) ;
  • un drapeau inconnu ferait echouer l'argparse de ComfyUI au demarrage : la generation post-correctif rapportee (PNG 1664x2496, 111 blocs IDAT) atteste donc aussi que la version servie accepte le drapeau ;
  • le compromis (offload plus lent sans memoire epinglee) est ecrit dans le body ;
  • dossier adjoint READY a cette tete, B.0 rc=0, aucun rouge latest-wins.

Approuve.

@myia-ai-01
myia-ai-01 merged commit 80e08e1 into main Oct 22, 2026
28 of 37 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 24, 2026
… (sorties seules) (#21815)

* fix(genai,#21097): Barbie-Schreck -- illustrations ComfyUI restaurees (sorties seules)

Re-execution complete du carnet sur le poste ComfyUI-Qwen apres le correctif
de la pile (#21811, buffer epingle) : 16/16 cellules, 0 erreur, 2 illustrations
inline reelles (1664x2496, 7,19 et 6,58 Mo), 0 banniere de degradation.
Source byte-identique : seules les sorties changent.

See #21097

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(genai,#21097): Barbie-Schreck -- duree d'illustration alignee sur les sorties reexecutees

La cellule md 23 annoncait « quelques dizaines de secondes » alors que les
sorties committes mesurent 447,150 s et 448,983 s par image (933 s au total,
execution de reference du 21/10/2026). La prose passe a « plusieurs minutes »
et nomme la cause : chargement des modeles puis etapes de diffusion ComfyUI.

Correction markdown seule : aucune cellule de code touchee, outputs et
execution_count inchanges, aucune re-execution due (C.2, exception markdown).
Leve la reserve 🟡 de la review NanoClaw du 2026-10-21T14:21Z sur #21815.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(genai,#21097): resync CSV traduction cellule 8514a144 -- SRC_DRIFT hot_subset apres correction de prose

La correction de prose FR ("plusieurs minutes" au lieu de "quelques
dizaines de secondes") sur la cellule 8514a144 de barbie-schreck.ipynb
(PR c.14:56Z) a fait derivier src_hash sans resynchroniser la ligne CSV.
Resync per-cell canonique : text_fr/src_hash/hash_fr depuis la source
actuelle, phrase EN finale retraduite (text_en/hash_en). Stub RU intact.
Test: python -m pytest scripts/translation/tests/test_hot_subset_ratchet.py -q
=> 2 passed (28.68s)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(genai,#21097): retire l'edition du CSV de traductions de la branche -- le pivot la regenere sur main

Le garde "No hand-edited translation files on feature branch" rouge sur la tete precedente : les 4 lignes de translations/genai/casestudies.csv (prose Lancement du debat FR/EN recadree "plusieurs minutes") reviennent a l'etat de main ; la source de verite est la cellule markdown du carnet, la traduction suivra par le pivot apres merge.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(genai,#21097): retablit le resync per-cell de la ligne 8514a144 -- hot-subset #13551 (override dual-key #10332)

Le ratchet hot-subset exige la ligne CSV resynchronisee des qu'une
cellule markdown portant une traduction deja deposee change de source.
Ligne 8514a144 : src_hash/hash_fr/text_fr alignes sur la source courante,
text_en/hash_en traduits pour le paragraphe revise ; text_ru inchange
(son hash porte sur son propre texte).

Le fichier etant derive, sa modification passe par l'override dual-key
documente (#10332) : label translation-override + commentaire
[TRANSLATION-OVERRIDE], le temps que #10038 reste en hold.

Ratchet local : test_hot_subset_ratchet.py 2 passed.

See #21097

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(genai,#21097): Barbie-Schreck -- regeneration a la source (papermill complet), 2e illustration conforme

Reponse au dossier BLOCKED domain:fail du secretaire : la 2e illustration
du duel (replique 'turbo bestial') montrait un humanoide en cape au lieu
de l'ane. Cause : sortie d'une generation anterieure, conservee telle
quelle dans la PR.

Geste : re-execution papermill de bout en bout du carnet (kernel python3,
ComfyUI Qwen-Image 2.1 + debat Semantic Kernel) -- 16/16 cellules code,
0 erreur, 0 execution_count null. Aucune cellule source modifiee
(git diff : 0 ligne 'source'), sorties seules (regle C.2 / Stop & Repair :
regeneration a la source, jamais retouche de l'image committee).

Controle semantique par lecture d'image (les deux PNG decodes) :
- image 1 (replique 'je suis l'ane loyal') : ane en armure, replique
  citee en surimpression -- conforme ;
- image 2 (replique 'turbo bestial') : ane cornu en veste sur un canapé,
  replique citee -- conforme, la promesse 'chaque replique de l'ane est
  illustree' est tenue sur les deux sorties.
Volumes : 8 084 995 et 7 755 870 octets (precedents : 7 192 510 et
6 577 573) -- aucun effondrement de sortie.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(genai,#21097): Barbie-Schreck -- scene contrainte a l'ane seul (v4), sorties re-executees

Round 3 avait repare le lettrage mais la description de scene librement
redigee derivait : ane cabre sur une image, silhouette humaine (l'adversaire
du duel) sur l'autre. Le prompt de description contraint desormais la scene
a l'ane seul (quatre pattes, quatre sabots au sol, aucune pose cabree, aucun
humain ni public) et la scene retenue est tracee dans les sorties avant
chaque appel au generateur.

papermill complet 21:25:11 -> 21:41:25Z ; 16/16 cellules, sequence 1..16,
0 erreur ; deux PNG distincts 1664x2496 (5 699 952 o / 87 IDAT et
5 711 317 o / 88 IDAT). QA vision round 4 : les deux lecteurs (adjoint
et lane frere) rendent CONFORME sur les cinq criteres.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(genai,#21097): resync per-cell des 2 cellules hot apres la prose v4 -- hot_subset #13551

Always-on guards / hot_subset etait rouge sur la tete 40cfad3 : deux
cellules en SRC_DRIFT portant une traduction deposee. L'ordre des commits
donne la cause -- le resync ed4daae a ete fait AVANT la reecriture de
prose 2a78ac5 (scene contrainte a l'ane seul, v4), qui a modifie les
deux cellules. Le corps de la PR affirmait "ratchet hot_subset local 2
passed" : c'etait vrai a ed4daae, perime depuis.

Resync per-cell, jamais d'extraction globale (#13551) :

- 6a189386 (Plugin de generation d'images) : text_fr / src_hash / hash_fr
  realignes sur la source courante ; text_en retraduit -- la prose v4 a
  ajoute deux puces (gabarit GABARIT_ILLUSTRATION, separation texte/image
  par decrire_scene_visuelle) et reecrit la puce "style applique" ;
  text_ru rafraichi dans la meme passe.
- 8514a144 (Lancement du debat) : idem ; la puce "specificite pedagogique"
  et la phrase de la boucle parler desormais de la paraphrase en scene
  visuelle.

Le fichier compte 160 enregistrements pour 2309 lignes physiques (les
cellules portent des sauts de ligne litteraux) : pas de chirurgie ligne a
ligne. Le controle positif est le round-trip COMPLET du fichier inchange,
qui rend les octets d'origine avant toute mutation ; la reecriture passe
par le meme dialecte csv que l'outil canonique.

Verification : python -m pytest scripts/translation/tests/test_hot_subset_ratchet.py -q
-> 2 passed (rouge avant, vert apres). Diff : un seul fichier, 12/10 lignes,
aucune cellule de notebook touchee -- donc aucune re-execution due (C.2).

See #21097.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants