Accelerate documentation
Kontrol Noktası Alma
Kontrol Noktası Alma
Bir PyTorch modelini Accelerate ile eğitirken, eğitim durumunu kaydetmeye ve kaldığınız yerden devam etmeye sıkça ihtiyaç duyabilirsiniz. Bunun için modelin, optimizasyoncunun, RNG üreteçlerinin ve GradScaler'ın kaydedilmesi ve yüklenmesi gerekir. Accelerate içinde bunu hızlı bir şekilde gerçekleştirmek için iki kolaylaştırıcı işlev bulunur:
- Yukarıda bahsedilen her şeyi bir klasör konumuna kaydetmek için save_state() kullanın
- Daha önceki bir
save_stateile kaydedilen her şeyi yüklemek için load_state() kullanın
save_state() ile durumların nerede ve nasıl kaydedileceğini daha da özelleştirmek için ProjectConfiguration sınıfı kullanılabilir. Örneğin, automatic_checkpoint_naming etkinleştirildiyse, her kaydedilen checkpoint Accelerator.project_dir/checkpoints/checkpoint_{checkpoint_number} konumunda bulunur.
Bu durumların aynı eğitim betiğinden geldiği varsayılmaktadır; iki ayrı betikten gelmemelidir.
- register_for_checkpointing() kullanarak, nesnenin
state_dictveload_state_dictişlevselliğine sahip olması koşuluyla, özel nesnelerin yukarıdaki iki fonksiyon tarafından otomatik olarak saklanmasını veya yüklenmesini sağlayabilirsiniz. Bu, bir öğrenme hızı zamanlayıcısı gibi nesneleri içerebilir.
Aşağıda, eğitim sırasında bir durumu kaydetmek ve yeniden yüklemek için checkpointing kullanan kısa bir örnek bulunmaktadır:
from accelerate import Accelerator
import torch
accelerator = Accelerator(project_dir="my/save/path")
my_scheduler = torch.optim.lr_scheduler.StepLR(my_optimizer, step_size=1, gamma=0.99)
my_model, my_optimizer, my_training_dataloader = accelerator.prepare(my_model, my_optimizer, my_training_dataloader)
# Register the LR scheduler
accelerator.register_for_checkpointing(my_scheduler)
# Save the starting state
accelerator.save_state()
device = accelerator.device
my_model.to(device)
# Perform training
for epoch in range(num_epochs):
for batch in my_training_dataloader:
my_optimizer.zero_grad()
inputs, targets = batch
inputs = inputs.to(device)
targets = targets.to(device)
outputs = my_model(inputs)
loss = my_loss_function(outputs, targets)
accelerator.backward(loss)
my_optimizer.step()
my_scheduler.step()
# Restore the previous state
accelerator.load_state("my/save/path/checkpointing/checkpoint_0")DataLoader durumunu geri yükleme
Kontrol noktasından devam ettikten sonra, durum bir epoch'un ortasında kaydedildiyse, aktif DataLoader'da belirli bir noktadan devam etmek de faydalı olabilir. Bunu yapmak için skip_first_batches() işlevini kullanabilirsiniz.
from accelerate import Accelerator
accelerator = Accelerator(project_dir="my/save/path")
train_dataloader = accelerator.prepare(train_dataloader)
accelerator.load_state("my_state")
# Assume the checkpoint was saved 100 steps into the epoch
skipped_dataloader = accelerator.skip_first_batches(train_dataloader, 100)
# After the first iteration, go back to `train_dataloader`
# First epoch
for batch in skipped_dataloader:
# Do something
pass
# Second epoch
for batch in train_dataloader:
# Do something
pass