fishaudio/fish-speech · error · TypeError

Logger config must be a DictConfig!

Error message

Logger config must be a DictConfig!

What it means

instantiate_loggers mirrors the callbacks instantiator: the loggers config must be a DictConfig or a TypeError is raised. Each entry with a _target_ is instantiated via hydra.utils.instantiate.

Source

Thrown at fish_speech/utils/instantiators.py:43

    for _, cb_conf in callbacks_cfg.items():
        if isinstance(cb_conf, DictConfig) and "_target_" in cb_conf:
            log.info(f"Instantiating callback <{cb_conf._target_}>")
            callbacks.append(hydra.utils.instantiate(cb_conf))

    return callbacks


def instantiate_loggers(logger_cfg: DictConfig) -> List[Logger]:
    """Instantiates loggers from config."""

    logger: List[Logger] = []

    if not logger_cfg:
        log.warning("No logger configs found! Skipping...")
        return logger

    if not isinstance(logger_cfg, DictConfig):
        raise TypeError("Logger config must be a DictConfig!")

    for _, lg_conf in logger_cfg.items():
        if isinstance(lg_conf, DictConfig) and "_target_" in lg_conf:
            log.info(f"Instantiating logger <{lg_conf._target_}>")
            logger.append(hydra.utils.instantiate(lg_conf))

    return logger

View on GitHub (pinned to befe400174)

Solutions

  1. Keep the logger section as DictConfig (OmegaConf.create / OmegaConf.merge)
  2. Structure it as name -> {_target_: ...} pairs
  3. Set logger to null/empty to skip rather than passing a wrong-typed value
Defensive patterns

Strategy: type-guard

Validate before calling

from omegaconf import DictConfig, OmegaConf
if logger_cfg is not None and not isinstance(logger_cfg, DictConfig):
    logger_cfg = OmegaConf.create(logger_cfg)

Type guard

def is_dict_config(x):
    from omegaconf import DictConfig
    return x is None or isinstance(x, DictConfig)

Prevention

When it happens

Trigger: Calling train() with cfg.logger that is a plain python dict or list (e.g. WandbLogger/TensorBoard config after to_container conversion).

Common situations: Custom training scripts assembling the logger section from dicts; overriding logger configs programmatically; copying configs from tutorials that use dict literals.

Related errors


AI-assisted analysis of fishaudio/fish-speech@befe400174 (2026-08-27). Data as JSON: /api/errors/3cbcf0d5321dfc31. Report an issue: GitHub.