5. Environments¶
Systems that depend upon the runtime environment (e.g., GPUs, local file paths) can be configured with environment config.
5.1. Use @penv to declare environment variables.¶
from pconfigs import pconfig, pdefaults, penv
@penv(convention="uppercase")
class TrainerEnv:
world_size: int
rank: int
@pconfig
class TrainerConfig:
environment: TrainerEnv # Environments are always called 'environment'
print_frequency_steps: int
trainer_config = TrainerConfig(
print_frequency_steps=10,
)
$ python -m pconfigs.print pconfigs.examples.environments.main.trainer_config
RuntimeError: Environment value for 'world_size' is not set.
$ WORLD_SIZE=8 RANK=0 python -m pconfigs.print pconfigs.examples.environments.main.trainer_config
TrainerConfig(
environment=TrainerEnv( # ClassVar (omit from config)
WORLD_SIZE="8",
RANK="0",
),
print_frequency_steps=10,
)
5.2. Set default values for optional environment variables.¶
@penv(convention="uppercase")
class WithDefaultsTrainerEnv(TrainerEnv):
world_size: int = 1
rank: int = 0
@pconfig
class WithDefaultsTrainerConfig(TrainerConfig):
environment: WithDefaultsTrainerEnv # Environments are always called 'environment'
trainer_config = WithDefaultsTrainerConfig(
print_frequency_steps=10,
)
$ python -m pconfigs.print pconfigs.examples.environments.defaults.trainer_config
WithDefaultsTrainerConfig(
environment=WithDefaultsTrainerEnv( # ClassVar (omit from config)
WORLD_SIZE="1",
RANK="0",
),
print_frequency_steps=10,
)
5.3. Environment variable types are auto-cast.¶
from pconfigs import pconfiged
@pconfiged
class MyTrainer:
config: MyTrainerConfig
def is_root(self) -> bool:
return self.config.environment.rank == 0
@pconfig(constructs=MyTrainer)
class MyTrainerConfig(TrainerConfig):
pass
my_trainer_config = MyTrainerConfig(
print_frequency_steps=10,
)
my_trainer = my_trainer_config.construct()
print("Is root:", my_trainer.is_root())
$ RANK=0 WORLD_SIZE=8 python -m pconfigs.examples.environments.types
Is root: True
$ RANK=1 WORLD_SIZE=8 python -m pconfigs.examples.environments.types
Is root: False