Skip to content

Commit a275763

Browse files
Pynisher context is passed to metafeatures (#1076)
* Pynisher context to metafeatures * Update test_smbo.py Co-authored-by: Matthias Feurer <[email protected]>
1 parent 9343373 commit a275763

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

autosklearn/smbo.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import copy
22
import json
33
import logging
4+
import multiprocessing
45
import os
56
import time
67
import traceback
@@ -29,6 +30,7 @@
2930
from autosklearn.data.abstract_data_manager import AbstractDataManager
3031
from autosklearn.evaluation import ExecuteTaFuncWithQueue, get_cost_of_crash
3132
from autosklearn.util.logging_ import get_named_client_logger
33+
from autosklearn.util.parallel import preload_modules
3234
from autosklearn.metalearning.metalearning.meta_base import MetaBase
3335
from autosklearn.metalearning.metafeatures.metafeatures import \
3436
calculate_all_metafeatures_with_labels, calculate_all_metafeatures_encoded_labels
@@ -339,9 +341,12 @@ def _calculate_metafeatures_with_limits(self, time_limit):
339341
res = None
340342
time_limit = max(time_limit, 1)
341343
try:
344+
context = multiprocessing.get_context(self.pynisher_context)
345+
preload_modules(context)
342346
safe_mf = pynisher.enforce_limits(mem_in_mb=self.memory_limit,
343347
wall_time_in_s=int(time_limit),
344348
grace_period_in_s=30,
349+
context=context,
345350
logger=self.logger)(
346351
self._calculate_metafeatures)
347352
res = safe_mf()

test/test_optimizer/test_smbo.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import logging.handlers
2+
3+
from ConfigSpace.configuration_space import Configuration
4+
5+
import pytest
6+
7+
import autosklearn.metrics
8+
from autosklearn.smbo import AutoMLSMBO
9+
import autosklearn.pipeline.util as putil
10+
from autosklearn.automl import AutoML
11+
from autosklearn.constants import BINARY_CLASSIFICATION
12+
from autosklearn.data.xy_data_manager import XYDataManager
13+
from autosklearn.util.stopwatch import StopWatch
14+
15+
16+
@pytest.mark.parametrize("context", ['fork', 'forkserver'])
17+
def test_smbo_metalearning_configurations(backend, context, dask_client):
18+
19+
# Get the inputs to the optimizer
20+
X_train, Y_train, X_test, Y_test = putil.get_dataset('iris')
21+
config_space = AutoML(backend=backend,
22+
metric=autosklearn.metrics.accuracy,
23+
time_left_for_this_task=20,
24+
per_run_time_limit=5).fit(
25+
X_train, Y_train,
26+
task=BINARY_CLASSIFICATION,
27+
only_return_configuration_space=True)
28+
watcher = StopWatch()
29+
30+
# Create an optimizer
31+
smbo = AutoMLSMBO(
32+
config_space=config_space,
33+
dataset_name='iris',
34+
backend=backend,
35+
total_walltime_limit=10,
36+
func_eval_time_limit=5,
37+
memory_limit=4096,
38+
metric=autosklearn.metrics.accuracy,
39+
watcher=watcher,
40+
n_jobs=1,
41+
dask_client=dask_client,
42+
port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
43+
start_num_run=1,
44+
data_memory_limit=None,
45+
num_metalearning_cfgs=25,
46+
pynisher_context=context,
47+
)
48+
assert smbo.pynisher_context == context
49+
50+
# Create the inputs to metalearning
51+
datamanager = XYDataManager(
52+
X_train, Y_train,
53+
X_test, Y_test,
54+
task=BINARY_CLASSIFICATION,
55+
dataset_name='iris',
56+
feat_type=None,
57+
)
58+
backend.save_datamanager(datamanager)
59+
smbo.task = BINARY_CLASSIFICATION
60+
smbo.reset_data_manager()
61+
metalearning_configurations = smbo.get_metalearning_suggestions()
62+
63+
# We should have 25 metalearning configurations
64+
assert len(metalearning_configurations) == 25
65+
assert [isinstance(config, Configuration) for config in metalearning_configurations]

0 commit comments

Comments
 (0)