Skip to content

Instantly share code, notes, and snippets.

@sappho192
Created January 8, 2024 22:16
Show Gist options
  • Save sappho192/c695bc4e0345867bffc4ec276825f6f4 to your computer and use it in GitHub Desktop.
Save sappho192/c695bc4e0345867bffc4ec276825f6f4 to your computer and use it in GitHub Desktop.
Notes on training with Marian MT & Tatoeba dataset

한국어 Windows OS에서 Marian 기반 일본어 → 한국어 번역 모델을 만들면서 겪은 일들을 남겨둡니다.

Tatoeba 데이터셋

내가 썼던 데이터셋에는 각종 보이지않는 유니코드 문자들이 텍스트에 섞여있어서 데이터 전처리와 훈련을 망치게 했었다.
그래서 대충 이런식으로 필요없는 공백과 문제를 일으키는 특문들을 정리했었다.
tp.source = line.rstrip().replace("\u200B", "").replace("\u2028","").replace("\u2029","") 특히 HelsinkiNLP/tatoeba 에서 공개한 데이터셋은 윈도우에서 작업된 텍스트 파일이어서인지 줄바꿈 문자가 리눅스와 다르기 때문에, dos2unix로 줄바꿈 문자를 한번 정리해줘야한다.
그러지 않고 리눅스에서 작업한 다른 데이터셋과 병합하면 문제를 일으킬 수 있으니 주의할 것.

컴파일

https://github.com/marian-nmt/marian 에서 ZIP 형태로 받거나 Release 페이지에서 압축파일을 받지 말고, 그냥 git clone으로 받아야 함.
각종 빌드 과정에서 리포의 git 정보를 확인하는 과정이 있기 때문에 .git 폴더의 내용이 없으면 안됨.

CUDA 컴파일

컴파일 과정에서 한국어 인코딩 CP949 때문에 warning(C4220)이 뜨게 되는데, 문제는 Marian의 CMake 설정에서 /WX가 설정되어있기 때문에 컴파일 Warning이 뜨면 아예 빌드 실패로 직행해버린다. 따라서 CMakeLists.txt 파일의 아래 부분을 수정해야 한다. 정확히는 C4220과 C4819 경고를 무시시키면 된다.

  if(USE_SENTENCEPIECE)
    set(DISABLE_GLOBALLY "/wd\"4310\" /wd\"4324\" /wd\"4702\" /wd\"4996\" /wd\"4100\"")
  else()
    set(DISABLE_GLOBALLY "/wd\"4310\" /wd\"4324\" /wd\"4702\" /wd\"4996\"")
  endif()
  if(USE_SENTENCEPIECE)
    set(DISABLE_GLOBALLY "/wd\"4310\" /wd\"4324\" /wd\"4702\" /wd\"4996\" /wd\"4100\" /wd\"4220\" /wd\"4819\"")
  else()
    set(DISABLE_GLOBALLY "/wd\"4310\" /wd\"4324\" /wd\"4702\" /wd\"4996\" /wd\"4220\" /wd\"4819\"")
  endif()

훈련

BPE 기반 Vocabulary 사용하기

SentencePiece의 기본 설정(Unigram)으로는 일본어 토크나이징이 제대로 되지 않는 것으로 보인다.
그것 외에도 여러 문제가 있어서 BPE로 진행하고 싶은데, Error: DefaultVocabulary file is expected to contain an entry for 같은 에러가 뜨면서 입력이 되지 않았다. 어떤 이슈에서 어느정도 해결방안이 나와있어서 이렇게 진행했다.

  1. BPE로 생성된 vocab 파일의 내용은단어[TAB]키번호 이렇게 이루어져 있을텐데, 텍스트 편집기를 쓰든 코드를 짜든 해서 탭문자와 키 번호를 전부 날리고 단어만 남긴다.
  2. 그러면 결과물로서 <unk>,<s>,</s>로 시작하는 평문 텍스트 단어장이 만들어지므로 이걸 입력으로 쓰면 된다.

명령줄

내가 쓴 명령은 다음과 같다: .\spm_train.exe --input="K:\DATASET\fftato\train.jp" --model_prefix=train.jp --vocab_size=60000 --model_type=bpe --max_sentence_length=510

모델 훈련

CTranslate2와 호환되려면 transformer모델만 써야하기 때문에 일단 transformer의 프리셋 중 하나인 --task transformer-base를 사용함.
아래 명령 그대로 쓰면 GPU로 훈련되고, --cpu-threads 4를 달아주면 CPU로 훈련됨. 저 4는 PC 사양에 맞게 적당히 조절할 것.

명령줄

.\marian.exe --task transformer-base -t K:\DATASET\train.jp K:\DATASET\train.ko --vocabs D:\temp\ffjako\train.jp.vocab.marian D:\temp\ffjako\train.ko.vocab.marian

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment