code: def executing_pipeline(pickle_url, mock_parameter="mock"):
      print("pipeline args:", pickle_url, mock_parameter)
  
      # Use the pipeline argument to start the pipeline and pass it ot the first step
      print("launch step one")
      data_frame = step_one(pickle_url)
  
      # Use the returned data from the first step (`step_one`), and pass it to the next step (`step_two`)
      # Notice! unless we actually access the `data_frame` object,
      # the pipeline logic does not actually load the artifact itself.
      # When actually passing the `data_frame` object into a new step,
      # It waits for the creating step/function (`step_one`) to complete the execution
      print("launch step two")
      X_train, X_test, y_train, y_test = step_two(data_frame)
  
      print("launch step three")
      model = step_three(X_train, y_train)
  
      # Notice since we are "printing" the `model` object,
      # we actually deserialize the object from the third step, and thus wait for the third step to complete.
      print("returned model: {}".format(model))
  
      print("launch step four")
      accuracy = 100 * step_four(model, X_data=X_test, Y_data=y_test)
  
      # Notice since we are "printing" the `accuracy` object,
      # we actually deserialize the object from the fourth step, and thus wait for the fourth step to complete.
      print(f"Accuracy={accuracy}%")
  
imports: from clearml.automation.controller import PipelineDecorator
  from clearml import TaskTypes
label_desc: Use image node_id 5 for calling a global function with example usage: executing_pipeline(pickle_url, mock_parameter) without return types