fix: use getattr for safe attribute access in argument verification

This commit is contained in:
umisetokikaze
2026-03-11 22:00:20 +09:00
parent e7f5be3934
commit c42ad076c6
8 changed files with 36 additions and 11 deletions

1
.codex-tmp/LECO Submodule

Submodule .codex-tmp/LECO added at a93cb46db4

1
.codex-tmp/ai-toolkit Submodule

Submodule .codex-tmp/ai-toolkit added at 35b1cde3cb

View File

@@ -62,7 +62,7 @@ def add_deepspeed_arguments(parser: argparse.ArgumentParser):
def prepare_deepspeed_args(args: argparse.Namespace):
if not args.deepspeed:
if not getattr(args, "deepspeed", False):
return
# To avoid RuntimeError: DataLoader worker exited unexpectedly with exit code 1.
@@ -70,7 +70,7 @@ def prepare_deepspeed_args(args: argparse.Namespace):
def prepare_deepspeed_plugin(args: argparse.Namespace):
if not args.deepspeed:
if not getattr(args, "deepspeed", False):
return None
try:

View File

@@ -4405,7 +4405,7 @@ def verify_command_line_training_args(args: argparse.Namespace):
def enable_high_vram(args: argparse.Namespace):
if args.highvram:
if getattr(args, "highvram", False):
logger.info("highvram is enabled / highvramが有効です")
global HIGH_VRAM
HIGH_VRAM = True
@@ -4418,10 +4418,10 @@ def verify_training_args(args: argparse.Namespace):
"""
enable_high_vram(args)
if args.v2 and args.clip_skip is not None:
if getattr(args, "v2", False) and getattr(args, "clip_skip", None) is not None:
logger.warning("v2 with clip_skip will be unexpected / v2でclip_skipを使用することは想定されていません")
if args.cache_latents_to_disk and not args.cache_latents:
if getattr(args, "cache_latents_to_disk", False) and not getattr(args, "cache_latents", False):
args.cache_latents = True
logger.warning(
"cache_latents_to_disk is enabled, so cache_latents is also enabled / cache_latents_to_diskが有効なため、cache_latentsを有効にします"
@@ -4440,32 +4440,32 @@ def verify_training_args(args: argparse.Namespace):
# "perlin_noise and multires_noise_iterations cannot be enabled at the same time / perlin_noiseとmultires_noise_iterationsを同時に有効にできません"
# )
if args.adaptive_noise_scale is not None and args.noise_offset is None:
if getattr(args, "adaptive_noise_scale", None) is not None and getattr(args, "noise_offset", None) is None:
raise ValueError("adaptive_noise_scale requires noise_offset / adaptive_noise_scaleを使用するにはnoise_offsetが必要です")
if args.scale_v_pred_loss_like_noise_pred and not args.v_parameterization:
if getattr(args, "scale_v_pred_loss_like_noise_pred", False) and not getattr(args, "v_parameterization", False):
raise ValueError(
"scale_v_pred_loss_like_noise_pred can be enabled only with v_parameterization / scale_v_pred_loss_like_noise_predはv_parameterizationが有効なときのみ有効にできます"
)
if args.v_pred_like_loss and args.v_parameterization:
if getattr(args, "v_pred_like_loss", None) and getattr(args, "v_parameterization", False):
raise ValueError(
"v_pred_like_loss cannot be enabled with v_parameterization / v_pred_like_lossはv_parameterizationが有効なときには有効にできません"
)
if args.zero_terminal_snr and not args.v_parameterization:
if getattr(args, "zero_terminal_snr", False) and not getattr(args, "v_parameterization", False):
logger.warning(
f"zero_terminal_snr is enabled, but v_parameterization is not enabled. training will be unexpected"
+ " / zero_terminal_snrが有効ですが、v_parameterizationが有効ではありません。学習結果は想定外になる可能性があります"
)
if args.sample_every_n_epochs is not None and args.sample_every_n_epochs <= 0:
if getattr(args, "sample_every_n_epochs", None) is not None and args.sample_every_n_epochs <= 0:
logger.warning(
"sample_every_n_epochs is less than or equal to 0, so it will be disabled / sample_every_n_epochsに0以下の値が指定されたため無効になります"
)
args.sample_every_n_epochs = None
if args.sample_every_n_steps is not None and args.sample_every_n_steps <= 0:
if getattr(args, "sample_every_n_steps", None) is not None and args.sample_every_n_steps <= 0:
logger.warning(
"sample_every_n_steps is less than or equal to 0, so it will be disabled / sample_every_n_stepsに0以下の値が指定されたため無効になります"
)

View File

@@ -42,6 +42,7 @@ def setup_parser() -> argparse.ArgumentParser:
train_util.add_sd_models_arguments(parser)
train_util.add_optimizer_arguments(parser)
train_util.add_training_arguments(parser, support_dreambooth=False)
custom_train_functions.add_custom_train_arguments(parser, support_weighted_captions=False)
sdxl_train_util.add_sdxl_training_arguments(parser, support_text_encoder_caching=False)
add_logging_arguments(parser)

View File

@@ -1,5 +1,16 @@
import sdxl_train_leco
from library import deepspeed_utils, sdxl_train_util, train_util
def test_syntax():
assert sdxl_train_leco is not None
def test_setup_parser_supports_shared_training_validation():
args = sdxl_train_leco.setup_parser().parse_args(["--prompts_file", "slider.yaml"])
train_util.verify_training_args(args)
sdxl_train_util.verify_sdxl_training_args(args, support_text_encoder_caching=False)
assert args.min_snr_gamma is None
assert deepspeed_utils.prepare_deepspeed_plugin(args) is None

View File

@@ -1,5 +1,15 @@
import train_leco
from library import deepspeed_utils, train_util
def test_syntax():
assert train_leco is not None
def test_setup_parser_supports_shared_training_validation():
args = train_leco.setup_parser().parse_args(["--prompts_file", "slider.yaml"])
train_util.verify_training_args(args)
assert args.min_snr_gamma is None
assert deepspeed_utils.prepare_deepspeed_plugin(args) is None

View File

@@ -40,6 +40,7 @@ def setup_parser() -> argparse.ArgumentParser:
train_util.add_sd_models_arguments(parser)
train_util.add_optimizer_arguments(parser)
train_util.add_training_arguments(parser, support_dreambooth=False)
custom_train_functions.add_custom_train_arguments(parser, support_weighted_captions=False)
add_logging_arguments(parser)
parser.add_argument(