Skip to main content

torsh_quantization/analysis/
mod.rs

1//! Analysis tools for quantization
2//!
3//! This module provides comprehensive tools for analyzing the impact of quantization on models,
4//! including sensitivity analysis, accuracy comparison, performance metrics, and visualization.
5//! The modular architecture separates concerns while maintaining a clean, unified interface.
6
7// Module declarations
8pub mod benchmarking;
9pub mod config;
10pub mod sensitivity;
11pub mod size;
12pub mod speed;
13pub mod statistical;
14pub mod visualization;
15
16// Re-export main types for convenience
17pub use config::{
18    AccuracyComparison, AnalysisConfig, EfficiencyWeights, LayerSensitivityResult,
19    NormalizationFactors, SensitivityAnalysisResults,
20};
21
22pub use sensitivity::SensitivityAnalyzer;
23
24pub use size::{SizeAnalyzer, SizeReport};
25
26pub use speed::SpeedAnalyzer;
27
28pub use statistical::{
29    AdvancedStatisticalAnalyzer, ComprehensiveStatisticalReport, RiskLevel, StatisticalSignificance,
30};
31
32pub use visualization::VisualizationTool;
33
34pub use benchmarking::{
35    BenchmarkConfig, BenchmarkResult, OptimizationCriteria, QuantizationBenchmarker,
36};
37
38// Convenience functions for common analysis tasks
39
40/// Perform quick sensitivity analysis for a list of layer names
41pub fn quick_sensitivity_analysis(
42    layer_names: &[String],
43) -> crate::TorshResult<SensitivityAnalysisResults> {
44    let analyzer = SensitivityAnalyzer::new(Vec::new()); // Empty test data for heuristic analysis
45    analyzer.heuristic_sensitivity_analysis(layer_names)
46}
47
48/// Generate size comparison report for multiple schemes
49pub fn compare_model_sizes(
50    num_parameters: usize,
51    schemes: &[crate::QScheme],
52) -> std::collections::HashMap<crate::QScheme, SizeReport> {
53    SizeAnalyzer::generate_size_report(num_parameters, schemes)
54}
55
56/// Create a comprehensive analysis report
57pub fn generate_comprehensive_analysis_report(
58    num_parameters: usize,
59    layer_names: &[String],
60    baseline_accuracy: f32,
61) -> crate::TorshResult<String> {
62    let mut report = String::new();
63
64    // Header
65    report.push_str("Comprehensive Quantization Analysis Report\n");
66    report.push_str(&"=".repeat(60));
67    report.push_str("\n\n");
68
69    // Model statistics
70    report.push_str("Model Statistics:\n");
71    report.push_str(&format!("- Parameters: {}\n", num_parameters));
72    report.push_str(&format!("- Layers: {}\n", layer_names.len()));
73    report.push_str(&format!(
74        "- Baseline Accuracy: {:.4}\n\n",
75        baseline_accuracy
76    ));
77
78    // Sensitivity analysis
79    report.push_str("Sensitivity Analysis:\n");
80    report.push_str(&"-".repeat(30));
81    report.push('\n');
82
83    let sensitivity_results = quick_sensitivity_analysis(layer_names)?;
84    report.push_str(&sensitivity_results.summary_report());
85    report.push_str("\n\n");
86
87    // Size analysis
88    report.push_str("Size Analysis:\n");
89    report.push_str(&"-".repeat(30));
90    report.push('\n');
91
92    let schemes = vec![
93        crate::QScheme::PerTensorAffine,
94        crate::QScheme::PerChannelAffine,
95        crate::QScheme::Int4PerTensor,
96        crate::QScheme::Binary,
97    ];
98
99    let size_reports = compare_model_sizes(num_parameters, &schemes);
100    for (scheme, report_data) in size_reports {
101        report.push_str(&format!(
102            "{:?}: {:.1}MB -> {:.1}MB ({:.1}x reduction, {:.1}% saved)\n",
103            scheme,
104            report_data.original_size_mb,
105            report_data.quantized_size_mb,
106            report_data.reduction_ratio,
107            report_data.space_savings_percentage()
108        ));
109    }
110    report.push_str("\n");
111
112    // Performance estimates
113    report.push_str("Performance Estimates:\n");
114    report.push_str(&"-".repeat(30));
115    report.push('\n');
116
117    for scheme in schemes {
118        let speed_improvement = SpeedAnalyzer::estimate_speed_improvement(scheme);
119        report.push_str(&format!(
120            "{:?}: {:.1}x speed improvement\n",
121            scheme, speed_improvement
122        ));
123    }
124
125    Ok(report)
126}
127
128/// Create an analysis configuration optimized for production deployment
129pub fn production_analysis_config() -> AnalysisConfig {
130    AnalysisConfig::conservative()
131}
132
133/// Create an analysis configuration optimized for research/experimentation
134pub fn research_analysis_config() -> AnalysisConfig {
135    AnalysisConfig::aggressive()
136}
137
138/// Batch analyze multiple models
139pub fn batch_analyze_models(
140    model_configs: &[(usize, Vec<String>, f32)], // (num_parameters, layer_names, baseline_accuracy)
141) -> crate::TorshResult<Vec<String>> {
142    let mut reports = Vec::new();
143
144    for (i, (num_parameters, layer_names, baseline_accuracy)) in model_configs.iter().enumerate() {
145        let mut report = format!("Model {} Analysis:\n", i + 1);
146        report.push_str(&"=".repeat(40));
147        report.push('\n');
148
149        let detailed_report = generate_comprehensive_analysis_report(
150            *num_parameters,
151            layer_names,
152            *baseline_accuracy,
153        )?;
154
155        report.push_str(&detailed_report);
156        report.push_str("\n\n");
157
158        reports.push(report);
159    }
160
161    Ok(reports)
162}