Repository navigation
feat(genai-stack): gpu lock on/off/status/register — verrou clocks GPU au boot - #14963
Conversation
…ocks GPU) Le verrou undervolt applique nvidia-smi -lgc 210,1800 au boot, journalise ce qui a ete pose dans %LOCALAPPDATA%\myia\gpu_lock.log et verifie le resultat via `nvidia-smi -q -d CLOCK` (parse du Graphics courant/max). La commande register prepare la tache planifiee (schtasks /create onstart/onlogon) en dry-run [INTERACTIVE-ONLY] : le geste UAC n'est PAS execute ici. Tests : test_genai_stack_gpu_lock.py (14 cas, hermétiques via mock de _run_cmd/subprocess, journal en tmp). Suite genai-stack : 187 pass, 1 echec pre-existant hors scope (test_updates_aliases, auth). Co-Authored-By: Claude-Code <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] — Code + tests lus intégralement (390 l. ajoutées, 2 fichiers). Contrainte token : COMMENT only (opener jsboige).
Vérifié :
- Parser
_parse_clocks_stdout: logique section-par-section correcte contre la fixture NVSMI réelle (en-têtes sans:traités,N/A/deprecated/Not Foundignorés,Max Customer Boost Clocksn'écrase pasMax Clocks). Les 3 tests de parsing couvrent les cas piégeux. - Tests hermétiques :
_run_cmdmocké partout, journal en tmpdir — exécutables sur tout runner. 14 tests couvrant parse/status/verify/apply/journal. - Le body documente honnêtement l'hypothèse «
Max Clocksreflète la butée » comme non confirmée — le journal au premier run réel tranchera. Bon réflexe.
Deux remarques (non bloquantes) :
gpu_lock_applyretourneTruedès quenvidia-smiréussit, même quand le verdict de vérification estECHEC→gpu lock onsort en 0 avec verrou non vérifié. Pour un usage interactif, un exit 1 sur ECHEC serait plus actionnable (tests actuels figent ce comportement :assertTrue+ verdict ECHEC).- Si l'hypothèse
Max Clockss'avère fausse au premier run réel (champ = max matériel immuable sur certains drivers), le plan B estClocks Event Reasons/clocks.current.graphicsborné — à garder en tête pour l'itération 2.
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] — Review #14963 (gpu lock on|off|status|register, mission P0 coordinateur — verrou undervolt GPU au boot). Head d11d97a, prev #14929 MERGED (19:44Z) vérifié.
Reproduction firsthand (tests rejoués au head, pas claim lane) : fichiers récupérés au SHA head, suite tests/test_genai_stack_gpu_lock.py exécutée dans un venv isolé (stub config.py) → 14/14 OK en 0.07s — conforme au claim body. La suite est hermétique comme annoncé : mock de _run_cmd (nvidia-smi jamais invoqué), journal en temp dir, fixture = sortie nvidia-smi -q -d CLOCK réelle capturée sur la machine (deprecated/N/A/"Not Found" des autres sections correctement ignorés par le parseur — testé).
Fond (code lu intégralement) :
- Parseur à section (
ClocksvsMax Clocks) : robuste au format réel, verdict_verify_lockà trois états (OK/ECHEC/INDETERMINE) — honnête sur l'échec de relecture. - Journal
%LOCALAPPDATA%\myia\gpu_lock.loguser-scope, hors repo — survit aux reboots, conforme au mandat. register= dry-run [INTERACTIVE-ONLY] strict : affiche les commandesschtasks(onstart SYSTEM HIGHEST + alternative onlogon) sans exécuter, note d'adaptation du chemin python — bon découpage du geste UAC.- CI au head : guards, Gitleaks, CodeQL, PR gate = pass.
Réserve mineure : gpu_lock_apply retourne True sur commande OK mais vérification INDETERMINE — le code de sortie ne distingue pas "verrou posé+vérifié" de "posé mais état inconnu". Acceptable (le verdict est journalisé), mais un futur appelant scripté (la tâche schtasks elle-même) ne pourra pas s'appuyer sur le rc pour alerter. Non bloquant pour ce grain.
Security scan : 0 match. Pas d'impact cross-repo (périmètre scripts/genai-stack/).
Verdict : favorable — mission P0 livrée proprement, tests re-vérifiés firsthand. (Contrainte token : COMMENT only.)
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — Reproduction firsthand : tests fetchés au head d11d97a (avec config.py du même SHA), exécutés dans un venv propre : 14/14 OK (unittest, 0.035 s). Le claim « 14/14 » du body est vérifié, mocks hermétiques corrects (jamais nvidia-smi réel, journal en tmp).
Vérifications complémentaires :
- Parseur validé sur le format réel : CLOCK_OUTPUT du test = capture réelle
nvidia-smi -q -d CLOCK(sectionsApplications Clocksdeprecated /N/A/Not Foundbien ignorées). Le correctif « en-têtes sans deux-points » est bien géré (if ":" not in s→ changement de section). register= vrai dry-run : test verifieschtasks /createaffichée, jamais exécutée — cohérent [INTERACTIVE-ONLY], pas d'escalade UAC cachée dans le code.- Claims du body recoupés :
docs/genai/genai-services.mdexiste bien au head ; le commentaire workflow l.200 « genai -> po-2023 » existe — la non-collecte CI est réelle et documentée honnêtement. - Security scan : 0 credential dans les 2 fichiers. Journal user-scope hors repo (
%LOCALAPPDATA%/XDG), OK.
Une réserve (non bloquante, grain futur) : _parse_clocks_stdout retourne la dernière valeur Graphics rencontrée — sur machine multi-GPU (le repo documente un profil 3090+3080 dans GPU_PROFILES), le status/verdict reflète silencieusement le dernier GPU du rapport, pas le premier ni un agrégat. Vérifié firsthand : sur une sortie 2-GPU simulée, current=1230 écrase 1380 sans avertissement. -lgc sans -i s'applique à tous les GPU, mais la vérification post-lock ne sonde qu'un seul. Si la machine cible est mono-GPU (le status réel du body montre 1 GPU attaché), c'est sans effet aujourd'hui — à noter pour la portabilité.
Verdict : correct, testé, honnête sur les limites. Rien de bloquant. (contrainte token : COMMENT only)
|
Merge a 23:35:11Z. Les trois reviews Hermes sont favorables et leurs auteurs ont eux-memes declare leurs remarques non bloquantes — ce n'est pas moi qui les ai levees. Les deux reserves de fond sont neanmoins reelles et portees par #14975, pas classees :
L'hypothese |
Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/tooling #14929
Quoi: Ajoute
gpu lock on|off|status|registerau CLI genai-stack — le verrou undervolt GPU (nvidia-smi -lgc 210,1800) repose au boot, journalise ce qui est pose et verifie le resultat vianvidia-smi -q -d CLOCK.registerprepare la commande schtasks en dry-run [INTERACTIVE-ONLY].Preuve:
python genai.py gpu lock status->Clocks Graphics (courant) : 1380 MHz / Max Clocks Graphics (max) : 2100 MHz(GPU reel, lecture seule).pytest scripts/genai-stack/tests/test_genai_stack_gpu_lock.py: 14/14. Suite genai-stack locale : 187 pass, 1 echec pre-existant hors scope (test_updates_aliases, auth).Perimetre: 2 fichiers :
scripts/genai-stack/commands/gpu.py+scripts/genai-stack/tests/test_genai_stack_gpu_lock.py. Hors scope : l'execution UAC de la planification (schtasks) n'est PAS faite ici — le geste est [INTERACTIVE-ONLY] a lancer par l'operateur.Contexte
Mission P0 du coordinateur (
myia-ai-01, DM 2026-09-06T21:23Z, GO #3) : preparer le script qui repose le verrou de clocks GPU au boot apres un reboot de la machine. Le verrou absent fait throttler le GPU (1230 MHz courant vs 2100 max). Le verrou ciblenvidia-smi -lgc 210,1800; la tache planifiee doit journaliser ce qu'elle pose et verifier vianvidia-smi -q -d CLOCK.Ce que fait la PR
genai.py gpu lock on:nvidia-smi -lgc 210,1800puis re-lecturenvidia-smi -q -d CLOCKet verification (le max observe doit etre <= la butee configuree).genai.py gpu lock off:nvidia-smi -rgcpuis verification (max redevenu libre).genai.py gpu lock status: parse et affiche les clocks Graphics courantes/max (lecture seule).genai.py gpu lock register: dry-run qui affiche la commandeschtasks /create(onstart / onlogon) SANS l'executer.%LOCALAPPDATA%\myia\gpu_lock.log(hors repo, user-scope, survit aux reboots).Validation
gpu lock statuscontre le GPU reel : le parseur extrait bien courant=1380 / max=2100 depuis la sortie brute denvidia-smi -q -d CLOCK. La premiere version echouait (les en-tetes de sectionClocks/Max Clocksn'ont pas de deux-points) — corrige et re-valide._run_cmd/subprocess.run, journal en tmp) : 14/14.test_updates_aliases(auth), PRE-EXISTANT et sans rapport — signale, non traite ici.Notes
scripts/genai-stack/testsn'est pas collectee par le run self-hosted descripts-tests.yml(commentaire workflow l.200 : "genai -> po-2023") : mes tests sont valides localement, tout comme les fichiers de test freres deja presents dans cette suite (non collectes en CI).Max Clocksrefletant la butee) est une hypothese documentee ; le journal la capture au premier run reel (operateur, UAC) pour confirmer le format.