13. ベンチマークを自分で動かしてみよう!スコアの再現方法

スポンサーリンク

前回のレッスンで、リーダーボードの見方やモデルの比較方法を学びましたよね。「このモデルは数学が得意」とか「こっちはコーディングが強い」みたいなことが、スコアから読み取れるようになったと思います。

でも、「このスコアって本当なの?」って思ったことありませんか?今回は、そのスコアを自分で再現してみる実践演習をやってみましょう!Google Colabを使って、Hugging Face Leaderboardと同じベンチマークを実際に動かしてみるんです。

なぜベンチマークを自分で再現するの?

「リーダーボードを見れば十分じゃない?」って思うかもしれませんね。でも、自分でベンチマークを実行すると、こんな良いことがあるんです:

  1. スコアの意味が本当に理解できる:数字を見るだけじゃなくて、どうやって計算されるのか体験できます
  2. 自分でファインチューニングした後に使える:モデルをカスタマイズした後、「本当に改善したの?」を確認できます
  3. 透明性と信頼性:公開された結果を自分で検証できるって、科学的でいいですよね

今回使うのは「lm-evaluation-harness(エルエム・エバリュエーション・ハーネス)」という、Hugging Faceが実際に使っているのと同じオープンソースツールです。つまり、公式と全く同じ条件でテストできるってわけ!

今回使うベンチマーク:tinyGSM8K

GSM8Kは「Grade School Math 8K」の略で、小学校レベルの算数問題8,000問を集めたデータセットです。「tinyGSM8K」はその軽量版。

例えばこんな問題:「Roryはサブサンドイッチを2つ(各7.50ドル)、ポテトチップスを2袋(各1.50ドル)、クッキーを2つ(各1.00ドル)注文しました。配達料が20%かかり、チップとして5ドル払いたいです。合計いくらでしょう?」

AIがこういう算数の文章題をちゃんと解けるか、テストするんですね。

ステップ1:Colab環境を準備しよう

まずはGoogle Colabを開いて、GPUを使えるようにします。

  1. 新しいColabノートブックを開く
  2. 「ランタイム」→「ランタイムのタイプを変更」→「GPU」を選択

これでOK!次に、必要なツールをインストールします:

!pip install lm_eval langdetect -q
!pip install git+https://github.com/felipemaiapolo/tinyBenchmarks

「-q」は「quiet(静かに)」の意味で、インストール中の細かいメッセージを省略してくれます。

ちゃんとインストールできたか確認してみましょう:

!lm_eval --help

ヘルプメッセージが表示されたら成功です!

ステップ2:テストするモデルを選ぶ

Hugging Faceに公開されているモデルなら、どれでもテストできます。今回は小さくて速い「meta-llama/Llama-3.2-1B-Instruct」を使ってみましょう。

「1B」は「10億パラメータ」の意味。「Instruct」は「命令チューニング済み」って意味で、「こうしてください」っていう指示に従えるように訓練されたモデルです。

そして、ベンチマークタスクは「tinyGSM8K」(数学データセット)を使います。

ステップ3:実際に評価を実行してみよう!

準備ができたら、いよいよベンチマークを動かします。コマンドはこれだけ:

!lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-3.2-1B-Instruct \
  --tasks tinyGSM8K \
  --device auto \
  --batch_size auto

このコマンドが何をしているか

  • --model hf:Hugging Faceからモデルを使うよって宣言
  • --model_args pretrained=...:どのモデルを使うか指定
  • --tasks tinyGSM8K:どのベンチマークを実行するか指定
  • --device auto:利用可能なGPUを自動で使う
  • --batch_size auto:最適なバッチサイズ(一度に処理する問題数)を自動で決める

実行すると、モデルがダウンロードされて、GPUにロードされて、ベンチマークが走ります。終わると精度などの結果が表示されますよ。

最後に出てくるスコアを、Hugging Face Leaderboardの公式スコアと比較してみてください。ほぼ同じはずです!

ステップ4:Pythonのコードから実行する(応用編)

コマンドラインでの実行もいいですが、Pythonのコードから実行すると、もっと柔軟に使えます。特に、ファインチューニングの前後で結果を比較したい時に便利なんです。

from lm_eval import evaluator
from joblib import dump

results = evaluator.simple_evaluate(
    model="hf",
    model_args="pretrained=meta-llama/Llama-3.2-1B-Instruct,parallelize=True,trust_remote_code=True",
    tasks=["tinyGSM8K"],
    device="cuda",
    batch_size="auto"
)

print(results)
dump(results, "results.joblib")

これで結果が辞書形式で返ってきて、ファイルにも保存されます。後で「ファインチューニング前は39%だったけど、今は45%になった!」みたいな比較ができるわけです。

ステップ5:結果を読み解こう

実行が終わると、こんな結果が出てきます:

データセットの精度

例えば、モデルがtinyGSM8Kベンチマークで約39%の精度を記録したとします。これは「10問のうち約4問、正しい答えを出せた」って意味です。

「厳密なメトリック(完全一致のみカウント)」と「柔軟なメトリック(小さなフォーマット違いは許容)」の両方が同じスコアを出したってことは、モデルの答えは一貫していたってことですね。

標準誤差(stderr)について

結果には「stderr: null」って表示されるかもしれません。これは標準誤差が計算されなかったって意味。もっと厳密に信頼性を測りたい時は、--bootstrap_iters 1000っていうオプションを追加します。これで統計的に「この結果はどのくらい信頼できるか」がわかります。

実際の問題を見てみよう

例えば、こんな問題がベンチマークに含まれています:

質問
Roryは配達用に各7.50ドルのサブ2つ、各1.50ドルのチップス2袋、各1.00ドルのクッキー2つを注文します。チェックアウト時に20%の配達料金が追加され、5.00ドルのチップを追加したいと考えています。配達注文の費用はいくらになりますか?

正解:29ドル

モデルの回答

サブに$7.50 x 2 = $15.00
チップスに$1.50 x 2 = $3.00
クッキーに$1.00 x 2 = $2.00
合計:$15.00 + $3.00 + $2.00 = $20.00
配達料金:$20.00の20% = $4.00
チップ:$5.00
合計:$20.00 + $4.00 + $5.00 = $29.00

このモデルは正解しました!計算過程も論理的ですよね。

これが後で役立つ理由

後のモジュールで、自分でモデルをファインチューニング(カスタマイズ)する時、このプロセスをもう一度実行します。そうすることで:

  • 「ファインチューニング前:39%」
  • 「ファインチューニング後:48%」

みたいに、本当に改善したかを数値で確認できるんです。これって超大事ですよね!

まとめ:Week 1完了!

お疲れ様でした!Week 1が終わりましたね。これまでに学んだこと:

  1. モデルアーキテクチャとエコシステムの理解:GPT、BERT、LLMの世界の全体像
  2. ファインチューニング vs RAGの判断:どっちを使えばいいか選べるように
  3. リーダーボードの読み方:スコアの意味と比較方法
  4. ベンチマークの再現:自分でスコアを確認できるように

来週からは、いよいよファインチューニングの基礎に入っていきます。言語モデルがどうやって次のトークン(単語のかけら)を予測するのか、トークン化とパディングって何か、データセットはどう準備するのか…そして、LoRAやQLoRAといった効率的なファインチューニング技術まで学びます。

準備はいいですか?来週はLLMファインチューニングのビルディングブロックをしっかり積み上げていきますよ!

コメント

タイトルとURLをコピーしました