コンテンツにスキップ

フェデレーテッド学習における集約LLM選択戦略

[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。

実装ノート(アーティファクト): トレーニングスクリプトが出力する artifact_manifest.json と推奨CLIフラグについては docs/implementation/ARTIFACT_MANIFESTS.md を参照してください。

概要

EvoSpikeNetの分散脳アーキテクチャにおけるフェデレーテッド学習では、動的集約LLM選択機構を実装しています。これにより、各学習ラウンドで最適なノード(LLM)を集約の中心として選択できます。

集約LLM選択の重要性

従来のフェデレーテッド学習では、全クライアントのモデルパラメータを単純に平均化していました。しかし、分散脳システムでは:

  1. ノードの役割が異なる: PFC(中央制御)、Visual(視覚)、Audio(聴覚)など
  2. 性能に差がある: GPU搭載ノードとCPUのみのノードなど
  3. 負荷状態が変動: リアルタイムで処理負荷が変化

そのため、状況に応じて最適なノードを集約の中心として選択する必要があります。

実装された選択戦略

1. PFC中心戦略(PFCCentricStrategy)

用途: 標準的な分散脳アーキテクチャ

<!-- from evospikenet.federated_strategy import create_dynamic_fedavg_strategy -->

# PFCノードを常に集約の中心とする
strategy = create_dynamic_fedavg_strategy(
    strategy_type="pfc_centric",
    pfc_node_id="pfc-0",  # PFCノードのID
    min_fit_clients=2
)

特徴: - PFCノードが中央制御ハブとして全集約を調整 - 最もシンプルで安定した戦略 - 脳の前頭前野(PFC)の役割を模倣

2. 負荷ベース戦略(LoadBasedStrategy)

用途: 負荷分散を重視する環境

# 最も負荷の低いノードを集約の中心とする
strategy = create_dynamic_fedavg_strategy(
    strategy_type="load_based",
    cpu_weight=0.6,      # CPU使用率の重み
    memory_weight=0.4,   # メモリ使用率の重み
    min_fit_clients=2
)

特徴: - CPU使用率とメモリ使用率を監視 - リソースに余裕のあるノードを選択 - システム全体のスループットを最適化

3. 性能ベース戦略(PerformanceBasedStrategy)

用途: モデル品質を最優先する環境

# 最も高性能なノードを集約の中心とする
strategy = create_dynamic_fedavg_strategy(
    strategy_type="performance_based",
    accuracy_weight=0.5,      # 精度の重み
    loss_weight=0.3,          # 損失の重み
    convergence_weight=0.2,   # 収束速度の重み
    min_fit_clients=2
)

特徴: - 訓練精度、損失、収束速度を評価 - 最も優れた性能を示すノードを選択 - モデル品質の向上を重視

4. ハイブリッド戦略(HybridStrategy)★推奨★

用途: バランスの取れた運用(推奨)

# 負荷と性能の両方を考慮
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    load_weight=0.4,           # 負荷の重み
    performance_weight=0.6,    # 性能の重み
    pfc_bonus=0.1,            # PFCノードへのボーナス
    aggregator_weight_multiplier=2.0,  # 選択されたノードの重み倍率
    min_fit_clients=2
)

特徴: - 負荷状態とパフォーマンスを総合評価 - PFCノードに若干のボーナスを付与 - 最もバランスの取れた戦略

5. 量子変調戦略(QuantumModulatedStrategy)

用途: EvoSpikeNet固有の量子変調機能を活用

# PFCの量子変調係数α(t)を考慮
strategy = create_dynamic_fedavg_strategy(
    strategy_type="quantum_modulated",
    entropy_threshold=0.5,  # エントロピー閾値
    min_fit_clients=2
)

特徴: - PFCの認知エントロピーと量子係数α(t)を活用 - 低エントロピー(確信度が高い)状態のPFCを優先 - EvoSpikeNetの特許技術である量子変調フィードバックループを利用

使用例

基本的な使用方法

# サーバー起動スクリプト(run_fl_server.py)
import flwr as fl
<!-- TODO: update or remove - import fail import create_dynamic_fedavg_strategy -->

def main():
    # ハイブリッド戦略で集約LLMを動的に選択
    strategy = create_dynamic_fedavg_strategy(
        strategy_type="hybrid",
        load_weight=0.4,
        performance_weight=0.6,
        pfc_bonus=0.1,
        aggregator_weight_multiplier=2.0,
        fraction_fit=0.8,
        min_fit_clients=3,
        min_available_clients=3
    )

    # Flowerサーバーを起動
    fl.server.start_server(
        server_address="0.0.0.0:8080",
        config=fl.server.ServerConfig(num_rounds=10),
        strategy=strategy,
    )

if __name__ == "__main__":
    main()

ノードメトリクスの更新

# クライアント側でメトリクスを収集して送信
class EvoSpikeNetClient(fl.client.NumPyClient):
    def fit(self, parameters, config):
        # ... 訓練処理 ...

        # メトリクスを収集
        metrics = {
            'accuracy': 0.95,
            'loss': 0.05,
            'cpu_usage': 45.2,
            'memory_usage': 62.8,
            'convergence_rate': 0.8,
            'entropy': 0.3,  # PFCの場合
            'alpha_t': 0.65,  # PFCの場合
        }

        return parameters, num_examples, metrics

サーバー側でのメトリクス更新

# カスタムコールバックでメトリクスを更新
class MetricsCallback:
    def __init__(self, strategy):
        self.strategy = strategy

    def on_fit_end(self, server_round, results, failures):
        # 各クライアントからのメトリクスを戦略に反映
        for client_proxy, fit_res in results:
            node_id = client_proxy.cid
            if fit_res.metrics:
                self.strategy.update_node_metrics(node_id, fit_res.metrics)

選択プロセスの詳細

1. ハイブリッド戦略の選択プロセス

各ラウンドで:
1. 全クライアントから訓練結果を収集
2. 各ノードのハイブリッドスコアを計算:

   hybrid_score = load_weight × load_score +
                  performance_weight × performance_score +
                  pfc_bonus (if PFC)

   where:
   - load_score = 1.0 - (cpu_usage + memory_usage) / 200
   - performance_score = (accuracy + 1/(1+loss)) / 2

3. 最高スコアのノードを集約の中心として選択
4. 選択されたノードの重みを2倍(デフォルト)にして集約
5. 重み付き平均でグローバルモデルを更新

2. 量子変調戦略の選択プロセス

各ラウンドで:
1. PFCノードから認知エントロピーとα(t)を取得
2. 量子スコアを計算:

   quantum_score = (1.0 - entropy) × alpha_t

   - 低エントロピー = 確信度が高い状態
   - 適度なα(t) = バランスの取れた変調

3. 機能モジュールからはスパイク蒸留知識を評価
4. 最高量子スコアのノードを集約の中心として選択

パラメータチューニング

aggregator_weight_multiplier(集約ノード重み倍率)

  • デフォルト: 2.0
  • 推奨範囲: 1.5 ~ 3.0
  • 効果: 選択されたノードの影響力を調整
# 選択されたノードの影響力を強める
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    aggregator_weight_multiplier=3.0  # より強い影響
)

# 選択されたノードの影響力を控えめに
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    aggregator_weight_multiplier=1.5  # 控えめな影響
)

ハイブリッド戦略の重みバランス

# 負荷を重視(リソース効率優先)
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    load_weight=0.7,
    performance_weight=0.3
)

# 性能を重視(品質優先)
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    load_weight=0.3,
    performance_weight=0.7
)

# バランス型(推奨)
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    load_weight=0.4,
    performance_weight=0.6
)

集約結果の確認

ログ出力

2025-12-16 10:15:23 INFO Round 1: Aggregator selected - pfc-0
2025-12-16 10:15:23 INFO Selected aggregator: pfc-0 (hybrid score: 0.872)
2025-12-16 10:16:45 INFO Round 2: Aggregator selected - lang-main
2025-12-16 10:16:45 INFO Selected aggregator: lang-main (hybrid score: 0.895)

メトリクスの確認

# 集約後のメトリクスにaggregator_nodeが含まれる
{
    'accuracy': 0.94,
    'loss': 0.06,
    'aggregator_node': 'pfc-0'
}

ベストプラクティス

1. 開発環境

  • 推奨戦略: PFC中心戦略
  • 理由: シンプルで予測可能な動作
strategy = create_dynamic_fedavg_strategy(
    strategy_type="pfc_centric",
    min_fit_clients=2
)

2. 本番環境(バランス重視)

  • 推奨戦略: ハイブリッド戦略
  • 理由: 負荷と性能のバランスが良い
strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    load_weight=0.4,
    performance_weight=0.6,
    pfc_bonus=0.1,
    aggregator_weight_multiplier=2.0
)

3. 本番環境(品質最優先)

  • 推奨戦略: 性能ベース戦略
  • 理由: モデル品質を最大化
strategy = create_dynamic_fedavg_strategy(
    strategy_type="performance_based",
    accuracy_weight=0.5,
    loss_weight=0.3,
    convergence_weight=0.2
)

4. 研究・実験環境

  • 推奨戦略: 量子変調戦略
  • 理由: EvoSpikeNet固有の特許技術を活用
strategy = create_dynamic_fedavg_strategy(
    strategy_type="quantum_modulated",
    entropy_threshold=0.5
)

トラブルシューティング

Q1: 常に同じノードが選択される

原因: ノードメトリクスが更新されていない 解決策: クライアント側で最新のメトリクスを送信

def fit(self, parameters, config):
    # メトリクスを必ず含める
    metrics = {
        'accuracy': current_accuracy,
        'loss': current_loss,
        'cpu_usage': get_cpu_usage(),
        'memory_usage': get_memory_usage()
    }
    return parameters, num_examples, metrics

Q2: 集約が不安定

原因: aggregator_weight_multiplierが高すぎる 解決策: 重み倍率を下げる

strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    aggregator_weight_multiplier=1.5  # 2.0から下げる
)

Q3: PFCノードが選択されない

原因: pfc_bonusが不足 解決策: ボーナスを増やす

strategy = create_dynamic_fedavg_strategy(
    strategy_type="hybrid",
    pfc_bonus=0.2  # 0.1から上げる
)

まとめ

フェデレーテッド学習における集約LLMの選択は、ハイブリッド戦略を使用することで:

  1. 動的に最適なノードを選択
  2. 負荷と性能のバランスを取る
  3. PFCノードを適度に優先
  4. システム全体の効率を最適化

を実現できます。用途に応じて適切な戦略を選択してください。