Skip to main content

airas-eval

AIRAS のための信頼できる評価層。 エージェントはタスクタイプと生の予測結果を渡し、その研究種別で報告すべき標準的な 評価指標一式を固定された形で受け取る。エージェントは評価スクリプトを実装せず、 どの指標を(どの variant で)報告するかも選ばない。

構成

2 層構造で、その間に呼び出し側が選べるものはない。

  1. metrics/ — 評価指標の実装。入力の形ごとに 1 モジュールで、タスクの知識を 持たない。標準実装(scikit-learn / scipy)があるものはそれに委譲し、存在しない もの(ECE、リグレット、上位 k 選択、2 目的ハイパーボリューム、IGD/GD/spacing) だけを自前で実装して variant を固定し、性質テストで検証している。
  2. tasks/ — エリアごとに 1 サブパッケージ、タスクタイプごとに 1 モジュール。 タスクタイプとは「その種類の研究が報告すべき指標の全集合」で、検証済みの入力 グループから計算される(グループあたり 5〜12 指標、スカラーまたは曲線、variant は すべて固定)。generic/ が基本となる評価ファミリー、エリアパッケージ(nas/) はその上に積む — エリアのバンドルは 基本のバインディング + その分野の文献が 追加するもの であり、名前を変えた複製ではない。再利用部品 (tasks/_bundles.py, tasks/nas/_bundles.py)は単なる定数で、登録も単独評価も されない。
tasks/
├── generic/   classification, binary_classification, search, candidate_ranking, multiobjective
└── nas/       nas_pre_training  = search(+ wall-clock 軸、探索空間内順位、ランダム探索
               │                    ベースライン)と predictor(candidate_ranking + 上位 10% 相関)
               └── nas_post_training = architecture(classification + ランダムアーキテクチャ比、
                                    テストリグレット)と tradeoff(multiobjective)

NAS は「アーキテクチャの性能をいつ測るか」で 2 タスクに分かれる:

タスクタイプ 測るもの グループ
nas_pre_training 学習前のアーキテクチャ性能 — ベンチマーク参照による探索、性能予測器、ゼロコストプロキシ search(任意)、predictor(任意)。少なくとも 1 つ
nas_post_training 学習後のアーキテクチャ性能 — 選ばれて学習された最終アーキテクチャ architecture(必須)、tradeoff(任意)

各タスクは何を返すか(指標の説明)

どちらも登録情報から導出されるので、実装と食い違うことがない:

airas-eval list                    # 全タスクタイプ: 入力、指標、曲線、入力サイズ、署名
airas-eval list nas_post_training  # 1 タスクタイプ

および、エリアごとに生成される README(テストで同期を検証):

各指標の説明(定義、読み方、高低どちらが良いか)はこれらの README の表に載っている。 タスクやバンドルを変更したら python -m airas_eval.tasks.readme で再生成する。

使い方

from airas_eval import evaluate

report = evaluate(
    "nas_post_training",
    {
        "architecture": {
            "predicted_labels": y_pred,
            "reference_labels": y_true,
            "probabilities": probs,  # 任意
            "oracle_test_best": 0.9437,  # 任意: ベンチマークのテスト最適値(0〜1)
        },
        "tradeoff": {  # 任意グループ
            "points": [[error, macs], ...],  # 全目的を最小化
            "reference_point": [0.2, 1e9],
        },
    },
)
report.metrics  # スカラー指標: {"architecture.accuracy": ..., "tradeoff.hypervolume_2d": ...}
report.curves  # 曲線指標: {"tradeoff.pareto_front": [...]}
report.inputs_summary  # 指標ではない — 入力サイズ: {"architecture.n_examples": 10000, ...}
report.skipped  # 計算できなかった指標 — 機械可読なコード + 理由
report.omitted_optional_inputs  # 例: ["architecture.random_architecture_accuracies"]
report.provenance  # 導出されたタスク署名、依存パッケージの版、入力の SHA-256
airas-eval score nas_pre_training --inputs inputs.json --output evaluation.json

examples/ に NAS 各タスクの最小入力ファイルがあり、テストスイートがそれぞれを CLI で採点する。NAS 固有の入力(evaluation_costs, search_space_scores, random_architecture_accuracies, oracle_test_best, ...)は任意の参照データで、 省略するとそれを必要とする指標は skipped として報告され、省略自体も記録される。

入力は常にグループ化されている({"architecture": {...}})。呼び出し側が選べるのは タスクタイプだけで、研究をどのタスクタイプで評価するかは研究計画側が決める (評価ステップではない)。NAS では、探索ステージの後に nas_pre_training、 最終アーキテクチャの学習後に nas_post_training を呼ぶ、というパイプラインの段階が それに対応する。

設計ルール

  1. 指標を選ばせない。 タスクタイプは自分の指標をすべて計算する。集合は固定で、 読み切れる大きさに保つ(長い一覧はそれ自体がチェリーピックの余地になる)。 variant(平均方法、k、ビン数)はタスクごとに固定され、指標関数が取る全パラメータは 明示的に固定される(テストで強制)。入力サイズ(n_examples, n_evaluations, ...) は指標とは別に inputs_summary に報告され、テスト集合の部分抽出や打ち切られた 探索が見えるようにする。
  2. 黙って消えるものはない。 計算できなかった指標は skipped に機械可読なコード (missing_optional_input, not_applicable, undefined_on_data, missing_dependency)付きで現れ、省略された任意入力もレポートごとに列挙される。 skip になるのはこれらの専用ケースだけで、不正な入力やライブラリのバグは 「未定義」に隠れず例外で失敗する。
  3. 来歴は手書きせず導出する。 タスク署名はタスク宣言(指標名、関数の識別子、 固定 kwargs、入力フィールド)のハッシュなので、実装と乖離できない。エリアごとの README も同じ宣言から生成される。
  4. 参照データは上流で固定する。 reference_labels、oracle_best、 oracle_test_best、参照点・参照フロントは実験設計に属する。このライブラリはそれ らが本物であることを検証できず、エージェントが制御するプロセスの中では自衛でき ない — airas-eval score をエージェントが編集できない固定環境から実行すること。

インストール

uv add "airas-eval==0.3.0"     # ライブラリ/CLI として
uvx airas-eval@0.3.0 list      # インストールせずに CLI だけ使う

評価層が研究の途中で変わらないように、必ずバージョンを固定する。依存: numpy, scikit-learn, scipy, pydantic。

研究リポジトリからの呼び出し方

agent の実験コードは airas_eval を import しない。agent の成果物は評価の 入力ファイル(evaluate に渡す dict をそのまま JSON にしたもの)までで、評価は 固定版の CLI を別プロセスで走らせる。研究リポジトリには airas(オーケストレータ)の テンプレート由来で次が置かれる:

# pyproject.toml — 依存として固定するが、実験コードからは import しない
[dependency-groups]
eval = ["airas-eval==0.3.0"]
# Makefile — task_type と入出力先は研究計画から埋める
evaluate:
	uv run --group eval airas-eval score nas_pre_training \
	    --inputs artifacts/eval_inputs/nas_pre_training.json \
	    --output artifacts/evaluation/nas_pre_training.json
	uv run --group eval airas-eval score nas_post_training \
	    --inputs artifacts/eval_inputs/nas_post_training.json \
	    --output artifacts/evaluation/nas_post_training.json

agent は make evaluate を実行してスコアを確認しながら実験を進めてよい。ただし Makefile は agent が書き換え得るので、公式のスコアはオーケストレータが agent の 触れない環境で、同じ版の CLI を入力ファイルに直接かけて再計算したものとする。 report の inputs_sha256 と入力ファイルの hash、provenance.versions の版を照合すれば、 どの入力をどの版で採点したかが確認できる。第三者は clone → uv sync --group eval → make evaluate で同じ数字を再現できる(uv.lock が版を固定する)。

リリース手順

公開は GitHub Actions の publish.yml(PyPI Trusted Publisher、API トークン不要)で行う。

初回のみ、PyPI 側の設定が必要:

  1. https://pypi.org/manage/account/publishing/ で pending publisher を登録する — PyPI project name airas-eval、owner airas-org、repository airas-eval、 workflow publish.yml、environment pypi。
  2. GitHub リポジトリの Settings → Environments に pypi を作る(承認者を付けてもよい)。

毎回のリリース:

uv version --bump minor          # pyproject と __init__ の版を揃える(現状は手動で両方)
uv lock && uv run pytest -q
git commit -am "release: v0.3.0" && git tag v0.3.0 && git push --tags

その後 Actions から Publish を手動実行する(HEAD にその版のタグが付いていることを ワークフローが検証する)。Trusted Publisher が動くことを確認したら、publish.yml の トリガーを push: tags: ["v*"] に切り替えてタグ push だけで公開できるようにする。

開発

uv sync
uv run ruff format --check .
uv run ruff check .
uv run mypy src
uv run pytest

タスクタイプの追加 = tasks/<area>/ に既存バンドルから TASK を定義するモジュールを 1 つ置き、エリアの TASKS に 1 行足し、python -m airas_eval.tasks.readme を実行。 新しいエリア = 新しいサブパッケージ + tasks.AREAS に 1 行。バンドルの追加 = tasks/_inputs.py の入力モデルと tasks/_bundles.py の Bundle(summary の件数 付き)。各バインディングには日本語の description が必須(テストで強制)。タスクは 5〜10 指標程度に保つ: 標準的な variant のみ、パラメータごとに 1 つの固定値。

登録は意図的に明示的(entry point もスキャンもしない): 信頼層では、何が計算される かがレビュー済みの差分に見えていなければならない。自前実装の指標を追加する場合は、 オラクル実装とのパリティテスト、または手計算ケース + 性質テストが必要。

ライセンス

MIT

Release files for airas-eval 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for airas-eval 0.3.0
File Size Uploaded
airas_eval-0.3.0.tar.gz 81.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for airas-eval 0.3.0
File Interpreter ABI Platform
airas_eval-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 132.9 kB

Release files / airas_eval-0.3.0.tar.gz

Download URL airas_eval-0.3.0.tar.gz
Size 81.0 kB
Tags Source
SHA-256 checksum
How to use checksums
13bf0a25f7827747fffad2312df2c7b11b974b621b502f18c0a7486b8c7b65fe
BLAKE2b-256 checksum
How to use checksums
856c263de1a82032958113ab9563cc3cfa4753c090154ebedb660580fd16f998
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / airas_eval-0.3.0-py3-none-any.whl

Download URL airas_eval-0.3.0-py3-none-any.whl
Size 51.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8c58c9d703a7850dc5b816b6f9c6394b6dfc787d3b4061a6cc8b8e5720ecc88a
BLAKE2b-256 checksum
How to use checksums
560d853aa2002bdf3e6b55da3c5238ef371a586fc614ff0b904eb08975461e3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.11.1

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

This release

0.3.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page