前回のレッスンで、リーダーボードの見方やモデルの比較方法を学びましたよね。「このモデルは数学が得意」とか「こっちはコーディングが強い」みたいなことが、スコアから読み取れるようになったと思います。
でも、「このスコアって本当なの?」って思ったことありませんか?今回は、そのスコアを自分で再現してみる実践演習をやってみましょう!Google Colabを使って、Hugging Face Leaderboardと同じベンチマークを実際に動かしてみるんです。
なぜベンチマークを自分で再現するの?
「リーダーボードを見れば十分じゃない?」って思うかもしれませんね。でも、自分でベンチマークを実行すると、こんな良いことがあるんです:
- スコアの意味が本当に理解できる:数字を見るだけじゃなくて、どうやって計算されるのか体験できます
- 自分でファインチューニングした後に使える:モデルをカスタマイズした後、「本当に改善したの?」を確認できます
- 透明性と信頼性:公開された結果を自分で検証できるって、科学的でいいですよね
今回使うのは「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を使えるようにします。
- 新しいColabノートブックを開く
- 「ランタイム」→「ランタイムのタイプを変更」→「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が終わりましたね。これまでに学んだこと:
- モデルアーキテクチャとエコシステムの理解:GPT、BERT、LLMの世界の全体像
- ファインチューニング vs RAGの判断:どっちを使えばいいか選べるように
- リーダーボードの読み方:スコアの意味と比較方法
- ベンチマークの再現:自分でスコアを確認できるように
来週からは、いよいよファインチューニングの基礎に入っていきます。言語モデルがどうやって次のトークン(単語のかけら)を予測するのか、トークン化とパディングって何か、データセットはどう準備するのか…そして、LoRAやQLoRAといった効率的なファインチューニング技術まで学びます。
準備はいいですか?来週はLLMファインチューニングのビルディングブロックをしっかり積み上げていきますよ!

コメント