feat: add migrations, test scripts, and utility tools
- Add database migrations (006-028) for face recognition, identity, file_uuid - Add test scripts for ASR, face, search, processing - Add portal frontend (Tauri) - Add config, benchmark, and monitoring utilities - Add model checkpoints and pretrained model references
This commit is contained in:
185
test_performance_quick.py
Normal file
185
test_performance_quick.py
Normal file
@@ -0,0 +1,185 @@
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
"""Quick performance test for ASR processor."""
|
||||
|
||||
import subprocess
|
||||
import tempfile
|
||||
import os
|
||||
import time
|
||||
import sys
|
||||
import json
|
||||
import statistics
|
||||
|
||||
|
||||
def test_small_video():
|
||||
"""Test with small video to establish baseline."""
|
||||
test_video = "/Users/accusys/test_video/BigBuckBunny_320x180.mp4"
|
||||
if not os.path.exists(test_video):
|
||||
print(f"Small test video not found: {test_video}")
|
||||
return None
|
||||
|
||||
print(f"Testing small video: {os.path.basename(test_video)}")
|
||||
|
||||
runs = 3
|
||||
times = []
|
||||
|
||||
for run in range(runs):
|
||||
with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as f:
|
||||
output_path = f.name
|
||||
|
||||
try:
|
||||
cmd = [
|
||||
"/opt/homebrew/bin/python3.11",
|
||||
"scripts/asr_processor.py",
|
||||
test_video,
|
||||
output_path,
|
||||
"--chunk-duration",
|
||||
"600",
|
||||
]
|
||||
|
||||
env = os.environ.copy()
|
||||
env["MOMENTRY_DISABLE_REDIS"] = "1"
|
||||
|
||||
start = time.time()
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True,
|
||||
env=env,
|
||||
)
|
||||
elapsed = time.time() - start
|
||||
|
||||
if result.returncode == 0:
|
||||
times.append(elapsed)
|
||||
print(f" Run {run + 1}: {elapsed:.1f}s")
|
||||
else:
|
||||
print(f" Run {run + 1}: failed (code {result.returncode})")
|
||||
|
||||
except Exception as e:
|
||||
print(f" Run {run + 1}: error: {e}")
|
||||
finally:
|
||||
if os.path.exists(output_path):
|
||||
os.unlink(output_path)
|
||||
|
||||
if times:
|
||||
avg = statistics.mean(times)
|
||||
stdev = statistics.stdev(times) if len(times) > 1 else 0
|
||||
print(f"\nResults: {len(times)} successful runs")
|
||||
print(f" Average: {avg:.1f}s")
|
||||
print(f" Std dev: {stdev:.1f}s")
|
||||
print(f" Range: {min(times):.1f}s - {max(times):.1f}s")
|
||||
return avg
|
||||
else:
|
||||
print("\nNo successful runs")
|
||||
return None
|
||||
|
||||
|
||||
def test_with_checkpoint():
|
||||
"""Test checkpoint functionality."""
|
||||
test_video = "/Users/accusys/test_video/BigBuckBunny_320x180.mp4"
|
||||
if not os.path.exists(test_video):
|
||||
print(f"Test video not found: {test_video}")
|
||||
return
|
||||
|
||||
print(f"\nTesting checkpoint functionality...")
|
||||
|
||||
# Force chunked mode with small max_direct_duration
|
||||
with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as f:
|
||||
output_path = f.name
|
||||
|
||||
try:
|
||||
cmd = [
|
||||
"/opt/homebrew/bin/python3.11",
|
||||
"scripts/asr_processor.py",
|
||||
test_video,
|
||||
output_path,
|
||||
"--chunk-duration",
|
||||
"30", # Small chunks for testing
|
||||
"--max-direct-duration",
|
||||
"1", # Force chunked mode
|
||||
]
|
||||
|
||||
env = os.environ.copy()
|
||||
env["MOMENTRY_DISABLE_REDIS"] = "1"
|
||||
env["ASR_DEBUG"] = "1"
|
||||
|
||||
print(f"Running with forced chunked mode...")
|
||||
start = time.time()
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True,
|
||||
env=env,
|
||||
timeout=60,
|
||||
)
|
||||
elapsed = time.time() - start
|
||||
|
||||
print(f" Time: {elapsed:.1f}s")
|
||||
print(f" Return code: {result.returncode}")
|
||||
|
||||
# Check for checkpoint file
|
||||
checkpoint_path = output_path + ".checkpoint"
|
||||
if os.path.exists(checkpoint_path):
|
||||
print(
|
||||
f" Checkpoint file created: Yes ({os.path.getsize(checkpoint_path)} bytes)"
|
||||
)
|
||||
# Load and inspect checkpoint
|
||||
try:
|
||||
with open(checkpoint_path, "r") as f:
|
||||
checkpoint = json.load(f)
|
||||
print(
|
||||
f" Checkpoint contains: {len(checkpoint.get('segments', []))} segments"
|
||||
)
|
||||
print(
|
||||
f" Processed chunks: {len(checkpoint.get('processed_chunks', []))}"
|
||||
)
|
||||
except Exception as e:
|
||||
print(f" Failed to read checkpoint: {e}")
|
||||
else:
|
||||
print(f" Checkpoint file created: No")
|
||||
|
||||
# Check if checkpoint was cleaned up after completion
|
||||
# (should be cleaned up if processing completed)
|
||||
if result.returncode == 0:
|
||||
if not os.path.exists(checkpoint_path):
|
||||
print(f" Checkpoint cleaned up after completion: Yes")
|
||||
else:
|
||||
print(f" Checkpoint cleaned up after completion: No (still exists)")
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
print(f" Timeout after 60 seconds")
|
||||
except Exception as e:
|
||||
print(f" Error: {e}")
|
||||
finally:
|
||||
if os.path.exists(output_path):
|
||||
os.unlink(output_path)
|
||||
checkpoint_path = output_path + ".checkpoint"
|
||||
if os.path.exists(checkpoint_path):
|
||||
os.unlink(checkpoint_path)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("ASR Processor Quick Performance Test")
|
||||
print("=" * 60)
|
||||
|
||||
# Baseline performance
|
||||
baseline = test_small_video()
|
||||
|
||||
# Checkpoint test
|
||||
test_with_checkpoint()
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
if baseline:
|
||||
print(f"Baseline performance: {baseline:.1f}s")
|
||||
# Compare with previous baseline (~18.9s from earlier test)
|
||||
previous_baseline = 18.9
|
||||
change = ((baseline - previous_baseline) / previous_baseline) * 100
|
||||
print(f"Change from previous: {change:+.1f}%")
|
||||
|
||||
if change <= 5:
|
||||
print("✅ Within 5% overhead limit")
|
||||
else:
|
||||
print(f"⚠️ Overhead exceeds 5% limit")
|
||||
|
||||
print("\nCheckpoint functionality appears to be integrated.")
|
||||
Reference in New Issue
Block a user