Files
TheRock/rocm-libraries/projects/composablekernel/tile_engine/sampling/sampler.py
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

104 lines
3.3 KiB
Python

# Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
"""Main sampling orchestrator: Sobol -> LHS pad -> maximin refine.
Implements the Daily Tier sampling pipeline from the RFC:
1. Sobol base draw (90% of budget)
2. LHS padding for marginal axis coverage (10% reserve)
3. Maximin simulated annealing post-pass (200 iterations)
"""
import random
from sampling.sobol import SobolSequence
from sampling.lhs import lhs_pad
from sampling.maximin import maximin_anneal
from sampling.feasible_set import GEMM_AXES, normalize_axis_values, normalize_point
def sample_feasible_set(feasible_set, budget, seed, axes=None, maximin_iterations=200):
"""Select `budget` items from `feasible_set` using Sobol + LHS + maximin.
Args:
feasible_set: List of parameter dicts (each with tile/trait keys).
budget: Maximum number of items to select.
seed: Integer seed for deterministic selection.
axes: List of axis names (defaults to GEMM_AXES).
maximin_iterations: SA iterations for maximin pass (default 200).
Returns:
Tuple of (selected_items, sampler_method_string).
"""
n = len(feasible_set)
if axes is None:
axes = GEMM_AXES
if budget >= n:
return list(feasible_set), "full", list(range(n))
if n == 0:
return [], "empty", []
rng = random.Random(seed)
# Phase 1: Sobol base selection (fill as much as possible from Sobol)
sobol = SobolSequence(d=1, scramble=True, seed=seed)
raw_points = sobol.generate(min(budget * 4, n * 2))
selected_indices = []
seen = set()
for pt in raw_points:
idx = min(int(pt[0] * n), n - 1)
if idx not in seen:
seen.add(idx)
selected_indices.append(idx)
if len(selected_indices) >= budget:
break
# If Sobol didn't produce enough unique points, fill with RNG
if len(selected_indices) < budget:
remaining = list(set(range(n)) - seen)
rng.shuffle(remaining)
for idx in remaining:
if len(selected_indices) >= budget:
break
selected_indices.append(idx)
seen.add(idx)
# Phase 2: LHS padding — swap in points that cover uncovered axis values
available_axes = [ax for ax in axes if any(ax in item for item in feasible_set)]
lhs_additions = lhs_pad(
selected_indices,
feasible_set,
available_axes,
max(0, budget - len(selected_indices)),
rng,
)
for idx in lhs_additions:
if idx not in seen:
seen.add(idx)
selected_indices.append(idx)
# Trim to budget
if len(selected_indices) > budget:
selected_indices = selected_indices[:budget]
# Phase 3: Maximin simulated annealing
meta = normalize_axis_values(feasible_set, available_axes)
all_coords = [normalize_point(item, available_axes, meta) for item in feasible_set]
selected_indices = maximin_anneal(
selected_indices,
feasible_set,
all_coords,
iterations=maximin_iterations,
rng=rng,
)
# Sort by original index for deterministic output order
selected_indices.sort()
selected_items = [feasible_set[i] for i in selected_indices]
return selected_items, "sobol+lhs+maximin", selected_indices