download
raw
5.68 kB
"""Edge Runtime Example for Sofia Engine.
Demonstrates:
1. Memory-bounded SignalFrame telemetry packaging
2. Hardened Sofia Assembly VM bytecode execution
3. In-situ neural network forward pass & analytical backpropagation
4. Safe, zero-pickle model serialization (JSON manifest + NPZ + SHA-256)
Run:
python examples/edge_runtime.py
"""
from __future__ import annotations
import tempfile
import time
from pathlib import Path
import numpy as np
from sofia_ai.core.contracts import DataQuality, Sample, SignalFrame, SignalMetadata
from sofia_ai.learning.asm import AssemblyNeuralNetwork
from sofia_ai.learning.asm.vm import (
AsmInstruction,
OpCode,
Register,
SofiaAsmVM,
VMStatus,
)
from sofia_ai.learning.manifest import load_assembly_model, save_assembly_model
def run_edge_runtime() -> None:
print("=== Sofia Engine: Edge Runtime & Embedded VM ===")
# -------------------------------------------------------------------------
# 1. Bounded SignalFrame Telemetry Packaging
# -------------------------------------------------------------------------
fs = 1000.0
meta = SignalMetadata(
sample_rate=fs,
channel_name="vibration_radial",
physical_unit="m/s^2",
sensor_id="piezo_accel_42",
)
# Telemetry buffer strictly respects runtime capacity ceilings (<= 65536)
base_time = time.time()
samples = tuple(
Sample(
timestamp=base_time + i / fs,
device_id="edge-gateway-42",
channel="vibration_radial",
value=float(np.sin(2 * np.pi * 10.0 * (i / fs))),
unit="m/s^2",
quality=DataQuality.GOOD,
)
for i in range(256)
)
frame = SignalFrame(samples=samples, metadata=meta)
print(f"\n[1] SignalFrame Ingested: {frame.size} samples, Quality={frame.samples[0].quality.name}")
print(f" Channel: {frame.metadata.channel_name}, Sensor: {frame.metadata.sensor_id}")
# -------------------------------------------------------------------------
# 2. Hardened Sofia Assembly Virtual Machine
# -------------------------------------------------------------------------
print("\n[2] Sofia Assembly Virtual Machine Execution")
vm = SofiaAsmVM(memory_size=1024)
# Assemble a bounded test program:
# R1 = 12.5, R2 = 3.5, R1 = R1 + R2 (16.0), Mem[100] = R1, HALT
program = [
AsmInstruction(OpCode.LOAD_CONST, Register.R1, imm=12.5),
AsmInstruction(OpCode.LOAD_CONST, Register.R2, imm=3.5),
AsmInstruction(OpCode.ADD, Register.R1, Register.R2),
AsmInstruction(OpCode.LOAD_CONST, Register.R3, imm=100.0),
AsmInstruction(OpCode.STORE_MEM, Register.R3, Register.R1),
AsmInstruction(OpCode.HALT),
]
result = vm.run(program, max_cycles=1000)
print(f" VM Status: {result.status.value}")
print(f" Executed Cycles: {result.cycles}")
print(f" Register R1: {vm.registers[Register.R1]:.2f}")
print(f" Memory[100]: {vm.memory[100]:.2f}")
assert result.status == VMStatus.HALTED
assert vm.memory[100] == 16.0
# -------------------------------------------------------------------------
# 3. In-Situ Neural Training with Analytical Backpropagation
# -------------------------------------------------------------------------
print("\n[3] In-Situ Neural Network (2-Layer Bytecode Backpropagation)")
input_dim, hidden_dim, output_dim = 4, 8, 1
net = AssemblyNeuralNetwork(
input_dim=input_dim,
hidden_dim=hidden_dim,
output_dim=output_dim,
learning_rate=0.05,
)
# Synthetic training sample (e.g. 4 normalized vibration features -> target health)
x = np.array([0.25, 0.40, 0.10, 0.60], dtype=np.float64)
target = np.array([0.85], dtype=np.float64)
initial_pred = net.forward(x)
initial_loss = float(np.mean((initial_pred - target) ** 2))
print(f" Initial Prediction: {initial_pred[0]:.4f} (Target: {target[0]:.4f}, Loss: {initial_loss:.4f})")
# Perform 15 in-situ gradient update steps
for _ in range(15):
net.train_step(x, target)
final_pred = net.forward(x)
final_loss = float(np.mean((final_pred - target) ** 2))
print(f" Updated Prediction: {final_pred[0]:.4f} (Target: {target[0]:.4f}, Loss: {final_loss:.4f})")
assert final_loss < initial_loss, "Loss should decrease after training steps"
# -------------------------------------------------------------------------
# 4. Safe Model Manifest Export & SHA-256 Checksum Verification
# -------------------------------------------------------------------------
print("\n[4] Safe Model Serialization (Zero-Pickle sofia.model.v1)")
with tempfile.TemporaryDirectory() as tmpdir:
manifest_path = save_assembly_model(
model=net,
destination_dir=tmpdir,
model_name="edge_demo_model",
feature_schema="vibration-v3",
extra_metadata={"trained_on": "synthetic_edge_sample"},
)
print(f" Saved Manifest: {manifest_path.name}")
# Reload model and verify SHA-256 parameter integrity
loaded_net, loaded_manifest = load_assembly_model(manifest_path)
print(f" Verified SHA-256: {loaded_manifest.parameters_sha256[:16]}... (Valid)")
reloaded_pred = loaded_net.forward(x)
print(f" Reloaded Model Prediction: {reloaded_pred[0]:.4f}")
assert np.isclose(reloaded_pred[0], final_pred[0]), "Reloaded model must match original weights"
print("\nAll edge runtime checks passed successfully.")
if __name__ == "__main__":
run_edge_runtime()

Xet Storage Details

Size:
5.68 kB
·
Xet hash:
ce8e72875da9003488fcbab7cf8f310356ba4df43216f988605ee2896544dd29

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.