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.
Files changed (115) hide show
  1. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/PKG-INFO +1 -1
  2. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/accuracy.py +1 -1
  3. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/cupy.py +2 -1
  4. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/interface.py +3 -0
  5. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/common.py +3 -1
  6. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/dual_annealing.py +2 -1
  7. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/simulated_annealing.py +2 -2
  8. kernel_tuner-1.3.3/kernel_tuner/strategies/skopt.py +116 -0
  9. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/utils/nvcuda.py +4 -0
  10. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/pyproject.toml +2 -1
  11. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/LICENSE +0 -0
  12. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/README.md +0 -0
  13. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/__init__.py +0 -0
  14. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/__init__.py +0 -0
  15. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/backend.py +0 -0
  16. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/compiler.py +0 -0
  17. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hip/__init__.py +0 -0
  18. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hip/hip.py +0 -0
  19. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hip/util.py +0 -0
  20. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/hypertuner.py +0 -0
  21. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/nvcuda.py +0 -0
  22. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/opencl.py +0 -0
  23. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/backends/pycuda.py +0 -0
  24. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/core.py +0 -0
  25. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/energy/__init__.py +0 -0
  26. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/energy/energy.py +0 -0
  27. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/file_utils.py +0 -0
  28. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/hyper.py +0 -0
  29. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/integration.py +0 -0
  30. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/kernelbuilder.py +0 -0
  31. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/__init__.py +0 -0
  32. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/compiler.py +0 -0
  33. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/cupy.py +0 -0
  34. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/hip.py +0 -0
  35. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/ncu.py +0 -0
  36. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/nvcuda.py +0 -0
  37. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/nvml.py +0 -0
  38. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/observer.py +0 -0
  39. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/opencl.py +0 -0
  40. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/pmt.py +0 -0
  41. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/powersensor.py +0 -0
  42. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/pycuda.py +0 -0
  43. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/register.py +0 -0
  44. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/observers/tegra.py +0 -0
  45. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/__init__.py +0 -0
  46. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/runner.py +0 -0
  47. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/sequential.py +0 -0
  48. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/runners/simulation.py +0 -0
  49. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/schema/T1/1.0.0/input-schema.json +0 -0
  50. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/schema/T4/1.0.0/metadata-schema.json +0 -0
  51. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/schema/T4/1.0.0/results-schema.json +0 -0
  52. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/searchspace.py +0 -0
  53. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/__init__.py +0 -0
  54. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/basinhopping.py +0 -0
  55. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/bayes_opt.py +0 -0
  56. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/brute_force.py +0 -0
  57. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/diff_evo.py +0 -0
  58. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/firefly_algorithm.py +0 -0
  59. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/genetic_algorithm.py +0 -0
  60. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/greedy_ils.py +0 -0
  61. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/greedy_mls.py +0 -0
  62. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/hillclimbers.py +0 -0
  63. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/minimize.py +0 -0
  64. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/mls.py +0 -0
  65. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/ordered_greedy_mls.py +0 -0
  66. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/pso.py +0 -0
  67. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/pyatf_strategies.py +0 -0
  68. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/random_sample.py +0 -0
  69. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/strategies/wrapper.py +0 -0
  70. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/util.py +0 -0
  71. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/utils/__init__.py +0 -0
  72. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/kernel_tuner/utils/directives.py +0 -0
  73. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/__init__.py +0 -0
  74. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/conftest.py +0 -0
  75. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/context.py +0 -0
  76. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/convolution.cu +0 -0
  77. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/__init__.py +0 -0
  78. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_bayesian_optimization.py +0 -0
  79. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_cache_file.json +0 -0
  80. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_common.py +0 -0
  81. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_diff_evo.py +0 -0
  82. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_genetic_algorithm.py +0 -0
  83. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/strategies/test_strategies.py +0 -0
  84. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/synthetic_fp32_cache_NVIDIA_RTX_A4000.json +0 -0
  85. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_T1_input.json +0 -0
  86. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_accuracy.py +0 -0
  87. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_backend.py +0 -0
  88. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cache_file.json +0 -0
  89. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cache_file_T1_input.json +0 -0
  90. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_common.py +0 -0
  91. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_compiler_functions.py +0 -0
  92. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_core.py +0 -0
  93. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cuda_functions.py +0 -0
  94. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_cupy_functions.py +0 -0
  95. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_custom_optimizer.py +0 -0
  96. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_energy.py +0 -0
  97. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_file_utils.py +0 -0
  98. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_hip_functions.py +0 -0
  99. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_hyper.py +0 -0
  100. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_integration.py +0 -0
  101. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_kernelbuilder.py +0 -0
  102. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_nvml_mocked.py +0 -0
  103. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_observers.py +0 -0
  104. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_opencl_functions.py +0 -0
  105. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_pycuda_functions.py +0 -0
  106. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_pycuda_mocked.py +0 -0
  107. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_runners.py +0 -0
  108. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_searchspace.py +0 -0
  109. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_time_budgets.py +0 -0
  110. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_toml_file.py +0 -0
  111. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/test_util_functions.py +0 -0
  112. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/utils/__init__.py +0 -0
  113. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/utils/nvcuda.py +0 -0
  114. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/utils/test_directives.py +0 -0
  115. {kernel_tuner-1.3.1 → kernel_tuner-1.3.3}/test/vector_add.cu +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kernel_tuner
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: An easy to use CUDA/OpenCL kernel tuner in Python
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -96,7 +96,7 @@ def _find_bfloat16_if_available():
96
96
  + "please install either the package `ml_dtypes`, `jax`, or `tensorflow`"
97
97
  )
98
98
 
99
- return None
99
+ return dtype
100
100
 
101
101
 
102
102
  def _to_float_dtype(x: str) -> np.dtype:
@@ -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(cp._cupyx.get_runtime_info()).split("\n")[:-1]
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 = sys.float_info.max
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 ps before, never move to nonvalid pos
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.1" # adhere to PEP440 versioning: https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#id55
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