Pytorch-번개-학습

0 서문

  • 여기에서 옮겨왔습니다

  • Pytorch-Lightning 간결한 튜토리얼

  • Pytorch Lightning 전체 가이드

  • PyTorch Lightning은 Pytorch에서 완전히 상속되었으며, Pytorch의 모든 항목은 PyTorch Lightning에서 사용할 수 있고, PyTorch Lightning의 모든 항목도 Pytorch에서 사용할 수 있습니다.

  • PyTorch Lightning은 Pytorch의 고급 패키지로서 완전하고 수정 가능한 훈련 로직을 포함하고 있습니다.

  • PyTorch Lightning의 하드웨어 감지는 Pytorch를 기반으로 하며 Trainer를 사용하여 수정할 수도 있습니다.

  • PyTorch Lightning에서는 데이터 유형이 자동으로 변경되므로 .cpu 및 .cuda가 필요하지 않습니다.

1. Pytorch의 Dataset 및 DataLoader를 사용하여 데이터 세트 정의

2. LightningModule을 사용하여 모델 정의 및 훈련 로직 구현

  • LightningModule: Pytorch Lightning의 두 가지 주요 API 중 하나이며 torch.nn.Module의 상위 수준 캡슐화입니다.

(1) 모델 정의

  • __init__():모델을 빌드하는 데 사용되는 torch.nn.Module의 __init__과 동일합니다.

  • forward(*args, **kwargs):torch.nn.Module의 전달과 동일하며 전달 전파는 __init__의 각 모듈을 통해 구현됩니다.

(2) 훈련 모델

#训练模型
training_step(*args, **kwargs)
"""
训练一批数据并反向传播。参数如下:
- batch (Tensor | (Tensor, …) | [Tensor, …]) – 数据输入,一般为x, y = batch。
- batch_idx (int) – 批次索引。
- optimizer_idx (int) – 当使用多个优化器时,会使用本参数。
- hiddens (Tensor) – 当truncated_bptt_steps > 0时使用。
"""
#举个例子:

def training_step(self, batch, batch_idx): # 数据类型自动转换,模型自动调用.train()
    x, y = batch
    _y = self(x)
    loss = criterion(_y, y) # 计算loss
    return loss # 返回loss,更新网络

def training_step(self, batch, batch_idx, hiddens):
    # hiddens是上一次截断反向传播的隐藏状态
    out, hiddens = self.lstm(data, hiddens)
    return {
    
    "loss": loss, "hiddens": hiddens}

#--------------------------------------

training_step_end(*args, **kwargs)
"""一批数据训练结束时的操作。一般用不着,分布式训练的时候会用上。参数如下:
- batch_parts_outputs – 当前批次的training_step()的返回值
"""
#举个例子:
def training_step(self, batch, batch_idx):
    x, y = batch
    _y = self(x)
    return {
    
    "output": _y, "target": y}

def training_step_end(self, training_step_outputs): # 多GPU分布式训练,计算loss
    gpu_0_output = training_step_outputs[0]["output"]
    gpu_1_output = training_step_outputs[1]["output"]
    
    gpu_0_target = training_step_outputs[0]["target"]
    gpu_1_target = training_step_outputs[1]["target"]

    # 对所有GPU的数据进行处理
    loss = criterion([gpu_0_output, gpu_1_output][gpu_0_target, gpu_1_target])
    return loss

#--------------------------------------

training_epoch_end(outputs)
"""一轮数据训练结束时的操作。主要针对于本轮所有training_step的输出。参数如下:
- outputs (List[Any]) – training_step()的输出。
"""
#举个例子:
def training_epoch_end(self, outs): # 计算本轮的loss和acc
    loss = 0.
    for out in outs: # outs按照训练顺序排序
        loss += out["loss"].cpu().detach().item()
    loss /= len(outs)
    acc = self.train_metric.compute()

    self.history["loss"].append(loss)
    self.history["acc"].append(acc)

세 가지 핵심 구성요소:

  • 모델
  • 옵티마이저
  • 훈련/Val/테스트 단계

데이터 흐름 의사코드:

outs = []
for batch in data:
    out = training_step(batch)
    outs.append(out)
training_epoch_end(outs)

동등한 Lightning 코드:

def training_step(self, batch, batch_idx):
    prediction = ...
    return prediction

def training_epoch_end(self, training_step_outputs):
    for prediction in predictions:
        # do something with these

우리가 해야 할 일은 빈칸을 채우는 것처럼 이러한 기능을 채우는 것뿐입니다.

3. 자동 훈련을 위해 트레이너 구성 매개변수 사용

  • "접착제"와 유사한 Pytorch Lightning의 두 가지 주요 API 중 하나는 LightningModule의 다양한 부분을 연결하여 완전한 논리를 형성합니다.

(1) 방법

__init__(logger=True, checkpoint_callback=True, callbacks=None, \
default_root_dir=None, gradient_clip_val=0, process_position=0, num_nodes=1, \
num_processes=1, gpus=None, auto_select_gpus=False, tpu_cores=None, \
log_gpu_memory=None, progress_bar_refresh_rate=1, overfit_batches=0.0, \
track_grad_norm=-1, check_val_every_n_epoch=1, fast_dev_run=False, \
accumulate_grad_batches=1, max_epochs=1000, min_epochs=1, max_steps=None, \
min_steps=None, limit_train_batches=1.0, limit_val_batches=1.0, \
limit_test_batches=1.0, val_check_interval=1.0, flush_logs_every_n_steps=100, \
log_every_n_steps=50, accelerator=None, sync_batchnorm=False, precision=32, \
weights_summary='top', weights_save_path=None, num_sanity_val_steps=2, \
truncated_bptt_steps=None, resume_from_checkpoint=None, profiler=None, \
benchmark=False, deterministic=False, reload_dataloaders_every_epoch=False, \
auto_lr_find=False, replace_sampler_ddp=True, terminate_on_nan=False, \
auto_scale_batch_size=False, prepare_data_per_node=True, plugins=None, \
amp_backend='native', amp_level='O2', distributed_backend=None, \
automatic_optimization=True, move_metrics_to_cpu=False)

트레이너를 초기화하는 데는 많은 매개변수가 있으며 아래에 소개하겠습니다.

  • 하드웨어 매개변수:

    • GPU[없음]:
      • CPU를 사용하려면 0 또는 None으로 설정하세요.
      • 0보다 큰 정수 n으로 설정하면 n개의 GPU가 사용됨을 나타냅니다.
      • ID가 n인 GPU를 사용함을 나타내는 0보다 큰 정수 문자열 'n'으로 설정합니다.
      • 모든 GPU를 사용하려면 -1 또는 '-1'로 설정하세요.
      • 정수 배열 [a, b] 또는 정수 배열 문자열 'a, b'로 설정하여 ID가 ​​a 및 b인 GPU가 사용됨을 나타냅니다.
    • auto_select_gpus[거짓]:
      • 필요한 GPU를 자동으로 선택하려면 True로 설정합니다.
      • 원하는 GPU를 순차적으로 선택하려면 False로 설정하세요.
    • 노드 수[1]:
      • 현재 GPU 노드를 선택하려면 1로 설정합니다.
      • 0보다 큰 정수 n으로 설정하면 n개의 노드가 사용됨을 나타냅니다.
    • tpu_cores[없음]:
      • TPU를 사용하지 않으려면 None으로 설정하세요.
      • 1개의 TPU 코어를 사용하려면 1로 설정합니다.
      • 0보다 큰 정수 배열 [n]으로 설정합니다. 이는 ID가 n인 TPU 코어가 사용됨을 나타냅니다.
      • 모든 TPU 코어를 사용하려면 8로 설정합니다.
  • 정확도 매개변수:

    • 정밀도[32]: 2, 4, 8, 16 또는 32로 설정되며 각각 다른 정밀도를 나타냅니다.
    • amp_backend[“네이티브”]:
      • 기본 혼합 정밀도를 사용하려면 "기본"으로 설정하세요.
      • 정점 혼합 정밀도를 사용하려면 "apex"로 설정합니다.
    • amp_level[“O2”]: 각각 O0, O1, O2 또는 O3으로 설정합니다.
      • O0: 정확성을 위한 기준으로 사용할 수 있는 순수 FP32 훈련입니다.
      • O1: 혼합 정밀도 교육(권장)은 흑백 목록을 기반으로 계산에 FP16(GEMM, 컨볼루션)을 사용할지 FP32(Softmax)를 사용할지 자동으로 결정합니다.
      • O2: "거의 FP16" 혼합 정밀도 훈련, 배치 표준을 제외하고 흑백 목록이 없으며 거의 ​​모든 계산이 FP16에서 수행됩니다.
      • O3: 순수한 FP16 훈련은 매우 불안정하지만 속도의 기준으로 사용할 수 있습니다.
  • 학습 초매개변수:

    • max_epochs[1000]: 최대 훈련 라운드 수입니다.
    • min_epochs[1]: 최소 훈련 라운드 수입니다.
    • max_steps[None]: 라운드당 최대 훈련 단계 수입니다.
    • min_steps[None]: 라운드당 최소 훈련 단계 수입니다.
  • 로그 매개변수 및 체크포인트 매개변수:

    • checkpoint_callback[참]:
      • 체크포인트 저장을 자동으로 수행하려면 True로 설정합니다.
      • 체크포인트를 저장하지 않으려면 False로 설정하세요.
    • logger[TensorBoardLogger]: 로그 도구를 설정합니다. False는 로거를 사용하지 않음을 의미합니다.
    • default_root_dir[os.getcwd()]: 로그 및 체크포인트 저장에 사용되는 기본 루트 디렉터리입니다.
    • 플러시_logs_every_n_steps[100]: 로그를 디스크에 업데이트하는 단계 수입니다.
    • log_every_n_steps[50]: 로그를 메모리에 업데이트하는 단계 수입니다.
    • log_gpu_memory[없음]:
      • GPU 메모리 정보를 기록하지 않으려면 없음으로 설정하세요.
      • 모든 GPU 메모리 정보를 기록하려면 "all"로 설정합니다.
      • GPU 메모리 정보의 최대값을 기록하려면 "min_max"로 설정합니다.
    • check_val_every_n_epoch[1]: 검증 횟수입니다.
    • val_check_interval[1.0]:
      • 소수로 설정합니다. 이는 검증 세트의 특정 비율을 취함을 의미합니다.
      • 특정 수의 검증 세트가 사용됨을 나타내는 정수로 설정됩니다.
    • resume_from_checkpoint[None]: 체크포인트 재개, 입력 경로.
    • Progress_bar_refresh_rate[1]: 진행률 표시줄의 새로 고침 빈도입니다.
    • 가중치_요약[“상단”]:
      • 모델 정보를 출력하지 않으려면 None으로 설정하세요.
      • 모델 간략한 정보를 출력하려면 "top"으로 설정하세요.
      • 모든 모델 정보를 출력하려면 "full"로 설정하세요.
    • 가중치_저장_경로[os.getcwd()]:
      • 가중치를 저장하는 경로입니다.
  • 테스트 매개변수:

    • num_sanity_val_steps[2]: 훈련 전에 확인할 검증 데이터 배치 수입니다.
    • fast_dev_run[False]: 일련의 단위 테스트입니다.
    • reload_dataloaders_every_epoch[False]: 각 라운드에서 데이터를 다시 로드할지 여부입니다.
  • 분산 매개변수:

    • 가속기[없음]:

      • dp(DataParallel)는 동일한 컴퓨터의 GPU 간에 일괄 처리를 분할하는 것입니다.

      • ddp(DistributedDataParallel)는 각 노드의 각 GPU에서 훈련되고 그라디언트를 동기화합니다. TPU 기본 옵션입니다.

      • ddp_cpu(CPU의 DistributedDataParallel)는 ddp와 동일하지만 GPU를 사용하지 않습니다. 다중 노드 CPU 교육 또는 단일 노드 디버깅에 유용합니다.

      • ddp2는 노드의 dp이고 노드 사이의 ddp입니다.

    • Accumulate_grad_batches[1]: 그라디언트를 누적하는 데 사용되는 배치 수입니다.

    • sync_batchnorm[False]: 일반적으로 여러 GPU와 함께 배포할 때 사용되는 동기식 일괄 처리입니다.

  • 자동 매개변수:

    • automatic_optimization[True]: 자동 최적화 활성화 여부.
    • auto_scale_batch_size[None]: 최대 배치 크기를 자동으로 찾을지 여부입니다.
    • auto_lr_find[False]: 최적의 학습률을 자동으로 찾을지 여부입니다.
  • 결정적 매개변수:

    • benchmark[False]: cudnn.benchmark 사용 여부.
    • deterministic[False]: 결정성을 활성화할지 여부입니다.
  • 제한적 및 샘플링 매개변수:

    • gradient_clip_val[0.0]: 그라데이션 클리핑.
    • limit_train_batches[1.0]: 라운드당 훈련 배치 수를 제한합니다.
    • limit_val_batches[1.0]: 각 라운드의 검증 배치 수를 제한합니다.
    • limit_test_batches[1.0]: 라운드당 테스트 배치 수를 제한합니다.
    • overfit_batches[0.0]: 배치의 중복 수를 제한합니다.
    • prepare_data_per_node[True]: 노드별로 데이터를 준비할지 여부입니다.
    • replacement_sampler_ddp[True]: 분산 샘플러를 자동으로 추가하는 기능을 활성화할지 여부입니다.
  • 기타 매개변수:

    • callbacks[]: 안녕하세요, 콜백입니다.
    • process_position[0]: 진행바를 순서대로 처리합니다.
    • 프로파일러[없음]
    • track_grad_norm[-1]
    • truncated_bptt_steps[없음]
  • fit(model, train_dataloader=None, val_dataloaders=None, datamodule=None)
    이 훈련을 시작합니다. 매개변수는 다음과 같습니다:

    • datamodule (Optional[LightningDataModule]) – LightningDataModule 인스턴스입니다.
    • 모델(LightningModule) – 훈련된 모델입니다.
    • train_dataloader (Optional[DataLoader]) – 훈련 데이터.
    • val_dataloaders (Union[DataLoader, List[DataLoader], None]) – 데이터 유효성을 검사합니다.
  • test(model=None, test_dataloaders=None, ckpt_path='best', verbose=True, datamodule=None)은
    테스트를 켭니다. 매개변수는 다음과 같습니다:

    • ckpt_path (선택 사항[str]) – best 또는 가장 테스트하려는 체크포인트 가중치가 있는 경로, None은 마지막 가중치를 사용합니다.
    • datamodule (Optional[LightningDataModule]) – LightningDataModule 인스턴스입니다.
    • model (Optional[LightningModule]) – 테스트할 모델입니다.
    • test_dataloaders (Union[DataLoader, List[DataLoader], None]) – 테스트 데이터.
    • verbose (bool) – 결과를 인쇄할지 여부.
  • tune(model, train_dataloader=None, val_dataloaders=None, datamodule=None)은
    훈련 전에 하이퍼파라미터를 조정합니다. 매개변수는 다음과 같습니다:

    • datamodule (Optional[LightningDataModule]) – LightningDataModule 인스턴스입니다.
    • model(LightningModule) – 조정된 모델입니다.
    • train_dataloader (Optional[DataLoader]) – 훈련 데이터.
    • val_dataloaders (Union[DataLoader, List[DataLoader], None]) – 데이터 유효성을 검사합니다.

(2) 속성

  • callback_metrics 콜백 측정항목. 예를 들어:
def training_step(self, batch, batch_idx):
    self.log('a_val', 2)

callback_metrics = trainer.callback_metricpythons
assert callback_metrics['a_val'] == 2
  • current_epoch 현재 에포크 번호입니다. 예를 들어:
def training_step(self, batch, batch_idx):
    current_epoch = self.trainer.current_epoch
    if current_epoch > 100:
        # do something
        pass
  • 현재 로그를 기록합니다. 예를 들어:
def training_step(self, batch, batch_idx):
    logger = self.trainer.logger
    tensorboard = logger.experiment
  • Logged_metrics 로그로 전송된 지표입니다. 예를 들어:
def training_step(self, batch, batch_idx):
    self.log('a_val', 2, log=True)

logged_metrics = trainer.logged_metrics
assert logged_metrics['a_val'] == 2
  • log_dir 현재 디렉토리, 이미지 저장 등에 사용됩니다. 예를 들어:
def training_step(self, batch, batch_idx):
    img = ...
    save_img(img, self.trainer.log_dir)
  • is_global_zero는 전역 최초입니다.

  • Progress_bar_metrics 진행률 표시줄에 전송된 측정항목입니다. 예를 들어:

def training_step(self, batch, batch_idx):
    self.log('a_val', 2, prog_bar=True)

progress_bar_metrics = trainer.progress_bar_metrics
assert progress_bar_metrics['a_val'] == 2

4.콜백

  • Pytorch Lightning의 가장 뛰어난 범용성, 무적의 플러그인으로 어디에서나 플러그 앤 플레이로 연결할 수 있습니다.

(1) 훈련방법

  • on_train_start(trainer, pl_module)
    첫 번째 훈련이 시작될 때 동작합니다.

  • on_train_end(trainer, pl_module)
    마지막 훈련이 끝나면 동작합니다.

  • on_train_batch_start(trainer, pl_module, 배치, 배치_idx, dataloader_idx)
    데이터 훈련 배치가 시작될 때의 작업입니다.

  • on_train_batch_end(trainer, pl_module, 출력, 배치, 배치_idx, dataloader_idx)
    데이터 배치 훈련이 종료될 때의 작업입니다.

  • on_train_epoch_start(trainer, pl_module)
    데이터 훈련 라운드가 시작될 때의 작업입니다.

  • on_train_epoch_end(trainer, pl_module, outputs)
    데이터 훈련 라운드가 끝나면 작업이 수행됩니다.

(2) 검증방법

  • on_validation_start(trainer, pl_module)
    첫 번째 검증이 시작될 때 동작합니다.

  • on_validation_end(self, training, pl_module)
    마지막 검증이 끝나면 동작합니다.

  • on_validation_batch_start(trainer, pl_module, 배치, 배치_idx, dataloader_idx)
    데이터 검증 배치가 시작될 때의 작업입니다.

  • on_validation_batch_end(trainer, pl_module, outputs, 배치, bat_idx, dataloader_idx) 일괄
    데이터 검증이 종료될 때의 작업입니다.

  • on_validation_epoch_start(trainer, pl_module)
    데이터 검증 라운드가 시작될 때의 작업입니다.

  • on_validation_epoch_end(trainer, pl_module)
    데이터 검증 라운드가 종료될 때의 작업입니다.

(3) 시험방법

  • on_test_start(trainer, pl_module)
    첫 번째 테스트가 시작될 때 동작합니다.

  • on_test_end(self, training, pl_module)
    마지막 테스트가 끝나면 동작합니다.

  • on_test_batch_start(trainer, pl_module, 배치, 배치_idx, dataloader_idx)
    일괄 데이터 테스트가 시작될 때의 작업입니다.

  • on_test_batch_end(trainer, pl_module, outputs, 배치, 배치_idx, dataloader_idx) 일괄
    데이터 테스트가 종료될 때의 작업입니다.

  • on_test_epoch_start(trainer, pl_module)
    데이터 테스트 라운드가 시작될 때의 작업입니다.

  • on_test_epoch_end(trainer, pl_module)
    데이터 테스트 라운드가 종료되면 동작합니다.

(4) 기타 방법

  • .fit을 호출할 때 on_fit_start(trainer, pl_module)
    작업.

  • on_fit_end(trainer, pl_module)
    .핏 종료 시 작업.

setup(trainer, pl_module, stage)
teardown(trainer, pl_module, stage)
on_init_start(trainer)
on_init_end(trainer)
on_sanity_check_start(trainer, pl_module)
on_sanity_check_end(trainer, pl_module)
on_batch_start(trainer, pl_module)
on_batch_end(trainer, pl_module)
on_epoch_start(trainer, pl_module)
on_epoch_end(trainer, pl_module)
on_keyboard_interrupt(trainer, pl_module)
on_save_checkpoint(trainer, pl_module)
on_load_checkpoint(checkpointed_state)

추천

출처blog.csdn.net/fb_941219/article/details/131556467