Skip to content

num_repeats実行時にfew-shot生成器のRNG状態が全リピートで共有される問題を修正 - #297

Open
kiakiraki wants to merge 1 commit into
mainfrom
fix/num-repeats-few-shot-rng
Open

num_repeats実行時にfew-shot生成器のRNG状態が全リピートで共有される問題を修正#297
kiakiraki wants to merge 1 commit into
mainfrom
fix/num-repeats-few-shot-rng

Conversation

@kiakiraki

Copy link
Copy Markdown
Contributor

問題

flexeval_lm --num_repeats N 実行時、maybe_replace_random_seedflexeval/scripts/flexeval_lm.py)は dataclasses.replace の浅いコピーで random_seed のみを差し替えるため、few_shot_generator は全リピートで同一オブジェクトを共有していました。

RandomFewShotGenerator / BalancedFewShotGenerator は永続的な random.Random(seed) を内部に持つため、次の問題が生じます。

  • 各リピートの few-shot 例が、シードではなく実行順序(それまでに同じ生成器から何回サンプリングしたか)に依存する
  • クラッシュ後などに特定のリピートだけ再実行すると、一括実行時と異なる few-shot 文脈(=異なるスコア)になり、再現性が壊れる

なお eval_setup.random_seedlanguage_model.set_random_seed() にのみ流れており、few-shot 生成器の seed とは元々独立です。

修正内容

「リピート毎に異なる few-shot 例」という現状の観測挙動を保ちつつ、シードのみから再現可能にしました。

  • FewShotGeneratorwith_seed_increment(seed_increment) を追加(デフォルトは return self で、FixedFewShotGenerator のような無状態の生成器はそのまま)
  • RandomFewShotGenerator / BalancedFewShotGenerator でオーバーライドし、seed + seed_increment で構築した新インスタンスを返す(dataset は参照共有で deepcopy しない)
  • maybe_replace_random_seed でリピート毎に生成器を差し替え、保存される config の few_shot_generator.init_args.seed も同様に increment(run1/config.json から単体再実行しても同じ few-shot 例が再現される)

run0 は increment=0 なので、--num_repeats 1 の実行と few-shot 例が一致します。LM 側の random_seed + index と同じ意味論です。

テスト

テストファーストで実施し、修正前のコードで回帰テストが fail することを確認済みです(例: 3リピートの生成器の distinct id 数が assert 1 == 3 で fail =全リピートが同一オブジェクトを共有)。

  • with_seed_increment の単体テスト(新インスタンス・dataset 参照共有・シードのみからの再現性・事前サンプリング回数に非依存であることの回帰テスト)を rand / balanced 両方に追加
  • maybe_replace_random_seed / generate_eval_entries のテスト(リピート毎に別インスタンス、config の seed increment、config に seed キーが無い場合の防御動作、few_shot_generator=None や Perplexity setup で無害であること)を追加
  • tests/core/few_show_generator/ + tests/scripts/test_flexeval_lm.py: 81 passed
  • ruff check / ruff format --check: パス

影響範囲

  • --num_repeats >= 2 かつ few-shot 生成器(Random / Balanced)を使う評価のみ。run0 以外の各リピートの few-shot 例が変わります(従来は実行順序依存の非再現な値だったため、シード決定的な値への変化は正しい方向の変化です)
  • --num_repeats 1(デフォルト)の結果は一切変わりません

🤖 Generated with Claude Code

maybe_replace_random_seedはdataclasses.replaceの浅いコピーで
random_seedのみ差し替えるため、few_shot_generatorは全リピートで
同一オブジェクトを共有していた。RandomFewShotGenerator /
BalancedFewShotGeneratorは永続的なrandom.Randomを持つため、
各リピートのfew-shot例がシードではなく実行順序(それまでの
サンプリング回数)に依存し、特定リピートのみの再実行で
一括実行と異なるfew-shot文脈になり再現性が壊れていた。

FewShotGeneratorにwith_seed_incrementを追加し、リピート毎に
seed + incrementで構築した新しい生成器インスタンスに差し替える
(datasetは参照共有)。保存されるconfigのfew_shot_generatorの
seedも同様にincrementし、単一リピートの再実行で同じfew-shot例が
再現されるようにした。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kiakiraki
kiakiraki marked this pull request as ready for review July 19, 2026 02:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant