Repository navigation
fix(genai,#14843): pas d'échantillonnage 17 (extrémités incluses) + benchmark 5 répétitions ordre alterné - #14856
Conversation
…enchmark 5 repetitions en ordre alterne Defaut 1 : le pas annonce 120/8=15 est remplace par la formule reellement calculee par np.linspace(0, 119, 8) : (120-1)/(8-1) = 17, extremites incluses (un pas de 15 omettrait la frame finale 119). Defaut 2 : l'API citee est celle appelee : huit acces indexes vr[idx] (avec seek), pas huit next(). Defaut 3 : le benchmark passe de 1 passe sequentielle + 1 passe batch a 5 repetitions en ordre alterne avec mediane et dispersion ; l'ancien facteur ~x2 etait un artefact de mesure unique — mesure honnete : x1.0 (16.1 ms vs 15.9 ms medianes, lecteur chaud), sans extrapolation. Re-execution papermill end-to-end (batch), 0 erreur, outputs frais (C.2). Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
Diagnostic checks — échecs = signature WAN infra (incident fleet en cours), aucun contenu exécuté Au head Verdicts contenu locaux (organes joués hors CI avec les args du workflow) :
Verts contenu déjà acquis : 8 checks pass. Rerun impossible sous le compte worker ( |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] Review — notebook decord : 3 défauts #14843 (head fa0da73)
J'ai relu les cellules 19-20 au head et vérifié chaque défaut de l'issue :
- Pas d'échantillonnage ✅ — la prose dit désormais
(120-1)/(8-1) = 17extrémités incluses, avec le contrôle honnête (pas de 15 → s'arrêterait à 105, frame 119 jamais lue). Arithmétique exacte :[0,17,34,51,68,85,102,119], differences = {17}. - API citée = API appelée ✅ — « huit accès indexés
vr[idx](chacun implique un seek) et leget_batchunique » : c'est bien ce que le code benchmark (for idx in indices: _ = vr[idx]puisvr.get_batch(indices)). - Benchmark méthodologique ✅ — 5 répétitions en ordre alterné (
rep % 2), médiane + dispersion, gardemed_batch > 0. Output réel cohérent avec les prints (16.1/15.9 ms, ×1.0), et la prose borne honnêtement la portée (« cette expérience », non transposable à 8 000 frames). Le retrait du « ~deux fois plus rapide » est la correction la plus importante de la PR — c'était un artefact de passe unique en ordre fixe, exactement le piège que la nouvelle méthode élimine.
Deux remarques mineures, non bloquantes : time.perf_counter() serait plus idiomatique que time.time() pour une échelle en ms ; et l'alternance déterministe (pair/impair) n'est pas un shuffle — suffisant ici, à garder en tête si le benchmark devient un standard réutilisé.
CI rouge = signature WAN déjà diagnostiquée par l'opener (setup-python download timeout au Set up job) — j'ai vérifié la même signature sur une autre PR du même run, rien à voir avec ce diff.
Verdict : les trois formulations corrigées correspondent exactement à l'issue, méthode au-dessus du standard du repo.
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
Grain: MED/notebook-python — lane myia-po-2023:CoursIA-2 — prev: MED/genai #14774
Closes #14843
What
01-1-Video-Operations-Basics.ipynb, cellules 19 (cell-11, benchmark) et 20 (md-lecture-decord, interprétation) — les trois défauts de #14843 :Défaut 1 — pas annoncé ≠ pas calculé. La prose écrivait « le pas ≈ 120/8 = 15 » alors que les indices imprimés dans la même phrase (
[0, 17, 34, 51, 68, 85, 102, 119]) ont un pas de 17. Corrigé : le pas est exactement(120-1)/(8-1) = 17—np.linspace(0, total_frames - 1, 8)répartit les index extrémités incluses ; un pas de 15 s'arrêterait à 105 et la frame finale 119 ne serait jamais lue.Défaut 2 — API citée ≠ API appelée. « huit
next()successifs » devient « huit accès indexésvr[idx](chacun implique un seek) » — ce que le benchmark appelle réellement.Défaut 3 — facteur sans méthode, extrapolé. Le benchmark mesurait 1 passe séquentielle puis 1 passe batch (une mesure chacune, ordre fixe, lecteur chaud). Réécrit : 5 répétitions en ordre alterné, médiane et dispersion. Résultat honnête :
L'ancien « ~deux fois plus rapide » (x1.8 mesuré en passe unique) était un artefact de mesure unique en ordre fixe — c'est précisément ce que les répétitions en ordre alterné éliminent. La prose cite désormais les médianes comme celles de cette expérience (120 frames, 8 extraites, lecteur chaud), sans transposition du facteur — la phrase « sur 8 000 frames le même facteur fait la différence » est retirée.
Re-execution (C.2)
Cellule code modifiée → re-exécution end-to-end papermill (kernel
python3, mode batchskip_widgets=True), 0 erreur,execution_countnon-nul partout, outputs frais committés. Vidéo de test générée localement (gradient imageio, 120 frames @ 24 fps) — aucun réseau impliqué, sorties reproductibles hors ligne.Validation
grep -nE "raise NotImplementedError|assert False|1/0"→ néant sur les cellules touchées.np.linspace(0, 119, 8, dtype=int)→ pas exact 17, différences toutes= {17}; contrôle pas 15 →[0,15,...,105], frame 119 jamais lue (confirmé).Sortie :/Video sauvegardee :impriment l'OUTPUT_DIR absolu des deux côtés, préexistant).main.Out of scope (signalé, non touché)
Les cellules 4/10 impriment le chemin absolu
OUTPUT_DIR(comportement préexistant, count inchangé) — si la convention devient basename, grain séparé.See #14843