-
Notifications
You must be signed in to change notification settings - Fork 7
04. Developer Guide
This guide is for developers who want to contribute to TritonParse, understand its architecture, or extend its functionality.
TritonParse consists of three main components:
ββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββββββββββ
β Python Backend β β Processing β β Frontend UI β
β β β β β β
β β’ Structured Logging ββββΆβ β’ Log Parsing ββββΆβ β’ React Interface β
β β’ Triton Hooks β β β’ Source Mapping β β β’ IR Visualization β
β β’ Trace Generation β β β’ Data Compression β β β’ Code Comparison β
β β β β’ Process Launch Traceβ β β’ Launch Diff Analysisβ
ββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββββββββββ
- Purpose: Capture Triton compilation events and generate structured logs. This package contains the core logic for parsing IR, processing traces, and creating source mappings.
-
Key Files:
-
structured_logging.py
- Main logging infrastructure to capture events. -
trace_processor.py
- Processes raw trace files, groups events, and generateslaunch_diff
and autotune analysis. -
ir_parser.py
- Extracts source location information from various IRs (TTIR, TTGIR, PTX, AMDGCN). -
mapper.py
- Creates bidirectional mappings between different IRs and Python source code. -
utils.py
- Main CLI entrypoint (unified_parse
) and other parsing utilities. -
extract_source_mappings.py
- Legacy utility for IR stage correlation. -
event_diff.py
- Logic for comparing kernel launch events. -
sourcemap_utils.py
- Helper functions for source mapping. -
common.py
,shared_vars.py
,tp_logger.py
- Common utilities, shared state, and logger configuration.
-
- Purpose: Transform raw logs into structured, analyzable format.
-
Key Functions:
- Parse NDJSON logs
- Extract source mappings between IR stages
- Process launch trace
- Compress and package data
- Purpose: Interactive visualization and analysis interface
-
Key Technologies:
- React 19 with TypeScript
- Vite build system
- Tailwind CSS for styling
- Monaco Editor for code display
tritonparse/
βββ tritonparse/ # Python package
β βββ __init__.py
β βββ structured_logging.py # Core logging infrastructure to capture events
β βββ trace_processor.py # Processes raw trace files, groups events, and generates diffs
β βββ ir_parser.py # Extracts source location information from various IRs
β βββ mapper.py # Creates bidirectional mappings between different IRs and Python source code
β βββ event_diff.py # Logic for comparing kernel launch events
β βββ utils.py # Main CLI entrypoint (`unified_parse`) and other parsing utilities
β βββ source_type.py # Source type definitions (e.g., TTIR, PTX)
β βββ sourcemap_utils.py # Helper functions for source mapping
β βββ common.py # Common utilities and helper functions
β βββ shared_vars.py # Shared state and variables for the package
β βββ tp_logger.py # Logger configuration
βββ website/ # React web application for visualization
β βββ src/
β β βββ components/ # Reusable React components
β β β βββ ArgumentViewer.tsx # Displays kernel arguments
β β β βββ CodeViewer.tsx # Displays IR code with syntax highlighting
β β β βββ DiffViewer.tsx # Side-by-side diff view for text
β β β βββ CodeComparisonView.tsx # Compares two IRs with line mappings
β β β βββ AutotuneAnalysis.tsx # Displays autotuning results
β β βββ pages/ # Main application pages
β β β βββ KernelOverview.tsx # Main analysis view for a kernel, combining all components
β β β βββ CodeView.tsx # A focused view for a single IR file
β β βββ utils/ # Utility functions
β β β βββ dataLoader.ts # Data loading and processing from parsed logs
β β βββ App.tsx # Main application component routing to pages
β β βββ main.tsx # Application entry point
β βββ public/ # Static assets (e.g., images, sample data)
β βββ package.json # Frontend dependencies and scripts
β βββ vite.config.ts # Vite build configuration
βββ tests/ # Test suite for the Python package
βββ docs/ # Project documentation
βββ .github/ # GitHub Actions workflows
βββ .ci/ # CI scripts
βββ pyproject.toml # Python project configuration
βββ Makefile # Development commands
βββ README.md # Project overview
- Python >= 3.10
- Node.js >= 18.0.0
- Triton >= 3.4.0 (latest version recommended)
- Git for version control
# Clone repository
git clone https://github.com/pytorch-labs/tritonparse.git
cd tritonparse
# Install Python dependencies
make install-dev
# Install website dependencies
cd website
npm install
# Check formatting and linting
make format-check
make lint-check
# Check Python setup
make format-check
make lint-check
python -m unittest tests.test_tritonparse.TestTritonparseCPU -v
# Check website setup
cd website
npm run dev
We use a comprehensive formatting pipeline:
Tool | Purpose | Configuration |
---|---|---|
Black | Code formatting | pyproject.toml |
usort | Import sorting | pyproject.toml |
Ruff | Linting | Built-in rules |
# Format code
make format
# Check formatting
make format-check
# Run linting
make lint-check
# Run tests
python -m unittest tests.test_tritonparse -v
# Website development
cd website && npm run dev
Before committing, ensure:
-
Code is formatted:
make format
-
Linting passes:
make lint-check
-
Tests pass:
python -m unittest tests.test_tritonparse -v
-
Website builds:
cd website && npm run build
Purpose: Capture Triton compilation and launch events in structured format
Key Functions:
-
init(log_path, enable_launch_trace=False)
- Initialize logging system.-
log_path
: The directory where log files will be stored. -
enable_launch_trace
: IfTrue
, captures detailed metadata for each kernel launch. This is required for launch analysis.
-
Integration Points:
- Triton compilation hooks
- PyTorch TorchInductor integration
- Stack trace extraction
Purpose: Transform raw logs into analyzable format
Key Functions:
-
unified_parse()
- Main parsing interface -
oss_run()
- OSS-specific parsing logic -
parse_logs()
- Core log processing
Processing Pipeline:
- Read raw NDJSON logs from input directory
- Parse and validate log entries
- Extract source mappings between IR stages
- Compress and save processed data
Purpose: Correlate lines between different IR stages
Key Functions:
-
extract_source_mappings()
- Main extraction logic -
process_kernel_logs()
- Process individual kernel logs -
map_ir_stages()
- Map lines between IR formats
- Define the new data: Determine what new information needs to be captured.
-
Update
structured_logging.py
: Add logic to capture the new data within the appropriate hooks (e.g., pre-compilation, post-compilation). -
Modify
trace_processor.py
: If the new data requires special processing or aggregation (like the launch analysis), add the logic here. -
Update
unified_parse()
: Ensure the new data is handled correctly during the main parsing routine. -
Write tests: Add unit and integration tests to
tests/
to validate the new feature.
# Run CPU tests (no GPU required)
python -m unittest tests.test_tritonparse.TestTritonparseCPU -v
# Run GPU tests (requires CUDA)
python -m unittest tests.test_tritonparse.TestTritonparseCUDA -v
# Run specific test
python -m unittest tests.test_tritonparse.TestTritonparseCUDA.test_whole_workflow -v
# Test with real kernel
cd tests
TORCHINDUCTOR_FX_GRAPH_CACHE=0 python test_add.py
- React 22 - UI framework
- TypeScript - Type safety
- Vite - Build tool and dev server
- Tailwind CSS - Styling
- Monaco Editor - Code display
Purpose: Load and process trace files
Key Functions:
-
loadLogData()
- Load from URL -
loadLogDataFromFile()
- Load from file -
processKernelData()
- Process raw data
Purpose: Display IR code with syntax highlighting
Features:
- Language-specific syntax highlighting
- Line number display
- Interactive line selection
- Source mapping visualization
Purpose: Side-by-side IR comparison
Features:
- Synchronized scrolling
- Line mapping visualization
- Interactive highlighting
- Dropdown IR selection
-
Update
dataLoader.ts
: Modify the data loading and processing functions to handle any new data fields from the backend. -
Create new components: In
website/src/components/
, create new React components to display the new information. For example, a new panel in theKernelOverview.tsx
or a new view. -
Integrate components: Add the new components to the appropriate pages (e.g.,
KernelOverview.tsx
,CodeComparisonView.tsx
). - Style the components: Use Tailwind CSS for styling to match the existing interface.
- Add tests: If applicable, add tests for the new components or functionality.
cd website
# Development server
npm run dev
# Type checking
npm run build
# Linting
npm run lint
# Test with sample data
# Load ./public/f0_fc0_a0_cai-.ndjson in browser
Python Code
β
βΌ
Triton Compilation
(triggers Hook Events)
β
βΌ
Structured Logging
β
βΌ
Raw NDJSON Logs
β
βΌ
Log Processing
- Source Mapping
- Launch Analysis
β
βΌ
Compressed Data
β
βΌ
Web Interface
β
βΌ
Interactive Visualization
{
"event_type": "compilation_start",
"timestamp": 1234567890,
"kernel_name": "add_kernel",
"metadata": {...}
}
{
"kernels": [
{
"hash": "abc123",
"name": "add_kernel",
"metadata": {...},
"irFiles": {
"ttgir": "...",
"ptx": "..."
},
"sourceMappings": {
"ttgir": {...},
"ptx": {...}
}
}
]
}
# Enable debug logging
export TRITONPARSE_DEBUG=1
# Run with debug output
python your_script.py
# Check log file contents
head -n 10 ./logs/*.ndjson
# Inspect compressed data
zcat ./parsed_output/*.gz | head -n 20
# Test parsing pipeline
python -c "
import tritonparse.utils
tritonparse.utils.unified_parse('./logs/', './test_output/', verbose=True)
"
// Enable frontend debug logging
localStorage.setItem('tritonparse-debug', 'true');
// Inspect loaded data
console.log(window.tritonparseData);
// Test data processing
import { processKernelData } from './utils/dataLoader';
console.log(processKernelData(rawData));
tests/
βββ test_tritonparse.py # Main test suite
βββ test_add.py # Manual test example
βββ example_output/ # Sample data
# All tests
python -m unittest tests.test_tritonparse -v
# CPU-only tests
python -m unittest tests.test_tritonparse.TestTritonparseCPU -v
# GPU tests (requires CUDA)
python -m unittest tests.test_tritonparse.TestTritonparseCUDA -v
# Manual test
cd tests
TORCHINDUCTOR_FX_GRAPH_CACHE=0 python test_add.py
To add a new end-to-end test case, you should follow the structure of existing tests in TestTritonparseCUDA
. The general workflow is as follows:
-
Define a test method: Create a new method inside
TestTritonparseCUDA
with a name starting withtest_
. - Define a Triton kernel: Write a simple Triton kernel that demonstrates the feature you want to test. This can be defined directly inside the test method.
-
Set up a temporary environment: Use
tempfile.mkdtemp()
to create temporary directories for logs and parsed output. -
Initialize
tritonparse
logging: Calltritonparse.structured_logging.init()
to start capturing events. -
Run the kernel: Execute the kernel to generate compilation and launch events. Run it multiple times if you need to test
launch_diff
functionality. -
Parse the logs: Call
tritonparse.utils.unified_parse()
to process the raw logs. - Assert the results: Check the contents of the raw log files or the parsed output to verify that the behavior is correct.
-
Clean up: Use a
try...finally
block to ensure the temporary directory is always removed.
Here is a simplified example illustrating how to add a new test:
# In tests/test_tritonparse.py, inside TestTritonparseCUDA
@unittest.skipUnless(torch.cuda.is_available(), "CUDA not available")
def test_new_feature_workflow(self):
"""Test a new feature in the end-to-end workflow."""
# 1. Define the kernel for the test
@triton.jit
def my_new_kernel(x_ptr, y_ptr, n_elements, BLOCK_SIZE: tl.constexpr):
# ... kernel implementation ...
pid = tl.program_id(axis=0)
offsets = pid * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
x = tl.load(x_ptr + offsets, mask=offsets < n_elements)
tl.store(y_ptr + offsets, x, mask=offsets < n_elements)
# 2. Set up temporary directories
temp_dir = tempfile.mkdtemp()
log_path = os.path.join(temp_dir, "logs")
parsed_path = os.path.join(temp_dir, "parsed")
os.makedirs(log_path, exist_ok=True)
os.makedirs(parsed_path, exist_ok=True)
# 3. Initialize logging and ensure cleanup
tritonparse.structured_logging.init(log_path, enable_launch_trace=True)
try:
# 4. Run the kernel to generate logs
x = torch.randn(128, device="cuda")
y = torch.empty_like(x)
my_new_kernel[(1,)](x, y, 128, BLOCK_SIZE=128)
torch.cuda.synchronize()
# 5. Parse the generated logs
tritonparse.utils.unified_parse(source=log_path, out=parsed_path)
# 6. Verify the output
parsed_files = os.listdir(parsed_path)
self.assertGreater(len(parsed_files), 0, "Parsing did not produce output files.")
# ... (add more specific assertions on file contents) ...
finally:
# 7. Clean up the temporary directory
shutil.rmtree(temp_dir)
tritonparse.structured_logging.clear_logging_config()
Versions are managed in:
-
pyproject.toml
- Python package version -
website/package.json
- Frontend version
- Update version numbers
- Update CHANGELOG.md
- Run full test suite
- Build and test website
- Create GitHub release
- Deploy to GitHub Pages
CI/CD pipeline includes:
- Format checking - Code style validation
- Linting - Code quality checks
- Testing - Python and frontend tests
- Website deployment - Automatic GitHub Pages deployment
- Fork the repository
-
Create feature branch:
git checkout -b feature-name
- Make changes following coding standards
- Add tests for new functionality
-
Run formatting:
make format
-
Run tests:
make lint-check && python -m unittest tests.test_tritonparse -v
- Submit pull request
- All PRs require review by core maintainers
- CI checks must pass before merge
- Documentation updates required for new features
- Tests required for new functionality
When reporting issues:
- Use issue templates provided
- Include system information
- Provide reproduction steps
- Include error messages and logs
- Code Formatting Guide - Detailed formatting standards
- API Reference - Complete API documentation
- Architecture Deep Dive - Detailed architecture
- GitHub Discussions - Community Q&A
- GitHub Issues - Bug reports and feature requests
- Triton Documentation - Official Triton docs
- React Documentation - React development guide
- TypeScript Documentation - TypeScript reference
For new developers:
- Complete the Installation Guide
- Read the Usage Guide to understand the tool
- Explore the codebase starting with simple components
- Run the test suite to verify your setup
- Join GitHub Discussions for community support
For experienced contributors:
- Check GitHub Issues for open tasks
- Review the Architecture Deep Dive for advanced topics
- Contribute to documentation improvements
- Propose new features through GitHub Discussions