Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

Optimum Neuronでresume_from_checkpointをするとTypeError None // int

先日の記事のように Optimun Neuronを使うとHuggingFace Trainerを簡単にAWS Neuron上で扱えます。

ですがまだあまり安定していないというのが正直なところです。今回の問題は0.0.23から0.0.25の範囲で確認済みです。記事に書いてしまっていますが、もし良ければちゃんと調査してIssueにしてください(すいません、時間が取れればやりたいと思ってます)。

Optimun Neuronでチェックポイントからの再開時にTypeError

Optimun Neuronでチェックポイントを残しつつ学習し、実際に resume_from_checkpoint=True をつけて再開すると以下の行で TypeError が発生します。

        train_bs_state = trainer_state.train_batch_size // max(1, training_args.n_gpu)

https://github.com/huggingface/transformers/blob/main/src/transformers/trainer.py#L1874

これは trainer_state.train_batch_size にNoneが設定されており、intとの比較でエラーとなっています。呼び出し元はこちら。

            self.compare_trainer_and_checkpoint_args(self.args, self.state)

https://github.com/huggingface/optimum-neuron/blob/v0.0.25/optimum/neuron/trainers.py#L900

Optimun Neuronの0.0.25ではNeuronTrainerの実装を見ても設定する処理がないようです。
https://github.com/huggingface/optimum-neuron/blob/v0.0.25/optimum/neuron/trainers.py

HuggingFace Trainerでは設定しています。
https://github.com/huggingface/transformers/blob/main/src/transformers/trainer.py#L2249

問題のとりあえずの回避方法

かなり雑な回避方法ですが、Optimun NeuronのNeuron Trainerでチェックポイントを今すぐ使いたい人は以下を参考にしてください(ちゃんと本家を修正しましょう。すいません)。この方法では読み込み時に、 training_state の値ではなく指定されたバッチサイズを使っています。

from optimum.neuron import NeuronTrainer

# Avoid a bug that NeuronTrainer does not store batch size to checkpoint
# And it cause None // int TypeError in compare_trainer_and_checkpoint_args.
class Trainer(NeuronTrainer):
    def compare_trainer_and_checkpoint_args(self, training_args, training_state):
        if training_state.train_batch_size is None:
            training_state.train_batch_size = self._train_batch_size
        super().compare_trainer_and_checkpoint_args(training_args, training_state)

バッチサイズの指定が別にならないようにだけは注意してください。

training_state.train_batch_size をちゃんと保存するようにしたかったのですが、良いところで処理を入れられずこう回避しています。

PRを出す人に向けて

個人的なメモでもありますが、PRを出す際はテストを修正して証明するのが手っ取り早いと思います。

ですが現状、Optimun Neuronで resume_from_checkpoint のテストはスキップされているようです。こちらを直してテストが通らないことを説明するのがPR提出のスタートラインになるかと思います。

https://github.com/huggingface/optimum-neuron/blob/v0.0.25/tests/test_trainers.py#L278

おわりに

Optimun Neuronはとても便利ですが、少しまだ不安定な様相も見せています。今後の開発に期待したいのと、同時に僕たちも協力していきたいものです。今回はこの記事に一旦まとめるということでご容赦ください(時間がとれればちゃんと検証してPRします)。

現在、Shodoではアドベントカレンダー応援クーポンを配布しております。80%オフでShodoを最長3ヶ月間使えるクーポンです。以下のクーポンコードをご購入時に入力して、このアドベントカレンダーの季節にShodoのAI校正をブログの執筆にお役立てください。

XMAS2024

shodo.ink

執筆:@hirokiky
Shodoで執筆されました