kernel-tuner 1.3.1__tar.gz → 1.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/PKG-INFO +1 -1
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/accuracy.py +1 -1
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/cupy.py +2 -1
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/interface.py +3 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/common.py +3 -1
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/dual_annealing.py +2 -1
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/simulated_annealing.py +2 -2
- kernel_tuner-1.3.3/kernel_tuner/strategies/skopt.py +116 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/utils/nvcuda.py +4 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/pyproject.toml +2 -1
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/LICENSE +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/README.md +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/backend.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/compiler.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hip/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hip/hip.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hip/util.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hypertuner.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/nvcuda.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/opencl.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/pycuda.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/core.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/energy/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/energy/energy.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/file_utils.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/hyper.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/integration.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/kernelbuilder.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/compiler.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/cupy.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/hip.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/ncu.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/nvcuda.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/nvml.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/observer.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/opencl.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/pmt.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/powersensor.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/pycuda.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/register.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/tegra.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/runner.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/sequential.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/simulation.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/schema/T1/1.0.0/input-schema.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/schema/T4/1.0.0/metadata-schema.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/schema/T4/1.0.0/results-schema.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/searchspace.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/basinhopping.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/bayes_opt.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/brute_force.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/diff_evo.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/firefly_algorithm.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/genetic_algorithm.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/greedy_ils.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/greedy_mls.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/hillclimbers.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/minimize.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/mls.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/ordered_greedy_mls.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/pso.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/pyatf_strategies.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/random_sample.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/wrapper.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/util.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/utils/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/utils/directives.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/conftest.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/context.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/convolution.cu +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_bayesian_optimization.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_cache_file.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_common.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_diff_evo.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_genetic_algorithm.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_strategies.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/synthetic_fp32_cache_NVIDIA_RTX_A4000.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_T1_input.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_accuracy.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_backend.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cache_file.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cache_file_T1_input.json +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_common.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_compiler_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_core.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cuda_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cupy_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_custom_optimizer.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_energy.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_file_utils.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_hip_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_hyper.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_integration.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_kernelbuilder.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_nvml_mocked.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_observers.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_opencl_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_pycuda_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_pycuda_mocked.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_runners.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_searchspace.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_time_budgets.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_toml_file.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_util_functions.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/utils/__init__.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/utils/nvcuda.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/utils/test_directives.py +0 -0
- {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/vector_add.cu +0 -0
|
@@ -10,6 +10,7 @@ from kernel_tuner.observers.cupy import CupyRuntimeObserver
|
|
|
10
10
|
# and run tests without cupy installed
|
|
11
11
|
try:
|
|
12
12
|
import cupy as cp
|
|
13
|
+
from cupyx import get_runtime_info
|
|
13
14
|
except ImportError:
|
|
14
15
|
cp = None
|
|
15
16
|
|
|
@@ -68,7 +69,7 @@ class CupyFunctions(GPUBackend):
|
|
|
68
69
|
|
|
69
70
|
# collect environment information
|
|
70
71
|
env = dict()
|
|
71
|
-
cupy_info = str(
|
|
72
|
+
cupy_info = str(get_runtime_info()).split("\n")[:-1]
|
|
72
73
|
info_dict = {
|
|
73
74
|
s.split(":")[0].strip(): s.split(":")[1].strip() for s in cupy_info
|
|
74
75
|
}
|
|
@@ -65,6 +65,7 @@ from kernel_tuner.strategies import (
|
|
|
65
65
|
pyatf_strategies,
|
|
66
66
|
random_sample,
|
|
67
67
|
simulated_annealing,
|
|
68
|
+
skopt
|
|
68
69
|
)
|
|
69
70
|
from kernel_tuner.strategies.wrapper import OptAlgWrapper
|
|
70
71
|
|
|
@@ -82,6 +83,7 @@ strategy_map = {
|
|
|
82
83
|
"mls": mls,
|
|
83
84
|
"pso": pso,
|
|
84
85
|
"simulated_annealing": simulated_annealing,
|
|
86
|
+
"skopt": skopt,
|
|
85
87
|
"firefly_algorithm": firefly_algorithm,
|
|
86
88
|
"bayes_opt": bayes_opt,
|
|
87
89
|
"pyatf_strategies": pyatf_strategies,
|
|
@@ -394,6 +396,7 @@ _tuning_options = Options(
|
|
|
394
396
|
* "pso" particle swarm optimization
|
|
395
397
|
* "random_sample" takes a random sample of the search space
|
|
396
398
|
* "simulated_annealing" simulated annealing strategy
|
|
399
|
+
* "skopt" uses the minimization methods from `skopt`
|
|
397
400
|
|
|
398
401
|
Strategy-specific parameters and options are explained under strategy_options.
|
|
399
402
|
|
|
@@ -73,6 +73,7 @@ class CostFunc:
|
|
|
73
73
|
snap=True,
|
|
74
74
|
return_invalid=False,
|
|
75
75
|
return_raw=None,
|
|
76
|
+
invalid_value=sys.float_info.max,
|
|
76
77
|
):
|
|
77
78
|
"""An abstract method to handle evaluation of configurations.
|
|
78
79
|
|
|
@@ -100,6 +101,7 @@ class CostFunc:
|
|
|
100
101
|
self.return_raw = f"{tuning_options['objective']}s"
|
|
101
102
|
self.results = []
|
|
102
103
|
self.budget_spent_fraction = 0.0
|
|
104
|
+
self.invalid_return_value = invalid_value
|
|
103
105
|
|
|
104
106
|
|
|
105
107
|
def __call__(self, x, check_restrictions=True):
|
|
@@ -168,7 +170,7 @@ class CostFunc:
|
|
|
168
170
|
else:
|
|
169
171
|
# this is not a valid configuration, replace with float max if needed
|
|
170
172
|
if not self.return_invalid:
|
|
171
|
-
return_value =
|
|
173
|
+
return_value = self.invalid_return_value
|
|
172
174
|
|
|
173
175
|
# include raw data in return if requested
|
|
174
176
|
if self.return_raw is not None:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""The strategy that uses the dual annealing optimization method."""
|
|
2
2
|
import scipy.optimize
|
|
3
|
+
import numpy as np
|
|
3
4
|
|
|
4
5
|
from kernel_tuner.util import StopCriterionReached
|
|
5
6
|
from kernel_tuner.searchspace import Searchspace
|
|
@@ -16,7 +17,7 @@ def tune(searchspace: Searchspace, runner, tuning_options):
|
|
|
16
17
|
method, max_fevals = common.get_options(tuning_options.strategy_options, _options)
|
|
17
18
|
|
|
18
19
|
#scale variables in x to make 'eps' relevant for multiple variables
|
|
19
|
-
cost_func = CostFunc(searchspace, tuning_options, runner, scaling=True)
|
|
20
|
+
cost_func = CostFunc(searchspace, tuning_options, runner, scaling=True, invalid_value=np.inf)
|
|
20
21
|
|
|
21
22
|
bounds, x0, _ = cost_func.get_bounds_x0_eps()
|
|
22
23
|
|
|
@@ -96,7 +96,7 @@ def acceptance_prob(old_cost, new_cost, T):
|
|
|
96
96
|
# if start pos is not valid, always move
|
|
97
97
|
if isinstance(old_cost, ErrorConfig):
|
|
98
98
|
res = 1.0
|
|
99
|
-
# if we have found a valid
|
|
99
|
+
# if we have found a valid pos before, never move to nonvalid pos
|
|
100
100
|
elif isinstance(new_cost, ErrorConfig):
|
|
101
101
|
res = 0.0
|
|
102
102
|
# always move if new cost is better
|
|
@@ -108,7 +108,7 @@ def acceptance_prob(old_cost, new_cost, T):
|
|
|
108
108
|
abs_diff = old_cost - new_cost
|
|
109
109
|
|
|
110
110
|
# relative to abs(old_cost), as the cost might be negative
|
|
111
|
-
rel_diff = abs_diff / np.abs(old_cost)
|
|
111
|
+
rel_diff = abs_diff / (np.abs(old_cost) if old_cost != 0.0 else 1e-20)
|
|
112
112
|
|
|
113
113
|
# exponential decay
|
|
114
114
|
res = np.exp(rel_diff / T)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""The strategy that uses the optimizer from skopt for searching through the parameter space."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from kernel_tuner.util import StopCriterionReached
|
|
5
|
+
from kernel_tuner.searchspace import Searchspace
|
|
6
|
+
from kernel_tuner.strategies.common import (
|
|
7
|
+
CostFunc,
|
|
8
|
+
get_options,
|
|
9
|
+
get_strategy_docstring,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
supported_learners = ["RF", "ET", "GBRT", "DUMMY", "GP"]
|
|
13
|
+
supported_acq = ["LCB", "EI", "PI","gp_hedge"]
|
|
14
|
+
supported_liars = ["cl_min", "cl_mean", "cl_max"]
|
|
15
|
+
|
|
16
|
+
_options = dict(
|
|
17
|
+
learner=(f"The leaner to use (supported: {supported_learners})", "RF"),
|
|
18
|
+
acq_func=(f"The acquisition function to use (supported: {supported_acq})", "gp_hedge"),
|
|
19
|
+
lie_strategy=(f"The lie strategy to use when using batches (supported: {supported_liars})", "cl_max"),
|
|
20
|
+
kappa=("The value of kappa", 1.96),
|
|
21
|
+
num_initial=("Number of initial samples. If `None`, let skopt choose the initial population", None),
|
|
22
|
+
batch_size=("The number of points to ask per batch", 1),
|
|
23
|
+
skopt_kwargs=("Additional options passed to the skopt `Optimizer` as kwargs.", dict()),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def tune(searchspace: Searchspace, runner, tuning_options):
|
|
28
|
+
learner, acq_func, lie_strategy, kappa, num_initial, batch_size, skopt_kwargs = \
|
|
29
|
+
get_options(tuning_options.strategy_options, _options)
|
|
30
|
+
|
|
31
|
+
# Get maximum number of evaluations
|
|
32
|
+
max_fevals = min(tuning_options.get("max_fevals", np.inf), searchspace.size)
|
|
33
|
+
|
|
34
|
+
# Const function
|
|
35
|
+
opt_config, opt_result = None, None
|
|
36
|
+
|
|
37
|
+
# The dimensions. Parameters with one value become categorical
|
|
38
|
+
from skopt.space.space import Categorical, Integer
|
|
39
|
+
tune_params_values = list(searchspace.tune_params.values())
|
|
40
|
+
bounds = [Integer(0, len(p) - 1) if len(p) > 1 else Categorical([0]) for p in tune_params_values]
|
|
41
|
+
|
|
42
|
+
# Space constraint
|
|
43
|
+
space_constraint = lambda x: searchspace.is_param_config_valid(
|
|
44
|
+
searchspace.get_param_config_from_param_indices(x))
|
|
45
|
+
|
|
46
|
+
# Create skopt optimizer
|
|
47
|
+
skopt_kwargs = dict(skopt_kwargs)
|
|
48
|
+
skopt_kwargs["base_estimator"] = learner
|
|
49
|
+
skopt_kwargs["acq_func"] = acq_func
|
|
50
|
+
|
|
51
|
+
# Only set n_initial_points if not None
|
|
52
|
+
if num_initial is not None:
|
|
53
|
+
skopt_kwargs["n_initial_points"] = num_initial
|
|
54
|
+
|
|
55
|
+
# Set kappa is not None
|
|
56
|
+
if kappa is not None:
|
|
57
|
+
skopt_kwargs.setdefault("acq_func_kwargs", {})["kappa"] = kappa
|
|
58
|
+
|
|
59
|
+
if tuning_options.verbose:
|
|
60
|
+
print(f"Initialize scikit-optimize Optimizer object: {skopt_kwargs}")
|
|
61
|
+
|
|
62
|
+
from skopt import Optimizer as SkOptimizer
|
|
63
|
+
optimizer = SkOptimizer(
|
|
64
|
+
dimensions=bounds,
|
|
65
|
+
space_constraint=space_constraint,
|
|
66
|
+
**skopt_kwargs
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Ask initial batch of configs
|
|
70
|
+
num_initial = optimizer._n_initial_points
|
|
71
|
+
batch = optimizer.ask(num_initial, lie_strategy)
|
|
72
|
+
xs, ys = [], []
|
|
73
|
+
eval_count = 0
|
|
74
|
+
|
|
75
|
+
if tuning_options.verbose:
|
|
76
|
+
print(f"Asked optimizer for {num_initial} points: {batch}")
|
|
77
|
+
|
|
78
|
+
# Create cost function
|
|
79
|
+
cost_func = CostFunc(searchspace, tuning_options, runner)
|
|
80
|
+
x0 = cost_func.get_start_pos()
|
|
81
|
+
|
|
82
|
+
# Add x0 if the user has requested it
|
|
83
|
+
if x0 is not None:
|
|
84
|
+
batch.insert(0, searchspace.get_param_indices(x0))
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
while eval_count < max_fevals:
|
|
88
|
+
if not batch:
|
|
89
|
+
optimizer.tell(xs, ys)
|
|
90
|
+
batch = optimizer.ask(batch_size, lie_strategy)
|
|
91
|
+
xs, ys = [], []
|
|
92
|
+
|
|
93
|
+
if tuning_options.verbose:
|
|
94
|
+
print(f"Asked optimizer for {batch_size} points: {batch}")
|
|
95
|
+
|
|
96
|
+
x = batch.pop(0)
|
|
97
|
+
y = cost_func(searchspace.get_param_config_from_param_indices(x))
|
|
98
|
+
eval_count += 1
|
|
99
|
+
|
|
100
|
+
xs.append(x)
|
|
101
|
+
ys.append(y)
|
|
102
|
+
|
|
103
|
+
if opt_result is None or y < opt_result:
|
|
104
|
+
opt_config, opt_result = x, y
|
|
105
|
+
|
|
106
|
+
except StopCriterionReached as e:
|
|
107
|
+
if tuning_options.verbose:
|
|
108
|
+
print(e)
|
|
109
|
+
|
|
110
|
+
if opt_result is not None and tuning_options.verbose:
|
|
111
|
+
print(f"Best configuration: {opt_config}")
|
|
112
|
+
|
|
113
|
+
return cost_func.results
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
tune.__doc__ = get_strategy_docstring("skopt minimize", _options)
|
|
@@ -56,6 +56,10 @@ def cuda_error_check(error):
|
|
|
56
56
|
if error != nvrtc.nvrtcResult.NVRTC_SUCCESS:
|
|
57
57
|
_, desc = nvrtc.nvrtcGetErrorString(error)
|
|
58
58
|
raise RuntimeError(f"NVRTC error: {desc.decode()}")
|
|
59
|
+
elif isinstance(error, tuple) and len(error) > 0:
|
|
60
|
+
cuda_error_check(error[0])
|
|
61
|
+
else:
|
|
62
|
+
raise RuntimeError(f"unknown error type returned by CUDA: {error!r} (type: {type(error).__name__})")
|
|
59
63
|
|
|
60
64
|
|
|
61
65
|
def to_valid_nvrtc_gpu_arch_cc(compute_capability: str) -> str:
|
|
@@ -5,7 +5,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "kernel_tuner"
|
|
7
7
|
description = "An easy to use CUDA/OpenCL kernel tuner in Python"
|
|
8
|
-
version = "1.3.
|
|
8
|
+
version = "1.3.3" # adhere to PEP440 versioning: https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#id55
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
11
11
|
authors = [
|
|
@@ -128,6 +128,7 @@ nox-poetry = "^1.0.3"
|
|
|
128
128
|
ruff = "^0.4.8"
|
|
129
129
|
pep440 = "^0.1.2"
|
|
130
130
|
tomli = "^2.0.1" # held back by Python <= 3.10, can be replaced by built-in [tomllib](https://docs.python.org/3.11/library/tomllib.html) from Python 3.11 onwards
|
|
131
|
+
scikit-optimize = "0.10.2"
|
|
131
132
|
|
|
132
133
|
# development dependencies are unused for now, as this is already covered by test and docs
|
|
133
134
|
# # ATTENTION: if anything is changed here, run `poetry update`
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|