한국어 Windows OS에서 Marian 기반 일본어 → 한국어 번역 모델을 만들면서 겪은 일들을 남겨둡니다.
내가 썼던 데이터셋에는 각종 보이지않는 유니코드 문자들이 텍스트에 섞여있어서 데이터 전처리와 훈련을 망치게 했었다.
그래서 대충 이런식으로 필요없는 공백과 문제를 일으키는 특문들을 정리했었다.
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 폴더의 내용이 없으면 안됨.
컴파일 과정에서 한국어 인코딩 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()
SentencePiece의 기본 설정(Unigram)으로는 일본어 토크나이징이 제대로 되지 않는 것으로 보인다.
그것 외에도 여러 문제가 있어서 BPE로 진행하고 싶은데, Error: DefaultVocabulary file is expected to contain an entry for
같은 에러가 뜨면서 입력이 되지 않았다.
어떤 이슈에서 어느정도 해결방안이 나와있어서 이렇게 진행했다.
- BPE로 생성된 vocab 파일의 내용은
단어[TAB]키번호
이렇게 이루어져 있을텐데, 텍스트 편집기를 쓰든 코드를 짜든 해서 탭문자와 키 번호를 전부 날리고 단어만 남긴다. - 그러면 결과물로서
<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