4343from autosklearn .util .stopwatch import StopWatch
4444from autosklearn .util .logging_ import (
4545 get_logger ,
46- is_port_in_use ,
4746 LogRecordSocketReceiver ,
4847 setup_logger ,
4948)
@@ -247,7 +246,11 @@ def _create_dask_client(self):
247246 # file was deleted, so the client could not close
248247 # the worker properly
249248 local_directory = tempfile .gettempdir (),
250- )
249+ # Memory is handled by the pynisher, not by the dask worker/nanny
250+ memory_limit = 0 ,
251+ ),
252+ # Heartbeat every 10s
253+ heartbeat_interval = 10000 ,
251254 )
252255
253256 def _close_dask_client (self ):
@@ -269,26 +272,35 @@ def _get_logger(self, name):
269272 # Setup the configuration for the logger
270273 # This is gonna be honored by the server
271274 # Which is created below
272- setup_logger (os .path .join (self ._backend .temporary_directory ,
273- '%s.log' % str (logger_name )),
274- self .logging_config ,
275- )
276-
277- # The desired port might be used, so check this
278- while is_port_in_use (self ._logger_port ):
279- self ._logger_port += 1
275+ setup_logger (
276+ output_file = os .path .join (
277+ self ._backend .temporary_directory , '%s.log' % str (logger_name )
278+ ),
279+ logging_config = self .logging_config ,
280+ output_dir = self ._backend .temporary_directory ,
281+ )
280282
281283 # As Auto-sklearn works with distributed process,
282284 # we implement a logger server that can receive tcp
283285 # pickled messages. They are unpickled and processed locally
284286 # under the above logging configuration setting
285287 # We need to specify the logger_name so that received records
286288 # are treated under the logger_name ROOT logger setting
287- self .stop_logging_server = multiprocessing .Event ()
288- self .logger_tcpserver = LogRecordSocketReceiver (logname = logger_name ,
289- port = self ._logger_port ,
290- event = self .stop_logging_server )
291- self .logging_server = multiprocessing .Process (
289+ context = multiprocessing .get_context ('fork' )
290+ self .stop_logging_server = context .Event ()
291+
292+ while True :
293+ # Loop until we find a valid port
294+ self ._logger_port = np .random .randint (10000 , 65535 )
295+ try :
296+ self .logger_tcpserver = LogRecordSocketReceiver (logname = logger_name ,
297+ port = self ._logger_port ,
298+ event = self .stop_logging_server )
299+ break
300+ except OSError :
301+ continue
302+
303+ self .logging_server = context .Process (
292304 target = self .logger_tcpserver .serve_until_stopped )
293305 self .logging_server .daemon = False
294306 self .logging_server .start ()
@@ -354,7 +366,6 @@ def _do_dummy_prediction(self, datamanager, num_run):
354366 autosklearn_seed = self ._seed ,
355367 resampling_strategy = self ._resampling_strategy ,
356368 initial_num_run = num_run ,
357- logger = self ._logger ,
358369 stats = stats ,
359370 metric = self ._metric ,
360371 memory_limit = memory_limit ,
@@ -409,6 +420,9 @@ def fit(
409420 only_return_configuration_space : Optional [bool ] = False ,
410421 load_models : bool = True ,
411422 ):
423+ self ._backend .save_start_time (self ._seed )
424+ self ._stopwatch = StopWatch ()
425+
412426 # Make sure that input is valid
413427 # Performs Ordinal one hot encoding to the target
414428 # both for train and test data
@@ -434,6 +448,12 @@ def fit(
434448 raise ValueError ('Metric must be instance of '
435449 'autosklearn.metrics.Scorer.' )
436450
451+ if dataset_name is None :
452+ dataset_name = hash_array_or_matrix (X )
453+ # By default try to use the TCP logging port or get a new port
454+ self ._logger_port = logging .handlers .DEFAULT_TCP_LOGGING_PORT
455+ self ._logger = self ._get_logger (dataset_name )
456+
437457 # If no dask client was provided, we create one, so that we can
438458 # start a ensemble process in parallel to smbo optimize
439459 if (
@@ -444,18 +464,9 @@ def fit(
444464 else :
445465 self ._is_dask_client_internally_created = False
446466
447- if dataset_name is None :
448- dataset_name = hash_array_or_matrix (X )
449-
450- self ._backend .save_start_time (self ._seed )
451- self ._stopwatch = StopWatch ()
452467 self ._dataset_name = dataset_name
453468 self ._stopwatch .start_task (self ._dataset_name )
454469
455- # By default try to use the TCP logging port or get a new port
456- self ._logger_port = logging .handlers .DEFAULT_TCP_LOGGING_PORT
457- self ._logger = self ._get_logger (dataset_name )
458-
459470 if feat_type is not None and len (feat_type ) != X .shape [1 ]:
460471 raise ValueError ('Array feat_type does not have same number of '
461472 'variables as X has features. %d vs %d.' %
0 commit comments