W&B Sweep Compatibility¶
Weights & Biases (wandb) is a popular platform for experiment tracking and hyperparameter optimization. Its sweep functionality allows you to define hyperparameter search spaces and automatically run experiments with different configurations.
Tyro works with wandb sweeps for most parameter types. There are some considerations when using sequence types like tuples or lists.
Sequence Arguments¶
By default, sequence arguments like tuple[int, int, int] or list[int] are parsed from multiple command-line values: --hidden-dims 128 128 128. However, wandb sweeps pass all parameter values as single strings.
For compatibility with wandb sweeps, use the tyro.conf.UsePythonSyntaxForLiteralCollections marker. This makes tyro expect Python literal syntax for collections (lists, tuples, dicts, sets):
from dataclasses import dataclass
import tyro
@dataclass
class Config:
hidden_dims: tuple[int, int, int] = (128, 128, 128)
learning_rate: float = 1e-3
if __name__ == "__main__":
config = tyro.cli(Config, config=(tyro.conf.UsePythonSyntaxForLiteralCollections,))
# Your training code here...
In your wandb sweep configuration, specify collection values using Python literal syntax:
parameters:
hidden_dims:
values: ["(128, 128, 128)", "(256, 256, 256)", "(512, 512, 512)"]
learning_rate:
values: [1e-3, 1e-4, 1e-5]
The marker applies to all collection types:
Tuples:
"(1, 2, 3)"Lists:
"[1, 2, 3]"Dicts:
"{'a': 1, 'b': 2}"Sets:
"{1, 2, 3}"
Collections can contain built-in types (int, str, float, bool, etc.)
and nested structures:
@dataclass
class Config:
# Built-in types work.
values: list[int] = [1, 2, 3]
# Nested structures work.
pairs: list[tuple[str, int]] = [("a", 1), ("b", 2)]
# Dictionaries work.
mapping: dict[str, list[int]] = {"x": [1, 2], "y": [3, 4]}
config = tyro.cli(Config, config=(tyro.conf.UsePythonSyntaxForLiteralCollections,))
# Usage: python script.py --values "[10, 20, 30]" --pairs "[('x', 5), ('y', 10)]"
Boolean Flags¶
Wandb sweeps work best with explicit --flag True/False syntax rather than tyro’s default --flag/--no-flag pairs. Use tyro.conf.FlagConversionOff in the config argument:
from dataclasses import dataclass
import tyro
@dataclass
class Config:
use_dropout: bool = False
learning_rate: float = 1e-3
if __name__ == "__main__":
config = tyro.cli(Config, config=(tyro.conf.FlagConversionOff,))
In your sweep configuration:
parameters:
use_dropout:
values: [True, False]
learning_rate:
values: [1e-3, 1e-4, 1e-5]
Complete Example¶
For a complete wandb sweeps setup with both sequence arguments and boolean flags, combine both markers:
from dataclasses import dataclass
import tyro
@dataclass
class Config:
hidden_dims: tuple[int, int, int] = (128, 128, 128)
use_dropout: bool = False
learning_rate: float = 1e-3
if __name__ == "__main__":
config = tyro.cli(
Config,
config=(
tyro.conf.UsePythonSyntaxForLiteralCollections,
tyro.conf.FlagConversionOff,
),
)
# Your training code here...
Corresponding sweep configuration:
parameters:
hidden_dims:
values: ["(128, 128, 128)", "(256, 256, 256)"]
use_dropout:
values: [True, False]
learning_rate:
values: [1e-3, 1e-4, 1e-5]
Additional Resources¶
wandb GitHub Issue #2939 - Discussion about list/tuple parameter handling in sweeps
Custom constructors - For advanced parameter parsing customization