BERT日本語モデル事前学習を途中までUbuntuで

やはり途中で生成されたファイルに不備があるのでは、という疑いが晴れないので学習前までのファイル生成をUbuntuでも行ってみる。

 

mecab-neologdのインストール

sudo apt -y install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
最後にyes/noで答えるところが出てくるので、yesと答えると、
/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
にインストールされる。

スクリプト中でmecabの設定ファイルを読み込むところがあるが、パスがうまく取得できないようなので、シンボリックリンクを張る

 

sudo ln -s /etc/mecabrc /usr/local/etc/mecabrc

 

必要なPythonモジュールをインストールする

pip3 install beautifulsoup4 fugashi ipadic==1.0.0 logzero sentencepiece>=0.1.91 tensorflow>=2.3.0 tensorflow-datasets>=3.2.0 tf-models-official==2.3.0 tqdm tokenizers==0.9.2 transformers==3.4.0 unidic==1.0.2 unidic_lite==1.0.7

 

git clone https://github.com/cl-tohoku/bert-japanese.git
git clone https://github.com/google-research/bert.git
cd bert-japanese

Wikiの日本語データをダウンロードする

wget https://dumps.wikimedia.org/other/cirrussearch/current/jawiki-20220117-cirrussearch-content.json.gz

 

たぶんcurrentの下のファイルはどんどん変わり続けるので安定したURLは別途探す必要があるかも

corpusの作成と8つに分割

python make_corpus_wiki.py --input_file jawiki-20220117-cirrussearch-content.json.gz --output_file ./corpus/jawiki-20220117/corpus.txt --min_text_length 10 --max_text_length 200 --mecab_option "-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd"
python merge_split_corpora.py --input_files ./corpus/jawiki-20220117/corpus.txt --output_dir ./corpus/jawiki-20220117 --num_files 8

 

tokenizer訓練のためのファイル作成

cat ./corpus/jawiki-20220117/corpus.txt|grep -v '^$'|shuf|head -n 1000000 > ./corpus/jawiki-20220117/corpus_sampled.txt

 

tokenizer訓練

TOKENIZERS_PARALLELISM=false python train_tokenizer.py --input_files ./corpus/jawiki-20220117/corpus_sampled.txt --output_dir ./tokenizers/jawiki-20220117/wordpiece_unidic_lite --tokenizer_type wordpiece --mecab_dic_type unidic_lite --vocab_size 32768 --limit_alphabet 6129 --num_unused_tokens 10

 

Ubuntuの場合は頭にTOKENIZERS_PARALLELISM=falseをつけないと一向にファイルが読み込まれず、一日経っても0%のままで絶望しかけたが、元のREADME.mdにこれがあるのに気付いてつけたところ順調に読み込み始めた。

 

一文字単位のtokenizer用のデータ作成?

head -n 6144 ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt > ./tokenizers/jawiki-20220117/character/vocab.txt

 

事前訓練用のデータ生成はWindowsと同じはず

今はこれを実行しているところで、完了したところでファイルの中身が同じように成っているかどうかをみてみようと思う

 

python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_01.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_01.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_02.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_02.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_03.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_03.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_04.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_04.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_05.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_05.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_06.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_06.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_07.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_07.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10
python create_pretraining_data.py --input_file ./corpus/jawiki-20220117/corpus_08.txt --output_file ./bert/jawiki-20220117/wordpiece_unidic_lite/pretraining_data/pretraining_data_08.tfrecord.gz --vocab_file ./tokenizers/jawiki-20220117/wordpiece_unidic_lite/vocab.txt --tokenizer_type wordpiece --mecab_dic_type unidic_lite --do_whole_word_mask --gzip_compress --max_seq_length 512 --max_predictions_per_seq 80 --dupe_factor 10

 

ひとまず一つファイルができたところで中身を見てみたところ、

 

$ less pretraining_data_01.tfrecord

"pretraining_data_01.tfrecord" may be a binary file.  See it anyway?

 

とテキストファイルではないと警告され、実際にあけてみるとところどころ読めるテキストあるけれど基本的にはバイナリファイルであった。Windowsでも同じようなファイルができていたから、ここまではどうやら間違っていなかったようだ。そうすると事前学習ステップか・・・。