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

参考文献