Unverified Commit eb65bc32 authored by liuzhe-lz's avatar liuzhe-lz Committed by GitHub
Browse files

Port trial examples' config file to v2 (#3721)


Co-authored-by: default avatarliuzhe <zhe.liu@microsoft.com>
parent c4d449c5
...@@ -29,6 +29,8 @@ class _AlgorithmConfig(ConfigBase): ...@@ -29,6 +29,8 @@ class _AlgorithmConfig(ConfigBase):
super().validate() super().validate()
_validate_algo(self) _validate_algo(self)
_canonical_rules = {'code_directory': util.canonical_path}
@dataclass(init=False) @dataclass(init=False)
class AlgorithmConfig(_AlgorithmConfig): class AlgorithmConfig(_AlgorithmConfig):
name: str name: str
...@@ -37,7 +39,7 @@ class AlgorithmConfig(_AlgorithmConfig): ...@@ -37,7 +39,7 @@ class AlgorithmConfig(_AlgorithmConfig):
@dataclass(init=False) @dataclass(init=False)
class CustomAlgorithmConfig(_AlgorithmConfig): class CustomAlgorithmConfig(_AlgorithmConfig):
class_name: str class_name: str
class_directory: Optional[PathLike] = '.' code_directory: Optional[PathLike] = '.'
class_args: Optional[Dict[str, Any]] = None class_args: Optional[Dict[str, Any]] = None
...@@ -67,7 +69,7 @@ class ExperimentConfig(ConfigBase): ...@@ -67,7 +69,7 @@ class ExperimentConfig(ConfigBase):
debug: bool = False debug: bool = False
log_level: Optional[str] = None log_level: Optional[str] = None
experiment_working_directory: PathLike = '~/nni-experiments' experiment_working_directory: PathLike = '~/nni-experiments'
tuner_gpu_indices: Optional[Union[List[int], str]] = None tuner_gpu_indices: Union[List[int], str, int, None] = None
tuner: Optional[_AlgorithmConfig] = None tuner: Optional[_AlgorithmConfig] = None
assessor: Optional[_AlgorithmConfig] = None assessor: Optional[_AlgorithmConfig] = None
advisor: Optional[_AlgorithmConfig] = None advisor: Optional[_AlgorithmConfig] = None
...@@ -137,7 +139,7 @@ _canonical_rules = { ...@@ -137,7 +139,7 @@ _canonical_rules = {
'trial_code_directory': util.canonical_path, 'trial_code_directory': util.canonical_path,
'max_experiment_duration': lambda value: f'{util.parse_time(value)}s' if value is not None else None, 'max_experiment_duration': lambda value: f'{util.parse_time(value)}s' if value is not None else None,
'experiment_working_directory': util.canonical_path, 'experiment_working_directory': util.canonical_path,
'tuner_gpu_indices': lambda value: [int(idx) for idx in value.split(',')] if isinstance(value, str) else value, 'tuner_gpu_indices': util.canonical_gpu_indices,
'tuner': lambda config: None if config is None or config.name == '_none_' else config.canonical(), 'tuner': lambda config: None if config is None or config.name == '_none_' else config.canonical(),
'assessor': lambda config: None if config is None or config.name == '_none_' else config.canonical(), 'assessor': lambda config: None if config is None or config.name == '_none_' else config.canonical(),
'advisor': lambda config: None if config is None or config.name == '_none_' else config.canonical(), 'advisor': lambda config: None if config is None or config.name == '_none_' else config.canonical(),
......
...@@ -249,13 +249,13 @@ def convert_algo(algo_type, v1, v2): ...@@ -249,13 +249,13 @@ def convert_algo(algo_type, v1, v2):
v2_algo = AlgorithmConfig(name=builtin_name, class_args=class_args) v2_algo = AlgorithmConfig(name=builtin_name, class_args=class_args)
else: else:
class_directory = util.canonical_path(v1_algo.pop('codeDir')) code_directory = util.canonical_path(v1_algo.pop('codeDir'))
class_file_name = v1_algo.pop('classFileName') class_file_name = v1_algo.pop('classFileName')
assert class_file_name.endswith('.py') assert class_file_name.endswith('.py')
class_name = class_file_name[:-3] + '.' + v1_algo.pop('className') class_name = class_file_name[:-3] + '.' + v1_algo.pop('className')
v2_algo = CustomAlgorithmConfig( v2_algo = CustomAlgorithmConfig(
class_name=class_name, class_name=class_name,
class_directory=class_directory, code_directory=code_directory,
class_args=class_args class_args=class_args
) )
......
...@@ -5,6 +5,7 @@ from dataclasses import dataclass ...@@ -5,6 +5,7 @@ from dataclasses import dataclass
from typing import List, Optional, Union from typing import List, Optional, Union
from .common import TrainingServiceConfig from .common import TrainingServiceConfig
from . import util
__all__ = ['LocalConfig'] __all__ = ['LocalConfig']
...@@ -13,10 +14,10 @@ class LocalConfig(TrainingServiceConfig): ...@@ -13,10 +14,10 @@ class LocalConfig(TrainingServiceConfig):
platform: str = 'local' platform: str = 'local'
use_active_gpu: Optional[bool] = None use_active_gpu: Optional[bool] = None
max_trial_number_per_gpu: int = 1 max_trial_number_per_gpu: int = 1
gpu_indices: Optional[Union[List[int], str]] = None gpu_indices: Union[List[int], str, int, None] = None
_canonical_rules = { _canonical_rules = {
'gpu_indices': lambda value: [int(idx) for idx in value.split(',')] if isinstance(value, str) else value 'gpu_indices': util.canonical_gpu_indices
} }
_validation_rules = { _validation_rules = {
......
...@@ -22,12 +22,12 @@ class RemoteMachineConfig(ConfigBase): ...@@ -22,12 +22,12 @@ class RemoteMachineConfig(ConfigBase):
ssh_passphrase: Optional[str] = None ssh_passphrase: Optional[str] = None
use_active_gpu: bool = False use_active_gpu: bool = False
max_trial_number_per_gpu: int = 1 max_trial_number_per_gpu: int = 1
gpu_indices: Optional[Union[List[int], str]] = None gpu_indices: Union[List[int], str, int, None] = None
python_path: Optional[str] = None python_path: Optional[str] = None
_canonical_rules = { _canonical_rules = {
'ssh_key_file': util.canonical_path, 'ssh_key_file': util.canonical_path,
'gpu_indices': lambda value: [int(idx) for idx in value.split(',')] if isinstance(value, str) else value, 'gpu_indices': util.canonical_gpu_indices
} }
_validation_rules = { _validation_rules = {
......
...@@ -92,3 +92,10 @@ def _parse_unit(string, target_unit, all_units): ...@@ -92,3 +92,10 @@ def _parse_unit(string, target_unit, all_units):
value = float(number) * factor value = float(number) * factor
return math.ceil(value / all_units[target_unit]) return math.ceil(value / all_units[target_unit])
raise ValueError(f'Unsupported unit in "{string}"') raise ValueError(f'Unsupported unit in "{string}"')
def canonical_gpu_indices(indices: Union[List[int], str, int, None]) -> Optional[List[int]]:
if isinstance(indices, str):
return [int(idx) for idx in indices.split(',')]
if isinstance(indices, int):
return [indices]
return indices
...@@ -403,9 +403,13 @@ def launch_experiment(args, experiment_config, mode, experiment_id, config_versi ...@@ -403,9 +403,13 @@ def launch_experiment(args, experiment_config, mode, experiment_id, config_versi
if not os.path.isdir(path): if not os.path.isdir(path):
os.makedirs(path) os.makedirs(path)
path = tempfile.mkdtemp(dir=path) path = tempfile.mkdtemp(dir=path)
nas_mode = experiment_config['trial'].get('nasMode', 'classic_mode') if config_version == 1:
code_dir = expand_annotations(experiment_config['trial']['codeDir'], path, nas_mode=nas_mode) nas_mode = experiment_config['trial'].get('nasMode', 'classic_mode')
experiment_config['trial']['codeDir'] = code_dir code_dir = expand_annotations(experiment_config['trial']['codeDir'], path, nas_mode=nas_mode)
experiment_config['trial']['codeDir'] = code_dir
else:
code_dir = expand_annotations(experiment_config['trialCodeDirectory'], path)
experiment_config['trialCodeDirectory'] = code_dir
search_space = generate_search_space(code_dir) search_space = generate_search_space(code_dir)
experiment_config['searchSpace'] = search_space experiment_config['searchSpace'] = search_space
assert search_space, ERROR_INFO % 'Generated search space is empty' assert search_space, ERROR_INFO % 'Generated search space is empty'
......
...@@ -187,7 +187,7 @@ def create_customized_class_instance(class_params): ...@@ -187,7 +187,7 @@ def create_customized_class_instance(class_params):
Returns customized class instance. Returns customized class instance.
""" """
code_dir = class_params.get('classDirectory') code_dir = class_params.get('codeDirectory')
qualified_class_name = class_params.get('className') qualified_class_name = class_params.get('className')
class_args = class_params.get('classArgs') class_args = class_params.get('classArgs')
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment