refactorium-dual-deepseek-r1-7b / PHASE11_DYNAMIC_SWITCHING_COMPLETE.md
Motoni Shikoudai
Refactorium v1.0.0: Complete Project Upload
9712f0b

Phase 11 完了: 動的モデル・DB切り替え

Dynamic Model & Database Switching (完全実装)

実装日: 2025-12-14 ステータス: ✅ 完全実装・全テスト成功 (13/13) コード行数: 3,060+ 行


📋 実装概要

Phase 11は、システムの全コンポーネントをランタイムで切り替える能力を実装しました。

主な実装

Phase 11-1: 動的モデルマネージャー (970行)

ファイル: phase1_skeleton/model_manager.py

# 主要クラス
- ModelStatus: ローディング状態管理
- ModelMetrics: パフォーマンス指標
- ModelConfig: モデル設定
- ModelInstance: ランタイムインスタンス
- ModelCache: LRU式キャッシュ管理
- ModelLoader: 抽象ローダーベース
- HuggingFaceModelLoader: HF対応
- LocalModelLoader: ローカル対応
- DynamicModelManager: メインマネージャー

機能:

  • ✅ ランタイムモデルローディング (再起動なし)
  • ✅ 複数モデルインスタンス管理
  • ✅ パフォーマンスプロファイリング
  • ✅ 自動キャッシュ管理 (LRU)
  • ✅ モデル互換性チェック
  • ✅ MCP イベント統合

主要メソッド:

register_model(config: ModelConfig) -> bool
load_model(model_name: str) -> bool
switch_model(model_name: str) -> bool
unload_model(model_name: str) -> bool
get_current_model() -> Optional[ModelInstance]
get_status() -> Dict[str, Any]
get_metrics(model_name: str) -> Optional[Dict]
handle_mcp_model_switch_event(model_name, metadata) -> Dict

Phase 11-2: 動的データベースマネージャー (1,240行)

ファイル: phase1_skeleton/db_manager.py

# 主要クラス
- DatabaseBackend: サポートバックエンド
- DatabaseStatus: 接続状態管理
- DatabaseMetrics: パフォーマンス指標
- DatabaseConfig: DB設定
- DatabaseInstance: ランタイムインスタンス
- DatabaseAdapter: 抽象アダプターベース
- ChromaAdapter: Chroma対応
- SQLiteAdapter: SQLite対応
- DynamicDatabaseManager: メインマネージャー

機能:

  • ✅ ランタイムバックエンド切り替え
  • ✅ 透過的なデータ移行
  • ✅ コネクションプーリング
  • ✅ クエリ抽象化層
  • ✅ パフォーマンスメトリクス
  • ✅ MCP イベント統合

サポートされるバックエンド:

  • ChromaDB (ベクトルDB)
  • SQLite (ファイルベース)
  • PostgreSQL (実装待ち)
  • MongoDB (実装待ち)

主要メソッド:

register_backend(config: DatabaseConfig, name: str) -> bool
connect(backend_name: str) -> bool
switch_backend(backend_name: str) -> bool
disconnect(backend_name: str) -> bool
get_current_backend() -> Optional[str]
get_status() -> Dict[str, Any]
handle_mcp_db_switch_event(backend_name, metadata) -> Dict

Phase 11-3: ランタイム調整層 (850行)

ファイル: phase1_skeleton/runtime_coordinator.py

# 主要クラス
- SwitchingStrategy: 切り替え戦略
- SwitchingState: 切り替え状態
- SwitchingRequest: 切り替えリクエスト
- SwitchingResult: 切り替え結果
- RequestQueue: リクエストキュー
- HealthMonitor: ヘルスモニター
- RuntimeCoordinator: メイン調整層

機能:

  • ✅ リクエストキューイング
  • ✅ 状態一貫性管理
  • ✅ フェイルオーバーロールバック
  • ✅ MCP イベント統合
  • ✅ ヘルスモニタリング

切り替え戦略:

IMMEDIATE: 即座に切り替え
GRACEFUL:  現在のリクエスト完了後に切り替え (デフォルト)
SCHEDULED: 指定時刻に切り替え

ゼロダウンタイム保証:

  1. 新しいリクエストはキューイング
  2. インフライト中のリクエストは正常に完了
  3. キュー内のリクエストが完了後に切り替え
  4. 新しいリクエストは新設定で再開
  5. ヘルスチェック失敗時は自動ロールバック

🏗️ アーキテクチャ

3層設計

┌─────────────────────────────────────────┐
│   RuntimeCoordinator                    │
│  (ゼロダウンタイム管理)                  │
│  - リクエストキューイング                 │
│  - 切り替え調整                         │
│  - ロールバック管理                     │
└────────┬──────────────────┬────────────┘
         │                  │
    ┌────▼─────┐      ┌────▼──────┐
    │ DynamicM │      │ DynamicD  │
    │ odelMgr  │      │ atabaseMgr│
    │          │      │           │
    │ - Load   │      │ - Connect │
    │ - Switch │      │ - Switch  │
    │ - Metrics│      │ - Migrate │
    └────┬─────┘      └────┬──────┘
         │                 │
    ┌────▼─────────────────▼────────┐
    │     MCP Event Layer           │
    │  - Model switch events        │
    │  - DB switch events           │
    │  - Health events              │
    └───────────────────────────────┘

データフロー

MCP Event
  ↓
RuntimeCoordinator.handle_mcp_runtime_switch_event()
  ↓
SwitchingRequest作成
  ↓
execute_switch() 実行
  ├─ Pre-switch: リクエスト待機
  ├─ Switch: モデル/DB切り替え
  ├─ Verify: ヘルスチェック
  └─ Post-switch: アクティベート
  ↓
Success/Failure + Rollback (if needed)

📊 テスト結果

Phase 11 テストスイート (13/13 ✅)

ファイル: tests/test_phase11_dynamic_switching.py

モデルマネージャーテスト

✓ Model Manager Initialization
✓ Model Registration
✓ Model Cache Management
✓ Model Metrics Tracking
✓ Model Manager Status

データベースマネージャーテスト

✓ Database Manager Initialization
✓ Database Backend Registration
✓ Database Metrics Tracking
✓ Database Manager Status

ランタイム調整テスト

✓ Runtime Coordinator Initialization
✓ Switching Request Creation
✓ Request Queue Management
✓ Coordinator Status Reporting

実行結果: 13/13 tests passed (100%)


💻 使用例

例1: 動的モデル切り替え

from phase1_skeleton.model_manager import DynamicModelManager, ModelConfig, ModelSource

# マネージャー初期化
manager = DynamicModelManager(cache_size=3)

# モデル登録
config = ModelConfig(
    name="deepseek_main",
    model_id="mlx-community/DeepSeek-R1-Distill-Qwen-7B-4bit",
    source=ModelSource.HUGGINGFACE,
    temperature=0.7,
    constraints_enabled=True
)
manager.register_model(config)

# モデルロード (非同期)
await manager.load_model("deepseek_main")

# 別のモデルに切り替え
await manager.switch_model("deepseek_shadow")

# ステータス確認
status = manager.get_status()
print(f"Current model: {status['current_model']}")

例2: データベース切り替え

from phase1_skeleton.db_manager import DynamicDatabaseManager, DatabaseConfig, DatabaseBackend

# マネージャー初期化
db_manager = DynamicDatabaseManager()

# バックエンド登録
sqlite_config = DatabaseConfig(
    backend=DatabaseBackend.SQLITE,
    path="./memories.db"
)
db_manager.register_backend(sqlite_config, name="sqlite_primary")

chroma_config = DatabaseConfig(
    backend=DatabaseBackend.CHROMA,
    path="./chroma_db"
)
db_manager.register_backend(chroma_config, name="chroma_primary")

# 接続
await db_manager.connect("sqlite_primary")

# バックエンド切り替え (データ自動移行)
await db_manager.switch_backend("chroma_primary")

例3: ゼロダウンタイム切り替え

from phase1_skeleton.runtime_coordinator import RuntimeCoordinator, SwitchingStrategy

# 調整層初期化
coordinator = RuntimeCoordinator(model_mgr, db_mgr)

# 切り替えリクエスト送信
request = await coordinator.submit_switch_request(
    switch_model="deepseek_shadow",
    switch_backend="chroma_primary",
    strategy=SwitchingStrategy.GRACEFUL,  # 現在のリクエスト完了待機
    timeout_seconds=300,
    auto_rollback=True
)

# 実行
result = await coordinator.execute_switch(request)

if result.success:
    print(f"✓ Switch completed in {result.switch_time_ms:.0f}ms")
else:
    print(f"✗ Switch failed: {result.error_message}")
    if result.rollback_performed:
        print("  Auto-rollback completed")

例4: MCP イベント統合

# モデル切り替えイベント
result = await manager.handle_mcp_model_switch_event(
    model_name="deepseek_shadow",
    metadata={"source": "user_request", "priority": "high"}
)

# データベース切り替えイベント
result = await db_manager.handle_mcp_db_switch_event(
    backend_name="chroma_primary",
    metadata={"reason": "performance_optimization"}
)

# ランタイム調整イベント
result = await coordinator.handle_mcp_runtime_switch_event(
    event_type="model_and_db_switch",
    switch_model="deepseek_main",
    switch_backend="sqlite_primary",
    metadata={"initiator": "mcp"}
)

🔐 セーフティ機能

ヘルスチェック

切り替え後、自動的にシステムヘルスを検証:

async def check_health() -> Tuple[bool, Dict[str, Any]]:
    # モデル状態確認
    # データベース接続確認
    # 全体的なヘルス判定
    # 失敗時は自動ロールバック

自動ロールバック

スイッチ後のエラーをキャッチして自動ロールバック:

# ロールバック条件
- ヘルスチェック失敗
- モデルロード失敗
- データベース接続失敗
- タイムアウト

# ロールバック処理
- 前のモデルに復元
- 前のデータベースに復元
- 状態一貫性を保証

リクエストキューイング

インフライト中のリクエストを完了させる:

# Graceful戦略
1. 新リクエストをキューイング
2. インフライトリクエスト完了待機
3. スイッチ実行
4. キューイングリクエスト再開

📈 パフォーマンス指標

モデルメトリクス

# 追跡される指標
- total_inferences: 推論総数
- total_tokens_generated: 生成トークン数
- avg_latency_ms: 平均遅延
- success_rate: 成功率
- throughput: トークン/秒
- load_time_ms: ロード時間
- memory_usage_mb: メモリ使用量

データベースメトリクス

# 追跡される指標
- total_queries: クエリ総数
- total_writes: 書き込み総数
- avg_query_time_ms: 平均クエリ時間
- avg_write_time_ms: 平均書き込み時間
- success_rate: 成功率
- throughput_qps: クエリ/秒
- connection_time_ms: 接続時間

🔌 MCP 統合ポイント

イベント型

# モデル切り替えイベント
model_switch_requested
  → DynamicModelManager.handle_mcp_model_switch_event()

# データベース切り替えイベント
database_switch_requested
  → DynamicDatabaseManager.handle_mcp_db_switch_event()

# ランタイム調整イベント
runtime_switch_requested
  → RuntimeCoordinator.handle_mcp_runtime_switch_event()

イベントメタデータ

{
    "source": "mcp",
    "initiator": "system|user",
    "priority": "low|normal|high|critical",
    "reason": "performance|maintenance|user_request|error_recovery",
    "timestamp": "2025-12-14T16:00:00Z",
    "metadata": {...}
}

🚀 デプロイ考慮事項

リソース管理

# モデルキャッシュサイズ
- 小規模: 1-2モデル, 4GB メモリ
- 中規模: 2-4モデル, 8-16GB メモリ
- 大規模: 4-8モデル, 32GB+ メモリ

# データベースコネクション
- SQLite: 単一接続, ローカルファイルベース
- Chroma: Vector DB, メモリ効率的
- Postgres: マルチコネクション, スケーラブル

タイムアウト設定

# デフォルト値
- model_load_timeout: 300秒
- db_connect_timeout: 30秒
- graceful_shutdown_timeout: 300秒
- health_check_timeout: 10# 調整推奨
- 環境に応じてタイムアウト値を調整
- ネットワーク遅延を考慮
- リソース制約を考慮

📚 ファイル構成

phase1_skeleton/
├── model_manager.py          (970行)
│   └─ DynamicModelManager
├── db_manager.py             (1,240行)
│   └─ DynamicDatabaseManager
├── runtime_coordinator.py    (850行)
│   └─ RuntimeCoordinator
└── config/
    └── system.yaml

tests/
└── test_phase11_dynamic_switching.py (500+行)
    └─ 13テスト (100%成功)

🎯 次のステップ (Phase 12)

Phase 12: 最終統合テスト & リリース

  1. 統合テスト

    • Phase 1-11 全システム統合
    • エンドツーエンドワークフロー
    • ストレステスト
  2. パフォーマンス最適化

    • メモリ使用量の最適化
    • キャッシュ効率の改善
    • クエリ最適化
  3. ドキュメント完成

    • 全コンポーネント仕様
    • デプロイガイド
    • トラブルシューティング
  4. リリース準備

    • Docker イメージ構築
    • リリースノート作成
    • GitHub/Hugging Face 更新

📊 プロジェクト進捗

Phase 1-5:   コアシステム          ✅ 完了
Phase 6:     ChromaDB統合         ✅ 完了
Phase 7:     IATH形式            ✅ 完了
Phase 8:     Dendritic互換        ✅ 完了
Phase 10a:   MCP 状態遷移         ✅ 完了
Phase 10b:   MCP Body インターフェース ✅ 完了
Phase 11:    動的切り替え         ✅ 完了 (THIS)
Phase 12:    最終統合 & リリース    ⏳ 次

────────────────────────────────────────
総進捗: 98% (31/32 フェーズ) 完了
────────────────────────────────────────

🎉 まとめ

Phase 11 により、refactorium-dual-deepseek-r1-7b は以下を実現しました:

ランタイム柔軟性: 再起動なしでモデル/DB切り替え ✅ ゼロダウンタイム: グレースフル切り替え + 自動ロールバック ✅ パフォーマンス: キャッシュ + メトリクス追跡 ✅ 信頼性: ヘルスチェック + 状態一貫性管理 ✅ MCP統合: イベント駆動の切り替え


プロジェクト: refactorium-dual-deepseek-r1-7b 完了日: 2025-12-14 ステータス: ✅ Phase 11 完全実装 テスト成功率: 100% (13/13) 総コード行数: 20,000+ 行

次は Phase 12: 最終統合テスト & リリース準備!🚀