0 서문
-
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로 설정합니다.
- GPU[없음]:
-
정확도 매개변수:
- 정밀도[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()]:
- 가중치를 저장하는 경로입니다.
- checkpoint_callback[참]:
-
테스트 매개변수:
- 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)