OfflineEmissionsTracker silently returns a half-built object when construction fails

Aperta Adatta ai principianti
#1,311 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@davidberenstein1957 ci sta già lavorando.

Dal 12/8/2026.

  • #1334 di @davidberenstein1957 — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

Inizia in codecarbon/emissions_tracker.py, in OfflineEmissionsTracker.init, intorno alla riga 1312, quindi confrontalo con EmissionsTracker ed esamina BaseEmissionsTracker._set_from_conf intorno alle righe 138-140. Riproduci il caso di output_dir non valido e verifica che la costruzione sollevi un’eccezione, mentre la soppressione deliberata a runtime in start e stop rimane invariata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

When OfflineEmissionsTracker is constructed with an invalid configuration, no exception is raised. The constructor returns a partially initialised object, every subsequent call fails silently, and the run produces no emissions data at all. The online EmissionsTracker raises correctly for the same input, so the two constructors have opposite error semantics.

Reproduction

from codecarbon import OfflineEmissionsTracker

tracker = OfflineEmissionsTracker(country_iso_code="FRA", output_dir="/does/not/exist")
tracker.start()
# ... user workload ...
print(tracker.stop())   # None, and emissions.csv was never written

EmissionsTracker(output_dir="/does/not/exist") raises OSError: Folder ... does not exist ! as expected.

Root cause

OfflineEmissionsTracker.__init__ is decorated with @suppress(Exception) at codecarbon/emissions_tracker.py:1312. The validation in BaseEmissionsTracker._set_from_conf (codecarbon/emissions_tracker.py:138-140) raises OSError, but the decorator swallows it, so super().__init__ never reaches _initialize_runtime_state() / _initialize_scheduler_state() (codecarbon/emissions_tracker.py:603-604). The object then has no _start_time, _hardware, _scheduler or _output_handlers.

start() and stop() are also @suppress(Exception) (lines 692 and 886), so the resulting AttributeError: OfflineEmissionsTracker object has no attribute _start_time is downgraded to warnings as well. Under the CLI default log_level="error" (codecarbon/cli/main.py) nothing is printed at all.

suppress itself lives at codecarbon/core/util.py:21-30.

Expected vs actual

  • Expected: a misconfigured offline tracker raises at construction time, like the online tracker does.
  • Actual: construction succeeds, start()/stop() no-op with warnings, stop() returns None, and no emissions file is produced. Users reasonably conclude CodeCarbon does not work on their machine.

Suppressing exceptions in start/flush/stop is deliberate and should stay: CodeCarbon must never crash a training job at runtime. The decorator on the constructor is a different case, since failure there means the object invariants were never established.

Lingua principale
Python
Stelle
1.9k
Fork
351
Merge medio
3g 12h
PR unite (30g)
22

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di mlco2/codecarbon

Tutte le issue di mlco2/codecarbon

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.