docstr: Start the Optimizer controller function loop()
  If the calling process is stopped, the controller will stop as well.
  
  .. important::
      This function returns only after optimization is completed or :meth:`stop` was called.
docstr_tok: ["Start","the","Optimizer","controller","function","loop","(",")","If","the","calling","process","is","stopped",",","the","controller","will","stop","as","well",".","..","important",":",":","This","function","returns","only","after","optimization","is","completed","or",":","meth",":","`","stop","`","was","called","."]
code: def start(self):
      # type: () -> ()
      """
      Start the Optimizer controller function loop()
      If the calling process is stopped, the controller will stop as well.
  
      .. important::
          This function returns only after optimization is completed or :meth:`stop` was called.
  
      """
      if self._objective_metric.len != 1:
          self._study = optuna.create_study(
              directions=[
                  "minimize" if sign_ < 0 else "maximize"
                  for sign_ in self._objective_metric.get_objective_sign()
              ],
              load_if_exists=False,
              sampler=self._optuna_sampler,
              pruner=self._optuna_pruner,
              study_name=self._optimizer_task.id
              if self._optimizer_task
              else None,
          )
      else:
          self._study = optuna.create_study(
              direction="minimize"
              if self._objective_metric.get_objective_sign()[0] < 0
              else "maximize",
              load_if_exists=False,
              sampler=self._optuna_sampler,
              pruner=self._optuna_pruner,
              study_name=self._optimizer_task.id
              if self._optimizer_task
              else None,
          )
      config_space = self._convert_hyper_parameters_to_optuna()
      self._objective = OptunaObjective(
          base_task_id=self._base_task_id,
          queue_name=self._execution_queue,
          optimizer=self,
          max_iteration_per_job=self.max_iteration_per_job,
          min_iteration_per_job=self.min_iteration_per_job,
          sleep_interval=int(self.pool_period_minutes * 60),
          config_space=config_space,
      )
      self._study.optimize(
          self._objective.objective,
          n_trials=self.total_max_jobs,
          n_jobs=self._num_concurrent_workers,
      )
  
file_path: clearml/clearml/automation/optuna/optuna.py
imports: from time import sleep
  from typing import Any, Optional, Sequence
  from ..optimization import Objective, SearchStrategy
  from ..parameters import DiscreteParameterRange, Parameter, UniformIntegerParameterRange, UniformParameterRange, LogUniformParameterRange
  from ...task import Task
label_desc: Use image node_id 2 for calling the OptimizerOptuna obj's underlying member method code with example usage: obj.start() without return types