from clearml import Task # Connecting ClearML with the current process, # from here on everything is logged automatically from clearml.automation import HyperParameterOptimizer, UniformParameterRange from clearml.automation.optuna import OptimizerOptuna task = Task.init(project_name='Hyper-Parameter Optimization', task_name='YOLOv5', task_type=Task.TaskTypes.optimizer, reuse_last_task_id=False) # Example use case: optimizer = HyperParameterOptimizer( # This is the experiment we want to optimize base_task_id='', # here we define the hyper-parameters to optimize # Notice: The parameter name should exactly match what you see in the UI: / # For Example, here we see in the base experiment a section Named: "General" # under it a parameter named "batch_size", this becomes "General/batch_size" # If you have `argparse` for example, then arguments will appear under the "Args" section, # and you should instead pass "Args/batch_size" hyper_parameters=[ UniformParameterRange('Hyperparameters/lr0', min_value=1e-5, max_value=1e-1), UniformParameterRange('Hyperparameters/lrf', min_value=0.01, max_value=1.0), UniformParameterRange('Hyperparameters/momentum', min_value=0.6, max_value=0.98), UniformParameterRange('Hyperparameters/weight_decay', min_value=0.0, max_value=0.001), UniformParameterRange('Hyperparameters/warmup_epochs', min_value=0.0, max_value=5.0), UniformParameterRange('Hyperparameters/warmup_momentum', min_value=0.0, max_value=0.95), UniformParameterRange('Hyperparameters/warmup_bias_lr', min_value=0.0, max_value=0.2), UniformParameterRange('Hyperparameters/box', min_value=0.02, max_value=0.2), UniformParameterRange('Hyperparameters/cls', min_value=0.2, max_value=4.0), UniformParameterRange('Hyperparameters/cls_pw', min_value=0.5, max_value=2.0), UniformParameterRange('Hyperparameters/obj', min_value=0.2, max_value=4.0), UniformParameterRange('Hyperparameters/obj_pw', min_value=0.5, max_value=2.0), UniformParameterRange('Hyperparameters/iou_t', min_value=0.1, max_value=0.7), UniformParameterRange('Hyperparameters/anchor_t', min_value=2.0, max_value=8.0), UniformParameterRange('Hyperparameters/fl_gamma', min_value=0.0, max_value=4.0), UniformParameterRange('Hyperparameters/hsv_h', min_value=0.0, max_value=0.1), UniformParameterRange('Hyperparameters/hsv_s', min_value=0.0, max_value=0.9), UniformParameterRange('Hyperparameters/hsv_v', min_value=0.0, max_value=0.9), UniformParameterRange('Hyperparameters/degrees', min_value=0.0, max_value=45.0), UniformParameterRange('Hyperparameters/translate', min_value=0.0, max_value=0.9), UniformParameterRange('Hyperparameters/scale', min_value=0.0, max_value=0.9), UniformParameterRange('Hyperparameters/shear', min_value=0.0, max_value=10.0), UniformParameterRange('Hyperparameters/perspective', min_value=0.0, max_value=0.001), UniformParameterRange('Hyperparameters/flipud', min_value=0.0, max_value=1.0), UniformParameterRange('Hyperparameters/fliplr', min_value=0.0, max_value=1.0), UniformParameterRange('Hyperparameters/mosaic', min_value=0.0, max_value=1.0), UniformParameterRange('Hyperparameters/mixup', min_value=0.0, max_value=1.0), UniformParameterRange('Hyperparameters/copy_paste', min_value=0.0, max_value=1.0)], # this is the objective metric we want to maximize/minimize objective_metric_title='metrics', objective_metric_series='mAP_0.5', # now we decide if we want to maximize it or minimize it (accuracy we maximize) objective_metric_sign='max', # let us limit the number of concurrent experiments, # this in turn will make sure we do dont bombard the scheduler with experiments. # if we have an auto-scaler connected, this, by proxy, will limit the number of machine max_number_of_concurrent_tasks=1, # this is the optimizer class (actually doing the optimization) # Currently, we can choose from GridSearch, RandomSearch or OptimizerBOHB (Bayesian optimization Hyper-Band) optimizer_class=OptimizerOptuna, # If specified only the top K performing Tasks will be kept, the others will be automatically archived save_top_k_tasks_only=5, # 5, compute_time_limit=None, total_max_jobs=20, min_iteration_per_job=None, max_iteration_per_job=None, ) # report every 10 seconds, this is way too often, but we are testing here optimizer.set_report_period(10 / 60) # You can also use the line below instead to run all the optimizer tasks locally, without using queues or agent # an_optimizer.start_locally(job_complete_callback=job_complete_callback) # set the time limit for the optimization process (2 hours) optimizer.set_time_limit(in_minutes=120.0) # Start the optimization process in the local environment optimizer.start_locally() # wait until process is done (notice we are controlling the optimization process in the background) optimizer.wait() # make sure background optimization stopped optimizer.stop() print('We are done, good bye')