11import numpy as np
22import torch
33import torch .nn .utils as torch_utils
4- from torch .cuda .amp import autocast
5- from torch .cuda .amp import GradScaler
4+ # from torch.cuda.amp import autocast
5+ # from torch.cuda.amp import GradScaler
66from ignite .engine import Engine
77from ignite .engine import Events
88from ignite .metrics import RunningAverage
@@ -25,7 +25,7 @@ def __init__(self, func, model, crit, optimizer, lr_scheduler, config):
2525 super ().__init__ (func )
2626
2727 self .best_loss = np .inf
28- self .scaler = GradScaler ()
28+ # self.scaler = GradScaler()
2929
3030 @staticmethod
3131 def train (engine , mini_batch ):
@@ -75,39 +75,41 @@ def train(engine, mini_batch):
7575 '''
7676 x , y = mini_batch .src , mini_batch .tgt [0 ][:, 1 :]
7777
78+ #-------------------------#
7879 # autocast로 공간효율적으로 학습 실행
79- with autocast (not engine .config .off_autocast ):
80- # y_hat = (batch_size, length_m, output_size)
81- # 입력 tgt의 경우, 맨뒤에 EOS를 토큰을 제거
82- y_hat = engine .model (x , mini_batch .tgt [0 ][:, :- 1 ])
80+ # with autocast(not engine.config.off_autocast):
81+ # y_hat = (batch_size, length_m, output_size)
82+ # 입력 tgt의 경우, 맨뒤에 EOS를 토큰을 제거
83+ y_hat = engine .model (x , mini_batch .tgt [0 ][:, :- 1 ])
8384
84- '''
85- loss값 연산을 위해 다음과 같이 텐서 모양 정리
86- 모든 문장의 각 단어를 순서대로 배치했다고 보면됨
87- 변경 전(3D):
88- y_hat = (batch_size, length_m, output_size)
89- y = (batch_size, length_m)
90- 변경 후(2D):
91- y_hat = (batch_size * length_m, output_size)
92- y = (batch_size * length_m)
93- '''
94- loss = engine .crit (
95- y_hat .contiguous ().view (- 1 , y_hat .size (- 1 )),
96- y .contiguous ().view (- 1 )
97- )
98- '''
99- div(y.size(0)): loss를 구한후, batch_size만큼 나눠준 후
100- div(engine.config.iteration_per_update):
101- Gradient Accumulation을 위해 미리 나눠줌
102- 즉, backward_target이 진짜 적용시킬 loss 값이라 보면 됨
103- '''
104- backward_target = loss .div (y .size (0 )).div (engine .config .iteration_per_update )
85+ '''
86+ loss값 연산을 위해 다음과 같이 텐서 모양 정리
87+ 모든 문장의 각 단어를 순서대로 배치했다고 보면됨
88+ 변경 전(3D):
89+ y_hat = (batch_size, length_m, output_size)
90+ y = (batch_size, length_m)
91+ 변경 후(2D):
92+ y_hat = (batch_size * length_m, output_size)
93+ y = (batch_size * length_m)
94+ '''
95+ loss = engine .crit (
96+ y_hat .contiguous ().view (- 1 , y_hat .size (- 1 )),
97+ y .contiguous ().view (- 1 )
98+ )
99+ '''
100+ div(y.size(0)): loss를 구한후, batch_size만큼 나눠준 후
101+ div(engine.config.iteration_per_update):
102+ Gradient Accumulation을 위해 미리 나눠줌
103+ 즉, backward_target이 진짜 적용시킬 loss 값이라 보면 됨
104+ '''
105+ backward_target = loss .div (y .size (0 )).div (engine .config .iteration_per_update )
106+ #-------------------------#
105107
106108 # autocast가 켜져 있는 경우, scale 작업 후에, backward
107- if engine .config .gpu_id >= 0 and not engine .config .off_autocast :
108- engine .scaler .scale (backward_target ).backward ()
109- else :
110- backward_target .backward ()
109+ # if engine.config.gpu_id >= 0 and not engine.config.off_autocast:
110+ # engine.scaler.scale(backward_target).backward()
111+ # else:
112+ backward_target .backward ()
111113
112114 # 현재 batch 내에 모든 토큰 수
113115 word_count = int (mini_batch .tgt [1 ].sum ())
@@ -131,12 +133,12 @@ def train(engine, mini_batch):
131133 engine .config .max_grad_norm ,
132134 )
133135
134- if engine .config .gpu_id >= 0 and not engine .config .off_autocast :
135- # GPU를 사용할 경우, 기존 optim.step() 대신에 scaler로 step 수행
136- engine .scaler .step (engine .optimizer )
137- engine .scaler .update ()
138- else :
139- engine .optimizer .step ()
136+ # if engine.config.gpu_id >= 0 and not engine.config.off_autocast:
137+ # # GPU를 사용할 경우, 기존 optim.step() 대신에 scaler로 step 수행
138+ # engine.scaler.step(engine.optimizer)
139+ # engine.scaler.update()
140+ # else:
141+ engine .optimizer .step ()
140142
141143 loss = float (loss / word_count )
142144 ppl = np .exp (loss )
0 commit comments