290 lines
11 KiB
Python
290 lines
11 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Deploy功能演示
|
||
|
||
此腳本展示deploy按鈕的完整工作流程,包括:
|
||
1. Pipeline驗證
|
||
2. .mflow轉換
|
||
3. 拓撲分析
|
||
4. 配置生成
|
||
5. 部署流程(模擬)
|
||
"""
|
||
|
||
import json
|
||
import os
|
||
|
||
def simulate_deploy_workflow():
|
||
"""模擬完整的deploy工作流程"""
|
||
|
||
print("🚀 Pipeline Deploy功能演示")
|
||
print("=" * 60)
|
||
|
||
# 模擬從UI導出的pipeline數據
|
||
pipeline_data = {
|
||
"project_name": "Fire Detection Pipeline",
|
||
"description": "Real-time fire detection using Kneron NPU",
|
||
"nodes": [
|
||
{
|
||
"id": "input_camera",
|
||
"name": "RGB Camera",
|
||
"type": "ExactInputNode",
|
||
"properties": {
|
||
"source_type": "Camera",
|
||
"device_id": 0,
|
||
"resolution": "1920x1080",
|
||
"fps": 30
|
||
}
|
||
},
|
||
{
|
||
"id": "model_fire_det",
|
||
"name": "Fire Detection Model",
|
||
"type": "ExactModelNode",
|
||
"properties": {
|
||
"model_path": "./models/fire_detection_520.nef",
|
||
"scpu_fw_path": "./firmware/fw_scpu.bin",
|
||
"ncpu_fw_path": "./firmware/fw_ncpu.bin",
|
||
"dongle_series": "520",
|
||
"port_id": "28,30",
|
||
"num_dongles": 2
|
||
}
|
||
},
|
||
{
|
||
"id": "model_verify",
|
||
"name": "Verification Model",
|
||
"type": "ExactModelNode",
|
||
"properties": {
|
||
"model_path": "./models/verification_520.nef",
|
||
"scpu_fw_path": "./firmware/fw_scpu.bin",
|
||
"ncpu_fw_path": "./firmware/fw_ncpu.bin",
|
||
"dongle_series": "520",
|
||
"port_id": "32,34",
|
||
"num_dongles": 2
|
||
}
|
||
},
|
||
{
|
||
"id": "output_alert",
|
||
"name": "Alert System",
|
||
"type": "ExactOutputNode",
|
||
"properties": {
|
||
"output_type": "Stream",
|
||
"format": "JSON",
|
||
"destination": "tcp://localhost:5555"
|
||
}
|
||
}
|
||
],
|
||
"connections": [
|
||
{"output_node": "input_camera", "input_node": "model_fire_det"},
|
||
{"output_node": "model_fire_det", "input_node": "model_verify"},
|
||
{"output_node": "model_verify", "input_node": "output_alert"}
|
||
]
|
||
}
|
||
|
||
print("📋 Step 1: Pipeline Validation")
|
||
print("-" * 30)
|
||
|
||
# 驗證pipeline結構
|
||
nodes = pipeline_data.get('nodes', [])
|
||
connections = pipeline_data.get('connections', [])
|
||
|
||
input_nodes = [n for n in nodes if 'Input' in n['type']]
|
||
model_nodes = [n for n in nodes if 'Model' in n['type']]
|
||
output_nodes = [n for n in nodes if 'Output' in n['type']]
|
||
|
||
print(f" Input nodes: {len(input_nodes)}")
|
||
print(f" Model nodes: {len(model_nodes)}")
|
||
print(f" Output nodes: {len(output_nodes)}")
|
||
print(f" Connections: {len(connections)}")
|
||
|
||
if input_nodes and model_nodes and output_nodes:
|
||
print(" ✓ Pipeline structure is valid")
|
||
else:
|
||
print(" ✗ Pipeline structure is invalid")
|
||
return
|
||
|
||
print("\n🔄 Step 2: MFlow Conversion & Topology Analysis")
|
||
print("-" * 30)
|
||
|
||
# 模擬拓撲分析
|
||
print(" Starting intelligent pipeline topology analysis...")
|
||
print(" Building dependency graph...")
|
||
print(f" Graph built: {len(model_nodes)} model nodes, {len(connections)} dependencies")
|
||
print(" Checking for dependency cycles...")
|
||
print(" No cycles detected")
|
||
print(" Performing optimized topological sort...")
|
||
print(" Calculating execution depth levels...")
|
||
print(f" Sorted {len(model_nodes)} stages into 2 execution levels")
|
||
print(" Calculating pipeline metrics...")
|
||
|
||
print("\n INTELLIGENT PIPELINE TOPOLOGY ANALYSIS COMPLETE")
|
||
print(" " + "=" * 40)
|
||
print(" Pipeline Metrics:")
|
||
print(f" Total Stages: {len(model_nodes)}")
|
||
print(f" Pipeline Depth: 2 levels")
|
||
print(f" Max Parallel Stages: 1")
|
||
print(f" Parallelization Efficiency: 100.0%")
|
||
|
||
print("\n Optimized Execution Order:")
|
||
for i, model in enumerate(model_nodes, 1):
|
||
print(f" {i:2d}. {model['name']}")
|
||
|
||
print("\n Critical Path (2 stages):")
|
||
print(" Fire Detection Model → Verification Model")
|
||
|
||
print("\n Performance Insights:")
|
||
print(" Excellent parallelization potential!")
|
||
print(" Low latency pipeline - great for real-time applications")
|
||
|
||
print("\n⚙️ Step 3: Stage Configuration Generation")
|
||
print("-" * 30)
|
||
|
||
for i, model_node in enumerate(model_nodes, 1):
|
||
props = model_node['properties']
|
||
stage_id = f"stage_{i}_{model_node['name'].replace(' ', '_').lower()}"
|
||
|
||
print(f" Stage {i}: {stage_id}")
|
||
print(f" Port IDs: {props.get('port_id', 'auto').split(',')}")
|
||
print(f" Model Path: {props.get('model_path', 'not_set')}")
|
||
print(f" SCPU Firmware: {props.get('scpu_fw_path', 'not_set')}")
|
||
print(f" NCPU Firmware: {props.get('ncpu_fw_path', 'not_set')}")
|
||
print(f" Upload Firmware: {props.get('upload_fw', False)}")
|
||
print(f" Queue Size: 50")
|
||
print()
|
||
|
||
print("🔧 Step 4: Configuration Validation")
|
||
print("-" * 30)
|
||
|
||
validation_errors = []
|
||
|
||
for model_node in model_nodes:
|
||
props = model_node['properties']
|
||
name = model_node['name']
|
||
|
||
# 檢查模型路徑
|
||
model_path = props.get('model_path', '')
|
||
if not model_path:
|
||
validation_errors.append(f"Model '{name}' missing model path")
|
||
elif not model_path.endswith('.nef'):
|
||
validation_errors.append(f"Model '{name}' must use .nef format")
|
||
|
||
# 檢查固件路徑
|
||
if not props.get('scpu_fw_path'):
|
||
validation_errors.append(f"Model '{name}' missing SCPU firmware")
|
||
if not props.get('ncpu_fw_path'):
|
||
validation_errors.append(f"Model '{name}' missing NCPU firmware")
|
||
|
||
# 檢查端口ID
|
||
if not props.get('port_id'):
|
||
validation_errors.append(f"Model '{name}' missing port ID")
|
||
|
||
if validation_errors:
|
||
print(" ✗ Validation failed with errors:")
|
||
for error in validation_errors:
|
||
print(f" - {error}")
|
||
print("\n Please fix these issues before deployment.")
|
||
return
|
||
else:
|
||
print(" ✓ All configurations are valid!")
|
||
|
||
print("\n🚀 Step 5: Pipeline Deployment")
|
||
print("-" * 30)
|
||
|
||
# 模擬部署過程
|
||
deployment_steps = [
|
||
(10, "Converting pipeline configuration..."),
|
||
(30, "Pipeline conversion completed"),
|
||
(40, "Validating pipeline configuration..."),
|
||
(60, "Configuration validation passed"),
|
||
(70, "Initializing inference pipeline..."),
|
||
(80, "Initializing dongle connections..."),
|
||
(85, "Uploading firmware to dongles..."),
|
||
(90, "Loading models to dongles..."),
|
||
(95, "Starting pipeline execution..."),
|
||
(100, "Pipeline deployed successfully!")
|
||
]
|
||
|
||
for progress, message in deployment_steps:
|
||
print(f" [{progress:3d}%] {message}")
|
||
|
||
# 模擬一些具體的部署細節
|
||
if "dongle connections" in message:
|
||
print(" Connecting to dongle on port 28...")
|
||
print(" Connecting to dongle on port 30...")
|
||
print(" Connecting to dongle on port 32...")
|
||
print(" Connecting to dongle on port 34...")
|
||
elif "firmware" in message:
|
||
print(" Uploading SCPU firmware...")
|
||
print(" Uploading NCPU firmware...")
|
||
elif "models" in message:
|
||
print(" Loading fire_detection_520.nef...")
|
||
print(" Loading verification_520.nef...")
|
||
|
||
print("\n🎉 Deployment Complete!")
|
||
print("-" * 30)
|
||
print(f" ✓ Pipeline '{pipeline_data['project_name']}' deployed successfully")
|
||
print(f" ✓ {len(model_nodes)} stages running on {sum(len(m['properties'].get('port_id', '').split(',')) for m in model_nodes)} dongles")
|
||
print(" ✓ Real-time inference pipeline is now active")
|
||
|
||
print("\n📊 Deployment Summary:")
|
||
print(" • Input: RGB Camera (1920x1080 @ 30fps)")
|
||
print(" • Stage 1: Fire Detection (Ports 28,30)")
|
||
print(" • Stage 2: Verification (Ports 32,34)")
|
||
print(" • Output: Alert System (TCP stream)")
|
||
print(" • Expected Latency: <50ms")
|
||
print(" • Expected Throughput: 25-30 FPS")
|
||
|
||
def show_ui_integration():
|
||
"""展示如何在UI中使用deploy功能"""
|
||
|
||
print("\n" + "=" * 60)
|
||
print("🖥️ UI Integration Guide")
|
||
print("=" * 60)
|
||
|
||
print("\n在App中使用Deploy功能的步驟:")
|
||
print("\n1. 📝 創建Pipeline")
|
||
print(" • 拖拽Input、Model、Output節點到畫布")
|
||
print(" • 連接節點建立數據流")
|
||
print(" • 設置每個節點的屬性")
|
||
|
||
print("\n2. ⚙️ 配置Model節點")
|
||
print(" • model_path: 設置.nef模型檔案路徑")
|
||
print(" • scpu_fw_path: 設置SCPU固件路徑(.bin)")
|
||
print(" • ncpu_fw_path: 設置NCPU固件路徑(.bin)")
|
||
print(" • port_id: 設置dongle端口ID (如: '28,30')")
|
||
print(" • dongle_series: 選擇dongle型號 (520/720等)")
|
||
|
||
print("\n3. 🔄 驗證Pipeline")
|
||
print(" • 點擊 'Validate Pipeline' 檢查結構")
|
||
print(" • 確認stage count顯示正確")
|
||
print(" • 檢查所有連接是否正確")
|
||
|
||
print("\n4. 🚀 部署Pipeline")
|
||
print(" • 點擊綠色的 'Deploy Pipeline' 按鈕")
|
||
print(" • 查看自動拓撲分析結果")
|
||
print(" • 檢查配置並確認部署")
|
||
print(" • 監控部署進度和狀態")
|
||
|
||
print("\n5. 📊 監控運行狀態")
|
||
print(" • 查看dongle連接狀態")
|
||
print(" • 監控pipeline性能指標")
|
||
print(" • 檢查實時處理結果")
|
||
|
||
print("\n💡 注意事項:")
|
||
print(" • 確保所有檔案路徑正確且存在")
|
||
print(" • 確認dongle硬體已連接")
|
||
print(" • 檢查USB端口權限")
|
||
print(" • 監控系統資源使用情況")
|
||
|
||
if __name__ == "__main__":
|
||
simulate_deploy_workflow()
|
||
show_ui_integration()
|
||
|
||
print("\n" + "=" * 60)
|
||
print("✅ Deploy功能已完整實現!")
|
||
print("\n🎯 主要特色:")
|
||
print(" • 一鍵部署 - 從UI直接部署到dongle")
|
||
print(" • 智慧拓撲分析 - 自動優化執行順序")
|
||
print(" • 完整驗證 - 部署前檢查所有配置")
|
||
print(" • 實時監控 - 部署進度和狀態追蹤")
|
||
print(" • 錯誤處理 - 詳細的錯誤信息和建議")
|
||
|
||
print("\n🚀 準備就緒,可以進行進度報告!") |