code: def _validate_canonical(self) -> None:
      super()._validate_canonical()
      if self.trial_gpu_number is None:
          raise ValueError("OpenpaiConfig: trial_gpu_number is not set")
      if not Path(self.local_storage_mount_point).is_dir():
          raise ValueError(
              f'OpenpaiConfig: local_storage_mount_point "(self.local_storage_mount_point)" is not a directory'
          )
      if (
          self.openpai_config is not None
          and self.openpai_config_file is not None
      ):
          raise ValueError(
              "openpai_config and openpai_config_file can only be set one"
          )
      if (
          self.openpai_config_file is not None
          and not Path(self.openpai_config_file).is_file()
      ):
          raise ValueError(
              f'OpenpaiConfig: openpai_config_file "(self.openpai_config_file)" is not a file'
          )
  
file_path: nni/nni/experiment/config/training_services/openpai.py
imports: from dataclasses import dataclass
  from pathlib import Path
  from typing import Dict, Optional, Union
  from typing_extensions import Literal
  from ..training_service import TrainingServiceConfig
  from ..utils import PathLike
label_desc: Use image node_id 2 for calling the OpenpaiConfig obj's underlying member method code with example usage: obj._validate_canonical() without return types