Rate this Page

Loggers#

Logger classes for experiment tracking and visualization.

Loggers support an owner/client deployment model. The direct backend returns the logger itself from client(). Process and Ray backends return a picklable client that only exposes logging operations; lifecycle calls remain on the owner. Remote calls preserve direct-logger semantics: they return after the concrete logger method has run, propagate service-side errors immediately, and preserve custom log_* return values. Bounded transport queues provide backpressure when several clients log concurrently.

from torchrl.record import CSVLogger

logger = CSVLogger(
    exp_name="run",
    log_dir="logs",
    service_backend="process",
    service_backend_options={"max_queue_size": 256},
)
worker_logger = logger.client()
worker_logger.log_scalar("loss", 1.0, step=0)
logger.flush()  # Flush buffers owned by the concrete logging SDK.
logger.shutdown()

Logger(*args[, use_ray_service, ...])

A template for loggers.

ProcessLogger(logger_cls, *args[, ...])

Driver-owned logger service running in a dedicated process.

RayLogger(logger_cls, *args[, ...])

Driver-owned Ray logger service with restricted worker clients.

csv.CSVLogger(*args[, use_ray_service, ...])

A minimal-dependency CSV logger.

mlflow.MLFlowLogger(*args[, ...])

Wrapper for the mlflow logger.

tensorboard.TensorboardLogger(*args[, ...])

Wrapper for the Tensoarboard logger.

trackio.TrackioLogger(*args[, ...])

Wrapper for the trackio logger.

wandb.WandbLogger(*args[, use_ray_service, ...])

Wrapper for the wandb logger.

get_logger(logger_type, logger_name, ...[, ...])

Get a logger instance of the provided logger_type.

generate_exp_name(model_name, experiment_name)

Generates an ID (str) for the described experiment using UUID and current date.

Monitoring collectors and replay buffers#

Any collector or replay buffer exposes a cheap stats() / stats() snapshot of operational counters (frames collected, buffer size, write count, worker liveness, …). A LoggerMonitor periodically pulls those snapshots on a wall-clock or counter (Every) schedule, derives rates such as frames per second, and forwards namespaced metrics to any logger, without adding work to collection or sampling hot paths. This works with local, multiprocessing and Ray implementations alike.

from torchrl.record import WandbLogger
from torchrl.record.loggers.monitoring import Every, LoggerMonitor

logger = WandbLogger(exp_name="experiment", project="torchrl")

with LoggerMonitor(logger, poll_interval=1.0) as monitor:
    monitor.watch(collector, name="collector", schedule=Every.counter("frames", 10_000))
    monitor.watch(replay_buffer, name="replay_buffer", schedule=Every.seconds(5), step="write_count")
    collector.start()
    run_training()

monitoring.LoggerMonitor(logger, *[, ...])

A pull-based monitor logging operational statistics of collectors and replay buffers.

monitoring.Every(kind, interval[, key])

A logging schedule for LoggerMonitor.

Recording utils#

VideoRecorder(logger, tag[, in_keys, skip, ...])

Video Recorder transform.

TensorDictRecorder(out_file_base[, ...])

TensorDict recorder.

PixelRenderTransform([out_keys, preproc, ...])

A transform to call render on the parent environment and register the pixel observation in the tensordict.