STEP 17 / 18

Multi30k 독→영 번역 학습

이제 진짜로 학습한다. 지금까지 만든 것이 모두 여기 모인다.

train_worker: GPU 하나에서 도는 학습 과정이다. 1. make_model로 6층 모델을 만들어 GPU에 올린다(분산 학습이면 DDP로 감싼다). 2. LabelSmoothing(smoothing=0.1), create_dataloaders, Adam(β=(0.9, 0.98), ε=1e-9) + rate 스케줄을 준비한다. 3. epoch마다 run_epoch로 학습하고 체크포인트를 저장한 뒤 검증 손실을 잰다.

train_distributed_model/train_model: GPU가 여러 개면 mp.spawn으로 GPU마다 train_worker를 하나씩 띄운다.

load_trained_model: 학습 설정이 여기 있다. 배치 32, accum_iter=10(10배치마다 한 번 업데이트하므로 실질 배치 320), warmup 3000, 8 epoch. multi30k_model_final.pt가 이미 있으면 학습을 건너뛴다.

check_outputs: 검증 문장을 greedy_decode로 번역해서 원문·정답·모델 출력을 나란히 찍는다.

원본의 load_trained_model은 vocab_src 같은 노트북 전역 변수를 그대로 가져다 쓴다. 파일 하나로 import할 수 있도록 인자로 받게만 바꿨다. train_distributed_model 첫 줄의 from the_annotated_transformer import train_worker(노트북에서 mp.spawn에 함수를 넘기려고 넣은 줄)도 뺐다.

실행 결과에서 볼 것

  • 손실이 7.6에서 시작해 epoch 7에 1점대로 내려간다. 검증 손실(괄호 안 첫 숫자)은 epoch 0 3.90 → epoch 7 1.44.
  • 마지막 번역: Ein Mann balanciert einen <unk> auf seinem Arm . → A man is balancing a <unk> on his arm .

코드 변화

+187 −0 · 파일 전체 944줄

이전 단계의 transformer.py와 비교했다. 초록 줄이 새로 생긴 줄, 빨간 줄이 사라진 줄이다.

GitHub에서 보기 ↗
1212from torch.optim.lr_scheduler import LambdaLR
1313from torch.utils.data import DataLoader
1414from torch.utils.data.distributed import DistributedSampler
15+import torch.distributed as dist
16+import torch.multiprocessing as mp
17+from torch.nn.parallel import DistributedDataParallel as DDP
18+import GPUtil
1519
1620
1721def attention(query, key, value, mask=None, dropout=None):
755759 collate_fn=collate_fn,
756760 )
757761 return train_dataloader, valid_dataloader
762+
763+
764+def train_worker(
765+ gpu,
766+ ngpus_per_node,
767+ vocab_src,
768+ vocab_tgt,
769+ spacy_de,
770+ spacy_en,
771+ config,
772+ is_distributed=False,
773+):
774+ print(f"Train worker process using GPU: {gpu} for training", flush=True)
775+ torch.cuda.set_device(gpu)
776+
777+ pad_idx = vocab_tgt["<blank>"]
778+ d_model = 512
779+ model = make_model(len(vocab_src), len(vocab_tgt), N=6)
780+ model.cuda(gpu)
781+ module = model
782+ is_main_process = True
783+ if is_distributed:
784+ dist.init_process_group(
785+ "nccl", init_method="env://", rank=gpu, world_size=ngpus_per_node
786+ )
787+ model = DDP(model, device_ids=[gpu])
788+ module = model.module
789+ is_main_process = gpu == 0
790+
791+ criterion = LabelSmoothing(
792+ size=len(vocab_tgt), padding_idx=pad_idx, smoothing=0.1
793+ )
794+ criterion.cuda(gpu)
795+
796+ train_dataloader, valid_dataloader = create_dataloaders(
797+ gpu,
798+ vocab_src,
799+ vocab_tgt,
800+ spacy_de,
801+ spacy_en,
802+ batch_size=config["batch_size"] // ngpus_per_node,
803+ max_padding=config["max_padding"],
804+ is_distributed=is_distributed,
805+ )
806+
807+ optimizer = torch.optim.Adam(
808+ model.parameters(), lr=config["base_lr"], betas=(0.9, 0.98), eps=1e-9
809+ )
810+ lr_scheduler = LambdaLR(
811+ optimizer=optimizer,
812+ lr_lambda=lambda step: rate(
813+ step, d_model, factor=1, warmup=config["warmup"]
814+ ),
815+ )
816+ train_state = TrainState()
817+
818+ for epoch in range(config["num_epochs"]):
819+ if is_distributed:
820+ train_dataloader.sampler.set_epoch(epoch)
821+ valid_dataloader.sampler.set_epoch(epoch)
822+
823+ model.train()
824+ print(f"[GPU{gpu}] Epoch {epoch} Training ====", flush=True)
825+ _, train_state = run_epoch(
826+ (Batch(b[0], b[1], pad_idx) for b in train_dataloader),
827+ model,
828+ SimpleLossCompute(module.generator, criterion),
829+ optimizer,
830+ lr_scheduler,
831+ mode="train+log",
832+ accum_iter=config["accum_iter"],
833+ train_state=train_state,
834+ )
835+
836+ GPUtil.showUtilization()
837+ if is_main_process:
838+ file_path = "%s%.2d.pt" % (config["file_prefix"], epoch)
839+ torch.save(module.state_dict(), file_path)
840+ torch.cuda.empty_cache()
841+
842+ print(f"[GPU{gpu}] Epoch {epoch} Validation ====", flush=True)
843+ model.eval()
844+ sloss = run_epoch(
845+ (Batch(b[0], b[1], pad_idx) for b in valid_dataloader),
846+ model,
847+ SimpleLossCompute(module.generator, criterion),
848+ DummyOptimizer(),
849+ DummyScheduler(),
850+ mode="eval",
851+ )
852+ print(sloss)
853+ torch.cuda.empty_cache()
854+
855+ if is_main_process:
856+ file_path = "%sfinal.pt" % config["file_prefix"]
857+ torch.save(module.state_dict(), file_path)
858+
859+
860+def train_distributed_model(vocab_src, vocab_tgt, spacy_de, spacy_en, config):
861+ ngpus = torch.cuda.device_count()
862+ os.environ["MASTER_ADDR"] = "localhost"
863+ os.environ["MASTER_PORT"] = "12356"
864+ print(f"Number of GPUs detected: {ngpus}")
865+ print("Spawning training processes ...")
866+ mp.spawn(
867+ train_worker,
868+ nprocs=ngpus,
869+ args=(ngpus, vocab_src, vocab_tgt, spacy_de, spacy_en, config, True),
870+ )
871+
872+
873+def train_model(vocab_src, vocab_tgt, spacy_de, spacy_en, config):
874+ if config["distributed"]:
875+ train_distributed_model(
876+ vocab_src, vocab_tgt, spacy_de, spacy_en, config
877+ )
878+ else:
879+ train_worker(
880+ 0, 1, vocab_src, vocab_tgt, spacy_de, spacy_en, config, False
881+ )
882+
883+
884+def load_trained_model(vocab_src, vocab_tgt, spacy_de, spacy_en):
885+ config = {
886+ "batch_size": 32,
887+ "distributed": False,
888+ "num_epochs": 8,
889+ "accum_iter": 10,
890+ "base_lr": 1.0,
891+ "max_padding": 72,
892+ "warmup": 3000,
893+ "file_prefix": "multi30k_model_",
894+ }
895+ model_path = "multi30k_model_final.pt"
896+ if not exists(model_path):
897+ train_model(vocab_src, vocab_tgt, spacy_de, spacy_en, config)
898+
899+ model = make_model(len(vocab_src), len(vocab_tgt), N=6)
900+ model.load_state_dict(torch.load("multi30k_model_final.pt"))
901+ return model
902+
903+
904+def check_outputs(
905+ valid_dataloader,
906+ model,
907+ vocab_src,
908+ vocab_tgt,
909+ n_examples=15,
910+ pad_idx=2,
911+ eos_string="</s>",
912+):
913+ results = [()] * n_examples
914+ for idx in range(n_examples):
915+ print("\nExample %d ========\n" % idx)
916+ b = next(iter(valid_dataloader))
917+ rb = Batch(b[0], b[1], pad_idx)
918+ greedy_decode(model, rb.src, rb.src_mask, 64, 0)[0]
919+
920+ src_tokens = [
921+ vocab_src.get_itos()[x] for x in rb.src[0] if x != pad_idx
922+ ]
923+ tgt_tokens = [
924+ vocab_tgt.get_itos()[x] for x in rb.tgt[0] if x != pad_idx
925+ ]
926+
927+ print(
928+ "Source Text (Input) : "
929+ + " ".join(src_tokens).replace("\n", "")
930+ )
931+ print(
932+ "Target Text (Ground Truth) : "
933+ + " ".join(tgt_tokens).replace("\n", "")
934+ )
935+ model_out = greedy_decode(model, rb.src, rb.src_mask, 72, 0)[0]
936+ model_txt = (
937+ " ".join(
938+ [vocab_tgt.get_itos()[x] for x in model_out if x != pad_idx]
939+ ).split(eos_string, 1)[0]
940+ + eos_string
941+ )
942+ print("Model Output : " + model_txt.replace("\n", ""))
943+ results[idx] = (rb, src_tokens, tgt_tokens, model_out, model_txt)
944+ return results

실행 결과

이 단계는 CUDA GPU로 8 epoch 학습한 모델이 필요해서 빌드 때 다시 실행하지 않는다. output.txt와 charts/는 annotated-transformer-modern의 노트북을 RTX 3070 한 장에서 처음부터 끝까지 실행한 기록이다(tools/extract_recorded.py로 추출).

실행한 코드 demo.py 보기
1# CUDA GPU가 있어야 학습할 수 있다. 웹 페이지의 출력은 RTX 3070에서 실행한 기록이다.
2import torch
3
4from transformer import (
5 check_outputs, create_dataloaders, load_tokenizers, load_trained_model, load_vocab, make_model,
6)
7
8spacy_de, spacy_en = load_tokenizers()
9vocab_src, vocab_tgt = load_vocab(spacy_de, spacy_en)
10
11# multi30k_model_final.pt가 없으면 8 epoch 학습한다 (RTX 3070에서 약 13분)
12load_trained_model(vocab_src, vocab_tgt, spacy_de, spacy_en)
13
14
15# 원본 노트북의 run_model_example: 학습한 가중치를 CPU로 불러 검증 문장을 번역한다
16def run_model_example(n_examples=5):
17 print("Preparing Data ...")
18 _, valid_dataloader = create_dataloaders(
19 torch.device("cpu"),
20 vocab_src,
21 vocab_tgt,
22 spacy_de,
23 spacy_en,
24 batch_size=1,
25 is_distributed=False,
26 )
27
28 print("Loading Trained Model ...")
29
30 model = make_model(len(vocab_src), len(vocab_tgt), N=6)
31 model.load_state_dict(
32 torch.load("multi30k_model_final.pt", map_location=torch.device("cpu"))
33 )
34
35 print("Checking Model Outputs:")
36 example_data = check_outputs(
37 valid_dataloader, model, vocab_src, vocab_tgt, n_examples=n_examples
38 )
39 return model, example_data
40
41
42run_model_example(n_examples=1)
Train worker process using GPU: 0 for training
[GPU0] Epoch 0 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   7.63 | Tokens / Sec:  1211.2 | Learning Rate: 5.4e-07
Epoch Step:     41 | Accumulation Step:   5 | Loss:   7.43 | Tokens / Sec:  3930.1 | Learning Rate: 1.1e-05
Epoch Step:     81 | Accumulation Step:   9 | Loss:   7.06 | Tokens / Sec:  3898.8 | Learning Rate: 2.2e-05
Epoch Step:    121 | Accumulation Step:  13 | Loss:   6.77 | Tokens / Sec:  3917.3 | Learning Rate: 3.3e-05
Epoch Step:    161 | Accumulation Step:  17 | Loss:   6.52 | Tokens / Sec:  3929.7 | Learning Rate: 4.4e-05
Epoch Step:    201 | Accumulation Step:  21 | Loss:   6.30 | Tokens / Sec:  3916.0 | Learning Rate: 5.4e-05
Epoch Step:    241 | Accumulation Step:  25 | Loss:   6.23 | Tokens / Sec:  3905.5 | Learning Rate: 6.5e-05
Epoch Step:    281 | Accumulation Step:  29 | Loss:   5.96 | Tokens / Sec:  3953.1 | Learning Rate: 7.6e-05
Epoch Step:    321 | Accumulation Step:  33 | Loss:   5.80 | Tokens / Sec:  3896.5 | Learning Rate: 8.7e-05
Epoch Step:    361 | Accumulation Step:  37 | Loss:   5.59 | Tokens / Sec:  3920.1 | Learning Rate: 9.7e-05
Epoch Step:    401 | Accumulation Step:  41 | Loss:   5.25 | Tokens / Sec:  3930.1 | Learning Rate: 1.1e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   5.13 | Tokens / Sec:  3891.5 | Learning Rate: 1.2e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   4.89 | Tokens / Sec:  3917.2 | Learning Rate: 1.3e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   4.74 | Tokens / Sec:  3904.5 | Learning Rate: 1.4e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   4.52 | Tokens / Sec:  3961.5 | Learning Rate: 1.5e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   4.34 | Tokens / Sec:  3958.8 | Learning Rate: 1.6e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   4.39 | Tokens / Sec:  3901.9 | Learning Rate: 1.7e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   4.34 | Tokens / Sec:  3910.5 | Learning Rate: 1.8e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   4.22 | Tokens / Sec:  3911.4 | Learning Rate: 1.9e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   4.03 | Tokens / Sec:  3897.0 | Learning Rate: 2.0e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   4.06 | Tokens / Sec:  3905.2 | Learning Rate: 2.2e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   4.08 | Tokens / Sec:  3894.0 | Learning Rate: 2.3e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   4.20 | Tokens / Sec:  3900.8 | Learning Rate: 2.4e-04
| ID | GPU | MEM |
------------------
|  0 | 94% | 41% |
[GPU0] Epoch 0 Validation ====
(tensor(3.9047, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 1 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   3.94 | Tokens / Sec:  4667.7 | Learning Rate: 2.4e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   3.91 | Tokens / Sec:  3883.0 | Learning Rate: 2.6e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   3.87 | Tokens / Sec:  3935.5 | Learning Rate: 2.7e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   3.75 | Tokens / Sec:  3911.2 | Learning Rate: 2.8e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   3.54 | Tokens / Sec:  3919.6 | Learning Rate: 2.9e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   3.63 | Tokens / Sec:  3931.7 | Learning Rate: 3.0e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   3.52 | Tokens / Sec:  3882.2 | Learning Rate: 3.1e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   3.45 | Tokens / Sec:  3923.6 | Learning Rate: 3.2e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   3.30 | Tokens / Sec:  3861.4 | Learning Rate: 3.3e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   3.38 | Tokens / Sec:  3945.2 | Learning Rate: 3.4e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   3.37 | Tokens / Sec:  3885.5 | Learning Rate: 3.5e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   3.20 | Tokens / Sec:  3876.5 | Learning Rate: 3.6e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   3.32 | Tokens / Sec:  3864.1 | Learning Rate: 3.7e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   3.49 | Tokens / Sec:  3921.5 | Learning Rate: 3.8e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   3.13 | Tokens / Sec:  3903.1 | Learning Rate: 4.0e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   3.39 | Tokens / Sec:  3915.3 | Learning Rate: 4.1e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   3.20 | Tokens / Sec:  3975.7 | Learning Rate: 4.2e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   3.27 | Tokens / Sec:  3888.8 | Learning Rate: 4.3e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   3.17 | Tokens / Sec:  3902.0 | Learning Rate: 4.4e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   3.07 | Tokens / Sec:  3936.9 | Learning Rate: 4.5e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   2.84 | Tokens / Sec:  3886.1 | Learning Rate: 4.6e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   2.98 | Tokens / Sec:  3909.2 | Learning Rate: 4.7e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   3.25 | Tokens / Sec:  3992.7 | Learning Rate: 4.8e-04
| ID | GPU | MEM |
------------------
|  0 | 90% | 50% |
[GPU0] Epoch 1 Validation ====
(tensor(2.8732, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 2 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   2.83 | Tokens / Sec:  4341.3 | Learning Rate: 4.9e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   2.57 | Tokens / Sec:  3974.1 | Learning Rate: 5.0e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   2.59 | Tokens / Sec:  3917.1 | Learning Rate: 5.1e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   2.83 | Tokens / Sec:  3920.7 | Learning Rate: 5.2e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   2.70 | Tokens / Sec:  3885.6 | Learning Rate: 5.3e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   2.71 | Tokens / Sec:  3892.3 | Learning Rate: 5.4e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   2.63 | Tokens / Sec:  3967.7 | Learning Rate: 5.5e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   2.54 | Tokens / Sec:  3911.5 | Learning Rate: 5.6e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   2.64 | Tokens / Sec:  3911.6 | Learning Rate: 5.7e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   2.32 | Tokens / Sec:  3875.5 | Learning Rate: 5.9e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   2.47 | Tokens / Sec:  3923.2 | Learning Rate: 6.0e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   2.49 | Tokens / Sec:  3978.4 | Learning Rate: 6.1e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   2.42 | Tokens / Sec:  3915.0 | Learning Rate: 6.2e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   2.37 | Tokens / Sec:  3934.4 | Learning Rate: 6.3e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   2.36 | Tokens / Sec:  3924.3 | Learning Rate: 6.4e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   2.30 | Tokens / Sec:  3886.9 | Learning Rate: 6.5e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   2.46 | Tokens / Sec:  3895.0 | Learning Rate: 6.6e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   2.16 | Tokens / Sec:  3911.2 | Learning Rate: 6.7e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   2.68 | Tokens / Sec:  3938.7 | Learning Rate: 6.8e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   2.42 | Tokens / Sec:  3852.0 | Learning Rate: 6.9e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   2.29 | Tokens / Sec:  3883.0 | Learning Rate: 7.0e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   2.34 | Tokens / Sec:  3826.2 | Learning Rate: 7.1e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   1.94 | Tokens / Sec:  3890.4 | Learning Rate: 7.3e-04
| ID | GPU | MEM |
------------------
|  0 | 94% | 50% |
[GPU0] Epoch 2 Validation ====
(tensor(2.1227, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 3 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   2.01 | Tokens / Sec:  4475.3 | Learning Rate: 7.3e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   1.88 | Tokens / Sec:  3900.3 | Learning Rate: 7.4e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   1.84 | Tokens / Sec:  3892.7 | Learning Rate: 7.5e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   1.70 | Tokens / Sec:  3884.3 | Learning Rate: 7.6e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   2.21 | Tokens / Sec:  3871.5 | Learning Rate: 7.8e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   2.10 | Tokens / Sec:  3904.7 | Learning Rate: 7.9e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   1.72 | Tokens / Sec:  3988.0 | Learning Rate: 8.0e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   2.02 | Tokens / Sec:  3809.6 | Learning Rate: 8.1e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   2.14 | Tokens / Sec:  3940.7 | Learning Rate: 8.0e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   1.89 | Tokens / Sec:  3900.1 | Learning Rate: 8.0e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   1.81 | Tokens / Sec:  3937.4 | Learning Rate: 7.9e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   1.78 | Tokens / Sec:  3922.3 | Learning Rate: 7.9e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   1.77 | Tokens / Sec:  3923.7 | Learning Rate: 7.8e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   1.79 | Tokens / Sec:  3902.3 | Learning Rate: 7.8e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   2.10 | Tokens / Sec:  3942.4 | Learning Rate: 7.7e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   1.64 | Tokens / Sec:  3859.5 | Learning Rate: 7.7e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   1.64 | Tokens / Sec:  3886.0 | Learning Rate: 7.6e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   1.67 | Tokens / Sec:  3954.5 | Learning Rate: 7.6e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   1.98 | Tokens / Sec:  3948.8 | Learning Rate: 7.5e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   1.74 | Tokens / Sec:  3866.5 | Learning Rate: 7.5e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   1.32 | Tokens / Sec:  3909.6 | Learning Rate: 7.4e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   1.65 | Tokens / Sec:  3934.2 | Learning Rate: 7.4e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   1.82 | Tokens / Sec:  3913.0 | Learning Rate: 7.4e-04
| ID | GPU | MEM |
------------------
|  0 | 86% | 50% |
[GPU0] Epoch 3 Validation ====
(tensor(1.7596, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 4 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   1.88 | Tokens / Sec:  4368.6 | Learning Rate: 7.3e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   1.42 | Tokens / Sec:  3890.5 | Learning Rate: 7.3e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   1.44 | Tokens / Sec:  3919.6 | Learning Rate: 7.3e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   1.71 | Tokens / Sec:  3925.4 | Learning Rate: 7.2e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   1.37 | Tokens / Sec:  3906.8 | Learning Rate: 7.2e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   1.70 | Tokens / Sec:  3913.0 | Learning Rate: 7.1e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   1.69 | Tokens / Sec:  3935.1 | Learning Rate: 7.1e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   1.51 | Tokens / Sec:  3908.5 | Learning Rate: 7.1e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   1.70 | Tokens / Sec:  3935.8 | Learning Rate: 7.0e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   1.52 | Tokens / Sec:  3962.7 | Learning Rate: 7.0e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   1.40 | Tokens / Sec:  3841.0 | Learning Rate: 7.0e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   1.34 | Tokens / Sec:  3894.0 | Learning Rate: 6.9e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   1.53 | Tokens / Sec:  3913.4 | Learning Rate: 6.9e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   1.46 | Tokens / Sec:  3836.5 | Learning Rate: 6.9e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   1.58 | Tokens / Sec:  3928.5 | Learning Rate: 6.8e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   1.68 | Tokens / Sec:  3936.6 | Learning Rate: 6.8e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   1.63 | Tokens / Sec:  3852.7 | Learning Rate: 6.8e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   1.34 | Tokens / Sec:  3870.6 | Learning Rate: 6.7e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   1.43 | Tokens / Sec:  3879.5 | Learning Rate: 6.7e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   1.51 | Tokens / Sec:  4023.7 | Learning Rate: 6.7e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   1.99 | Tokens / Sec:  3892.2 | Learning Rate: 6.6e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   1.39 | Tokens / Sec:  3906.9 | Learning Rate: 6.6e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   1.35 | Tokens / Sec:  3937.1 | Learning Rate: 6.6e-04
| ID | GPU | MEM |
------------------
|  0 | 97% | 50% |
[GPU0] Epoch 4 Validation ====
(tensor(1.5702, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 5 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   1.43 | Tokens / Sec:  4672.0 | Learning Rate: 6.6e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   1.43 | Tokens / Sec:  3889.8 | Learning Rate: 6.5e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   1.60 | Tokens / Sec:  3921.6 | Learning Rate: 6.5e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   1.11 | Tokens / Sec:  3932.6 | Learning Rate: 6.5e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   1.16 | Tokens / Sec:  3952.2 | Learning Rate: 6.4e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   1.21 | Tokens / Sec:  3910.7 | Learning Rate: 6.4e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   1.18 | Tokens / Sec:  3909.1 | Learning Rate: 6.4e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   1.62 | Tokens / Sec:  3869.4 | Learning Rate: 6.4e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   1.39 | Tokens / Sec:  3920.1 | Learning Rate: 6.3e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   1.34 | Tokens / Sec:  3902.5 | Learning Rate: 6.3e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   1.47 | Tokens / Sec:  3931.2 | Learning Rate: 6.3e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   1.54 | Tokens / Sec:  3917.2 | Learning Rate: 6.3e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   1.34 | Tokens / Sec:  3881.8 | Learning Rate: 6.2e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   1.34 | Tokens / Sec:  3950.6 | Learning Rate: 6.2e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   1.41 | Tokens / Sec:  3902.6 | Learning Rate: 6.2e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   1.42 | Tokens / Sec:  3905.2 | Learning Rate: 6.2e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   1.10 | Tokens / Sec:  3884.3 | Learning Rate: 6.1e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   1.14 | Tokens / Sec:  3892.4 | Learning Rate: 6.1e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   1.33 | Tokens / Sec:  3882.2 | Learning Rate: 6.1e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   1.24 | Tokens / Sec:  3949.4 | Learning Rate: 6.1e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   1.40 | Tokens / Sec:  3928.7 | Learning Rate: 6.0e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   1.51 | Tokens / Sec:  3884.4 | Learning Rate: 6.0e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   1.24 | Tokens / Sec:  3864.3 | Learning Rate: 6.0e-04
| ID | GPU | MEM |
------------------
|  0 | 94% | 50% |
[GPU0] Epoch 5 Validation ====
(tensor(1.5052, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 6 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   1.19 | Tokens / Sec:  4634.4 | Learning Rate: 6.0e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   1.22 | Tokens / Sec:  3893.6 | Learning Rate: 6.0e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   1.05 | Tokens / Sec:  3893.4 | Learning Rate: 5.9e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   1.34 | Tokens / Sec:  3938.7 | Learning Rate: 5.9e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   1.20 | Tokens / Sec:  3959.0 | Learning Rate: 5.9e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   1.11 | Tokens / Sec:  3912.3 | Learning Rate: 5.9e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   1.27 | Tokens / Sec:  3883.7 | Learning Rate: 5.9e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   1.31 | Tokens / Sec:  3917.3 | Learning Rate: 5.8e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   1.08 | Tokens / Sec:  3931.7 | Learning Rate: 5.8e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   1.02 | Tokens / Sec:  3919.3 | Learning Rate: 5.8e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   1.21 | Tokens / Sec:  3905.3 | Learning Rate: 5.8e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   1.20 | Tokens / Sec:  3885.1 | Learning Rate: 5.8e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   1.35 | Tokens / Sec:  3884.1 | Learning Rate: 5.7e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   1.26 | Tokens / Sec:  3895.4 | Learning Rate: 5.7e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   1.22 | Tokens / Sec:  3977.4 | Learning Rate: 5.7e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   1.27 | Tokens / Sec:  3860.3 | Learning Rate: 5.7e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   1.03 | Tokens / Sec:  3949.8 | Learning Rate: 5.7e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   1.12 | Tokens / Sec:  3893.4 | Learning Rate: 5.6e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   1.06 | Tokens / Sec:  3867.2 | Learning Rate: 5.6e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   1.35 | Tokens / Sec:  3887.7 | Learning Rate: 5.6e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   1.30 | Tokens / Sec:  3914.9 | Learning Rate: 5.6e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   1.16 | Tokens / Sec:  3876.5 | Learning Rate: 5.6e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   1.16 | Tokens / Sec:  3860.5 | Learning Rate: 5.6e-04
| ID | GPU | MEM |
------------------
|  0 | 93% | 50% |
[GPU0] Epoch 6 Validation ====
(tensor(1.4669, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)
[GPU0] Epoch 7 Training ====
Epoch Step:      1 | Accumulation Step:   1 | Loss:   1.02 | Tokens / Sec:  4269.4 | Learning Rate: 5.5e-04
Epoch Step:     41 | Accumulation Step:   5 | Loss:   1.05 | Tokens / Sec:  3948.1 | Learning Rate: 5.5e-04
Epoch Step:     81 | Accumulation Step:   9 | Loss:   1.01 | Tokens / Sec:  3880.2 | Learning Rate: 5.5e-04
Epoch Step:    121 | Accumulation Step:  13 | Loss:   0.96 | Tokens / Sec:  3897.9 | Learning Rate: 5.5e-04
Epoch Step:    161 | Accumulation Step:  17 | Loss:   1.11 | Tokens / Sec:  3938.5 | Learning Rate: 5.5e-04
Epoch Step:    201 | Accumulation Step:  21 | Loss:   0.93 | Tokens / Sec:  3972.2 | Learning Rate: 5.5e-04
Epoch Step:    241 | Accumulation Step:  25 | Loss:   0.75 | Tokens / Sec:  3882.1 | Learning Rate: 5.4e-04
Epoch Step:    281 | Accumulation Step:  29 | Loss:   1.02 | Tokens / Sec:  3895.9 | Learning Rate: 5.4e-04
Epoch Step:    321 | Accumulation Step:  33 | Loss:   0.82 | Tokens / Sec:  3898.5 | Learning Rate: 5.4e-04
Epoch Step:    361 | Accumulation Step:  37 | Loss:   1.03 | Tokens / Sec:  3897.0 | Learning Rate: 5.4e-04
Epoch Step:    401 | Accumulation Step:  41 | Loss:   1.01 | Tokens / Sec:  3904.6 | Learning Rate: 5.4e-04
Epoch Step:    441 | Accumulation Step:  45 | Loss:   1.11 | Tokens / Sec:  3974.2 | Learning Rate: 5.4e-04
Epoch Step:    481 | Accumulation Step:  49 | Loss:   0.91 | Tokens / Sec:  3911.6 | Learning Rate: 5.3e-04
Epoch Step:    521 | Accumulation Step:  53 | Loss:   1.02 | Tokens / Sec:  3948.5 | Learning Rate: 5.3e-04
Epoch Step:    561 | Accumulation Step:  57 | Loss:   0.87 | Tokens / Sec:  3888.8 | Learning Rate: 5.3e-04
Epoch Step:    601 | Accumulation Step:  61 | Loss:   1.14 | Tokens / Sec:  3915.0 | Learning Rate: 5.3e-04
Epoch Step:    641 | Accumulation Step:  65 | Loss:   0.98 | Tokens / Sec:  3872.0 | Learning Rate: 5.3e-04
Epoch Step:    681 | Accumulation Step:  69 | Loss:   1.11 | Tokens / Sec:  3888.8 | Learning Rate: 5.3e-04
Epoch Step:    721 | Accumulation Step:  73 | Loss:   1.17 | Tokens / Sec:  3896.8 | Learning Rate: 5.3e-04
Epoch Step:    761 | Accumulation Step:  77 | Loss:   0.99 | Tokens / Sec:  3912.5 | Learning Rate: 5.2e-04
Epoch Step:    801 | Accumulation Step:  81 | Loss:   1.09 | Tokens / Sec:  3875.1 | Learning Rate: 5.2e-04
Epoch Step:    841 | Accumulation Step:  85 | Loss:   1.05 | Tokens / Sec:  3933.9 | Learning Rate: 5.2e-04
Epoch Step:    881 | Accumulation Step:  89 | Loss:   1.11 | Tokens / Sec:  3834.6 | Learning Rate: 5.2e-04
| ID | GPU | MEM |
------------------
|  0 | 93% | 50% |
[GPU0] Epoch 7 Validation ====
(tensor(1.4417, device='cuda:0'), <__main__.TrainState object at 0x7a2e01634380>)

Preparing Data ...
Loading Trained Model ...
Checking Model Outputs:

Example 0 ========

Source Text (Input)        : <s> Ein Mann balanciert einen <unk> auf seinem Arm . </s>
Target Text (Ground Truth) : <s> A man is balancing a metal ball on his arm . </s>
Model Output               : <s> A man is balancing a <unk> on his arm . </s>