Skip to content

Commit ede378a

Browse files
committed
Update trainer.py
1 parent fad31c2 commit ede378a

File tree

1 file changed

+40
-38
lines changed

1 file changed

+40
-38
lines changed

src/11_seq2seq/modules/trainer.py

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import numpy as np
22
import torch
33
import 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
66
from ignite.engine import Engine
77
from ignite.engine import Events
88
from 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

Comments
 (0)