본문 바로가기

머신러닝, 딥러닝

Transformer를 사용한 인공 신경망 한영 번역기 코드 예제 실습

Huffon/pytorch-transformer-kor-eng

다음의 깃허브 레파지토리를 따라해보며 실습했습니다.

파이썬 코드로 짜여진 pytorch 기반의 레파지토리인데, 코드들을 코랩으로 옮겨와 코랩에서도 편하게 실행할 수 있도록 코드를 참고해서 만들어보고 싶네요!

일단 오늘은 Readme에 쓰여진 대로 따라서 실습해볼 예정입니다.

 

conda가 설치된 CMD와 vscode 같은 IDE가 있으면 좋습니다.

먼저 해당 레포지토리를 클론 후, 경로를 이동해줍니다.

git clone https://github.com/Huffon/pytorch-transformer-kor-eng.git
cd pytorch-transformer-kor-eng

 

다음으로 가상환경을 만듭니다.

conda create -n nlp python=3.7
conda activate nlp

 

이 레파지토리는 한국어 토큰 처리에 soynlp을 사용합니다.

pip install soynlp

으로 설치해줍니다.

 

Requirements

먼저 관리자 권한으로 cmd를 열고, 

python -m spacy download en_core_web_sm
python -m spacy download en

를 해줘야 오류가 나지 않습니다.

spacy를 사용하면서

[E050] Can't find model 'en'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory. 오류는 정말 자주 나오는 것 같아요.

python -m spacy download en

를 해주고도 "linking failed"란 오류가 나면, CMD를 관리자 권한으로 실행해주면 됩니다.

다음으론 필요 패키지들을 설치해주는데,

이 튜토리얼에서 사용된 torch, torchtext는 다음의 방법으로 설치해야 오류가 나지 않습니다.

pip install torch==1.2.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install Torchtext==0.4.0

 

다음으로는

python build_pickles.py

 

로 한국어, 영어 문장을 토큰화해 학습과 예측에 쓰이도록 합니다. 시간이 꽤 걸리니 차분하게 기다리세요.(로컬 기준)

 

보통 한국어 데이터셋이 영어보다 단어 수를 더 많이 생성해, 다음의 숫자형 변수를 넣어주어 단어 사이즈의 균형을 맞추어 주어야 한다고 합니다.

python build_pickles.py --kor_vocab KOREAN_VOCAB_SIZE --eng_vocab ENGLISH_VOCAB_SIZE

 

학습이 완료되면 다음과 같이 토큰화된 한국어, 영어 데이터가 보입니다.

 

다음으로는

python main.py

파일을 실행시켜 모델을 훈련시킵니다.

이것도 시간이 좀 걸리는데요, 완료되고 나니 GPU 

The model has 82,253,312 trainable parameters

RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 2.00 GiB total capacity; 1.20 GiB already allocated; 12.88 MiB free; 32.02 MiB cached)

제 노트북의 경우에는 GPU가 최대 2기가인데, 1.2기가가 이미 쓰였고 320메가는 캐시에 쓰이고 있다고 합니다.

 

이 문제를 해결하려면 batch 사이즈를 줄이거나, 

torch.cuda.empty_cache()

해당 명령어로 캐시를 비울 수 있습니다.

현재 사용하지 않는 변수를 지우는 것도 좋다고 하네요. 출처

import gc
del variables
gc.collect()

 

config/params.json 폴더에서 원래 128이던 배치 사이즈를 64로 줄여 보았습니다.

이렇게 해도 계속 터져서 코랩 파일로 한땀한땀 옮겨보는 중입니다... 예...