Web Analytics Made Easy - Statcounter

Bouncing ideas 생각 작업실/lexical subclassing

음운론 연구자가 Mac에서 fairseq 쓰려고 도전

sleepy_wug 2023. 12. 11. 08:10

0. 이 글은 무슨 글?

이 글은 이론 음운론 연구자가 음운론적 논증을 하기 위한 과정에서 fairseq에 입문하는 과정을 묘사한다. 이 글의 교훈을 간단히 요약하자면, fairseq 모델 train하는 건 Google colab에서 하는 게 더 빠르지만, training 끝난 모델을 이용하는 데에는 M3 base Macbook Pro가 충분하다는 것. 로컬로 training하는 것보다 Google colab에서 무료로 제공하는 T4 쓰는 게 더 빠르다.

 

주로 실패한 과정을 기록한다. 이렇게 실패한 기록을 하는 것은 다른 사람(e.g., 미래의 나)이 실패하지 않게 하기 위함이다.

 

배경이 되는 간단한 하드웨어 스펙을 적어놓고 시작한다. 

  • Macbook Pro 2023 / M3 (base model) / 16GB RAM

 

와! 사실 나는 오랜시간 Windows PC 유저였기 때문에 스펙을 엄청 상세하게 적어야 하는 것에 익숙해져 있었는데, 애플은 생태계 교통정리가 확실하니 (혹은 하드웨어 경우의 수가 별로 없으니) 스펙 적어놓기가 무척 깔끔해서 좋다.

 

어쨌든 이 글은 주로 맥북프로에서 우당탕탕 좌충우돌하는 이론언어학 연구자의 이야기다.

 

반응형

 

목차

     

    1. 큰 그림

    음운론을 한마디로 말하하면, 궁극적으로 아래 질문에 대답하는 언어학의 연구분과다.

     

    "선형으로 나열된 자질총(feature bundle)을 음운부가 어떻게 조작하는가?"

     

    더보기

    "선형으로 나열된 자질총을 음운부가 어떻게 조작하는가?" 라는 질문을 이리지리 분해해보자.

    "선형으로 나열": 언어에서 뭔가가 선형으로 줄줄이 이어진다는 건, 이성적인 사람이면 누구나 쉽게 받아들일 수 있다.
    "자질총 (feature bundle)": 자질총(자질의 묶음)이 무엇인지, 그 자질총을 구성하는 자질이 무엇인지는 학부에서 배운다. 자질이 실제로 존재한다는 사실은 언어현상을 통해 실증적으로 알 수 있다.
    "음운부": 아쉽게도 "음운부"라는 개념은 axiological하다. 즉, 그냥 논증없이 받아들이는 것이다. 이걸 머리로만 알다가 진심으로 '아 이걸 증명할 수는 없는 것이겠구나' 하고 깨달았던 순간이 있었는데, 그때 조금 숨이 막혔다. 언어현상을 통한 논증은 음운부의 존재와 부재 모두를 증명할 수 있기 때문이다. 음운부가 독립적으로 실재한다는 건 인간의 일반적 "심리기관"/"정신기관"과 별개로 음운현상만을 전담하는 단위가 존재한다는 것을 말한다. 고전적인 촘스키언은 음운부의 실체를 전제한다. 오늘날의 심리언어학이나 Emergent Phonology에서는 음운부의 독립성을 인정하지 않는다. 아직까지는 음운부 자체를 비판하는 연구가 아니라면, 음운론 내부에서는 음운부를 존재하는 것으로 전제한다 (아마도? 혹은 내 주변에서만 그럴지도.ㅋㅋㅋㅋ)

    음운론인데 음운부를 정의할 수 없다니... 뭐, 그러려니 한다. 학문분과 중에서 내부 논리만으로 스스로를 정의할 수 있는 건 철학밖에 없다고도 한다.

     

    음운론 외부의 lexicon 혹은 morphology는 어떠한 자질총의 연쇄(sequence of feature bundles)를 음운부에 던져준다. 음운부는 이를 입력으로 받아들이고 처리하여서 연쇄로 내뱉는다. 그 내뱉은 것을 음성부가 물리적 제스처로 바꿔준다. 이는 말소리라면 혀놀림일 것이고, 수화라면 손짓일 것이다.

     

    음운론은, 음운부가 한다는 이 "처리"가 어떻게 이루어지는 것인지 명시적으로 서술하고 설명하는 것을 목적으로 한다.

     

    기계학습 방법론 용어로 바꾸어보자: 음운론의 목적은 음운부를 sequence to sequence model로 규명하는 것이다. 음운부는 연쇄를 받아들여서 변형한 다음 연쇄로 내보내는 시스템이기 때문이다.

     

    왜 기계학습 방법론을 이용하느냐 하면, 애초에 형식주의 언어학의 근본이 기계적 재현성에 있기 때문이다. 물론 촘스키는 딥러닝의 특히 그 블랙박스적인 부분에 반감을 가지고 있는 듯하지만, 애초에 언어학은 일단 블랙박스를 만든다음 그걸 해명해나가는 과정으로 발전해나갔다. 촘스키 자신도 통사론에서 UG라는 블랙박스를 일단 던져놓고 뒤에 수많은 사람들이 달라붙어서 그걸 원리(Principles)와 매개변인(Parameters)으로 해명해나가는 방식으로 연구 프로그램을 구성하지 않았는가?

     

    또한, 음운론에서 기계학습을 사용해야 하는 이유는, 음운론 그 자체는 물리적 구현으로부터 자유롭기 때문이다. 현대 음운론자들이[각주:1] 모두 수화나 기계학습에 집중하는 이유가 바로 이것이다. 인간의 발화기관이 가지는 한계성이 있다. 예를 들어보자. 개론 수준의 음운론에서, DORSAL 자질 중 [+high]와 [+low]가 동시에 존재할 수 없다고 가르치는데, 이것은 결코 논리적으로 불가능한 것이 아니다. 다만 "혀가 동시에 입천장에 있으면서 입바닥에 있을 수 없음"이라는 생리적인(physiological) 한계 때문이다. 음운론은 이런 생리적인 한계를 제거한 순수한 논리적 시스템을 연구대상으로 해야 한다. 이것이 나를 포함한 음운론의 '일부' 연구자들의 관점이다.

     

    그러면 음운론자랑 NLP연구자들이랑 다를 게 뭐냐 할 수 있는데, NLP연구자들이 기계적 재현성에만 초점을 맞추는 것과 대조적으로 이론 음운론 연구자들은 인간이랑 기계가 다른 부분에 더 집중한다. '학습 데이터에 대한 불투명성'이라고도 하는 부분인데, 기계학습은 학습 데이터에 따라 충실히 예상되는 예측과 생성을 하는 것과 대조적으로 인간은 학습 데이터에 충실하지 않은 학습을 한다. 언어학의 고전에서는 Poverty of Stimulus (인간은 학습데이터가 부족함에도 언어를 습득할 수 있음) 라고도 하고, 아기한테 아무리 언어를 가르치려 해도 언어를 도통 배우지 않았다 하는 일화 등은 개론 교과서에서도 자주 소개된다. 현대 이론에서는 Sour Grape patterns[링크]나 Impossible Languages[링크] 등도 기계랑 인간이 다른 언어기관(언어기관이란게 있다면)을 가졌다는 증거로 인용된다. 이런 언어현상들은 언어데이터가 주어져도 사람은 학습하지 못하는 신기한 현상들이다.

     

    어쨌든 이 글은 오랜만에 "생각 작업실"에 알맞는 글이다. 이론 언어학 연구자가 우왕좌왕 딥러닝 도전하면서 실수하는 이야기이기 때문이다. 내 스스로에게 남기는 메모 같은 것이나 뒤죽박죽이고, 계속 업데이트 될 글이다.

     

    2. Fairseq 튜토리얼 선정

    딥러닝은 나의 분야 밖이기 때문에 Transformer 모델들을 추천 받아 알아보다가, 내 연구주제를 아는 NLP 전공 교수가 fairseq을 추천해서 이용해보기로 했다. Fairseq은 sequence modeling을 위한 PyTorch오픈소스 ToolKit이다. [간단한 소개 링크]

     

     

    튜토리얼로, Warsaw University of Technology의 Mateusz Klimaszewski가 작성한 것을 따라해보기로 했다. [링크] 이것은 fairseq으로 독일어-영어 번역 모델 train하는 튜토리얼이다.

     

    Mateusz Klimaszewski | Fairseq 101 - train a model

    Fairseq 101 - train a model Train your first Fairseq model - tutorial for NLP@WUT class Contents Fairseq SentencePiece Wandb Fairseq is my go-to library when it comes to Neural Machine Translation. The codebase is quite nicely written, and it is easy to mo

    mklimasz.github.io

     

    일단 Google Colab에 있는 IPython Notebook (Jupyter Notebook)을 한단계 한단계씩 실행해보았는데, training하는 지점에서 시간이 너무 많이 소요되어서 자꾸 disconnect되었다. 그래서 로컬로 구현해야겠다는 생각을 했다. 'Apple Silicon M3칩 맛좀 볼까' 하는 생각이 컸다.

     

    Fairseq logo
    Fairseq logo

     

     

    3. Python 3.11 버전 이슈 (3.10로 해결)

    Fairseq-py의 github readme [링크]에 보면 python 3.8 이상을 requirement로 하고 있다. 그래서 나는 자연스럽게 내 맥북의 로컬 conda 의 파이썬 버전인 python 3.11을 선택했다.

     

    실패했다. 이유는 python 3.11에서 dataclass의 field mutability check할 때 hashable object만 받을 수 있도록 바꾸었기 때문이다. 즉, fairseq 버전 0.12.2은 공식적으로 Python 3.8.x부터 3.10.x까지만 호환되는 것.

     

    2023년 12월 현재, fairseq github repo에 이 문제를 해결하는 PR[링크]이 있기 때문에 조만간 해결될 이슈로 보인다.

     

    결국 Python 3.10로 conda environment를 재구성하여서 진행하였다. 3.10에서는 일단은 문제가 없었다.

     

    4. GPU 활용 이슈

    그러나 Python 버전의 문제를 떠나 더 근본적인 문제가 있었으니 Apple Silicon에서는 CUDA를 사용하지 못한다는 것이다.

     

    M1, M2, M3같은 Apple Silicon의 혁신 지점은 cpu와 gpu를 하나의 칩으로 만들었다는 것이다. 하지만 당연하지만 nvidia gpu칩이 안 들어가고, 그래서 CUDA 역시 불가능하다. 인터넷을 계속 검색해봤는데 Apple Silicon에서는 CUDA쓰는 게 불가능하고 Metal이라는 대체 프레임워크가 있다는 것만 알 수 있었다.

     

    Apple silicon as a SOC cihp
    Apple silicon은 SOC

     

    에이 [심한 말] 애플 기기 써서 좋은거라곤  ← 이거 안 깨지고 나오는 거 말고는 없잖아! (애플 기기에서는 애플 로고가 뜸)

     

     

     

    5. CUDA 이슈 해결을 위한 노력

    5.1 cpu만을 이용한 시도

    --cpu flag를 줬는데도 계속 cuda 찾고 앉아있었다. 알고보니 fp16에서 별도로 cuda를 요구하는 것이었다.

     

    fairseq-train의 parameter 설정 중, gpu사용 안하게 만드는 게 분명 있을 것이라는 생각으로, readthedocs documentation[링크]을 한참 읽다가 결국 fp16이 원인이라는 걸 깨달아서 command를 아래와 같이 바꾸어서 했다. --cpu를 넣고 --fp16를 제거한 것이다.

     

    fairseq-train \
            "bin" \
            --cpu \
            --arch transformer_wmt_en_de \
            --share-all-embeddings \
            --optimizer adam \
            --adam-betas '(0.9, 0.98)' \
            --clip-norm 0.0 \
            --lr 5e-4 \
            --lr-scheduler inverse_sqrt \
            --warmup-updates 4000 \
            --warmup-init-lr 1e-07 \
            --dropout 0.1 \
            --weight-decay 0.0 \
            --criterion label_smoothed_cross_entropy \
            --label-smoothing 0.1 \
            --save-dir "model_output_mac" \
            --log-format json \
            --log-interval 100 \
            --max-tokens 8000 \
            --max-epoch 100 \
            --patience 5 \
            --seed 3921 \
            --eval-bleu \
            --eval-bleu-args '{"beam": 5, "max_len_a": 1.2, "max_len_b": 10}' \
            --eval-bleu-detok space \
            --eval-bleu-remove-bpe sentencepiece \
            --eval-bleu-print-samples \
            --best-checkpoint-metric bleu \
            --maximize-best-checkpoint-metric

     

    하지만 속도가 너무 느렸다. 밤새도록 했는데도 epoch를 12인가 13정도까지밖에 못했다.

     

    따라서 gpu를 사용하는 방법이 반드시 필요했다. nvidia gpu가 없는 대신 Apple Silicon에는 metal 이라는 프레임워크가 있다고 했다. 관련하여 검색을 계속하다가 결국 답은 출발점, 즉 fairseq-py의 documentation에 있었다.[링크] 역시 등잔밑이 어둡다더니 😢.

     

    5.2 재시도

    pip install했던 fairseq, torch, 그리고 torchaudio를 제거했다. 아예 새출발하는 느낌으로 천천히 쌓아올리기로 한것이다.

     

    우선 pip uninstall fairseq 하여 fairseq을 제거했다. 이어서 pip uninstall torchpip uninstall torchaudio

     

    패키지 다시 설치할 때는 Apple 홈페이지의 예시를 그대로 따라 torch와 torchaudio의 nightly version을 설치했다.

    그리고 그 위에 fairseq를 설치했는데, github repo의 readme.md에서 예시된 대로 소스코드를 git clone한 다음 재설치했다. fairseq 버전은 여전히 0.12.2

     

    문제는 여전히 해결이 되지 않았다. 있지도 않은 CUDA를 찾고 앉아있는 에러가 그대로이다.

     

    Error log를 다시 보았다. 여전히 fp16의 문제였다. 구체적으로 말하자면 아래에서 빨갛게 표시된 부분에서 fairseq이 torch의 method를 function call하는데, 아예 torch.cuda.current_device()를 calling한다는 점이 문제의 원인이다. torch 입장에서는 CUDA 안쓰는데 뭔소리냐 하고 exception을 raise하는 것이고..

     

    결국 --cpu 빼고 --fp16 flag도 빼면 될 일이다. 결국 아래와 같다.

     

    fairseq-train \
            "bin" \
            --arch transformer_wmt_en_de \ 
            --share-all-embeddings \
            --optimizer adam \
            --adam-betas '(0.9, 0.98)' \
            --clip-norm 0.0 \
            --lr 5e-4 \
            --lr-scheduler inverse_sqrt \
            --warmup-updates 4000 \
            --warmup-init-lr 1e-07 \
            --dropout 0.1 \
            --weight-decay 0.0 \
            --criterion label_smoothed_cross_entropy \
            --label-smoothing 0.1 \
            --save-dir "model_output" \
            --log-format json \
            --log-interval 100 \
            --max-tokens 8000 \
            --max-epoch 10 \
            --patience 5 \
            --seed 3921 \
            --eval-bleu \
            --eval-bleu-args '{"beam": 5, "max_len_a": 1.2, "max_len_b": 10}' \
            --eval-bleu-detok space \
            --eval-bleu-remove-bpe sentencepiece \
            --eval-bleu-print-samples \
            --best-checkpoint-metric bleu \
            --maximize-best-checkpoint-metric

     

     

    일단 아래의 log를 보면 이제 GPU를 사용하기는 하는 듯하다. 뜬금없이 Google의 TPU (Tensor Processing Units) 사용할 리는 없으니.

     

     

    6. 차라리 Google Colab 무료 GPU가 더 빨라

    그러나 여전히 training에는 시간이 너무 오래 걸리고 있다. 아래에 제시한 log에서 알 수 있듯이, 한 epoch 돌리는 데에도 여전히 시간이 엄청 걸린다.

     

    2024-02-07 15:06:54 | INFO | train_inner | {"epoch": 1, "update": 0.144, "loss": "11.919", "nll_loss": "11.606", "ppl": "3118.16", "wps": "1726.4", "ups": "0.24", "wpb": "7061.4", "bsz": "192.3", "num_updates": "200", "lr": "2.5095e-05", "gnorm": "1.538", "train_wall": "408", "wall": "848"}
    2024-02-07 15:13:26 | INFO | train_inner | {"epoch": 1, "update": 0.216, "loss": "10.98", "nll_loss": "10.53", "ppl": "1478.17", "wps": "1744.2", "ups": "0.26", "wpb": "6838", "bsz": "213.7", "num_updates": "300", "lr": "3.75925e-05", "gnorm": "1.516", "train_wall": "391", "wall": "1240"}
    2024-02-07 15:19:55 | INFO | train_inner | {"epoch": 1, "update": 0.288, "loss": "10.637", "nll_loss": "10.096", "ppl": "1094.69", "wps": "1730.1", "ups": "0.26", "wpb": "6730", "bsz": "178.1", "num_updates": "400", "lr": "5.009e-05", "gnorm": "1.346", "train_wall": "388", "wall": "1629"}
    2024-02-07 15:26:09 | INFO | train_inner | {"epoch": 1, "update": 0.359, "loss": "10.454", "nll_loss": "9.866", "ppl": "933.24", "wps": "1755.8", "ups": "0.27", "wpb": "6567", "bsz": "179.9", "num_updates": "500", "lr": "6.25875e-05", "gnorm": "1.474", "train_wall": "373", "wall": "2003"}
    2024-02-07 15:32:51 | INFO | train_inner | {"epoch": 1, "update": 0.431, "loss": "10.258", "nll_loss": "9.635", "ppl": "795.35", "wps": "1807", "ups": "0.25", "wpb": "7269.9", "bsz": "203.5", "num_updates": "600", "lr": "7.5085e-05", "gnorm": "1.389", "train_wall": "402", "wall": "2405"}
    2024-02-07 15:39:36 | INFO | train_inner | {"epoch": 1, "update": 0.503, "loss": "10.027", "nll_loss": "9.369", "ppl": "661.31", "wps": "1698", "ups": "0.25", "wpb": "6870.1", "bsz": "211.4", "num_updates": "700", "lr": "8.75825e-05", "gnorm": "1.642", "train_wall": "404", "wall": "2810"}
    2024-02-07 15:46:16 | INFO | train_inner | {"epoch": 1, "update": 0.575, "loss": "9.772", "nll_loss": "9.078", "ppl": "540.61", "wps": "1754.5", "ups": "0.25", "wpb": "7019.2", "bsz": "214.6", "num_updates": "800", "lr": "0.00010008", "gnorm": "1.41", "train_wall": "400", "wall": "3210"}
    2024-02-07 15:53:02 | INFO | train_inner | {"epoch": 1, "update": 0.647, "loss": "9.606", "nll_loss": "8.884", "ppl": "472.45", "wps": "1746", "ups": "0.25", "wpb": "7081.6", "bsz": "201", "num_updates": "900", "lr": "0.000112578", "gnorm": "1.637", "train_wall": "405", "wall": "3616"}
    2024-02-07 16:00:25 | INFO | train_inner | {"epoch": 1, "update": 0.719, "loss": "9.381", "nll_loss": "8.626", "ppl": "395.08", "wps": "1567.3", "ups": "0.23", "wpb": "6946.3", "bsz": "215.4", "num_updates": "1000", "lr": "0.000125075", "gnorm": "1.368", "train_wall": "443", "wall": "4059"}

     

     

    하도 속이 터져서 돌아가는 도중에 Google colab에서 같은 코드를 실행하였다. Runtime type은 Google에서 무료로 제공해주는 T4 GPU. 

     

     

    튜토리얼 돌리는 데 굳이 돈주고 compute unit을 살 필요는 없다고 생각했고 잘 돌아가는지만 확인하면 되었기 때문에 그냥 T4 썼다. 돈을 내면 A100, V100 이용 가능하다. 나는 Colab Pro 구독하지만 일주일만에 100 compute units 다 써버렸다.ㅠㅠ[각주:2] 

     

    어쨌든, T4로도 같은 코드를 돌렸는데, 이쪽도 여전히 train중이다. 그런데 아래 log를 보면 알겠지만, 로컬로 맥북에서 돌리는 것보다 훨씬!!! 빠르다. 1 epoch에 6분씩 공무원처럼 진행중이다. 물론 gradient overflow 문제 때문에 이 training 중단하고 다시해야 하는 게 맞지만, 어짜피 리소스 무료이니 그냥 계속 돌리고 있다.

     

    2024-02-07 23:49:02 | INFO | fairseq_cli.train | task: TranslationTask
    2024-02-07 23:49:02 | INFO | fairseq_cli.train | model: TransformerModel
    2024-02-07 23:49:02 | INFO | fairseq_cli.train | criterion: LabelSmoothedCrossEntropyCriterion
    2024-02-07 23:49:02 | INFO | fairseq_cli.train | num. shared model params: 71,232,512 (num. trained: 71,232,512)
    2024-02-07 23:49:02 | INFO | fairseq_cli.train | num. expert model params: 0 (num. trained: 0)
    2024-02-07 23:49:02 | INFO | fairseq.data.data_utils | loaded 1,000 examples from: bin/valid.en-de.en
    2024-02-07 23:49:02 | INFO | fairseq.data.data_utils | loaded 1,000 examples from: bin/valid.en-de.de
    2024-02-07 23:49:02 | INFO | fairseq.tasks.translation | bin valid en-de 1000 examples
    2024-02-07 23:49:02 | INFO | fairseq.trainer | detected shared parameter: encoder.embed_tokens.weight <- decoder.embed_tokens.weight
    2024-02-07 23:49:02 | INFO | fairseq.trainer | detected shared parameter: encoder.embed_tokens.weight <- decoder.output_projection.weight
    2024-02-07 23:49:02 | INFO | fairseq.utils | ***********************CUDA enviroments for all 1 workers***********************
    2024-02-07 23:49:02 | INFO | fairseq.utils | rank   0: capabilities =  7.5  ; total memory = 14.748 GB ; name = Tesla T4                                
    2024-02-07 23:49:02 | INFO | fairseq.utils | ***********************CUDA enviroments for all 1 workers***********************
    2024-02-07 23:49:02 | INFO | fairseq_cli.train | training on 1 devices (GPUs/TPUs)
    2024-02-07 23:49:02 | INFO | fairseq_cli.train | max tokens per device = 8000 and max sentences per device = None
    2024-02-07 23:49:02 | INFO | fairseq.trainer | Preparing to load checkpoint model_output/checkpoint_last.pt
    2024-02-07 23:49:02 | INFO | fairseq.trainer | No existing checkpoint found model_output/checkpoint_last.pt
    2024-02-07 23:49:02 | INFO | fairseq.trainer | loading train data for epoch 1
    2024-02-07 23:49:02 | INFO | fairseq.data.data_utils | loaded 294,498 examples from: bin/train.en-de.en
    2024-02-07 23:49:02 | INFO | fairseq.data.data_utils | loaded 294,498 examples from: bin/train.en-de.de
    2024-02-07 23:49:02 | INFO | fairseq.tasks.translation | bin train en-de 294498 examples
    2024-02-07 23:49:04 | INFO | fairseq.data.iterators | grouped total_num_itrs = 1392
    2024-02-07 23:49:04 | INFO | fairseq.trainer | begin training epoch 1
    2024-02-07 23:49:04 | INFO | fairseq_cli.train | Start iterating over samples
    /usr/local/lib/python3.10/dist-packages/torch/nn/functional.py:5076: UserWarning: Support for mismatched key_padding_mask and attn_mask is deprecated. Use same type for both instead.
      warnings.warn(
    2024-02-07 23:49:05 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 64.0
    2024-02-07 23:49:07 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 32.0
    2024-02-07 23:49:28 | INFO | train_inner | {"epoch": 1, "update": 0.073, "loss": "13.187", "nll_loss": "13.016", "ppl": "8284.42", "wps": "31555.3", "ups": "4.48", "wpb": "7053.8", "bsz": "206.8", "num_updates": "100", "lr": "1.25975e-05", "gnorm": "3.526", "loss_scale": "32", "train_wall": "23", "gb_free": "10.6", "wall": "25"}
    2024-02-07 23:49:50 | INFO | train_inner | {"epoch": 1, "update": 0.145, "loss": "11.916", "nll_loss": "11.604", "ppl": "3112.29", "wps": "31795.9", "ups": "4.53", "wpb": "7023", "bsz": "189.8", "num_updates": "200", "lr": "2.5095e-05", "gnorm": "1.536", "loss_scale": "32", "train_wall": "22", "gb_free": "10.9", "wall": "47"}
    2024-02-07 23:50:12 | INFO | train_inner | {"epoch": 1, "update": 0.217, "loss": "10.986", "nll_loss": "10.536", "ppl": "1485.05", "wps": "30296.7", "ups": "4.4", "wpb": "6885.9", "bsz": "212.9", "num_updates": "300", "lr": "3.75925e-05", "gnorm": "1.493", "loss_scale": "32", "train_wall": "22", "gb_free": "11.6", "wall": "70"}
    2024-02-07 23:50:36 | INFO | train_inner | {"epoch": 1, "update": 0.289, "loss": "10.629", "nll_loss": "10.087", "ppl": "1087.92", "wps": "28591.7", "ups": "4.19", "wpb": "6817.6", "bsz": "179.7", "num_updates": "400", "lr": "5.009e-05", "gnorm": "1.317", "loss_scale": "32", "train_wall": "23", "gb_free": "10.7", "wall": "94"}
    2024-02-07 23:51:01 | INFO | train_inner | {"epoch": 1, "update": 0.361, "loss": "10.447", "nll_loss": "9.859", "ppl": "928.56", "wps": "26884.7", "ups": "4.12", "wpb": "6519.7", "bsz": "182.8", "num_updates": "500", "lr": "6.25875e-05", "gnorm": "1.525", "loss_scale": "32", "train_wall": "24", "gb_free": "10.5", "wall": "118"}
    2024-02-07 23:51:25 | INFO | train_inner | {"epoch": 1, "update": 0.432, "loss": "10.264", "nll_loss": "9.641", "ppl": "798.55", "wps": "29423.3", "ups": "4.08", "wpb": "7209.4", "bsz": "202.3", "num_updates": "600", "lr": "7.5085e-05", "gnorm": "1.39", "loss_scale": "32", "train_wall": "24", "gb_free": "10.5", "wall": "143"}
    2024-02-07 23:51:49 | INFO | train_inner | {"epoch": 1, "update": 0.504, "loss": "10.028", "nll_loss": "9.371", "ppl": "662.18", "wps": "28658.8", "ups": "4.2", "wpb": "6830.3", "bsz": "211.1", "num_updates": "700", "lr": "8.75825e-05", "gnorm": "1.647", "loss_scale": "32", "train_wall": "23", "gb_free": "11", "wall": "167"}
    2024-02-07 23:52:14 | INFO | train_inner | {"epoch": 1, "update": 0.576, "loss": "9.81", "nll_loss": "9.12", "ppl": "556.35", "wps": "28587.5", "ups": "4.05", "wpb": "7063.4", "bsz": "213.9", "num_updates": "800", "lr": "0.00010008", "gnorm": "1.593", "loss_scale": "32", "train_wall": "24", "gb_free": "10.5", "wall": "191"}
    2024-02-07 23:52:38 | INFO | train_inner | {"epoch": 1, "update": 0.648, "loss": "9.586", "nll_loss": "8.862", "ppl": "465.35", "wps": "28675.4", "ups": "4.09", "wpb": "7006.7", "bsz": "201.8", "num_updates": "900", "lr": "0.000112578", "gnorm": "1.509", "loss_scale": "32", "train_wall": "24", "gb_free": "10.9", "wall": "216"}
    2024-02-07 23:53:02 | INFO | train_inner | {"epoch": 1, "update": 0.72, "loss": "9.395", "nll_loss": "8.641", "ppl": "399.2", "wps": "28964.8", "ups": "4.14", "wpb": "7000.3", "bsz": "213.1", "num_updates": "1000", "lr": "0.000125075", "gnorm": "1.4", "loss_scale": "32", "train_wall": "24", "gb_free": "10.5", "wall": "240"}
    2024-02-07 23:53:26 | INFO | train_inner | {"epoch": 1, "update": 0.792, "loss": "9.19", "nll_loss": "8.404", "ppl": "338.62", "wps": "29534", "ups": "4.14", "wpb": "7136.1", "bsz": "220.1", "num_updates": "1100", "lr": "0.000137573", "gnorm": "1.488", "loss_scale": "32", "train_wall": "24", "gb_free": "10.6", "wall": "264"}
    2024-02-07 23:53:51 | INFO | train_inner | {"epoch": 1, "update": 0.864, "loss": "9.077", "nll_loss": "8.27", "ppl": "308.63", "wps": "28483.6", "ups": "4.09", "wpb": "6962", "bsz": "200.9", "num_updates": "1200", "lr": "0.00015007", "gnorm": "1.55", "loss_scale": "32", "train_wall": "24", "gb_free": "10.5", "wall": "288"}
    2024-02-07 23:54:15 | INFO | train_inner | {"epoch": 1, "update": 0.935, "loss": "8.876", "nll_loss": "8.038", "ppl": "262.89", "wps": "29138", "ups": "4.07", "wpb": "7153.4", "bsz": "229", "num_updates": "1300", "lr": "0.000162568", "gnorm": "1.327", "loss_scale": "32", "train_wall": "24", "gb_free": "11.1", "wall": "313"}
    2024-02-07 23:54:18 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 16.0
    2024-02-07 23:54:19 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 8.0
    2024-02-07 23:54:37 | INFO | fairseq_cli.train | begin validation on "valid" subset
    2024-02-07 23:54:38 | INFO | fairseq.tasks.translation | example hypothesis: In der Welt ist die Welt in der Welt.
    2024-02-07 23:54:38 | INFO | fairseq.tasks.translation | example reference: Überall in der Welt feiert die Verschleierung ein Comeback.
    2024-02-07 23:54:39 | INFO | fairseq.tasks.translation | example hypothesis: Es gibt, dass sie sich mit der Lage haben, wie sie sich zu tun, wie sie sich zu tun.
    2024-02-07 23:54:39 | INFO | fairseq.tasks.translation | example reference: Mehr und mehr interpretieren irakische Mädchen alles, was ihnen gegeben wird, als einen Weg, Sex mit ihnen zu haben.
    2024-02-07 23:54:40 | INFO | fairseq.tasks.translation | example hypothesis: Das Problem ist, dass dies zu einer unwahrscheinlich ist.
    2024-02-07 23:54:40 | INFO | fairseq.tasks.translation | example reference: Die Symptome sind erkennbar, auch wenn die Krankheit noch nicht den ganzen Körper befallen hat.
    2024-02-07 23:54:41 | INFO | fairseq.tasks.translation | example hypothesis: Das Problem ist, dass dies, dass die USA und die USA, dass sie sich in der Lage ist.
    2024-02-07 23:54:41 | INFO | fairseq.tasks.translation | example reference: Der Schleier und die Schlachten um ihn stehen auch für einen Kulturkrieg, der auf unangemessene Weise auf den Körpern der Frauen ausgetragen wird.
    2024-02-07 23:54:42 | INFO | fairseq.tasks.translation | example hypothesis: Es gibt, dass sie sich nicht mehr als auch mehr als auch mehr als auch mehr als dies, als sie sind.
    2024-02-07 23:54:42 | INFO | fairseq.tasks.translation | example reference: Nachdem der Tod Sartre und Aron verstummen ließ, erinnert man sich an sie eher aufgrund der Einstellungen, die sie allem entgegenbrachten, worüber sie schrieben, als aufgrund dessen, was sie eigentlich sagten.
    2024-02-07 23:54:43 | INFO | fairseq.tasks.translation | example hypothesis: In der Tat ist es mit einer neuen Welt.
    2024-02-07 23:54:43 | INFO | fairseq.tasks.translation | example reference: Sartre und Aron begannen ihre 50-jährige Bekanntschaft mit einer gemeinsamen französischen Elite-Ausbildung, zu der ein Studienaufenthalt in Deutschland vor dem Aufkommen des Nationalsozialismus gehörte.
    2024-02-07 23:54:45 | INFO | fairseq.tasks.translation | example hypothesis: In diesem Fall werden die meisten Menschen in den letzten Jahren, wodurch sie werden, wodurch sie werden.
    2024-02-07 23:54:45 | INFO | fairseq.tasks.translation | example reference: Oder die Zentralbank lässt die Märkte machen, was sie wollen – und zieht sich damit den Zorn der Unternehmen, der Arbeiter, der übrigen staatlichen Organe und praktisch aller mit Ausnahme bestimmter Finanztypen zu.
    2024-02-07 23:54:46 | INFO | fairseq.tasks.translation | example hypothesis: In den letzten Jahren ist es nicht nur nur nur eine Reihe, sondern auch in den Vereinigtenerhalb der Eurozone, sondern auch in den letzten Jahren.
    2024-02-07 23:54:46 | INFO | fairseq.tasks.translation | example reference: Und was zunächst ein kleiner Betriebsumfall im Prozess der Kapitalakkumulation war, hat sich in eine anhaltende Investitionslücke verwandelt – was einen geringeren Kapitalstock und ein geringeres reales BIP-Niveau nicht nur heute (wo die Erholung noch unvollständig ist), sondern möglicherweise noch für Jahrzehnte bedeutet.
    2024-02-07 23:54:48 | INFO | fairseq.tasks.translation | example hypothesis: In den letzten Jahren haben sich dies, dass die USA in den Vereinigtenerhalb der Lage sind, dass sie sich in den Vereinigtenerhalb der Lage werden.
    2024-02-07 23:54:48 | INFO | fairseq.tasks.translation | example reference: Romney ging noch weiter und behauptete, Obama wolle Steuererhöhungen von 4.000 Dollar für Steuerzahler mittleren Einkommens einführen und „die Sozialreform durch Entfall der Arbeitsanforderungen aushöhlen”. Außerdem soll Chrysler, einst von der Regierung Obama gerettet, die Jeep-Produktion nach China verlagern.
    2024-02-07 23:54:50 | INFO | fairseq.tasks.translation | example hypothesis: Es ist nicht, dass wir uns in der Welt, dass wir in der Welt, dass die Welt in der Welt in der Welt, dass die Welt in der Welt, dass die Welt in der Welt in der Welt, die die wir in der Welt, die die wir innerhalb der Welt zu tun, die Welt zu tun.
    2024-02-07 23:54:50 | INFO | fairseq.tasks.translation | example reference: Er war der Ansicht, dass es wichtig sei, sich der Tatsache unseres bedeutungslosen Platzes innerhalb des Universums zu stellen, weil er nicht wollte, dass wir mit der behaglichen Illusion eines Glaubens leben, dass die Welt irgendwie unseretwegen geschaffen worden sei und wir uns in der wohlmeinenden Obhut eines allmächtigen Schöpfers befänden. „Dreams and Facts“ schließt mit den ergreifenden Worten: „Niemand ist von Furcht befreit, der es nicht wagt, seinen Platz auf der Welt so zu sehen, wie er ist; niemand kann die Größe, zu welcher er fähig ist, erreichen, bis er es sich selbst gestattet, seine eigene Kleinheit zu sehen.“
    2024-02-07 23:54:50 | INFO | valid | {"epoch": 1, "valid_loss": "8.678", "valid_nll_loss": "7.795", "valid_ppl": "222.08", "valid_bleu": "0.91", "valid_wps": "2858.9", "valid_wpb": "3471.7", "valid_bsz": "100", "valid_num_updates": "1388"}
    2024-02-07 23:54:50 | INFO | fairseq.checkpoint_utils | Preparing to save checkpoint for epoch 1 @ 1388 updates
    2024-02-07 23:54:50 | INFO | fairseq.trainer | Saving checkpoint to /content/model_output/checkpoint1.pt
    2024-02-07 23:54:54 | INFO | fairseq.trainer | Finished saving checkpoint to /content/model_output/checkpoint1.pt
    2024-02-07 23:55:13 | INFO | fairseq.checkpoint_utils | Saved checkpoint model_output/checkpoint1.pt (epoch 1 @ 1388 updates, score 0.91) (writing took 23.250306338999962 seconds)
    2024-02-07 23:55:13 | INFO | fairseq_cli.train | end of epoch 1 (average epoch stats below)
    2024-02-07 23:55:13 | INFO | train | {"epoch": 1, "train_loss": "10.163", "train_nll_loss": "9.536", "train_ppl": "742.22", "train_wps": "26311.4", "train_ups": "3.77", "train_wpb": "6974.6", "train_bsz": "211.7", "train_num_updates": "1388", "train_lr": "0.000173565", "train_gnorm": "1.664", "train_loss_scale": "8", "train_train_wall": "326", "train_gb_free": "10.5", "train_wall": "371"}
    2024-02-07 23:55:14 | INFO | fairseq.data.iterators | grouped total_num_itrs = 1392

     

     

    결론은 그냥 Google Colab 쓰자. 무료 플랜이더라도 맥북프로로 하는 것보다 훨 낫다.

    1. 음성음운론자를 제외하고는 [본문으로]
    2. 사실상 돈 많아야 할 수 있는 연구방법론인 듯하다.ㅋㅋ [본문으로]
    반응형