Files
rocm-systems/projects/rocprofiler-compute/tools/config_management/README.md
T
2025-11-19 10:46:02 -05:00

501 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Architecture Configuration Workflow
This document explains the master workflow system for managing architecture-specific metric configurations.
## Overview
The workflow system manages changes to architecture configurations located in `src/rocprof_compute_soc/analysis_configs/gfx<arch>/`. It handles:
- **Metric changes** (additions, deletions, modifications)
- **Metric description changes** (plain text + RST documentation)
- **New architecture additions**
- **Template updates**
- **Config delta generation** for version control
## Files Overview
### Core Scripts
1. **`master_config_workflow_script.py`** - Main orchestrator script
2. **`hash_manager.py`** - Tracks file changes via MD5 hashes
3. **`metric_description_manager.py`** - Syncs metric descriptions across files
4. **`config_workflow.yaml`** - Configuration file
5. **`parse_config_template.py`** - Parses base config template from latest arch
6. **`generate_config_deltas.py`** - Generates config deltas between two archs
7. **`apply_config_deltas.py`** - Applies config deltas to genearte new arch configs
8. **`verify_against_config_template.py`** - Validates configs against template
## Quick Start
### Initial Setup (not needed following first commit)
1. Create the hash database:
```bash
python hash_manager.py --compute-all src/rocprof_compute_soc/analysis_configs
```
2. Ensure `analysis_config_template.yaml` has metadata:
```yaml
latest_arch: gfx950
panels:
- file: top_stats.yaml
panel_id: 0
...
```
### Making Changes
Simply run the master workflow after making any changes:
```bash
python master_config_workflow_script.py
```
The script will:
- Detect what changed
- Prompt you for confirmation
- Apply changes
- Validate results
- Update all necessary files
### Dry Run Mode
To see what would happen without making changes:
```bash
python master_config_workflow_script.py --dry-run
```
## Usage Scenarios
### Scenario A: Add Metrics to Latest Arch (gfx950)
**Method 1: Direct Edit**
1. Edit `src/rocprof_compute_soc/analysis_configs/gfx950/0700_wavefront.yaml`
2. Add your metric to the appropriate table
3. Add description to `metrics_description` section
4. Run: `python master_config_workflow_script.py`
5. Answer prompts
**Method 2: Using Delta**
1. Create `src/rocprof_compute_soc/analysis_configs/gfx950/config_delta/gfx955_diff.yaml`:
```yaml
Addition:
- Panel Config:
id: 700
title: Wavefront
metric_tables:
- metric_table:
id: 701
title: Wavefront Launch Stats
metrics:
- New Metric:
avg: AVG(something)
unit: Units
metric_descriptions:
New Metric:
plain: Description text
rst: >- # Optional
Description with :ref:`RST markup <link>`
Deletion:
[]
Modification:
[]
```
2. Run: `python master_config_workflow_script.py`
**What Happens:**
- Changes applied to gfx950
- Template updated
- Deltas regenerated for all previous archs (gfx940, gfx941, etc.)
- Metric descriptions synced to:
- `tools/per_arch_metric_definitions/gfx950_metrics_description.yaml`
- `docs/data/metrics_description.yaml`
- All archs validated
- Hashes updated
### Scenario B: Modify Metrics in Older Arch (gfx940)
**Method 1: Direct Edit**
1. Edit `src/rocprof_compute_soc/analysis_configs/gfx940/0700_wavefront.yaml`
2. Make your changes
3. Run: `python master_config_workflow_script.py`
**Method 2: Using Delta**
1. Create `src/rocprof_compute_soc/analysis_configs/gfx940/config_delta/gfx950_diff.yaml`
2. Run: `python master_config_workflow_script.py`
**What Happens:**
- Changes applied to gfx940 only
- Validated against template (must still match structure)
- Metric descriptions synced to `tools/per_arch_metric_definitions/gfx940_metrics_description.yaml`
- Hashes updated for gfx940 only
### Scenario C: Add New Architecture (gfx955)
**Method 1: Create Directory with YAMLs**
1. Create `src/rocprof_compute_soc/analysis_configs/gfx955/`
2. Copy/create YAML files
3. Run: `python master_config_workflow_script.py`
4. Confirm this is the new latest arch
**Method 2: Using Delta from Latest**
1. Create delta showing differences from gfx950
2. Place in `src/rocprof_compute_soc/analysis_configs/gfx955/config_delta/gfx955_diff.yaml`
3. Run: `python master_config_workflow_script.py`
4. Confirm this is the new latest arch
**What Happens:**
- gfx955 becomes new latest arch
- Template updated with gfx955 as source
- Deltas generated: gfx955 → gfx950, gfx955 → gfx940, etc.
- All archs validated
- Metric descriptions synced
- Hashes updated
### Scenario D: Update Metric Descriptions Only
1. Edit description in config YAML:
```yaml
metrics_description:
Grid Size: "Updated description text"
```
2. Run: `python master_config_workflow_script.py`
**What Happens:**
- Same workflow as metric changes
- Plain text stored in config YAMLs
- RST version generated and stored in docs/tools files
## Delta YAML Structure
### Complete Example
```yaml
Addition:
- Panel Config:
id: 1100
title: Compute Units - Compute Pipeline
metric_tables:
- metric_table:
id: 1103
title: Arithmetic Operations
metrics:
- F8 OPs:
avg: AVG(((512 * SQ_INSTS_VALU_MFMA_MOPS_F8) / $denom))
min: MIN(((512 * SQ_INSTS_VALU_MFMA_MOPS_F8) / $denom))
max: MAX(((512 * SQ_INSTS_VALU_MFMA_MOPS_F8) / $denom))
unit: (OPs + $normUnit)
metric_descriptions:
F8 OPs:
plain: Number of 8-bit floating point operations
rst: |-
Number of 8-bit floating point operations per :ref:`normalization unit <normalization-units>`"
Deletion:
- Panel Config:
id: 1100
title: Compute Units - Compute Pipeline
metric_tables:
- metric_table:
id: 1103
title: Arithmetic Operations
metrics:
- Old Metric:
avg: AVG(something)
metric_descriptions:
Old Metric:
plain: "Old description"
Modification:
- Panel Config:
id: 1100
title: Compute Units - Compute Pipeline
metric_tables:
- metric_table:
id: 1103
title: Arithmetic Operations
metrics:
- Existing Metric:
avg: AVG(new_formula) # Changed field only
metric_descriptions:
Existing Metric:
plain: Updated description
rst: >-
Updated description with **RST**"
```
### Rules for Deltas
1. **Must have all three sections**: Addition, Deletion, Modification (can be empty lists)
2. **Metric descriptions**:
- `plain` field is required
- `rst` field is optional (defaults to copy of plain)
3. **Delta filename**: Must be `<target_arch>_diff.yaml`
4. **Location**: `src/rocprof_compute_soc/analysis_configs/gfx<arch>/config_delta/`
## Standalone Tool Usage
### Hash Manager
```bash
# Compute hashes for all archs
python hash_manager.py --compute-all src/rocprof_compute_soc/analysis_configs
# Detect changes
python hash_manager.py --detect-changes src/rocprof_compute_soc/analysis_configs
# Update hashes for specific arch
python hash_manager.py --update gfx950 src/rocprof_compute_soc/analysis_configs
```
### Metric Description Manager
```bash
# Sync descriptions for specific arch
python metric_description_manager.py --sync-arch gfx950 src/rocprof_compute_soc/analysis_configs --latest-arch gfx950
# Sync all archs
python metric_description_manager.py --sync-all src/rocprof_compute_soc/analysis_configs --latest-arch gfx950
# Validate descriptions
python metric_description_manager.py --validate gfx950 src/rocprof_compute_soc/analysis_configs
```
### Parse Config Template
```bash
# Generate template with metadata
python parse_config_template.py src/rocprof_compute_soc/analysis_configs/gfx950 \
tools/config_management/analysis_config_template.yaml \
--latest-arch gfx950
```
### Generate Delta
```bash
# Generate delta from current arch to previous arch
python generate_config_deltas.py \
src/rocprof_compute_soc/analysis_configs/gfx950 \
src/rocprof_compute_soc/analysis_configs/gfx940
```
### Apply Delta
```bash
# Apply delta to base arch
python apply_config_deltas.py \
src/rocprof_compute_soc/analysis_configs/gfx940 \
src/rocprof_compute_soc/analysis_configs/gfx940/config_delta/gfx950_diff.yaml \
output_dir
```
### Verify Against Template
```bash
# Validate all archs
python verify_against_config_template.py \
src/rocprof_compute_soc/analysis_configs \
tools/config_management/analysis_config_template.yaml
```
## File Structure
```
.
├── src/rocprof_compute_soc/analysis_configs/
│ ├── gfx940/
│ │ ├── 0700_wavefront.yaml # Config with plain descriptions
│ │ └── config_delta/
│ │ └── gfx950_diff.yaml # Delta to apply changes
│ ├── gfx941/
│ └── gfx950/ # Latest arch
│ ├── 0700_wavefront.yaml
│ └── config_delta/
│ └── gfx950_diff.yaml # Optional delta for modifications
├── tools/
│ ├── config_management/
│ │ ├── .config_hashes.json # Hash database (auto-generated)
│ │ ├── analysis_config_template.yaml # Template with metadata
│ │ ├── hash_manager.py
│ │ ├── metric_description_manager.py
│ │ ├── parse_config_template.py
│ │ ├── generate_config_deltas.py
│ │ ├── apply_config_deltas.py
│ │ ├── verify_against_config_template.py
│ │ ├── master_config_workflow_script.py
│ │ └── config_workflow.yaml
│ │
│ └── per_arch_metric_definitions/
│ ├── gfx940_metrics_description.yaml # RST only
│ ├── gfx941_metrics_description.yaml
│ └── gfx950_metrics_description.yaml
├── docs/data/
│ └── metrics_description.yaml # RST only, latest arch only
└── .backups/ # Auto-generated backups
└── 20250115_143022/ # Timestamped backup
```
## Configuration
Edit `config_workflow.yaml` to customize paths and behavior:
```yaml
paths:
template: tools/config_management/analysis_config_template.yaml
configs_root: src/rocprof_compute_soc/analysis_configs
backups: .backups
hashes: tools/config_management/.config_hashes.json
per_arch_metrics: tools/per_arch_metric_definitions
docs_metrics: docs/data/metrics_description.yaml
validation:
strict_mode: true # Fail on warnings
verify_after_changes: true # Validate after operations
behavior:
require_confirmation: true # Prompt before changes
```
## Error Handling
### Validation Failures
If validation fails:
1. All changes are automatically reverted
2. Backup is restored
3. Detailed error report is printed
4. Fix the issue and run again
### Hash Mismatches
If hashes are out of sync:
```bash
# Recompute all hashes
python hash_manager.py --compute-all src/rocprof_compute_soc/analysis_configs
```
### Description Validation Errors
Common issues:
- **Missing descriptions**: Warning only (won't fail)
- **Invalid RST syntax**: Error (will fail and revert)
- **Missing plain text**: Error (plain is required)
## Best Practices
1. **Always use master_config_workflow_script.py** - Don't run individual scripts manually unless debugging
2. **Test with --dry-run first** - See what will happen before committing
3. **Use deltas for complex changes** - Easier to review and version control
4. **Keep descriptions updated** - Plain text in configs, RST in docs
5. **One change at a time** - If multiple archs need updates, do them sequentially
6. **Check validation output** - Review warnings even if they don't fail
## Troubleshooting
### "No changes detected"
- Check that files were actually modified
- Ensure you're in the correct directory
- Verify hash database exists: `tools/config_management/.config_hashes.json`
### "Validation failed"
- Review the error output carefully
- Check that new metrics match template structure
- Ensure panel IDs are correct
- Verify data source ordering
### "Failed to sync metric descriptions"
- Check RST syntax in descriptions
- Ensure all metrics have descriptions
- Verify section_panel_map includes your table ID
### Changes not detected after manual edit
```bash
# Force recompute hashes
python hash_manager.py --compute-all src/rocprof_compute_soc/analysis_configs
# Then run workflow
python master_config_workflow_script.py
```
## Development Notes
### Adding New Architecture Support
When adding a completely new architecture line:
1. Ensure table IDs are in `metric_description_manager.py`'s `SECTION_PANEL_MAP`
2. Follow existing naming conventions (gfxXXX)
3. Create complete YAML set (don't start with partial configs)
### Modifying the Workflow
If you need to modify the workflow behavior:
1. Edit `config_workflow.yaml` for path/behavior changes
2. Edit `master_config_workflow_script.py` for workflow logic changes
3. Test with `--dry-run` extensively
4. Update this README
# Pre-commit: Hash Consistency Check
We ship a lightweight pre-commit hook that catches inconsistent hash updates across config YAMLs and deltas.
## What it enforces (per arch)
* Latest panels changed → latest delta must change (if there are older archs).
* Latest delta changed → latest panels must change or a new arch must be added.
* Older arch panels changed → that archs delta must change.
* Older arch delta changed → either latest panels or that archs panels must have changed.
## Setup
Install and enable pre-commit:
```bash
pip install pre-commit
pre-commit install
```
Our .pre-commit-config.yaml includes a local hook that runs the checker.
```yaml
- repo: local
hooks:
- id: hash-check
name: Hash consistency check
entry: bash -lc 'cd projects/rocprofiler-compute && python3 tools/config_management/hash_checker.py'
language: system
pass_filenames: false
stages: [pre-commit]
```
## Run manually
```bash
# from super-repo root
pre-commit run --all-files
# or directly in the subproject
cd projects/rocprofiler-compute
python3 tools/config_management/hash_checker.py
```