Skip to content

Latest commit

 

History

History
352 lines (256 loc) · 17.1 KB

File metadata and controls

352 lines (256 loc) · 17.1 KB

TRust-BO

English | 日本語 | 简体中文

今手元にあるハードウェアだけで動くベイズ最適化。

TRust-BOはCFDソルバーではありません。 最適化ループの中で動作するツールであり、 CFDソルバー自体を置き換えるものではなく、設計探索中に必要なCFD実行回数を減らします。

CI License: MIT Python Rust


なぜ作ったか

最良の設計に、最良のハードウェアは要らないはずだ。

CFD最適化は長らくHPCクラスタやワークステーション、組織的な予算に縛られてきた —— それらは優れたツールだが、多くの人の手には届かない。 TRust-BOは、ある高校生が実際に抱えていた課題を解くために作られた: Formula Studentカーの空力を、GPUなしのラップトップで最適化すること。 目標は、ベイズ最適化をどこでも動くほど高速に、博士号なしで使えるほどシンプルに、 そして実際の設計現場で意味を持つほど正確にすることだ。

TRust-BOは、Rustで実装したトラスト領域ベイズ最適化エンジンを、PyO3経由でPythonに公開したものだ。 GPU不要、クラウド不要。pip install trust-bo してローカルで実行できる。

正確に何をするか: 高次元(50D以上)、または ノイズあり・制約ありの問題(実CFDなど)において、 TRust-BOはBoTorch TuRBO比で5〜10倍高速でありながら、同等以上の品質を達成する。 低次元・滑らか・小予算の問題ではGPベースの手法(BoTorch, HEBO)の方が通常優れており、 TRust-BOは万能最良を主張しない。正直なデータに基づく評価は docs/PERFORMANCE_ASSESSMENT.md(英語)を参照。

ベンチマークの範囲(比較する前に読むこと): 以下の結果は BoTorch TuRBO, CMA-ES, Random Search, NSGA-II との比較で測定したものだ。SAASBO(強力な高次元BOベースライン) との比較は今後の課題。CFDベンチマークは3シード、多目的は2シードであり、 統計的な厳密性のためにさらにシード数を増やす予定。


他手法との比較

特徴 TRust-BO BoTorch HEBO Optuna
GPU必須 任意
CPU最適化されたコア ✓ (Rust)
高次元対応(50D+)
最小限のask/tell API
CFDワークフロー特化

BoTorchやOptunaもCFD駆動の最適化に使うことはできる。TRust-BOは学生や小規模な エンジニアリングチーム向けに、軽量・CPU優先のワークフローを念頭に設計されている点が特徴だ。


インストール

pip install trust-bo

ビルド済みホイール(abi3, Python 3.9以上)をLinux/macOS/Windows向けに配布しており、 通常のインストールにはRustツールチェーンは不要。

ソースからビルドする場合(Rustツールチェーンが必要):

git clone https://github.com/K092203/TRust-BO
cd TRust-BO
python -m venv .venv && source .venv/bin/activate
pip install .

開発時はmaturinを使うと再ビルドが速い: pip install maturin && maturin develop --release


使い方

from trust_bo import TRustBOEngine, Float

# 1. 探索空間を定義
space = [Float(f"x{i}", -5.0, 5.0) for i in range(10)]

# 2. エンジンを作成
engine = TRustBOEngine(space=space, direction="minimize", seed=42)

# 3. ask → evaluate → tell
for _ in range(20):                          # 20ラウンド × batch_size=10
    candidates = engine.ask(batch_size=10)   # 次の候補点を提案
    results = [
        {"value": your_cfd_solver(c), "feasible": True}
        for c in candidates
    ]
    engine.tell(candidates, results)         # 結果をエンジンへ返す

# 4. 最良の結果を取得
print(engine.best())
# {'parameters': {'x0': 0.12, ...}, 'objective_values': [3.47]}

制約付き

engine.tell(candidates, [
    {"value": solver(c), "feasible": constraint_ok(c)}
    for c in candidates
])

多目的最適化(パレート)

MultiObjectiveEngineで複数目的を同時に最適化する。method="ehvi"はRustで実装された 閉形式の2目的Expected Hypervolume Improvementを使い、method="chebyshev"はスカラー化 (任意の目的数に対応)を使う。

from trust_bo import MultiObjectiveEngine, Float

space = [Float(f"x{i}", 0.0, 1.0) for i in range(20)]
engine = MultiObjectiveEngine(
    space=space, directions=["maximize", "minimize"],  # 例: Cl ↑, Cd ↓
    method="ehvi", seed=0,
)
for _ in range(15):
    cands = engine.ask(batch_size=4)
    results = [{"values": [cl(c), cd(c)], "feasible": True} for c in cands]
    engine.tell(cands, results)

print(engine.pareto_front())                 # 非劣解の設計群
print(engine.hypervolume(ref=[0.0, 0.05]))   # 品質指標

保存と再開

engine.save("study.zip")
engine = TRustBOEngine.load("study.zip")

Optunaサンプラーとして使う

TRust-BOをOptunaのサンプラーとしてそのまま使える。pip install optunaが必要。

import optuna
from trust_bo.integrations.optuna import TrustBoOptunaSampler

study = optuna.create_study(direction="minimize", sampler=TrustBoOptunaSampler(seed=42))

def objective(trial):
    x = [trial.suggest_float(f"x{i}", -5.0, 5.0) for i in range(10)]
    return sum(v**2 for v in x)

study.optimize(objective, n_trials=100)
print(study.best_value)

ベンチマーク

TRust-BO vs BoTorch TuRBO on Ackley 100D: better optimum, 5.7× faster, CPU-only

詳細データと手法: docs/BENCHMARK.mddocs/PERFORMANCE_ASSESSMENT.md(いずれも英語)。 比較対象はBoTorch TuRBO, CMA-ES, Random Search, NSGA-II。SAASBOとの比較は今後の課題。

合成高次元関数(得意分野)

Ackley / Rastrigin / Levy の50D・100D、予算100〜500、enable_phase2=True。 値は小さいほど良い。品質はシード間の中央値best、速度はラウンドあたりの実時間。

条件 TRust-BO BoTorch TuRBO 品質 速度
Ackley 50D, b=300 5.96 7.25 TRust 8.9×
Levy 50D, b=300 152.4 194.5 TRust 10.7×
Ackley 100D, b=300 7.13 8.51 TRust 5.7×
Levy 100D, b=300 284.1 723.2 TRust 5.7×
Ackley 50D, b=500 4.64 6.38 TRust

中予算条件18件中16件、budget=500では5件中5件でTRust-BOが勝ち、5〜10倍高速。 唯一の敗北はbudget=100のRastrigin(小予算ではGPが有利)。

実CFD — 翼型形状最適化

H-1(NeuralFoil, 16D CST, Cl/Cd最大化, 10シード): クリーンなサロゲート、良設定問題。

手法 median Cl/Cd best
BoTorch TuRBO 241.4 245.4
TRust-BO+P2 227.9 267.4
CMA-ES 223.3 265.5
Random 148.7 161.1

16D・滑らかな問題では中央値でBoTorchが上回るが、TRust-BOは単独最良設計に到達している。

測定は当時のデフォルトだったacquisition="ei"で実施。現在のデフォルトは"ts"であり、 同じ滑らかなCST 16D Cl/Cd目的の別のA/Bでは"ei"に劣る (docs/BENCHMARK.md §15参照、上表とはシード・予算が異なるため、 この227.9という数値そのものの再現は期待できない) — CFD形状の目的関数にはconfig={"acquisition": "ei"}を明示することを推奨。

H-2(SU2 RANS, 実ナビエ・ストークス方程式, 16D, 3シード): ノイズあり・メッシュ制約あり。

手法 median Cl/Cd 物理的に妥当な範囲のシード
TRust-BO+P2 171.6 3 / 3
BoTorch TuRBO 126.1 3 / 3
CMA-ES 774.6 ⚠ 1 / 3
Random 316.1 ⚠ 1 / 3

より難しくノイジーなRANS問題ではTRust-BOが優位(+36%)で、最も安定している。

SU2(H-2)の例についての注記: 上表の⚠値は、SU2パイプラインにfail-fast幾何検証 (最小厚み/面積、自己交差)とmin_cd下限を導入するに測定された歴史的な値であり、 現在のfeasibility判定では再現しない(既知の限界参照)。 クリーンで即使えるCFD例としてはNeuralFoil(H-1)パイプラインを推奨。

多目的(Cl↑とCd↓を同時に)

Rustで実装した閉形式2目的EHVI(Expected Hypervolume Improvement)とChebyshevスカラー化を SU2上で比較(budget=60、2シード): EHVIのmedian hypervolumeは0.0239 vs 0.0165(+45%)。 Chebyshevの方がパレートフロントの多様性は高い。詳細はdocs/BENCHMARK.md

ネイティブPhase 2

純Rust実装のMatern 5/2マイクロGPがMLPアンサンブルの残差を最良点近傍でフィットし、 終盤の精密化を行う。フラグ一つ、sklearn不要、追加依存なし:

engine = TRustBOEngine(space=space, config={"enable_phase2": True})

TRust-BOを使うべき場面: 高次元(50D+)、またはノイズあり/制約ありの問題、 中〜大予算(100〜1000)、そしてCFDのように1評価が既に数分〜数時間かかり BOラウンドごとの実時間が重要になる場面。


動作原理

TRust-BOはTuRBO(トラスト領域ベイズ最適化)を、独自サロゲートで実装している:

コールドスタート → Halton準乱数サンプリング(n_init点)
ウォームパス     → MLPブートストラップ・アンサンブルサロゲート(5メンバー)
                 + トラスト領域内でのCross-Entropy Method(CEM)
                 + トラスト領域の動的更新(成功で拡大、失敗で縮小)

主な設計判断:

  • Rustコア — 内側ループ(サロゲート学習、CEM、TR管理)はPyO3経由でコンパイル済みRustが実行し、CPU負荷を低く抑える
  • ウォームスタート — サロゲートの重みをラウンド間でシリアライズし、学習時間を約41%削減
  • 中立な中心の安定性 — TR中心は相対1%以上の改善がない限り動かず、小さな揺らぎによる不安定化を防ぐ
  • GPU不要burnndarrayバックエンドを使用、最近のノートPC用CPUで十分

ロードマップ

現状(v0.3.0)

  • 単一トラスト領域(exploitation重視) + TuRBO-M マルチTR(実験的)
  • ウォームスタート付きMLPブートストラップ・アンサンブルサロゲート
  • 制約処理(feasibilityサロゲート) + CFD向けfail-fast幾何形状制約(最小厚み/面積、メッシュ生成前)
  • 128テストスイート(Python 84 + Rust 44)、CPUのみ、PyO3 Pythonバインディング
  • BoTorch TuRBO / CMA-ES / HEBO / Random / NSGA-II との比較ベンチマーク
  • ネイティブPhase 2(Rust Tandem Residual-GP): 50Dで+32%、10Dで+55%、追加依存ゼロ
  • 高価なソルバー向けの非同期並列/rolling評価(SLURM対応)
  • マルチフィデリティ・カスケード(LF→HF、NeuralFoilで高忠実度評価70%削減)
  • 実CFD翼型最適化 — NeuralFoil(H-1)およびSU2 RANS(H-2)パイプライン
  • 多目的最適化: Chebyshevスカラー化 + 閉形式2目的EHVI(Rust)
  • Optunaサンプラー統合
  • PyPI公開(Linux/macOS/Windows向けビルド済みabi3ホイール)

予定

  • SAASBOとの比較 + ベンチマークシード数の追加(統計的厳密性)
  • 2目的を超える閉形式EHVI(Chebyshevスカラー化は既に任意の目的数に対応済み)
  • マルチTR(TuRBO-M) — 優先度は下げている。CFD規模の予算では単一TRの方が安定
  • 軽量エンジニアリング設計向けBOに関するリサーチ・レポート

FAQ

TRust-BOはCFDソルバーですか?

いいえ。TRust-BOは外部のCFDソルバーと一緒に動く最適化エンジンです。 ナビエ・ストークス方程式は解きません。次にどの設計候補を評価すべきかを決定し、 高価なCFD実行の総回数を減らします。

なぜBoTorchを使わないのですか?

BoTorchは優れており、はるかに柔軟です。TRust-BOはその代替ではなく、 学生や小規模チーム向けの軽量CFD駆動ワークフローを念頭に置いた、 シンプルなask/tell APIを持つ、より小さなCPU優先エンジンです。

実CFDでの検証実績はありますか?

はい、翼型形状最適化で検証済みです。NeuralFoil(H-1、高速な学習済み空力サロゲート)と SU2 RANS(H-2、実の定常ナビエ・ストークス方程式、Ma=0.3、Re=3×10⁶、SA乱流モデル) という2つのパイプラインを同梱しています。ベンチマークの節と docs/BENCHMARK.mdを参照してください。 現時点の検証はSU2で3シードのみ — さらなるシード数とSAASBO比較を予定しています。

誰のためのツールですか?

学生、Formula Studentチーム、そしてHPCやGPUなしでCFD駆動の設計最適化に 取り組みたい小規模エンジニアリングチーム。

BoTorch / HEBO / Optuna との関係は?

いずれも優れた最適化エンジンであり、TRust-BOはそれらの置き換えを目指していません。 CPUのみ・軽量で、CFD駆動のエンジニアリング設計ワークフロー向けにパッケージ化された 最適化エンジンという特定のギャップに焦点を当てています。


既知の限界

  • GP比でのサロゲート精度: MLPブートストラップ・アンサンブルは不確実性の較正精度を速度と引き換えにしている。低次元・滑らか・小予算の問題ではGPベースの手法(BoTorch, HEBO)が通常上回る(16D NeuralFoilベンチマークで確認済み)。TRust-BOの優位性は50D以上、またはノイズあり/制約ありの問題にある。
  • ベンチマークシード数: 合成関数の結果は10シードだが、実CFD(SU2)は3シード、多目的は2シードと統計的には薄い。シード数の追加を予定している。
  • SAASBOとの比較は未実施: 強力な高次元BOベースラインであるSAASBOとのベンチマークは(環境上の制約で)未実施。主張はBoTorch TuRBO / CMA-ES / Random / NSGA-IIとの比較に限定される。
  • CFDのfeasibility判定には既知のギャップがある: SU2(H-2)パイプラインは現在、メッシュ生成前に不正な形状(最小厚み/面積、自己交差)をfail-fastで弾き、閾値未満の非物理的なCdを事後的に棄却するようになっており、以前見られた主要なアーティファクトの原因は塞いだ(docs/BENCHMARK.md §20.3参照)。ゼロから構築したFSAEフロントウィング実用検証パイプライン(65D、SU2 INC_RANS)で使う より粗い3Dフロントウィングメッシュには残存リスクがある (docs/BENCHMARK.md §24参照)。
  • 多目的最適化はEHVIについて2目的まで: 閉形式EHVIは2目的限定。3目的以上ではChebyshevスカラー化を使うこと。
  • ウォームスタートの重み転送: サロゲートの重みは16進文字列(ラウンドあたり約1MB)としてシリアライズされる。機能するが非効率であり、バイナリ転送機構を予定している。
  • マルチTR(n_trs > 1)は実験的: 実装・テスト済みだが、CFD規模の予算では単一TRの方が安定するため優先度を下げている。

開発ログ

設計判断・フェーズごとの実験・ベンチマークの記録を含む完全な開発履歴は docs/DEVELOPMENT.md(日本語)にまとめている。


Contributing

貢献を歓迎する。現状は個人開発プロジェクトであり、バグ報告・実問題でのベンチマーク結果・ ドキュメント・コードなど、どんな形の協力も心から歓迎する。

TRust-BOを実際のCFD問題に使って結果(良い結果でも悪い結果でも)を得た場合は、 ぜひissueを開いて共有してほしい。現段階では実世界からのフィードバックが最も価値がある。


License

MIT © 2026 Kotaro Ozawa