Solar is a toolkit for analyzing PyTorch model graphs, converting them to einsum representations, and performing hardware-aware SOL performance predictions.
- 5-Stage Analysis Pipeline: Seamless conversion from PyTorch models to performance predictions
- Graph Extraction: Extract structured computation graphs from PyTorch models (torchview-based)
- Einsum Conversion: Convert PyTorch operations to einsum notation with automatic rank renaming
- Graph Visualization: Generate PDF visualizations of einsum graphs
- Hardware-Independent Analysis: Compute MACs, FLOPs, and memory footprints
- Performance Prediction: Architecture-aware roofline modeling (H100, A6000, etc.)
- Timeloop / Orojenesis Export: Convert to Timeloop workload format for architectural exploration
- Benchmark Support: Native support for kernelbench benchmark suites
- Human-Readable YAML: All outputs use clean YAML without anchors/aliases
# Install Solar in development mode
cd solar
pip install -e .Dependencies:
# Core dependencies are in requirements.txt
pip install -r requirements.txt
# For graph visualization (optional)
pip install graphviz matplotlibSolar processes models through five distinct stages:
Stage 1: PyTorch Graph Extraction
└─> pytorch_graph.yaml
Stage 2: Einsum Conversion + Rank Renaming
└─> einsum_graph.yaml
└─> einsum_graph_renamed.yaml
└─> einsum_graph.pdf (optional)
Stage 3: Hardware-Independent Analysis
└─> analysis.yaml
Stage 4: Performance Prediction
└─> perf_<arch>.yaml
Stage 5: Timeloop Export (optional)
└─> timeloop_graph.yaml
Solar includes several example models demonstrating different attention patterns:
| Example | Description | Based On |
|---|---|---|
Attention/ |
Multi-head self-attention | Standard Transformer |
BERT/ |
BERT-like encoder model | BERT architecture |
# Run the complete pipeline for any example
cd solar/examples/Attention
bash run_solar.sh
# Outputs:
# - output/graph/pytorch_graph.yaml (Stage 1)
# - output/einsum/einsum_graph.yaml (Stage 2)
# - output/einsum/einsum_graph_renamed.yaml (Stage 2 - with BFS rank renaming)
# - output/einsum/einsum_graph.pdf (Stage 2 - visualization)
# - output/analysis/analysis.yaml (Stage 3)
# - output/perf/perf_H100_PCIe.yaml (Stage 4)
# - output/timeloop/timeloop_graph.yaml (Stage 5)Process benchmark models:
# Process and analyze kernelbench models
solar-toeinsum --level level1 --kernel-ids 1 2 3
# Use different architecture
solar-toeinsum --level level1 --kernel-ids 1 --arch-config B200# Stage 1: Extract PyTorch graph
solar-process-model --model-file model.py --output-dir output/graph
# Stage 2: Convert to einsum (with optional PDF visualization)
solar-toeinsum-model --graph-path output/graph/pytorch_graph.yaml \
--output-dir output/einsum --no-copy-graph \
--save-graph
# Stage 3: Analyze (hardware-independent)
solar-analyze-model --einsum-graph-path output/einsum/einsum_graph_renamed.yaml \
--output-dir output/analysis
# Stage 4: Predict performance
solar-predict-perf-model --analysis-path output/analysis/analysis.yaml \
--output-dir output/perf --arch-config H100_PCIe
# Stage 5: Convert to Timeloop format
solar-totimeloop --einsum-graph-path output/einsum/einsum_graph_renamed.yaml \
--output-dir output/timeloopAll output files use human-readable YAML without anchors/aliases:
- pytorch_graph.yaml: Structured graph with layers, shapes, weights, connections
- einsum_graph.yaml: Einsum equations + shapes for each layer
- einsum_graph_renamed.yaml: Einsum graph with consistent dimension labels (BFS-based)
- einsum_graph.pdf: Visual representation of the computation graph
- analysis.yaml: Hardware-independent metrics (MACs, FLOPs, bytes)
- perf_.yaml: Architecture-specific performance predictions
- timeloop_graph.yaml: Timeloop workload format for architectural exploration
# Run all tests
bash run_tests.sh
# Quick smoke tests
bash run_tests.sh quick
# Run specific test categories
bash run_tests.sh graph # Graph processing tests
bash run_tests.sh einsum # Einsum analyzer tests
bash run_tests.sh unit # All unit tests
bash run_tests.sh integration # Integration tests
# Test examples
bash run_tests.sh examples # Run all example scripts
# Test benchmark compatibility
bash run_tests.sh kernelbench
# Verbose output
bash run_tests.sh all -vSee TESTING_GUIDE.md for detailed testing documentation.
from solar.graph import PyTorchProcessor
processor = PyTorchProcessor()
processor.process_model_file("model.py", output_dir="outputs/my_model")from solar.einsum import PyTorchToEinsum
converter = PyTorchToEinsum()
einsum_graph = converter.convert(
"outputs/my_model/pytorch_graph.yaml",
"outputs/my_model",
copy_graph=False # Don't duplicate input graph
)
# Produces both einsum_graph.yaml and einsum_graph_renamed.yamlfrom solar.einsum import EinsumGraphVisualizer
visualizer = EinsumGraphVisualizer()
visualizer.save_graph_pdf(
"outputs/my_model/einsum_graph_renamed.yaml",
"outputs/my_model/einsum_graph.pdf"
)from solar.analysis import EinsumGraphAnalyzer
analyzer = EinsumGraphAnalyzer()
analysis = analyzer.analyze_graph(
"outputs/my_model/einsum_graph_renamed.yaml",
"outputs/my_model"
)from solar.perf import EinsumGraphPerfModel
perf_model = EinsumGraphPerfModel()
perf = perf_model.predict(
"outputs/my_model/analysis.yaml",
"outputs/my_model",
arch_config="H100_PCIe"
)from solar.einsum import EinsumToTimeloop
converter = EinsumToTimeloop()
result = converter.convert(
"outputs/my_model/einsum_graph_renamed.yaml",
"outputs/my_model/timeloop_graph.yaml"
)solar/
├── solar/
│ ├── common/ # Shared types, constants, utilities (NoAliasDumper)
│ ├── graph/ # Stage 1: PyTorch graph extraction
│ ├── einsum/ # Stage 2: Einsum conversion, visualization, Timeloop export
│ ├── analysis/ # Stage 3: Hardware-independent analysis
│ ├── perf/ # Stage 4: Performance prediction
│ └── cli/ # Command-line interfaces
├── tests/ # Comprehensive test suite
├── examples/ # Example models (Attention, BERT, sparse attention variants)
└── configs/ # Architecture configs (H100_PCIe.yaml, A6000.yaml)
- NoAliasDumper: Custom YAML dumper for human-readable output (no
&id001references) - EinsumRankRenamer: BFS-based dimension label renaming for consistent einsum equations
- EinsumGraphVisualizer: PDF visualization of computation graphs
- EinsumToTimeloop: Export to Timeloop workload format
- Node Registry: Extensible registry for operation handlers
- LLM Agent (optional): Dynamic handler generation for unknown operations
- Benchmark Processors: Specialized handling for kernelbench file structures
- Follow Google's Python Style Guide
- Add tests for new features
- Update documentation for API changes
- Run
bash run_tests.shbefore submitting PRs
TESTING_GUIDE.md: Comprehensive testing documentationREFACTORING_SUMMARY.md: Design decisions and refactoring historyMIGRATION_COMPLETE.md: Migration guide from legacy JSON format
MIT License