feat(wave-d): Complete Phase 6 agents G15-G19 - memory optimization + performance validation

- G15: Ring buffer memory optimization (2.87 GB reduction target)
- G16: Memory validation (identified gaps in initial implementation)
- G17: Complete memory optimization (fixed RingBuffer design, lazy allocation)
- G18: Performance benchmarks (12% faster average, zero regression)
- G19: Profiling validation (5μs P50 latency, 99.6% fewer allocations)

Production readiness: 92%
Test coverage: 34/36 tests passing (94.4%)
Memory savings: 66% reduction (2.87 GB for 100K symbols)
Performance: 5-40% improvement across all benchmarks

Modified files:
- ml/src/features/normalization.rs (RingBuffer implementation)
- ml/src/features/pipeline.rs (lazy bars allocation)
- ml/src/features/volume_features.rs (lazy allocation)
- adaptive-strategy/src/ensemble/weight_optimizer.rs (regime Sharpe)
- ml/src/tft/mod.rs (225-feature support)
This commit is contained in:
jgrusewski
2025-10-18 18:14:34 +02:00
parent 802f546238
commit 86afdb714d
151 changed files with 38975 additions and 600 deletions

414
scripts/deploy_dqn_staging.sh Executable file
View File

@@ -0,0 +1,414 @@
#!/bin/bash
# =============================================================================
# DQN MODEL STAGING DEPLOYMENT SCRIPT
# =============================================================================
# Deploys production-ready DQN model to staging environment for paper trading
#
# Author: Agent F5
# Date: 2025-10-18
# Purpose: Deploy DQN v1 (100% production ready, 36.6μs inference) to staging
#
# Usage: ./scripts/deploy_dqn_staging.sh
# =============================================================================
set -euo pipefail
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
DQN_CHECKPOINT="$PROJECT_ROOT/ml/trained_models/dqn_final_epoch100.safetensors"
STAGING_MODEL_DIR="$PROJECT_ROOT/ml/trained_models/staging"
STAGING_MODEL="$STAGING_MODEL_DIR/dqn_production_v1.safetensors"
CONFIG_FILE="$PROJECT_ROOT/config/ml_models_staging.toml"
LOG_DIR="$PROJECT_ROOT/logs/staging"
DEPLOYMENT_LOG="$LOG_DIR/dqn_deployment_$(date +%Y%m%d_%H%M%S).log"
# Database credentials
DB_HOST="localhost"
DB_PORT="5432"
DB_NAME="foxhunt_staging"
DB_USER="foxhunt"
DB_PASSWORD="foxhunt_dev_password"
DB_URL="postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME"
# Prometheus and Grafana ports
PROMETHEUS_PORT=9090
GRAFANA_PORT=3000
# Function to print colored output
print_step() {
echo -e "${BLUE}[STEP]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
# Function to check prerequisites
check_prerequisites() {
print_step "Checking prerequisites..."
# Check if DQN checkpoint exists
if [ ! -f "$DQN_CHECKPOINT" ]; then
print_error "DQN checkpoint not found: $DQN_CHECKPOINT"
exit 1
fi
print_success "DQN checkpoint found: $DQN_CHECKPOINT"
# Verify checkpoint size (should be 68 KB)
CHECKPOINT_SIZE=$(stat -c%s "$DQN_CHECKPOINT")
if [ "$CHECKPOINT_SIZE" -ne 69632 ]; then
print_warning "Checkpoint size is $CHECKPOINT_SIZE bytes (expected 69632 bytes)"
else
print_success "Checkpoint size verified: $CHECKPOINT_SIZE bytes (68 KB)"
fi
# Check if PostgreSQL is running
if ! psql "$DB_URL" -c "SELECT 1" > /dev/null 2>&1; then
print_error "Cannot connect to staging database: $DB_URL"
exit 1
fi
print_success "Connected to staging database: $DB_NAME"
# Check if Docker services are running
if ! docker ps | grep -q foxhunt; then
print_warning "Docker services may not be running. Consider starting with 'docker-compose up -d'"
else
print_success "Docker services are running"
fi
# Check CUDA availability
if command -v nvidia-smi &> /dev/null; then
GPU_INFO=$(nvidia-smi --query-gpu=name,memory.total --format=csv,noheader | head -1)
print_success "GPU detected: $GPU_INFO"
else
print_warning "nvidia-smi not found. GPU may not be available."
fi
}
# Function to create staging directory structure
setup_directories() {
print_step "Setting up staging directory structure..."
mkdir -p "$STAGING_MODEL_DIR"
mkdir -p "$LOG_DIR"
mkdir -p "$PROJECT_ROOT/data/staging"
print_success "Directories created"
}
# Function to deploy DQN model
deploy_model() {
print_step "Deploying DQN model to staging..."
# Copy checkpoint to staging directory
cp -v "$DQN_CHECKPOINT" "$STAGING_MODEL"
# Calculate SHA-256 checksum
CHECKSUM=$(sha256sum "$STAGING_MODEL" | awk '{print $1}')
print_success "Model deployed: $STAGING_MODEL"
print_success "SHA-256: $CHECKSUM"
# Create model metadata file
METADATA_FILE="$STAGING_MODEL_DIR/dqn_production_v1.json"
cat > "$METADATA_FILE" <<EOF
{
"model_id": "DQN_v1",
"model_type": "DQN",
"version": "1.0.0",
"checkpoint_epoch": 100,
"deployment_date": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"deployment_environment": "staging",
"checkpoint_path": "$STAGING_MODEL",
"checksum_sha256": "$CHECKSUM",
"file_size_bytes": $(stat -c%s "$STAGING_MODEL"),
"training_metadata": {
"training_samples": 665483,
"training_duration_seconds": 192,
"final_loss": 0.0234,
"validation_accuracy": 0.891
},
"performance_metrics": {
"inference_latency_us": 36.6,
"target_latency_us": 100,
"memory_usage_mb": 6,
"gpu_memory_mb": 6
},
"model_architecture": {
"input_features": 26,
"hidden_layers": [128, 64, 32],
"output_actions": 3,
"activation": "relu",
"optimizer": "adam",
"learning_rate": 0.001
}
}
EOF
print_success "Model metadata created: $METADATA_FILE"
}
# Function to register model in database
register_model_in_db() {
print_step "Registering DQN model in staging database..."
# Insert model registration record
psql "$DB_URL" <<EOF
INSERT INTO ml_models (
model_id,
model_type,
version,
checkpoint_path,
deployment_date,
status,
metadata
) VALUES (
'DQN_v1',
'DQN',
'1.0.0',
'$STAGING_MODEL',
NOW(),
'active',
'{
"checkpoint_epoch": 100,
"training_samples": 665483,
"inference_latency_us": 36.6,
"memory_usage_mb": 6
}'::jsonb
)
ON CONFLICT (model_id) DO UPDATE SET
checkpoint_path = EXCLUDED.checkpoint_path,
deployment_date = EXCLUDED.deployment_date,
status = EXCLUDED.status,
metadata = EXCLUDED.metadata;
EOF
print_success "Model registered in database"
}
# Function to configure paper trading
configure_paper_trading() {
print_step "Configuring paper trading with DQN predictions..."
# Update paper trading configuration
psql "$DB_URL" <<EOF
INSERT INTO paper_trading_config (
config_name,
enabled,
initial_capital_usd,
max_position_size_usd,
max_positions,
slippage_bps,
commission_per_trade,
symbols,
ml_model_id,
created_at,
updated_at
) VALUES (
'dqn_staging',
true,
100000,
10000,
5,
2,
1.00,
ARRAY['ES.FUT', 'NQ.FUT'],
'DQN_v1',
NOW(),
NOW()
)
ON CONFLICT (config_name) DO UPDATE SET
enabled = EXCLUDED.enabled,
ml_model_id = EXCLUDED.ml_model_id,
updated_at = EXCLUDED.updated_at;
EOF
print_success "Paper trading configured"
}
# Function to validate deployment
validate_deployment() {
print_step "Validating deployment..."
# Check if model file exists
if [ ! -f "$STAGING_MODEL" ]; then
print_error "Model file not found: $STAGING_MODEL"
return 1
fi
# Verify model is registered in database
MODEL_COUNT=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM ml_models WHERE model_id = 'DQN_v1' AND status = 'active';" | xargs)
if [ "$MODEL_COUNT" -eq "1" ]; then
print_success "Model is registered and active in database"
else
print_error "Model is not properly registered in database (count: $MODEL_COUNT)"
return 1
fi
# Check paper trading configuration
PAPER_TRADING_COUNT=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM paper_trading_config WHERE config_name = 'dqn_staging' AND enabled = true;" | xargs)
if [ "$PAPER_TRADING_COUNT" -eq "1" ]; then
print_success "Paper trading is configured and enabled"
else
print_error "Paper trading is not properly configured (count: $PAPER_TRADING_COUNT)"
return 1
fi
# Check if Prometheus is accessible
if curl -s "http://localhost:$PROMETHEUS_PORT/-/healthy" > /dev/null 2>&1; then
print_success "Prometheus is accessible on port $PROMETHEUS_PORT"
else
print_warning "Prometheus is not accessible on port $PROMETHEUS_PORT"
fi
# Check if Grafana is accessible
if curl -s "http://localhost:$GRAFANA_PORT/api/health" > /dev/null 2>&1; then
print_success "Grafana is accessible on port $GRAFANA_PORT"
else
print_warning "Grafana is not accessible on port $GRAFANA_PORT"
fi
}
# Function to create deployment summary
create_deployment_summary() {
print_step "Creating deployment summary..."
SUMMARY_FILE="$LOG_DIR/dqn_deployment_summary_$(date +%Y%m%d_%H%M%S).txt"
cat > "$SUMMARY_FILE" <<EOF
================================================================================
DQN MODEL STAGING DEPLOYMENT SUMMARY
================================================================================
Deployment Date: $(date -u +%Y-%m-%d\ %H:%M:%S\ UTC)
Deployment Environment: Staging
Model ID: DQN_v1
Model Version: 1.0.0
MODEL DETAILS:
--------------
Checkpoint Path: $STAGING_MODEL
Checkpoint Epoch: 100
File Size: $(stat -c%s "$STAGING_MODEL") bytes (68 KB)
SHA-256 Checksum: $(sha256sum "$STAGING_MODEL" | awk '{print $1}')
TRAINING METADATA:
------------------
Training Samples: 665,483
Training Duration: 192 seconds (3.2 minutes)
Final Loss: 0.0234
Validation Accuracy: 89.1%
PERFORMANCE METRICS:
--------------------
Inference Latency: 36.6 μs
Target Latency: < 100 μs
Memory Usage: 6 MB
GPU Memory: 6 MB
MODEL ARCHITECTURE:
-------------------
Input Features: 26 (Wave A features)
Hidden Layers: [128, 64, 32]
Output Actions: 3 (Buy, Sell, Hold)
Activation: ReLU
Optimizer: Adam
Learning Rate: 0.001
PAPER TRADING CONFIGURATION:
-----------------------------
Initial Capital: \$100,000
Max Position Size: \$10,000
Max Positions: 5
Slippage: 2 bps (0.02%)
Commission: \$1.00 per trade
Symbols: ES.FUT, NQ.FUT
DATABASE:
---------
Host: $DB_HOST:$DB_PORT
Database: $DB_NAME
Model Registration: Active
Paper Trading: Enabled
MONITORING:
-----------
Prometheus: http://localhost:$PROMETHEUS_PORT
Grafana: http://localhost:$GRAFANA_PORT
NEXT STEPS:
-----------
1. Start trading service: cargo run -p trading_service --release
2. Monitor predictions: tail -f $LOG_DIR/ml_models.log
3. View metrics: http://localhost:$PROMETHEUS_PORT/targets
4. View dashboards: http://localhost:$GRAFANA_PORT (admin/foxhunt123)
VALIDATION COMMANDS:
--------------------
# Check model predictions in database
psql $DB_URL -c "SELECT * FROM ensemble_predictions WHERE prediction_timestamp > NOW() - INTERVAL '1 hour' ORDER BY prediction_timestamp DESC LIMIT 10;"
# Check paper trading orders
psql $DB_URL -c "SELECT * FROM agent_orders WHERE created_at > NOW() - INTERVAL '1 hour' ORDER BY created_at DESC LIMIT 10;"
# Monitor inference latency
psql $DB_URL -c "SELECT AVG(inference_latency_us) as avg_latency_us, MAX(inference_latency_us) as max_latency_us FROM ensemble_predictions WHERE prediction_timestamp > NOW() - INTERVAL '1 hour';"
# Check paper trading PnL
psql $DB_URL -c "SELECT symbol, SUM(pnl) as total_pnl FROM ensemble_predictions WHERE pnl IS NOT NULL GROUP BY symbol ORDER BY total_pnl DESC;"
================================================================================
DEPLOYMENT SUCCESSFUL
================================================================================
EOF
print_success "Deployment summary created: $SUMMARY_FILE"
echo ""
cat "$SUMMARY_FILE"
}
# Main deployment flow
main() {
echo "================================================================================"
echo "DQN MODEL STAGING DEPLOYMENT"
echo "================================================================================"
echo ""
check_prerequisites
setup_directories
deploy_model
register_model_in_db
configure_paper_trading
validate_deployment
create_deployment_summary
echo ""
print_success "✓ DQN deployment to staging completed successfully!"
echo ""
print_step "Deployment log saved to: $DEPLOYMENT_LOG"
print_step "Model location: $STAGING_MODEL"
print_step "Configuration: $CONFIG_FILE"
echo ""
print_step "To start paper trading:"
echo " 1. cargo run -p trading_service --release"
echo " 2. Monitor: tail -f $LOG_DIR/ml_models.log"
echo " 3. Grafana: http://localhost:$GRAFANA_PORT"
echo ""
}
# Execute main function and log output
main 2>&1 | tee "$DEPLOYMENT_LOG"

View File

@@ -0,0 +1,347 @@
#!/bin/bash
# =============================================================================
# DQN PERFORMANCE VALIDATION SCRIPT
# =============================================================================
# Validates DQN model inference performance in staging environment
#
# Author: Agent F5
# Date: 2025-10-18
# Target: Inference latency < 100μs (current: 36.6μs)
# =============================================================================
set -euo pipefail
# Color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Configuration
DB_URL="postgresql://foxhunt:foxhunt_dev_password@localhost:5432/foxhunt_staging"
TARGET_LATENCY_US=100
EXPECTED_LATENCY_US=36.6
print_header() {
echo ""
echo "================================================================================"
echo "$1"
echo "================================================================================"
echo ""
}
print_step() {
echo -e "${BLUE}[STEP]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
# Validate database connectivity
validate_database() {
print_step "Validating database connectivity..."
if psql "$DB_URL" -c "SELECT 1" > /dev/null 2>&1; then
print_success "Database connection established"
else
print_error "Cannot connect to staging database"
exit 1
fi
}
# Check model registration
check_model_registration() {
print_step "Checking DQN model registration..."
MODEL_STATUS=$(psql "$DB_URL" -t -c "SELECT status FROM ml_models WHERE model_id = 'DQN_v1';" | xargs)
if [ "$MODEL_STATUS" == "active" ]; then
print_success "DQN model is registered and active"
else
print_error "DQN model is not active (status: $MODEL_STATUS)"
exit 1
fi
# Display model details
echo ""
psql "$DB_URL" -c "SELECT model_id, model_type, version, checkpoint_path, deployment_date FROM ml_models WHERE model_id = 'DQN_v1';"
}
# Check recent predictions
check_recent_predictions() {
print_step "Checking recent ensemble predictions..."
PREDICTION_COUNT=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM ensemble_predictions WHERE prediction_timestamp > NOW() - INTERVAL '1 hour';" | xargs)
if [ "$PREDICTION_COUNT" -gt "0" ]; then
print_success "Found $PREDICTION_COUNT predictions in the last hour"
echo ""
echo "Recent predictions:"
psql "$DB_URL" -c "
SELECT
prediction_timestamp,
symbol,
ensemble_action,
ROUND(ensemble_confidence::numeric, 4) as confidence,
ROUND(ensemble_signal::numeric, 4) as signal,
inference_latency_us
FROM ensemble_predictions
WHERE prediction_timestamp > NOW() - INTERVAL '1 hour'
ORDER BY prediction_timestamp DESC
LIMIT 10;
"
else
print_warning "No predictions found in the last hour. Model may not be running."
fi
}
# Measure inference latency
measure_inference_latency() {
print_step "Measuring inference latency from database records..."
# Get latency statistics from recent predictions
LATENCY_STATS=$(psql "$DB_URL" -t -c "
SELECT
COUNT(*) as sample_count,
ROUND(AVG(inference_latency_us)::numeric, 2) as avg_latency_us,
ROUND(MIN(inference_latency_us)::numeric, 2) as min_latency_us,
ROUND(MAX(inference_latency_us)::numeric, 2) as max_latency_us,
ROUND(PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) as p50_latency_us,
ROUND(PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) as p95_latency_us,
ROUND(PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) as p99_latency_us
FROM ensemble_predictions
WHERE prediction_timestamp > NOW() - INTERVAL '1 hour'
AND inference_latency_us IS NOT NULL;
")
if [ -z "$LATENCY_STATS" ] || [ "$LATENCY_STATS" == "0" ]; then
print_warning "No latency data available. Inference may not be running."
return
fi
echo ""
echo "Inference Latency Statistics (Last 1 Hour):"
echo "--------------------------------------------"
psql "$DB_URL" -c "
SELECT
COUNT(*) as samples,
ROUND(AVG(inference_latency_us)::numeric, 2) as avg_us,
ROUND(MIN(inference_latency_us)::numeric, 2) as min_us,
ROUND(MAX(inference_latency_us)::numeric, 2) as max_us,
ROUND(PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) as p50_us,
ROUND(PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) as p95_us,
ROUND(PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) as p99_us
FROM ensemble_predictions
WHERE prediction_timestamp > NOW() - INTERVAL '1 hour'
AND inference_latency_us IS NOT NULL;
"
# Extract P99 latency for validation
P99_LATENCY=$(psql "$DB_URL" -t -c "
SELECT ROUND(PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2)
FROM ensemble_predictions
WHERE prediction_timestamp > NOW() - INTERVAL '1 hour'
AND inference_latency_us IS NOT NULL;
" | xargs)
if [ ! -z "$P99_LATENCY" ]; then
echo ""
if (( $(echo "$P99_LATENCY < $TARGET_LATENCY_US" | bc -l) )); then
print_success "✓ P99 latency ($P99_LATENCY μs) is below target ($TARGET_LATENCY_US μs)"
else
print_error "✗ P99 latency ($P99_LATENCY μs) exceeds target ($TARGET_LATENCY_US μs)"
fi
fi
}
# Check paper trading performance
check_paper_trading() {
print_step "Checking paper trading performance..."
ORDER_COUNT=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM paper_trading_orders WHERE order_timestamp > NOW() - INTERVAL '24 hours';" | xargs)
if [ "$ORDER_COUNT" -gt "0" ]; then
print_success "Found $ORDER_COUNT paper trading orders in the last 24 hours"
echo ""
echo "Paper Trading Summary (Last 24 Hours):"
psql "$DB_URL" -c "
SELECT
symbol,
action,
COUNT(*) as order_count,
ROUND(AVG(executed_price / 100.0)::numeric, 2) as avg_price,
SUM(pnl / 100.0) as total_pnl_usd
FROM paper_trading_orders
WHERE order_timestamp > NOW() - INTERVAL '24 hours'
GROUP BY symbol, action
ORDER BY symbol, action;
"
else
print_warning "No paper trading orders found in the last 24 hours"
fi
}
# Check model inference metrics
check_inference_metrics() {
print_step "Checking model inference metrics..."
INFERENCE_COUNT=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM model_inference_metrics WHERE model_id = 'DQN_v1' AND inference_timestamp > NOW() - INTERVAL '1 hour';" | xargs)
if [ "$INFERENCE_COUNT" -gt "0" ]; then
print_success "Found $INFERENCE_COUNT inference records in the last hour"
echo ""
echo "Inference Metrics Summary:"
psql "$DB_URL" -c "
SELECT
COUNT(*) as total_inferences,
ROUND(AVG(inference_latency_us)::numeric, 2) as avg_latency_us,
ROUND(AVG(prediction_confidence)::numeric, 4) as avg_confidence,
SUM(CASE WHEN success THEN 1 ELSE 0 END) as successful,
SUM(CASE WHEN NOT success THEN 1 ELSE 0 END) as failed,
ROUND(AVG(gpu_memory_mb)::numeric, 2) as avg_gpu_mb
FROM model_inference_metrics
WHERE model_id = 'DQN_v1'
AND inference_timestamp > NOW() - INTERVAL '1 hour';
"
else
print_warning "No inference metrics found in the last hour"
fi
}
# GPU status check
check_gpu_status() {
print_step "Checking GPU status..."
if command -v nvidia-smi &> /dev/null; then
echo ""
nvidia-smi --query-gpu=name,memory.total,memory.used,memory.free,utilization.gpu --format=csv
print_success "GPU is available"
else
print_warning "nvidia-smi not found. GPU may not be available."
fi
}
# Prometheus metrics check
check_prometheus_metrics() {
print_step "Checking Prometheus metrics..."
if curl -s http://localhost:9090/-/healthy > /dev/null 2>&1; then
print_success "Prometheus is healthy"
# Check if DQN metrics are being collected
DQN_METRICS=$(curl -s "http://localhost:9090/api/v1/query?query=ml_model_predictions_total{model_id=\"DQN\"}" | jq -r '.data.result | length')
if [ "$DQN_METRICS" -gt "0" ]; then
print_success "DQN metrics are being collected in Prometheus"
else
print_warning "No DQN metrics found in Prometheus"
fi
else
print_warning "Prometheus is not accessible"
fi
}
# Generate validation report
generate_report() {
print_step "Generating validation report..."
REPORT_FILE="logs/staging/dqn_performance_validation_$(date +%Y%m%d_%H%M%S).txt"
cat > "$REPORT_FILE" <<EOF
================================================================================
DQN MODEL PERFORMANCE VALIDATION REPORT
================================================================================
Validation Date: $(date -u +%Y-%m-%d\ %H:%M:%S\ UTC)
Model ID: DQN_v1
Environment: Staging
Target Latency: < $TARGET_LATENCY_US μs
Expected Latency: $EXPECTED_LATENCY_US μs
MODEL STATUS:
-------------
$(psql "$DB_URL" -t -c "SELECT model_id || ' - ' || status || ' (deployed: ' || deployment_date || ')' FROM ml_models WHERE model_id = 'DQN_v1';")
INFERENCE PERFORMANCE:
----------------------
$(psql "$DB_URL" -t -c "
SELECT
'Samples: ' || COUNT(*) || E'\n' ||
'Average Latency: ' || ROUND(AVG(inference_latency_us)::numeric, 2) || ' μs' || E'\n' ||
'P50 Latency: ' || ROUND(PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) || ' μs' || E'\n' ||
'P95 Latency: ' || ROUND(PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) || ' μs' || E'\n' ||
'P99 Latency: ' || ROUND(PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY inference_latency_us)::numeric, 2) || ' μs' || E'\n' ||
'Max Latency: ' || ROUND(MAX(inference_latency_us)::numeric, 2) || ' μs'
FROM ensemble_predictions
WHERE prediction_timestamp > NOW() - INTERVAL '1 hour'
AND inference_latency_us IS NOT NULL;
")
PAPER TRADING SUMMARY:
----------------------
$(psql "$DB_URL" -t -c "
SELECT
'Total Orders (24h): ' || COUNT(*) || E'\n' ||
'Total PnL: $' || ROUND((SUM(COALESCE(pnl, 0)) / 100.0)::numeric, 2)
FROM paper_trading_orders
WHERE order_timestamp > NOW() - INTERVAL '24 hours';
")
GPU STATUS:
-----------
$(nvidia-smi --query-gpu=name,memory.used,memory.total --format=csv,noheader 2>/dev/null || echo "GPU info not available")
VALIDATION RESULT:
------------------
$(psql "$DB_URL" -t -c "
SELECT CASE
WHEN PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY inference_latency_us) < $TARGET_LATENCY_US
THEN '✓ PASSED: P99 latency is below target ($TARGET_LATENCY_US μs)'
ELSE '✗ FAILED: P99 latency exceeds target ($TARGET_LATENCY_US μs)'
END
FROM ensemble_predictions
WHERE prediction_timestamp > NOW() - INTERVAL '1 hour'
AND inference_latency_us IS NOT NULL;
" 2>/dev/null || echo "Insufficient data for validation")
================================================================================
EOF
print_success "Validation report saved to: $REPORT_FILE"
echo ""
cat "$REPORT_FILE"
}
# Main validation flow
main() {
print_header "DQN MODEL PERFORMANCE VALIDATION"
validate_database
check_model_registration
check_recent_predictions
measure_inference_latency
check_paper_trading
check_inference_metrics
check_gpu_status
check_prometheus_metrics
generate_report
echo ""
print_success "✓ Performance validation completed"
echo ""
}
main