fairseqの使い方
💡
fairseqを使うときはscriptsの中で作業をする
ディレクトリ構成
.venv/
dataset/
L train/
L train.en
L train.ja
L dev/
L dev.en
L dev.ja
L test/
L test.en
L test.ja
*unigram-corpus/ (SentencePieceから作成するデータセット用のディレクトリ)
L train/
L train.en
L train.ja
L dev/
L dev.en
L dev.ja
L test/
L test.en
L test.ja
*spm-model/ (SentencePiece作成時に作られるmodel用のディレクトリ)
L spm.en
L spm.ja
*fairseq/ (今回作られるfairseqディレクトリ)
L logs/
L results/
L scripts/ (ここで作業する)
インストール
uv環境の構築
uv init uv python pin 3.11 uv venv . .venv/bin/activate
fairseqのインストール
git clone https://github.com/pytorch/fairseq cd fairseq pip install --editable ./
sentencepiece, sacrebleuのインストール
uv add sentencepiece uv add sacrebleu uv add sacrebleu[ja]
モデルの作成とトークナイズ(SentencePiece)
./fairseq/scripts
にmake-dataset.shを作成する。
#!/bin/bash
mkdir -p ../../unigram-corpus
mkdir -p ../../unigram-corpus/train
mkdir -p ../../unigram-corpus/dev
mkdir -p ../../unigram-corpus/test
mkdir -p ../../spm-model
# sentencepiece model の学習
spm_train --input=../../dataset/train/train.ja --model_prefix=../../spm-model/spm.ja --vocab_size=16000 --character_coverage=1.0 --model_type=unigram
spm_train --input=../../dataset/train/train.en --model_prefix=../../spm-model/spm.en --vocab_size=16000 --character_coverage=1.0 --model_type=unigram
for lang in en ja
do
for type in train/train dev/dev test/test
do
spm_encode --model=../../spm-model/spm.$lang.model --output_format=piece < ../../dataset/$type.$lang > ../../unigram-corpus/$type.$lang
done
done
実行
chmod +x make-dataset-JC.sh
./make-dataset-JC.sh
./fairseq/scripts
にpreprocess-baseline-JE.shを作成する。
#!/bin/bash
#SBATCH -J pp-ba-JE #ジョブ名。なんでもよい。
#SBATCH -p opus #指定しなければデフォルトパーテーションはopus、[opus,luce,lepin,ausone,varuna,ganesa,budha,hestia]この中から選ぶ。
#SBATCH -o ../logs/%x_%j.log #標準出力先。この場合[ジョブ名]_[ジョブID].logというファイル名で保存される。
#SBATCH -t 3-00:00:00 #ジョブの実行上限時間を指定。days-hours:minutes:seconds
#SBATCH -c 3 #要求するCPUコア数指定。指定しなければ、1コアが割り当てられる。
#SBATCH --mem=46GB #要求するメモリ量。
#SBATCH --gpus=1 #要求するGPUの枚数。指定しなければGPUは使えない。
#SBATCH --mail-type=ALL #ジョブの開始や終了などメールを受け取ることができる。 値はBEGIN, END, FAIL, ALL。メール送信の際は#を1個を外すこと。
##SBATCH --mail-user=---@ai.cs.ehime-u.ac.jp #メール送信先。メール送信の際は#を1個を外すこと。
TRAIN_DIR=../../unigram-corpus/train
VALID_DIR=../../unigram-corpus/dev
TEST_DIR=../../unigram-corpus/test
fairseq-preprocess \
--trainpref $TRAIN_DIR/train \
--validpref $VALID_DIR/dev \
--testpref $TEST_DIR/test \
--source-lang en --target-lang ja \
--destdir ../../unigram-corpus \
--task translation \
--seed 1
実行
sbatch preprocess-baseline-JE.sh
翻訳とBLEUによる評価
ディレクトリの準備
mkdir -p ../results
訓練
./fairseq/scripts
にtrain-fairseq-baseline-en-ja.shを作成する。
#!/bin/bash
#SBATCH -J TrFbaE2J #ジョブ名。なんでもよい。
#SBATCH -p opus #指定しなければデフォルトパーテーションはopus、[opus,luce,lepin,ausone,varuna,ganesa,budha,hestia]この中から選ぶ。
#SBATCH -o ../logs/%x_%j.log #標準出力先。この場合[ジョブ名]_[ジョブID].logというファイル名で保存される。
#SBATCH -t 3-00:00:00 #ジョブの実行上限時間を指定。days-hours:minutes:seconds
#SBATCH -c 3 #要求するCPUコア数指定。指定しなければ、1コアが割り当てられる。
#SBATCH --mem=46GB #要求するメモリ量。
#SBATCH --gpus=1 #要求するGPUの枚数。指定しなければGPUは使えない。
#SBATCH --mail-type=ALL #ジョブの開始や終了などメールを受け取ることができる。 値はBEGIN, END, FAIL, ALL。メール送信の際は#を1個を外すこと。
##SBATCH --mail-user=---@ai.cs.ehime-u.ac.jp #メール送信先。メール送信の際は#を1個を外すこと。
. ../../.venv/bin/activate
fairseq-train ../../unigram-corpus \
--task translation \
--arch transformer \
--source-lang "en" --target-lang "ja" \
--max-epoch 30 \
--batch-size 128 \
--optimizer adam \
--lr 1e-4 \
--ddp-backend no_c10d \
--seed 1 \
--save-dir ../results/checkpoints \
| tee -a ../results/train.log
評価
./fairseq/scripts
にtest-fairseq-baseline-en-ja.shを作成する。
#!/bin/bash
#SBATCH -J TeFbaE2J #ジョブ名。なんでもよい。
#SBATCH -p opus #指定しなければデフォルトパーテーションはopus、[opus,luce,lepin,ausone,varuna,ganesa,budha,hestia]この中から選ぶ。
#SBATCH -o ../logs/%x_%j.log #標準出力先。この場合[ジョブ名]_[ジョブID].logというファイル名で保存される。
#SBATCH -t 3-00:00:00 #ジョブの実行上限時間を指定。days-hours:minutes:seconds
#SBATCH -c 3 #要求するCPUコア数指定。指定しなければ、1コアが割り当てられる。
#SBATCH --mem=46GB #要求するメモリ量。
#SBATCH --gpus=1 #要求するGPUの枚数。指定しなければGPUは使えない。
#SBATCH --mail-type=ALL #ジョブの開始や終了などメールを受け取ることができる。 値はBEGIN, END, FAIL, ALL。メール送信の際は#を1個を外すこと。
##SBATCH --mail-user=---@ai.cs.ehime-u.ac.jp #メール送信先。メール送信の際は#を1個を外すこと。
. ../../.venv/bin/activate
#英日翻訳
mkdir -p ../results/generate
fairseq-interactive ../../unigram-corpus \
--input ../../unigram-corpus/test/test.en \
--path ../results/checkpoints/checkpoint_best.pt \
--task translation \
--nbest 1 \
> ../results/generate/result.txt
#翻訳結果の文の抽出
grep ^H ../results/generate/result.txt | sort -V | cut -f 3- > ../results/generate/result.sys
# デトークナイズ
spm_decode --model='../../spm-model/spm.ja.model' --input_format=piece < ../results/generate/result.sys > ../results/generate/pred.ja
#BLEUスコア
sacrebleu ../../dataset/test/test.ja -i ../results/generate/pred.ja --tokenize ja-mecab -b
参考文献
Command-line Tools — fairseq 0.12.2 documentation
Fairseq provides several command-line tools for training and evaluating models:
GitHub - mjpost/sacrebleu: Reference BLEU implementation that auto-downloads test sets and reports a version string to facilitate cross-lab comparisons
Reference BLEU implementation that auto-downloads test sets and reports a version string to facilitate cross-lab comparisons - mjpost/sacrebleu
