221 lines
8.2 KiB
Python
221 lines
8.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
XGBoost Multi-Label Inference Usage Examples
|
|
===================================================
|
|
|
|
This script demonstrates how to use the XGBoostMultiLabelPredictor class
|
|
for multi-label classification with confidence scores.
|
|
|
|
Sample data is from real HPC workloads extracted from roofline_features.h5:
|
|
- TurTLE: Turbulence simulation (memory-bound, low arithmetic intensity ~0.84)
|
|
- SCALEXA: Scaling benchmarks (high bw-flops correlation ~0.995)
|
|
- Chroma: Lattice QCD (compute-intensive, high arithmetic intensity ~2.6)
|
|
"""
|
|
|
|
import json
|
|
from xgb_local import XGBoostMultiLabelPredictor
|
|
|
|
# ============================================================================
|
|
# Realistic Sample Data from roofline_features.h5
|
|
# ============================================================================
|
|
|
|
# TurTLE application - turbulence simulation workload
|
|
SAMPLE_TURTLE = {
|
|
"bandwidth_raw_p10": 186.33,
|
|
"bandwidth_raw_median": 205.14,
|
|
"bandwidth_raw_p90": 210.83,
|
|
"bandwidth_raw_mad": 3.57,
|
|
"bandwidth_raw_range": 24.5,
|
|
"bandwidth_raw_iqr": 12.075,
|
|
"flops_raw_p10": 162.024,
|
|
"flops_raw_median": 171.45,
|
|
"flops_raw_p90": 176.48,
|
|
"flops_raw_mad": 3.08,
|
|
"flops_raw_range": 14.456,
|
|
"flops_raw_iqr": 8.29,
|
|
"arith_intensity_p10": 0.7906,
|
|
"arith_intensity_median": 0.837,
|
|
"arith_intensity_p90": 0.9109,
|
|
"arith_intensity_mad": 0.02,
|
|
"arith_intensity_range": 0.12,
|
|
"arith_intensity_iqr": 0.0425,
|
|
"bw_flops_covariance": 60.86,
|
|
"bw_flops_correlation": 0.16,
|
|
"avg_performance_gflops": 168.1,
|
|
"median_performance_gflops": 171.45,
|
|
"performance_gflops_mad": 3.08,
|
|
"avg_memory_bw_gbs": 350.0,
|
|
"scalar_peak_gflops": 432.0,
|
|
"simd_peak_gflops": 9216.0,
|
|
"node_num": 0,
|
|
"duration": 19366,
|
|
}
|
|
|
|
# SCALEXA application - scaling benchmark workload
|
|
SAMPLE_SCALEXA = {
|
|
"bandwidth_raw_p10": 13.474,
|
|
"bandwidth_raw_median": 32.57,
|
|
"bandwidth_raw_p90": 51.466,
|
|
"bandwidth_raw_mad": 23.62,
|
|
"bandwidth_raw_range": 37.992,
|
|
"bandwidth_raw_iqr": 23.745,
|
|
"flops_raw_p10": 4.24,
|
|
"flops_raw_median": 16.16,
|
|
"flops_raw_p90": 24.584,
|
|
"flops_raw_mad": 10.53,
|
|
"flops_raw_range": 20.344,
|
|
"flops_raw_iqr": 12.715,
|
|
"arith_intensity_p10": 0.211,
|
|
"arith_intensity_median": 0.475,
|
|
"arith_intensity_p90": 0.492,
|
|
"arith_intensity_mad": 0.021,
|
|
"arith_intensity_range": 0.281,
|
|
"arith_intensity_iqr": 0.176,
|
|
"bw_flops_covariance": 302.0,
|
|
"bw_flops_correlation": 0.995,
|
|
"avg_performance_gflops": 14.7,
|
|
"median_performance_gflops": 16.16,
|
|
"performance_gflops_mad": 10.53,
|
|
"avg_memory_bw_gbs": 350.0,
|
|
"scalar_peak_gflops": 432.0,
|
|
"simd_peak_gflops": 9216.0,
|
|
"node_num": 18,
|
|
"duration": 165,
|
|
}
|
|
|
|
# Chroma application - lattice QCD workload (compute-intensive)
|
|
SAMPLE_CHROMA = {
|
|
"bandwidth_raw_p10": 154.176,
|
|
"bandwidth_raw_median": 200.57,
|
|
"bandwidth_raw_p90": 259.952,
|
|
"bandwidth_raw_mad": 5.12,
|
|
"bandwidth_raw_range": 105.776,
|
|
"bandwidth_raw_iqr": 10.215,
|
|
"flops_raw_p10": 327.966,
|
|
"flops_raw_median": 519.8,
|
|
"flops_raw_p90": 654.422,
|
|
"flops_raw_mad": 16.97,
|
|
"flops_raw_range": 326.456,
|
|
"flops_raw_iqr": 34.88,
|
|
"arith_intensity_p10": 1.55,
|
|
"arith_intensity_median": 2.595,
|
|
"arith_intensity_p90": 3.445,
|
|
"arith_intensity_mad": 0.254,
|
|
"arith_intensity_range": 1.894,
|
|
"arith_intensity_iqr": 0.512,
|
|
"bw_flops_covariance": 382.76,
|
|
"bw_flops_correlation": 0.063,
|
|
"avg_performance_gflops": 503.26,
|
|
"median_performance_gflops": 519.8,
|
|
"performance_gflops_mad": 16.97,
|
|
"avg_memory_bw_gbs": 350.0,
|
|
"scalar_peak_gflops": 432.0,
|
|
"simd_peak_gflops": 9216.0,
|
|
"node_num": 3,
|
|
"duration": 31133,
|
|
}
|
|
|
|
# Raw JSON roofline data (before aggregation, as produced by monitoring)
|
|
SAMPLE_JSON_ROOFLINE = json.dumps([
|
|
{"node_num": 1, "bandwidth_raw": 150.5, "flops_raw": 2500.0, "arith_intensity": 16.6,
|
|
"performance_gflops": 1200.0, "memory_bw_gbs": 450, "scalar_peak_gflops": 600, "duration": 3600},
|
|
{"node_num": 1, "bandwidth_raw": 155.2, "flops_raw": 2600.0, "arith_intensity": 16.8,
|
|
"performance_gflops": 1250.0, "memory_bw_gbs": 450, "scalar_peak_gflops": 600, "duration": 3600},
|
|
{"node_num": 1, "bandwidth_raw": 148.0, "flops_raw": 2450.0, "arith_intensity": 16.5,
|
|
"performance_gflops": 1180.0, "memory_bw_gbs": 450, "scalar_peak_gflops": 600, "duration": 3600},
|
|
])
|
|
|
|
|
|
def main():
|
|
print("XGBoost Multi-Label Inference Examples")
|
|
print("=" * 50)
|
|
|
|
# Initialize the predictor
|
|
predictor = XGBoostMultiLabelPredictor()
|
|
|
|
# =========================================================================
|
|
# Example 1: Single prediction with aggregated features
|
|
# =========================================================================
|
|
print("\n=== Example 1: Single Prediction (TurTLE workload) ===")
|
|
|
|
result = predictor.predict(SAMPLE_TURTLE, threshold=0.3)
|
|
|
|
print(f"Predictions: {result['predictions']}")
|
|
print(f"Confidences: {result['confidences']}")
|
|
print("\nTop 5 probabilities:")
|
|
sorted_probs = sorted(result['probabilities'].items(), key=lambda x: x[1], reverse=True)
|
|
for cls, prob in sorted_probs[:5]:
|
|
print(f" {cls}: {prob:.4f}")
|
|
|
|
# =========================================================================
|
|
# Example 2: Compare different workload types
|
|
# =========================================================================
|
|
print("\n=== Example 2: Compare Different Workloads ===")
|
|
|
|
workloads = [
|
|
("TurTLE (turbulence)", SAMPLE_TURTLE),
|
|
("SCALEXA (benchmark)", SAMPLE_SCALEXA),
|
|
("Chroma (lattice QCD)", SAMPLE_CHROMA),
|
|
]
|
|
|
|
for name, features in workloads:
|
|
result = predictor.predict(features, threshold=0.3)
|
|
top_pred = result['predictions'][0] if result['predictions'] else "None"
|
|
top_prob = max(result['probabilities'].values()) if result['probabilities'] else 0
|
|
print(f"{name:25} -> Top prediction: {top_pred:20} (prob: {top_prob:.4f})")
|
|
|
|
# =========================================================================
|
|
# Example 3: Top-K predictions
|
|
# =========================================================================
|
|
print("\n=== Example 3: Top-5 Predictions (Chroma workload) ===")
|
|
|
|
top_k_result = predictor.predict_top_k(SAMPLE_CHROMA, k=5)
|
|
|
|
for i, cls in enumerate(top_k_result['top_predictions'], 1):
|
|
prob = top_k_result['top_probabilities'][cls]
|
|
print(f" {i}. {cls}: {prob:.4f}")
|
|
|
|
# =========================================================================
|
|
# Example 4: Batch prediction
|
|
# =========================================================================
|
|
print("\n=== Example 4: Batch Prediction ===")
|
|
|
|
batch_data = [SAMPLE_TURTLE, SAMPLE_SCALEXA, SAMPLE_CHROMA]
|
|
batch_results = predictor.batch_predict(batch_data, threshold=0.3)
|
|
|
|
for i, result in enumerate(batch_results, 1):
|
|
if 'error' not in result:
|
|
preds = result['predictions'][:2] # Show top 2
|
|
print(f" Sample {i}: {preds}")
|
|
else:
|
|
print(f" Sample {i}: Error - {result['error']}")
|
|
|
|
# =========================================================================
|
|
# Example 5: Prediction from raw JSON roofline data
|
|
# =========================================================================
|
|
print("\n=== Example 5: Prediction from Raw JSON Data ===")
|
|
|
|
result = predictor.predict(
|
|
SAMPLE_JSON_ROOFLINE,
|
|
is_json=True,
|
|
job_id="example_job_001",
|
|
threshold=0.3
|
|
)
|
|
|
|
print(f"Predictions: {result['predictions'][:3]}")
|
|
print(f"(Aggregated from {len(json.loads(SAMPLE_JSON_ROOFLINE))} roofline samples)")
|
|
|
|
# =========================================================================
|
|
# Example 6: Model information
|
|
# =========================================================================
|
|
print("\n=== Example 6: Model Information ===")
|
|
|
|
info = predictor.get_class_info()
|
|
print(f"Number of classes: {info['n_classes']}")
|
|
print(f"Number of features: {info['n_features']}")
|
|
print(f"Sample classes: {info['classes'][:5]}...")
|
|
print(f"Sample features: {info['feature_columns'][:3]}...")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |