# PyTorch to CK Profiler Conversion Tools This directory contains two Python scripts to convert PyTorch convolution operations to CK Profiler format and execute them. ## Overview 1. **`convert_pytorch_to_ck.py`** - Converts PyTorch JSON to CK Profiler configuration JSON 2. **`run_ck_profiler.py`** - Executes CK profilers for each configuration ## Workflow ```bash # Step 1: Convert PyTorch JSON to CK Profiler JSON python convert_pytorch_to_ck.py build/test-data/conv_repros_ir.json ck_profiler_configs.json # Step 2: Execute profilers python run_ck_profiler.py ck_profiler_configs.json --profiler-path ./build/bin ``` --- ## Script 1: convert_pytorch_to_ck.py ### Description Converts PyTorch convolution operations from `conv_repros_ir.json` to CK Profiler configuration format. ### Supported Operations - `aten::miopen_convolution` → Forward convolution - `aten::convolution_backward` → Backward data and/or backward weight ### Configuration The script uses these hardcoded settings: - **Data type**: FP16 (data_type=1) - **Layout**: NGCHW_GKCYX_NGKHW (layout=3) - **Index type**: 32-bit (index_type=0, for forward only) - **Verification**: Disabled (verify=0) - **Initialization**: Integer values (init=1) - **Logging**: Disabled (log=0) - **Timing**: Enabled (time=1) - **Split-K**: "all" (for backward operations) ### Usage ```bash # Basic usage (uses defaults) python convert_pytorch_to_ck.py # Specify input and output files python convert_pytorch_to_ck.py input.json output.json # Help python convert_pytorch_to_ck.py --help ``` ### Default Files - **Input**: `build/test-data/conv_repros_ir.json` - **Output**: `ck_profiler_configs.json` ### Output Format The output JSON contains an array of configurations: ```json [ { "operation_type": "profile_grouped_conv_fwd", "profiler_args": { "data_type": 1, "layout": 3, "index_type": 0, "verify": 0, "init": 1, "log": 0, "time": 1, "num_dim_spatial": 2, "G": 32, "N": 32, "K": 4, "C": 4, "filter_spatial": [3, 3], "input_spatial": [200, 200], "strides": [1, 1], "dilations": [1, 1], "left_pads": [1, 1], "right_pads": [1, 1] }, "metadata": { "priority_rank": 1, "pytorch_op": "aten::miopen_convolution", "description": "Forward conv: G=32, N=32, K=4, C=4, [3, 3] kernel, [200, 200] input" } } ] ``` ### Example Output ``` Converting PyTorch convolutions to CK Profiler format... ✓ [1/78] Converted: aten::miopen_convolution (rank 1) → fwd ✓ [2/78] Converted: aten::convolution_backward (rank 2) → bwd_data ✓ [2/78] Converted: aten::convolution_backward (rank 2) → bwd_weight ... ============================================================ Conversion Summary ============================================================ Total PyTorch operations: 78 ✓ Forward convolutions: 30 ✓ Backward data convolutions: 35 ✓ Backward weight convolutions: 35 ⚠ Skipped operations: 0 Total CK profiler configs: 100 Output file: ck_profiler_configs.json ============================================================ Conversion completed successfully! ``` --- ## Script 2: run_ck_profiler.py ### Description Executes CK Profiler binaries for each configuration in the JSON file, with support for dry-run, filtering, and result collection. ### Usage ```bash # Run all configurations python run_ck_profiler.py ck_profiler_configs.json # Run first 10 only (for testing) python run_ck_profiler.py ck_profiler_configs.json --max-ops 10 # Dry run (show commands without executing) python run_ck_profiler.py ck_profiler_configs.json --dry-run # Specify profiler path python run_ck_profiler.py ck_profiler_configs.json --profiler-path ./build/bin # Quiet mode (less verbose output) python run_ck_profiler.py ck_profiler_configs.json --quiet # Don't save results python run_ck_profiler.py ck_profiler_configs.json --no-save # Custom results output file python run_ck_profiler.py ck_profiler_configs.json --output my_results.json ``` ### Command Line Options | Option | Description | Default | |--------|-------------|---------| | `config_file` | CK Profiler configuration JSON file | (required) | | `--profiler-path` | Path to CK profiler binaries | `./build/bin` | | `--max-ops` | Maximum number of operations to execute | All | | `--dry-run` | Show commands without executing | False | | `--quiet` | Reduce output verbosity | False | | `--no-save` | Do not save results to JSON | False | | `--output` | Output file for results | `profiler_results.json` | ### Example Output ``` Executing CK Profiler for 100 configurations... ====================================================================== [1/100] Forward conv: G=32, N=32, K=4, C=4, [3, 3] kernel, [200, 200] input Priority Rank: 1 PyTorch Op: aten::miopen_convolution ====================================================================== Command: ./build/bin/profile_grouped_conv_fwd 1 3 0 0 1 0 1 2 32 32 4 4 3 3 200 200 1 1 1 1 1 1 1 1 ✓ SUCCESS (completed in 2.34s) Output: ...profiler output... ... ====================================================================== Execution Summary ====================================================================== Total configurations: 100 ✓ Successful: 95 ✗ Failed: 5 Success rate: 95.0% ====================================================================== Results saved to: profiler_results.json ``` ### Results File Format The `profiler_results.json` file contains: ```json { "timestamp": "2026-01-19T05:48:00", "stats": { "total": 100, "success": 95, "failed": 5, "skipped": 0 }, "results": [ { "operation": "profile_grouped_conv_fwd", "description": "Forward conv: G=32, N=32, K=4, C=4, [3, 3] kernel, [200, 200] input", "priority_rank": 1, "success": true, "returncode": 0, "elapsed_time": 2.34, "command": "./build/bin/profile_grouped_conv_fwd ...", "error": null, "stdout": "...truncated..." } ] } ``` --- ## Requirements - Python 3.6+ - CK profiler binaries built in `./build/bin` (or specify with `--profiler-path`) - Input JSON file with PyTorch convolution operations ## Notes ### Layout Mapping PyTorch uses **NCHW** layout, which maps to CK's **NGCHW_GKCYX_NGKHW** (layout=3): - Input: [N, G, C, Hi, Wi] - Weight: [G, K, C, Y, X] - Output: [N, G, K, Ho, Wo] ### Per-Group Channels For grouped convolutions: - `C_per_group = C_total / groups` - `K_per_group = K_total / groups` The converter automatically computes these values. ### Backward Operations The `aten::convolution_backward` operation can compute: - **Backward data** (gradient w.r.t. input) when `output_mask[0]=true` - **Backward weight** (gradient w.r.t. weight) when `output_mask[1]=true` - Both if both flags are true ### Split-K Parameter For backward operations, split_k is set to "all" which instructs the profiler to test all split-K values: -1, 1, 2, 4, 8, 16, 32, 64, 128. --- ## Troubleshooting ### "Profiler executable not found" Ensure CK profilers are built: ```bash mkdir -p build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make profile_grouped_conv_fwd profile_grouped_conv_bwd_data profile_grouped_conv_bwd_weight ``` ### "Input file not found" Check that the PyTorch JSON file exists: ```bash ls -l build/test-data/conv_repros_ir.json ``` ### Conversion warnings Yellow warnings indicate operations that couldn't be converted (e.g., non-convolution operations). These are expected and don't indicate errors. ---