diff options
author | Volpeon <git@volpeon.ink> | 2023-04-13 07:14:24 +0200 |
---|---|---|
committer | Volpeon <git@volpeon.ink> | 2023-04-13 07:14:24 +0200 |
commit | a0b63ee7f4a8c793c0d200c86ef07677aa4cbf2e (patch) | |
tree | 6a695b2b5a73cebc35ff9e581c70f1a0e75b62e8 /training | |
parent | Experimental convnext discriminator support (diff) | |
download | textual-inversion-diff-a0b63ee7f4a8c793c0d200c86ef07677aa4cbf2e.tar.gz textual-inversion-diff-a0b63ee7f4a8c793c0d200c86ef07677aa4cbf2e.tar.bz2 textual-inversion-diff-a0b63ee7f4a8c793c0d200c86ef07677aa4cbf2e.zip |
Update
Diffstat (limited to 'training')
-rw-r--r-- | training/functional.py | 35 | ||||
-rw-r--r-- | training/strategy/dreambooth.py | 7 | ||||
-rw-r--r-- | training/strategy/lora.py | 6 | ||||
-rw-r--r-- | training/strategy/ti.py | 3 |
4 files changed, 22 insertions, 29 deletions
diff --git a/training/functional.py b/training/functional.py index be39776..ed8ae3a 100644 --- a/training/functional.py +++ b/training/functional.py | |||
@@ -168,8 +168,7 @@ def save_samples( | |||
168 | image_grid = pipeline.numpy_to_pil(image_grid.unsqueeze(0).permute(0, 2, 3, 1).numpy())[0] | 168 | image_grid = pipeline.numpy_to_pil(image_grid.unsqueeze(0).permute(0, 2, 3, 1).numpy())[0] |
169 | image_grid.save(file_path, quality=85) | 169 | image_grid.save(file_path, quality=85) |
170 | 170 | ||
171 | del generator | 171 | del generator, pipeline |
172 | del pipeline | ||
173 | 172 | ||
174 | if torch.cuda.is_available(): | 173 | if torch.cuda.is_available(): |
175 | torch.cuda.empty_cache() | 174 | torch.cuda.empty_cache() |
@@ -398,31 +397,32 @@ def loss_step( | |||
398 | else: | 397 | else: |
399 | raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}") | 398 | raise ValueError(f"Unknown prediction type {noise_scheduler.config.prediction_type}") |
400 | 399 | ||
401 | if disc is None: | 400 | acc = (model_pred == target).float().mean() |
402 | if guidance_scale == 0 and prior_loss_weight != 0: | ||
403 | # Chunk the noise and model_pred into two parts and compute the loss on each part separately. | ||
404 | model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0) | ||
405 | target, target_prior = torch.chunk(target, 2, dim=0) | ||
406 | 401 | ||
407 | # Compute instance loss | 402 | if guidance_scale == 0 and prior_loss_weight != 0: |
408 | loss = F.mse_loss(model_pred.float(), target.float(), reduction="none") | 403 | # Chunk the noise and model_pred into two parts and compute the loss on each part separately. |
404 | model_pred, model_pred_prior = torch.chunk(model_pred, 2, dim=0) | ||
405 | target, target_prior = torch.chunk(target, 2, dim=0) | ||
409 | 406 | ||
410 | # Compute prior loss | 407 | # Compute instance loss |
411 | prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction="none") | 408 | loss = F.mse_loss(model_pred.float(), target.float(), reduction="none") |
412 | 409 | ||
413 | # Add the prior loss to the instance loss. | 410 | # Compute prior loss |
414 | loss = loss + prior_loss_weight * prior_loss | 411 | prior_loss = F.mse_loss(model_pred_prior.float(), target_prior.float(), reduction="none") |
415 | else: | ||
416 | loss = F.mse_loss(model_pred.float(), target.float(), reduction="none") | ||
417 | 412 | ||
418 | loss = loss.mean([1, 2, 3]) | 413 | # Add the prior loss to the instance loss. |
414 | loss = loss + prior_loss_weight * prior_loss | ||
419 | else: | 415 | else: |
416 | loss = F.mse_loss(model_pred.float(), target.float(), reduction="none") | ||
417 | |||
418 | loss = loss.mean([1, 2, 3]) | ||
419 | |||
420 | if disc is not None: | ||
420 | rec_latent = get_original(noise_scheduler, model_pred, noisy_latents, timesteps) | 421 | rec_latent = get_original(noise_scheduler, model_pred, noisy_latents, timesteps) |
421 | rec_latent /= vae.config.scaling_factor | 422 | rec_latent /= vae.config.scaling_factor |
422 | rec_latent = rec_latent.to(dtype=vae.dtype) | 423 | rec_latent = rec_latent.to(dtype=vae.dtype) |
423 | rec = vae.decode(rec_latent).sample | 424 | rec = vae.decode(rec_latent).sample |
424 | loss = 1 - disc.get_score(rec) | 425 | loss = 1 - disc.get_score(rec) |
425 | del rec_latent, rec | ||
426 | 426 | ||
427 | if min_snr_gamma != 0: | 427 | if min_snr_gamma != 0: |
428 | snr = compute_snr(timesteps, noise_scheduler) | 428 | snr = compute_snr(timesteps, noise_scheduler) |
@@ -432,7 +432,6 @@ def loss_step( | |||
432 | loss *= mse_loss_weights | 432 | loss *= mse_loss_weights |
433 | 433 | ||
434 | loss = loss.mean() | 434 | loss = loss.mean() |
435 | acc = (model_pred == target).float().mean() | ||
436 | 435 | ||
437 | return loss, acc, bsz | 436 | return loss, acc, bsz |
438 | 437 | ||
diff --git a/training/strategy/dreambooth.py b/training/strategy/dreambooth.py index fa51bc7..4ae28b7 100644 --- a/training/strategy/dreambooth.py +++ b/training/strategy/dreambooth.py | |||
@@ -142,9 +142,7 @@ def dreambooth_strategy_callbacks( | |||
142 | ) | 142 | ) |
143 | pipeline.save_pretrained(checkpoint_output_dir) | 143 | pipeline.save_pretrained(checkpoint_output_dir) |
144 | 144 | ||
145 | del unet_ | 145 | del unet_, text_encoder_, pipeline |
146 | del text_encoder_ | ||
147 | del pipeline | ||
148 | 146 | ||
149 | if torch.cuda.is_available(): | 147 | if torch.cuda.is_available(): |
150 | torch.cuda.empty_cache() | 148 | torch.cuda.empty_cache() |
@@ -165,8 +163,7 @@ def dreambooth_strategy_callbacks( | |||
165 | unet_.to(dtype=orig_unet_dtype) | 163 | unet_.to(dtype=orig_unet_dtype) |
166 | text_encoder_.to(dtype=orig_text_encoder_dtype) | 164 | text_encoder_.to(dtype=orig_text_encoder_dtype) |
167 | 165 | ||
168 | del unet_ | 166 | del unet_, text_encoder_ |
169 | del text_encoder_ | ||
170 | 167 | ||
171 | if torch.cuda.is_available(): | 168 | if torch.cuda.is_available(): |
172 | torch.cuda.empty_cache() | 169 | torch.cuda.empty_cache() |
diff --git a/training/strategy/lora.py b/training/strategy/lora.py index 73ec8f2..1517ee8 100644 --- a/training/strategy/lora.py +++ b/training/strategy/lora.py | |||
@@ -140,8 +140,7 @@ def lora_strategy_callbacks( | |||
140 | with open(checkpoint_output_dir / "lora_config.json", "w") as f: | 140 | with open(checkpoint_output_dir / "lora_config.json", "w") as f: |
141 | json.dump(lora_config, f) | 141 | json.dump(lora_config, f) |
142 | 142 | ||
143 | del unet_ | 143 | del unet_, text_encoder_ |
144 | del text_encoder_ | ||
145 | 144 | ||
146 | if torch.cuda.is_available(): | 145 | if torch.cuda.is_available(): |
147 | torch.cuda.empty_cache() | 146 | torch.cuda.empty_cache() |
@@ -153,8 +152,7 @@ def lora_strategy_callbacks( | |||
153 | 152 | ||
154 | save_samples_(step=step, unet=unet_, text_encoder=text_encoder_) | 153 | save_samples_(step=step, unet=unet_, text_encoder=text_encoder_) |
155 | 154 | ||
156 | del unet_ | 155 | del unet_, text_encoder_ |
157 | del text_encoder_ | ||
158 | 156 | ||
159 | if torch.cuda.is_available(): | 157 | if torch.cuda.is_available(): |
160 | torch.cuda.empty_cache() | 158 | torch.cuda.empty_cache() |
diff --git a/training/strategy/ti.py b/training/strategy/ti.py index 08af89d..ca7cc3d 100644 --- a/training/strategy/ti.py +++ b/training/strategy/ti.py | |||
@@ -158,8 +158,7 @@ def textual_inversion_strategy_callbacks( | |||
158 | unet_.to(dtype=orig_unet_dtype) | 158 | unet_.to(dtype=orig_unet_dtype) |
159 | text_encoder_.to(dtype=orig_text_encoder_dtype) | 159 | text_encoder_.to(dtype=orig_text_encoder_dtype) |
160 | 160 | ||
161 | del unet_ | 161 | del unet_, text_encoder_ |
162 | del text_encoder_ | ||
163 | 162 | ||
164 | if torch.cuda.is_available(): | 163 | if torch.cuda.is_available(): |
165 | torch.cuda.empty_cache() | 164 | torch.cuda.empty_cache() |