Reliable, Reproducible, and Really Fast Leaderboards with Evalica
Abstract
自然言語処理(NLP)技術、特に指示調整された大規模言語モデル(LLM)の急速な進歩により、人間と機械のフィードバックを含む現代的な評価プロトコルの開発が急務となっている。我々はEvalicaを紹介する。これは信頼性が高く再現可能なモデルのリーダーボードを作成するためのオープンソースツールキットである。本稿では、その設計を提示し、性能を評価し、さらにWebインターフェース、コマンドラインインターフェース、およびPython APIを通じてその使いやすさを実証する。
1 Introduction
教示調整された大規模言語モデル(LLM)などの高性能な自然言語処理(NLP)手法が示す創発的能力は、健全で信頼性の高い評価プロトコルの開発を促している。初期の手法は静的なデータセットや個別のベンチマークで合理的に評価できたが、現代の手法では人間と機械からのリアルタイムのフィードバックを伴う最新のベンチマークが必要である(Faggioli et al., 2024)。これらのベンチマークは、LMSYS Arena (Chiang et al., 2024)やAlpacaEval (Dubois et al., 2024)プロジェクトによって普及した、ペアワイズ比較リーダーボード(図1)として表現されることが多い。
NLP手法が急速に進化する中、今日の評価手法は多くの場合、計算ノートブックやアドホックなプログラムとして後付けで実装されており、これがエラーや非互換性を引き起こし、再現性と採用を妨げている。ベンチマーキングのエンジニアリング面を改善し、方法論的エラーの数を減らし、結果の交換と解釈を簡素化するために、我々はEvalicaを提示する。これは、信頼性が高く再現可能なNLPモデルベンチマークの作成を容易にし、スピードアップするオープンソースの評価ツールキットであり、111https://github.com/dustalov/evalica現在は選好データに焦点を当てている。クラウドソーシングにおける品質管理のための本番グレードのツール開発における4年間の経験に基づき(Ustalov et al., 2024)、我々は以下の3つの実践的な目標を念頭にEvalicaを構築した:
-
•
一般的な評価手法を幅広いユーザーが利用できるようにする
-
•
提供される実装のパフォーマンスと正確性を確保する
-
•
可能な限り最高の開発者体験を提供する
2 Related Work
研究コミュニティは、Elo (1978)やTrueSkill (Herbrich et al., 2006)のような、ランキングシステムのための様々なツールキットを開発してきた。我々の分析では、これらをいくつかのクラスに区別する。
第一に、専用のリーダーボード構築ツールがある。これにはIFEval Zhou et al. (2023)、LMSYS Arena (Chiang et al., 2024)、Arena-Hard (Li et al., 2024)、AlpacaEval (Dubois et al., 2024)などが含まれる。これらのツールキットは、研究者チームによって特定の新しい評価手法を実装するために作成された。コードは一般的に特定のベンチマークに厳密に合わせて書かれており、ユーザーが自身のデータセットやドメインに適用するには追加の労力が必要である。今日の科学研究の高速なペースにより、テストカバレッジ、コードドキュメンテーション、継続的インテグレーション、データフォーマットの互換性などの一部のソフトウェアエンジニアリングのベストプラクティスが省略されることが多かった。同時に、一部の実装は、元のベンチマークの範囲外であった、より大規模で現実的なデータセットに対して最適とは言えない計算性能を示している。
第二に、ランキングシステムの実装がある。これにはRustパッケージのPropagon222https://github.com/Refefer/propagonとskillrating333https://github.com/atomflunder/skillratings、PythonパッケージのOpenSkill.py (Joshi, 2024)などが含まれる。これらのパッケージは多くの場合、熟練したプログラマーによって正確な実装を提供するために最善の努力で書かれているが、これらの手法は必ずしも自然言語処理評価の現在のベストプラクティスで使用されているものと一致しない。また、Python以外のパッケージは、既存のPythonコードやノートブックと統合するために追加の非trivialな労力が必要である。
最後に、アプリケーション固有のツールキットとして、Elovation、444https://github.com/elovation/elovation ArtistAssistApp、555https://github.com/eugene-khyst/pairwise-comparison そしてCrowd-Kit (Ustalov et al., 2024)がある。これらのツールキットは、主にクラウドソーシングによるアノテーションの形式でユーザー生成コンテンツに対応するために構築されており、多くの場合、自然言語処理評価で使用される方法論に従っていない。
3 Design of Evalica
Evalicaは図1に示す3つのタスクを容易にする。すなわち、評価システムの最適化されたシングルスレッド実装の提供、モデルスコアの信頼区間計算の簡素化、そして可視化のための便利なルーチンの提供である。
図2はEvalicaのアーキテクチャの概要を示している。そのコアには、生データを処理するパフォーマンスが重要なRustのルーチンがある。これらのコアルーチンは、他の言語のアプリケーション開発者のための便利なAPIでラップされている。これらのAPIは、表現をコアルーチンで使用されるインデックス付き形式に変換する役割を担っている。666モデルは通常、llama-3.1-405b-instructやclaude-3-5-sonnet-20240620のような名前を持つ。コンピュータは文字列をそのまま扱うわけではないので、このような名前を対応するインデックス(例:0や1)に変換する必要がある。 コアルーチンの例としては、すべてのランキングアルゴリズムの実装や、勝利行列を構築するためのヘルパールーチンがある。
我々は現在、機械学習における人気のため、Pythonのみをサポートしている。信頼性とプロトタイピングの容易さのために、我々はすべてのメソッドを素朴にPythonでも実装し、Pythonの実装とRustの実装を比較する包括的なテストスイートを構築した。他の言語も(Rustとその言語間のブリッジが存在する限り)比較的容易にサポートでき、コア実装とテストの改善は、すべての派生コードの状態を向上させることになる。
我々は、これらの措置により、セクション1で言及した3つの目標を適切に満たすことができたと考えている。Evalicaは、高性能なコンパイル済みプログラミング言語で対応する実装を提供し、以前開発されたソフトウェアから得られた教訓を活かして開発者の生産性を向上させることで、一般的な評価実践を加速している。
4 Implementation Details
Evalicaは、Chatbot ArenaやArena-Hardなどの人気のあるベンチマークで用いられているスコアリング手法を実装している:Elo (1978)とBradley and Terry (1952)、そして平均勝率である。我々は、これらのベンチマークと同じ結果が得られることを確認した。このパッケージには、固有値法(Bonacich, 1987)、PageRank (Brin and Page, 1998)、Newman (2023)の引き分けを考慮した手法、および単純な投票カウントの実装も含まれている。
Evalicaの実装を呼び出すには(リストA)、左側のオブジェクトのベクトル(xs)、右側のオブジェクトのベクトル(ys)、勝者ラベルのベクトル(winners)、そしてオプションとして、Li et al. (2024)で提案されているスタイル制御のための例の重みのベクトル(weights)を提供する必要がある。勝者ラベルの可能な値は「X won」、「Y won」、「tie」である。すべての手法は、軽量で統一された関数型APIで利用可能である。我々は意図的に、データの表形式に関する仮定を避けることにした。これは、Crowd-Kit (Ustalov et al., 2024)を本番環境で運用した経験から、エラーが発生しやすいデータ変換ステップが必要となり、それを回避できたはずだということが分かったためである。
内部的に、Evalicaはモデル名を操作せず、コアの実装ではモデル名を一意の数値識別子と比較するためのインデックスが必要となる(セクション3で説明)。この操作は短いながらも無視できない時間がかかるため、我々は信頼区間のブートストラップやスコアの再計算を必要とする他のルーチンの際に時間を節約するために、すでに構築されたインデックスを渡す可能性を提供した(リストA)。
APIに加えて、Evalicaは組み込みのWebインターフェースとコマンドラインインターフェースを提供している。例示的な例については付録Aを参照されたい。具体的には、組み込みのWebインターフェースはAbid et al. (2019)による周知の入出力分離パラダイムに従っており、Gradioツールキットを使用して作成された(図4)。777https://www.gradio.app/ コマンドラインインターフェースは、データ操作のためのpandasライブラリ(McKinney, 2010)とPython標準ライブラリで利用可能なツールを使用して開発された(図5)。
スコアとランクを計算した後、比較されたモデル間のペアワイズ勝率を可視化することがしばしば有用である。Chiang et al. (2024)に従い、我々は全てのモデルペアとに対して、Bradley and Terry (1952)による以下の定義を適用した:
ここで、はモデルがモデルに勝つ確率、はモデルのスコア、はモデルのスコアである。
4.1 Correctness and Reliability
我々は、Evalicaにおけるメソッド実装の正確性と信頼性を確保するために、一連の合理的な手段を適用した。第一に、すべてのメソッドをRustとPythonという2つの異なるプログラミング言語で独立して実装した。同じ入力に対する出力がこれらの実装間で一致することを確認した。第二に、Pythonの Hypothesis ライブラリ (MacIver et al., 2019) を用いたプロパティベーステストを採用し、空の入力や不正な入力を含むコーナーケースを列挙してプログラムを破壊しようと試みた。888https://github.com/HypothesisWorks/hypothesis 我々はそのようなケースをすべてカバーし、可能な限り合理的な数値的フォールバックを提供した。第三に、外部ベンチマークからの標準的なスコアと比較して出力を検証した。第四に、テストカバレッジが100%以上であることを確認し、リポジトリの各リビジョンでテストスイートを実行した。
4.2 Governance and Availability
我々は信頼できるオープンソースエコシステムを用いてEvalicaを構築した。EvalicaのソースコードはGitHub上でApache License 2.0の下で公開されていた。999https://github.com/dustalov/evalica 機能リクエストとコード貢献は、それぞれGitHubのIssuesとPull Requests機能を使用して処理された。我々はGitHub Actionsで継続的インテグレーションを使用し、リビジョンごとのチェックを呼び出した。これにはユニットテスト、リンティング、型チェック、テストカバレッジ測定、計算パフォーマンステストが含まれる。テストカバレッジとパフォーマンステストの公開ダッシュボードは、それぞれCodecov101010https://codecov.io/gh/dustalov/evalicaとCodspeed111111https://codspeed.io/dustalov/evalicaで利用可能であった。我々は信頼できる公開アプローチを使用して、Linux、Windows、macOSプラットフォーム向けのPythonパッケージをPyPIにリリースした。121212https://pypi.python.org/pypi/evalica 我々のコンパイルされたパッケージは、安定したCPython ABIの使用により、Python 3.8以降のどのバージョンとも前方互換性がある。また、人気のある科学計算ツール配布であるAnacondaのユーザー向けに、conda-forge上でもEvalicaをリリースした。131313https://anaconda.org/conda-forge/evalica 最後に、開発者向けドキュメントをRead the Docsで公開した。141414https://evalica.readthedocs.io/
5 Performance Tests
我々は、Evalicaにおけるアルゴリズム実装の正確性を確認した後、その実行時間を調査するために2つの一連の計算実験を実施した。まず、一般的なベンチマークにおける現在の実装とEvalicaが提供する実装との間の計算性能の差異を評価した。次に、Evalica内のすべての手法について、コア実装と素朴な実装の性能を比較した。すべての実験は、CPython 3.13.1、NumPy 2.2.0、およびEvalica 0.3.2を使用し、macOS 15.2(Intel® Core™ i5-8500 CPU、32 GB RAM)上で実行された。すべての信頼区間は、10,000サンプルと95%の有意水準を用いたブートストラップ法により構築された。
5.1 Chatbot Arena Experiment
Setup | Time |
---|---|
BT in Evalica | |
Elo in Evalica | |
Elo from Arena-Hard | |
BT from Chatbot Arena |
我々は、2024年8月14日版のChatbot Arenaデータセット(Chiang et al., 2024)を処理する4つのセットアップの性能を評価した。このデータセットには129モデルの170万件の対比較が含まれており、同点は除外されていない。151515https://storage.googleapis.com/arena_external_data/public/clean_battle_20240814_public.json 我々は4つの異なるセットアップを比較した:Chatbot Arenaで使用されている純粋なPythonによるElo (1978)ランキングシステムの実装、Arena-Hardで使用されているscikit-learn (Pedregosa et al., 2011)を用いたPythonによるBradley and Terry (1952)の実装、そしてEvalicaにおけるこれら2つの手法のRust実装である。そのために、我々はモデルリーダーボードでしばしば現れる信頼区間推定の現実的な問題をシミュレートするため、各セットアップを10回実行した。表1に示す結果が示すように、Evalicaのランキング手法の実装は、マルチスレッド処理を全く使用せずに、ベンチマークで現在使用されているものよりも最大46倍優れた性能を示した。これはPythonが解釈型言語であり、Rustがコンパイル型言語であることから予想されたことではあるが、我々はEvalicaの性能と使いやすさの組み合わせにより、同じ時間内でより多くの実験を実行できるようになると考えている。同時に、複数のスレッドで計算を実行すること、例えば1つのサンプリングラウンドを1つのスレッドで処理することで、現代のマルチコアCPUをより有効に活用し、計算時間を何倍も削減することができるであろう。
5.2 Rust vs. Python in Evalica Experiment
Algorithm | Rust | Python |
---|---|---|
Average Win Rate | ||
Bradley–Terry | ||
Counting | ||
Eigenvalue | ||
Elo | ||
Newman | ||
PageRank |
我々は、EvalicaのコアにおけるRustで実装されたすべてのメソッドのパフォーマンスを、Pythonでの素朴な実装と比較して評価した。その名称にもかかわらず、これらのPython実装はNumPy (Harris et al., 2020)を使用して書かれており、NumPyは数値計算のためにCとFortranにおける数十年に及ぶ成功した性能エンジニアリング作業に基づいて構築された高度に最適化されたライブラリである。我々は、LLMFAO (Ustalov, 2023)と呼ばれる小規模なベンチマークからのデータセットを使用した。このデータセットは、2023年10月にクラウドソーシングを用いて収集された59のLLMに対する9,000のペアワイズ比較を含んでいる。表2に示されている結果から分かるように、コア実装と素朴な実装の間の差異は、置換検定によると統計的に有意であった()。しかし、純粋なPython実装で使用された効率的なNumPyルーチンのため、その規模では効果量は顕著ではなかった。重要な例外の一つはEloであり、Rustでの同等の実装は、効率的なコンパイラ最適化により、Pythonよりも96倍以上高速であることが示された。同時に、Rust実装はより小さな実行時間の分散とより予測可能なパフォーマンスを示し、これはより大規模なデータセットで有用であるはずである。
5.3 Scaling on Synthetic Data Experiment
我々は、Evalicaを使用してデータセットサイズと計算時間の関係を分析した。この分析には、Chatbot Arenaから派生した合成データセットを用いた。これは、元のデータセットが既存の選好ベースのNLPデータセットの多くよりも大きかったためである。我々は、101から107ペアまでの7つのデータセットサイズを選択し、各サイズは10倍ずつ増加させた。各サイズについて、Chatbot Arenaから必要な数のペアを復元抽出で10回サンプリングし、時間の変動を調査した。計算時間は、Evalicaで利用可能な手法のRust実装を使用して測定し、ブートストラップ法を用いて95%信頼区間を構築した。図3は、すべての手法においてデータセットサイズと計算時間の関係が線形にスケールすることを示しており、良好なスケーラビリティを示している。しかし、小さな入力サイズでは明確な性能差が見られ、Newman (2023)のような手法は初期段階では遅いものの、入力サイズが増加するにつれて同様のトレンドに収束している。なお、本稿の分析は、実験で使用したChatbot Arenaのバージョンに含まれるモデル数によって制限されていることに留意されたい。
6 Conclusion
我々は、Evalicaが将来のNLPシステムのための信頼性と再現性の高いベンチマークの作成を促進すると考えている。我々は、さらなる研究の方向性として以下のいくつかの可能性を定義する:(1) 実践で広く使用されているより多くのユースケースの実装(信頼区間の構築を標準機能として含め、追加のランキングアルゴリズムを導入する)、(2) さらなるパフォーマンスとメモリの最適化の実現、(3) JavaScriptやRubyを含む、Rustとの相互運用性が高い他の一般的なプログラミング言語のサポート。我々の知る限り、Evalicaは計算性能と数値的信頼性に影響を与える、ドロップインで高速化された選好ベースのベンチマークを提供する最初の試みである。我々は、Evalicaのより広範な採用により、イテレーション時間の短縮、より有用な実験、そしてモデル選択の誤りの減少がもたらされると期待している。
Acknowledgements
我々は、有益なフィードバックを提供してくれた3名の匿名の査読者に感謝の意を表する。また、Evalicaの初期採用者であるVikhrチーム (Nikolich et al., 2024) およびJetBrains AIチームに感謝する。彼らの親切なフィードバックにより、ライブラリの改善が可能となった。なお、このライブラリの正しい発音はeh-vah-lee-tsahであり、これはバルカン半島の典型的な村の名前に似ている。
References
- Abid et al. (2019) Abubakar Abid, Ali Abdalla, Ali Abid, Dawood Khan, Abdulrahman Alfozan, and James Y. Zou. 2019. Gradio: Hassle-Free Sharing and Testing of ML Models in the Wild. Preprint, arXiv:1906.02569.
- Bonacich (1987) Phillip Bonacich. 1987. Power and Centrality: A Family of Measures. American Journal of Sociology, 92(5):1170–1182.
- Bradley and Terry (1952) Ralph Allan Bradley and Milton E. Terry. 1952. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika, 39(3/4):324–345.
- Brin and Page (1998) Sergey Brin and Lawrence Page. 1998. The anatomy of a large-scale hypertextual Web search engine. Computer Networks and ISDN Systems, 30(1):107–117. Proceedings of the Seventh International World Wide Web Conference.
- Chiang et al. (2024) Wei-Lin Chiang, Lianmin Zheng, Ying Sheng, Anastasios Nikolas Angelopoulos, Tianle Li, Dacheng Li, Banghua Zhu, Hao Zhang, Michael Jordan, Joseph E. Gonzalez, and Ion Stoica. 2024. Chatbot Arena: An Open Platform for Evaluating LLMs by Human Preference. In Proceedings of the 41st International Conference on Machine Learning, volume 235 of Proceedings of Machine Learning Research, pages 8359–8388. PMLR.
- Dubois et al. (2024) Yann Dubois, Percy Liang, and Tatsunori Hashimoto. 2024. Length-Controlled AlpacaEval: A Simple Debiasing of Automatic Evaluators. In First Conference on Language Modeling.
- Elo (1978) Arpad E. Elo. 1978. The Rating Of Chess Players, Past & Present. Arco Publishing Inc., New York.
- Faggioli et al. (2024) Guglielmo Faggioli, Laura Dietz, Charles L. A. Clarke, Gianluca Demartini, Matthias Hagen, Claudia Hauff, Noriko Kando, Evangelos Kanoulas, Martin Potthast, Benno Stein, and Henning Wachsmuth. 2024. Who Determines What Is Relevant? Humans or AI? Why Not Both? Communications of the ACM, 67(4):31–34.
- Harris et al. (2020) Charles R. Harris, K. Jarrod Millman, Stéfan J. van der Walt, Ralf Gommers, et al. 2020. Array programming with NumPy. Nature, 585(7825):357–362.
- Herbrich et al. (2006) Ralf Herbrich, Tom Minka, and Thore Graepel. 2006. TrueSkill™: A Bayesian Skill Rating System. In Advances in Neural Information Processing Systems 19, pages 569–576. MIT Press.
- Joshi (2024) Vivek Joshi. 2024. OpenSkill: A faster asymmetric multi-team, multiplayer rating system. Journal of Open Source Software, 9(93):5901.
- Li et al. (2024) Tianle Li, Wei-Lin Chiang, Evan Frick, Lisa Dunlap, Banghua Zhu, Joseph E. Gonzalez, and Ion Stoica. 2024. From Live Data to High-Quality Benchmarks: The Arena-Hard Pipeline.
- MacIver et al. (2019) David R. MacIver, Zac Hatfield-Dodds, et al. 2019. Hypothesis: A new approach to property-based testing. Journal of Open Source Software, 4(43):1891.
- McKinney (2010) Wes McKinney. 2010. Data Structures for Statistical Computing in Python. In Proceedings of the 9th Python in Science Conference, SciPy 2010, pages 56–61.
- Newman (2023) Mark E. J. Newman. 2023. Efficient Computation of Rankings from Pairwise Comparisons. Journal of Machine Learning Research, 24(238):1–25.
- Nikolich et al. (2024) Aleksandr Nikolich, Konstantin Korolev, Artem Shelmanov, and Igor Kiselev. 2024. Vikhr: The Family of Open-Source Instruction-Tuned Large Language Models for Russian. Preprint, arXiv:2405.13929.
- Pedregosa et al. (2011) Fabian Pedregosa, Gaël Varoquaux, Alexandre Gramfort, Vincent Michel, Bertrand Thirion, Olivier Grisel, Mathieu Blondel, Peter Prettenhofer, Ron Weiss, Vincent Dubourg, Jake Vanderplas, Alexandre Passos, David Cournapeau, Matthieu Brucher, Matthieu Perrot, and Édouard Duchesnay. 2011. Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12(85):2825–2830.
- Ustalov (2023) Dmitry Ustalov. 2023. Large Language Model Feedback Analysis and Optimization (LLMFAO). Dataset.
- Ustalov et al. (2024) Dmitry Ustalov, Nikita Pavlichenko, and Boris Tseitlin. 2024. Learning from Crowds with Crowd-Kit. Journal of Open Source Software, 9(96):6227.
- Virtanen et al. (2020) Pauli Virtanen, Ralf Gommers, Travis E. Oliphant, Matt Haberland, Tyler Reddy, et al. 2020. SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python. Nature Methods, 17:261–272.
- Zhou et al. (2023) Jeffrey Zhou, Tianjian Lu, Swaroop Mishra, Siddhartha Brahma, Sujoy Basu, Yi Luan, Denny Zhou, and Le Hou. 2023. Instruction-Following Evaluation for Large Language Models. Preprint, arXiv:2311.07911.
Appendix A Usage Examples
[!ht] {minted}pycon >>> from evalica import elo, pairwise_frame, Winner >>> result = elo( … xs=["pizza", "burger", "pizza"], … ys=["burger", "sushi", "sushi"], … winners=[Winner.X, Winner.Y, Winner.Draw], … ) >>> result.scores pizza 1014.972058 burger 970.647200 sushi 1014.380742 Name: elo, dtype: float64 >>> df_scores = pairwise_frame(result.scores) >>> df_scores # can be used for plotting the pairwise win rate pizza sushi burger pizza 0.500000 0.500003 0.501499 sushi 0.499997 0.500000 0.501496 burger 0.498501 0.498504 0.500000
[!ht] {minted}python # 比較対象のモデルをインデックス化し、各ラウンドでの再インデックス化を避けて時間を節約する *_, index = evalica.indexing( xs=df["model_a"], # モデルAの識別子を含むシリーズ ys=df["model_b"], # モデルBの識別子を含むシリーズ )
bootstrap: list["pd.Series[str]"] = [] # モデル名が文字列であると仮定
for r in range(BOOTSTRAP_ROUNDS): # 再現性のため、ブートストラップラウンドの番号に等しい乱数シードを設定する df_sample = df_arena.sample(frac=1.0, replace=True, random_state=r)
# 与えられたサンプルに対してBradley-Terryスコアを推定する result_sample = evalica.bradley_terry( xs=df_sample["model_a"], ys=df_sample["model_b"], winners=df_sample["winner"], index=index # 上で構築したインデックスを使用して高速化 )
bootstrap.append(result_sample.scores)
# これはBOOTSTRAP_ROUNDS行を持つデータフレームであり、 # 各行はr番目のラウンドにおける各モデルのスコアを表す df_bootstrap = pd.DataFrame(bootstrap)
# これは各比較モデルのスコアの信頼区間を持つデータフレームです # df_bootstrap_ci = pd.DataFrame( "lower": df_bootstrap.quantile(.025), "rating": df_bootstrap.quantile(.5), "upper": df_bootstrap.quantile(.975), ).reset_index(names="model").sort_values("rating", ascending=False)