docstr: :param U: mini unit computation for each modle
  :param candidates_m:
  :return:
docstr_tok: [":","param","U",":","mini","unit","computation","for","each","modle",":","param","candidates_m",":",":","return",":"]
code: def run_phase2(self, U: int, candidates_m: list):
      """
      :param U: mini unit computation for each modle
      :param candidates_m:
      :return:
      """
  
      # print(f" *********** begin uniformly_allocate with U={U}, K={len(candidates_m)} ***********")
  
      candidates = copy(candidates_m)
      min_budget_required = 0
  
      if U >= self.max_unit_per_model:
          U = self.max_unit_per_model
  
      # print(f"[uniformly_allocate]: uniformly allocate {U} epoch to each model")
  
      total_score = []
      for cand in candidates:
          score = self._evaluator.p2_evaluate(cand, U)
          total_score.append((cand, score))
          min_budget_required += U
      # sort from min to max
      scored_cand = sorted(total_score, key=lambda x: x[1])
      candidate = scored_cand[-1][0]
      return candidate, None, min_budget_required
  
file_path: singa/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py
imports: from copy import copy
  from random import randint
  from src.common.constant import Config
label_desc: Use image node_id 4 for calling the UniformAllocation obj's underlying member method code with example usage: obj.run_phase2(U, candidates_m) and returns: candidate,  None,  min_budget_required