分散脳シミュレーション - ノード構成とモデルマッピング
[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。
実装ノート(アーティファクト): トレーニングスクリプトが出力する
artifact_manifest.jsonと推奨CLIフラグについてはdocs/implementation/ARTIFACT_MANIFESTS.mdを参照してください。
Copyright: 2026 Moonlight Technologies Inc. All Rights Reserved.
Author: Masahiro Aoki
Last Updated: January 8, 2026
このドキュメントの目的と使い方
- 目的: 分散脳のノード構成、モデルマッピング、ハブ構成を素早く参照できるようにする。
- 対象読者: ノード配備・モデル割当を担当する実装/運用メンバー。
- まず読む順: 概要 → 新しいアーキテクチャ → シミュレーションタイプ/各ノード設定。
- 関連リンク: 実行スクリプトは
examples/run_zenoh_distributed_brain.py、PFC/Zenoh/Executive詳細は implementation/PFC_ZENOH_EXECUTIVE.md。
2026-04-20 追記: 分散ASR/Whisper統合の実行設定
分散ノードの動画/音声解析は、ノード環境変数でASR経路を切り替えます。
VIDEO_ANALYSIS_ASR_BACKEND:asr_fallback(互換既定)またはwhisper_realVIDEO_ANALYSIS_WHISPER_MODEL: 例tiny,baseVIDEO_ANALYSIS_WHISPER_DEVICE: 例cpu,cudaVIDEO_ANALYSIS_ASR_PREPROCESS: 前処理切替(1/0)
docker-compose.distributed.yml では上記環境変数を各 brain-node-* に設定可能です。Whisperを有効化する場合は、起動時に VIDEO_ANALYSIS_ASR_BACKEND=whisper_real を指定してください。
EvoSpikeNetの分散脳シミュレーションは、複数のノードが協調して動作する階層的なアーキテクチャを採用しています。各ノードは特定の脳領域をシミュレートし、Zenoh通信プロトコルを介してスパイク信号を交換します。
概要
EvoSpikeNetの分散脳シミュレーションは、複数のノードが協調して動作する階層的なアーキテクチャを採用しています。各ノードは特定の脳領域をシミュレートし、Zenoh通信プロトコルを介してスパイク信号を交換します。
新しいアーキテクチャ: Sensor Hub と Motor Hub の分離
2025年12月12日更新: 運動野とセンサー情報を管理する分類を分離し、より効率的なアーキテクチャを導入。
Sensor Hub (センサーハブ)
- すべてのセンサー入力(視覚、聴覚、触覚)を統合管理
- センサーデータの前処理と統合を担当
- PFCに統合されたセンサーデータを提供
Motor Hub (モーターハブ)
- すべての運動出力(軌道制御、小脳協調、PWM制御)を統合管理
- PFCからのコマンドを実際の運動制御に変換
- 複数の運動サブシステムの協調を管理
利点
- 並列処理: センサー入力の同時処理が可能
- 専門化: 各ハブが専門の機能を担当
- 拡張性: 新しいセンサー/運動タイプの追加が容易
- 効率性: センサーと運動の分離により、処理の最適化が可能
データフロー
概要
EvoSpikeNetの分散脳シミュレーションは、複数のノードが協調して動作する階層的なアーキテクチャを採用しています。各ノードは特定の脳領域をシミュレートし、Zenoh通信プロトコルを介してスパイク信号を交換します。 Sensor Hub → PFC → Motor Hub ↓ ↓ ↓ Visual Compute Motor-Traj Auditory Lang-Main Motor-Cereb Speech Motor-PWM
## シミュレーションタイプ
分散脳シミュレーションは以下の5つのタイプをサポートしています:
1. **Language Focus** (6プロセス) - 言語処理に特化
2. **Image Focus** (7プロセス) - 視覚処理に特化(Sensor Hub使用)
3. **Audio Focus** (10プロセス) - 聴覚・発声処理に特化(Sensor Hub使用)
4. **Motor Focus** (7プロセス) - 運動制御に特化(Motor Hub使用)
5. **Full Brain** (24プロセス) - 全機能統合(Sensor Hub + Motor Hub)
---
## ノード階層構成
### 1. Language Focus (10プロセス)
言語処理を中心とした構成。埋め込みベクトル生成、タスク分解、RAG検索などの高度な言語機能を含みます。
**使用モデル:**
- PFC: `SimpleLIFNode`
- Lang-Main, Lang-Embed, Lang-TAS, Lang-RAG: `SpikingEvoTextLM`
- Visual: `SpikingEvoVisionEncoder`
- Auditory, Speech: `SpikingEvoAudioEncoder`
- Motor: `SimpleLIFNode` (フォールバック)
- Compute: `SpikingEvoTextLM`
---
### 2. Image Focus (7プロセス)
視覚処理階層を重点的にカバー。Sensor Hubの下にVisualモジュールを配置し、エッジ検出、形状認識、物体認識の3段階処理。
**使用モデル:**
- Visual, Vis-Edge, Vis-Shape, Vis-Object: `SpikingEvoVisionEncoder`
- Sensor-Hub: `SimpleLIFNode` (統合管理)
- PFC, Compute: `SpikingEvoTextLM`
---
### 3. Audio Focus (10プロセス)
聴覚・発声処理階層を重点的にカバー。Sensor Hubの下にAuditoryモジュールを配置し、MFCC特徴抽出、音素認識、意味理解の3段階処理。Speechモジュールは独立して配置。
**使用モデル:**
- Auditory, Aud-MFCC, Aud-Phoneme, Aud-Semantic: `SpikingEvoAudioEncoder`
- Speech, Speech-Phoneme, Speech-Wave: `SpikingEvoAudioEncoder`
- Sensor-Hub: `SimpleLIFNode` (統合管理)
- PFC, Compute: `SpikingEvoTextLM`
---
### 4. Motor Focus (7プロセス)
運動制御階層を重点的にカバー。Motor Hubの下にMotorモジュールを配置し、軌道制御、小脳協調、PWM制御の3段階処理。
**使用モデル:**
- Motor, Motor-Traj, Motor-Cereb, Motor-PWM: `SimpleLIFNode` (運動制御用)
- Motor-Hub: `SimpleLIFNode` (統合管理)
- PFC, Compute: `SpikingEvoTextLM`
---
### 5. Full Brain (24プロセス)
全ての階層処理を統合した完全な脳シミュレーション。Sensor HubとMotor Hubを使用した新しいアーキテクチャを採用。
---
## モデルマッピング
### ノードタイプ正規化
サブノードは`_get_base_module_type()`メソッドによってベースタイプに正規化され、対応するSpikingモデルが割り当てられます。
```python
# 言語系サブノード → lang-main
"lang-embed", "lang-rag", "lang-tas", "compute"
→ SpikingEvoTextLM
# 視覚系サブノード → visual
"vis-edge", "vis-shape", "vis-object"
→ SpikingEvoVisionEncoder
# 聴覚系サブノード → audio
"aud-mfcc", "aud-phoneme", "aud-semantic"
→ SpikingEvoAudioEncoder
# 発声系サブノード → audio
"speech-phoneme", "speech-wave"
→ SpikingEvoAudioEncoder
# 運動系サブノード → motor
"motor-traj", "motor-cereb", "motor-pwm"
→ SimpleLIFNode (フォールバック、将来的にMotorModule使用予定)
モデル詳細
SpikingEvoTextLM (言語モデル)
- vocab_size: 30522 (BERT互換)
- d_model: 128
- n_heads: 4
- num_transformer_blocks: 2
- time_steps: 10
- Model Type: "text"
- Category: "LangText"
使用ノード: - Lang-Main, Lang-Embed, Lang-TAS, Lang-RAG, Compute
SpikingEvoVisionEncoder (視覚モデル)
- input_channels: 1 (グレースケール)
- output_dim: 128
- image_size: (28, 28) (MNIST互換)
- time_steps: 10
- アーキテクチャ: 2層CNN + LIF
- Model Type: "vision"
- Category: "Vision"
使用ノード: - Visual, Vis-Edge, Vis-Shape, Vis-Object
SpikingEvoAudioEncoder (音声モデル)
- input_features: 13 (MFCC係数)
- output_neurons: 128
- time_steps: 10
- Model Type: "audio"
- Category: "Audio"
使用ノード: - Auditory, Aud-MFCC, Aud-Phoneme, Aud-Semantic - Speech, Speech-Phoneme, Speech-Wave
SpikingEvoMultiModalLM (マルチモーダルモデル)
- text_vocab_size: 30522
- vision_input_channels: 1
- audio_input_features: 13
- d_model: 128
- n_heads: 4
- time_steps: 10
- Model Type: "multimodal"
- Category: "MultiModal"
使用ノード: - 統合タスク用 (将来的拡張)
SimpleLIFNode (汎用スパイキングニューロン)
- size: 128
- 基本的なLIF (Leaky Integrate-and-Fire) ニューロンレイヤー
- Model Type: N/A (汎用)
- Category: N/A
使用ノード: - PFC - Motor系 (Motor, Motor-Traj, Motor-Cereb, Motor-PWM)
ノード起動方法
基本コマンド
python examples/run_zenoh_distributed_brain.py \
--node-id <node-id> \
--module-type <module-type> \
[--model-artifact-id <artifact-id>]
起動例
1. PFCノード起動
python examples/run_zenoh_distributed_brain.py \
--node-id pfc-0 \
--module-type pfc
2. 言語メインノード起動(学習済みモデル使用)
python examples/run_zenoh_distributed_brain.py \
--node-id lang-main-4 \
--module-type lang-main \
--model-artifact-id 236d1796-547b-4b74-9f67-02e506c1a706
3. 視覚サブノード起動
python examples/run_zenoh_distributed_brain.py \
--node-id vis-object-9 \
--module-type vis-object
4. 聴覚サブノード起動
python examples/run_zenoh_distributed_brain.py \
--node-id aud-mfcc-13 \
--module-type aud-mfcc
モデルロード動作
1. 明示的なアーティファクトID指定時
1. --model-artifact-id で指定されたアーティファクトを検索
2. セッションIDを解決
3. APIからconfig.jsonとweights.pthをダウンロード
4. モデルを初期化して重みをロード
5. 言語モデルの場合、tokenizerもロード
2. アーティファクトID未指定時
1. APIから最新のモデルセッションを取得
2. 最新セッションのアーティファクトをダウンロード
3. モデルを初期化して重みをロード
3. API接続失敗時
1. デフォルトパラメータでモデルを初期化
2. ランダム重みで動作(学習なし)
3. 言語モデルの場合、デフォルトBERTトークナイザーを使用
自動ノード生成(Auto Node Mapper)
目的:公開コネクトームデータから分散脳ノード構成(rank→node)を自動生成し、structural_mask NPZ と node_manifest.yaml を出力する。
主要要件:
- 入力:
connectomeJSON/NPZ(neurons[],synapses[], metadata) - 出力:per-
rank_idNPZ (row_indices,col_indices,weights,delays,ei_mask) とnode_manifest.yaml(node_id,ranks,mask_url,version_uuid,etag) - 削減手法:Policy F(F-1 層別サンプリング / F-2 スペクトル削減 / F-3 クラスタ代表)を実装、並列評価して最良案を選択
- 検証:E/I 差分 <5%、degrees-distribution KS p-value >0.05、メモリ制限内(
rank_profiles) - 運用:HCP 等の契約データは manual approval 必須、CAVE はバックオフ + NPZ キャッシュ
推定フロー:
- プリプロセス(metadata 抽出、cell_type/layer/ROI 集計)
- 削減候補生成(F-1/F-2/F-3)
- RANK 割当(ルールベース + スコア最適化)
- NPZ 出力 +
node_manifest.yaml生成 - デプロイ:
connectome/metadata/{node_id}へ manifest を publish、ノードはapply_maskAPI を呼び出す
推奨実装成果物:
scripts/auto_node_mapper.py(PoC:C. elegans → 29-node manifest)evospikenet/connectome/node_mapping.py(マッピングルール・Policy F 実装)config/connectome_config.yamlのrank_profiles拡張tests/test_auto_node_mapper.py,tests/test_connectome_integration_mapper.py
この設計は docs-dev/connectome_schema.md と互換であり、evospikenet/connectome/connectome_loader.py の apply/validate/rollback ワークフローと連携します。
FPGAセーフティコントローラー統合
全てのノードはFPGAセーフティコントローラーと統合され、2秒ごとにハートビートを送信します。
ハートビート送信タイミング
- セッション解決中
- モデルロード前
- config.json ダウンロード後
- モデル初期化後
- weights.pth ダウンロード後
- 重みロード後
これにより、長時間のモデルロード中にもウォッチドッグタイムアウトが発生しません。
ノード検証
テストスクリプト
全ノードタイプのモデル初期化を検証:
python tests/test_node_types.py
検証項目: - Lang系: lang-main, lang-embed, lang-rag, lang-tas, compute - Visual系: visual, vision, vis-main - Audio系: audio, auditory, aud-main, speech - Multimodal: multimodal
検証結果
✅ lang-main: SpikingEvoTextLM
✅ lang-embed: SpikingEvoTextLM
✅ lang-rag: SpikingEvoTextLM
✅ lang-tas: SpikingEvoTextLM
✅ compute: SpikingEvoTextLM
✅ visual: SpikingEvoVisionEncoder
✅ vision: SpikingEvoVisionEncoder
✅ vis-main: SpikingEvoVisionEncoder
✅ audio: SpikingEvoAudioEncoder
✅ auditory: SpikingEvoAudioEncoder
✅ aud-main: SpikingEvoAudioEncoder
✅ speech: SpikingEvoAudioEncoder
✅ multimodal: SpikingEvoMultiModalLM
Passed: 13/13
トラブルシューティング
1. FPGAウォッチドッグタイムアウト
症状: 50秒以上のモデルロード中にタイムアウト
解決策:
- AutoModelSelector.get_model()にsafety_controllerを渡す
- モデルロード中の6箇所でハートビートを送信
2. モデル初期化エラー (TypeError)
症状: name 'd_model' is not defined
解決策:
- _load_from_api()でTypeErrorをキャッチ
- デフォルトパラメータでフィルタリング
- フィルタ済みパラメータで再初期化
3. API接続エラー
症状: Failed to resolve 'api'
解決策:
- Docker環境: apiホスト名を使用
- ローカル環境: localhostを使用
- 環境変数API_HOSTで制御可能
4. トークナイザーロード失敗
症状: 言語モデルでトークナイザーが見つからない
解決策:
- _load_tokenizer_from_session()失敗時に自動フォールバック
- デフォルトBERTトークナイザー(bert-base-uncased)を使用
今後の開発
優先度: 高
- MotorModule統合
MotorModuleをAutoModelSelectorに統合-
Motor系サブノードで専用モデルを使用
-
モデル保存・読込の強化
- トークナイザーの自動保存
- config.jsonの完全性チェック
優先度: 中
- 階層的モデル選択
- サブノードごとに異なるモデルを使用可能に
-
視覚階層: Edge→Shape→Objectで異なるモデル
-
動的ノード発見
- ノード発見サービスの強化
- 動的なトポロジー変更対応
優先度: 低
- 分散学習サポート
- 複数ノード間での協調学習
- 勾配同期機構
config.jsonの構造
各モデルタイプで保存されるconfig.jsonの詳細な構造です。
SpikingEvoTextLM (言語モデル)
{
"vocab_size": 30522,
"d_model": 128,
"n_heads": 4,
"num_transformer_blocks": 2,
"time_steps": 16,
"neuron_type": "lif"
}
パラメータ説明:
- vocab_size: 語彙サイズ(BERT互換は30522)
- d_model: Transformerの隠れ層次元
- n_heads: マルチヘッドアテンションのヘッド数
- num_transformer_blocks: Transformerブロックの層数
- time_steps: スパイキングニューロンの時間ステップ数
- neuron_type: ニューロンタイプ("lif" または "alif")
保存スクリプト:
python examples/train_spiking_evospikenet_lm.py \
--run-name lang_20251209_132845 \
--upload-to-db
アーティファクト:
- config.json - モデル設定
- spiking_lm.pth - モデル重み
- spiking_lm_tokenizer.zip - BERTトークナイザー
SpikingEvoVisionEncoder (視覚モデル)
{
"input_channels": 1,
"output_dim": 128,
"time_steps": 20,
"num_classes": 10,
"dataset": "mnist",
"image_size": [28, 28]
}
パラメータ説明:
- input_channels: 入力画像のチャンネル数(1=グレースケール、3=RGB)
- output_dim: 出力特徴ベクトルの次元
- time_steps: スパイキングニューロンの時間ステップ数
- num_classes: 分類クラス数(分類タスクの場合)
- dataset: 学習に使用したデータセット名
- image_size: 入力画像サイズ [高さ, 幅]
保存スクリプト:
python examples/train_vision_encoder.py \
--run-name vision_20251208_164304 \
--dataset mnist \
--upload-to-db
アーティファクト:
- config.json - モデル設定
- vision_encoder.pth - エンコーダー重み
- vision_classifier.pth - 分類器重み(オプション)
SpikingEvoAudioEncoder (音声モデル)
{
"input_features": 13,
"output_neurons": 128,
"time_steps": 10
}
パラメータ説明:
- input_features: 入力特徴量の次元(通常はMFCC係数数)
- output_neurons: 出力ニューロン数
- time_steps: スパイキングニューロンの時間ステップ数
保存スクリプト:
python examples/train_audio_modal_lm.py \
--run-name audio_20251208_164638 \
--upload-to-db
アーティファクト:
- config.json - モデル設定
- audio_encoder.pth - モデル重み
config.jsonの使用フロー
1. モデル保存時
# 学習スクリプト内
config_to_save = {
'vocab_size': tokenizer.vocab_size,
'd_model': args.d_model,
'n_heads': args.n_heads,
'num_transformer_blocks': args.num_blocks,
'time_steps': args.time_steps,
'neuron_type': args.neuron_type,
}
with open('config.json', 'w') as f:
json.dump(config_to_save, f, indent=4)
2. モデルロード時(AutoModelSelector)
# config.jsonをダウンロード
with open(config_path, 'r') as f:
config = json.load(f)
# deviceを追加
config['device'] = 'cpu'
# モデル初期化
try:
model = SpikingEvoTextLM(**config)
except TypeError as e:
# パラメータ不一致時はフィルタリング
default_params = _get_default_params(task_type)
filtered_config = {k: v for k, v in config.items()
if k in default_params or k == 'device'}
model = SpikingEvoTextLM(**filtered_config)
3. エラーハンドリング
config.jsonに余分なパラメータが含まれている場合:
# 例: config.jsonに"aeg_module"などモデルが受け付けないパラメータがある
{
"vocab_size": 30522,
"d_model": 128,
"aeg_module": {...} # SpikingEvoTextLMは受け付けない
}
# TypeError発生 → デフォルトパラメータでフィルタリング
filtered_config = {
"vocab_size": 30522,
"d_model": 128,
"time_steps": 10, # デフォルト値で補完
"device": "cpu"
}
参考資料
最終更新: 2025年12月10日 バージョン: v1.1