nnictl.py 14.5 KB
Newer Older
Deshui Yu's avatar
Deshui Yu committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Copyright (c) Microsoft Corporation
# All rights reserved.
#
# MIT License
#
# Permission is hereby granted, free of charge,
# to any person obtaining a copy of this software and associated
# documentation files (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and
# to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


import argparse
Shinai Yang's avatar
Shinai Yang committed
23
import os
Gems Guo's avatar
Gems Guo committed
24
import pkg_resources
Shinai Yang's avatar
Shinai Yang committed
25
26
from colorama import init
from .common_utils import print_error
SparkSnail's avatar
SparkSnail committed
27
from .launcher import create_experiment, resume_experiment, view_experiment
28
from .updater import update_searchspace, update_concurrency, update_duration, update_trialnum, import_data
Shinai Yang's avatar
Shinai Yang committed
29
30
31
32
33
34
from .nnictl_utils import stop_experiment, trial_ls, trial_kill, list_experiment, experiment_status,\
                          log_trial, experiment_clean, platform_clean, experiment_list, \
                          monitor_experiment, export_trials_data, trial_codegen, webui_url, get_config, log_stdout, log_stderr
from .package_management import package_install, package_show
from .constants import DEFAULT_REST_PORT
from .tensorboard_utils import start_tensorboard, stop_tensorboard
35
init(autoreset=True)
Deshui Yu's avatar
Deshui Yu committed
36

chicm-ms's avatar
chicm-ms committed
37
38
39
40
if os.environ.get('COVERAGE_PROCESS_START'):
    import coverage
    coverage.process_startup()

Gems Guo's avatar
Gems Guo committed
41
42
def nni_info(*args):
    if args[0].version:
43
44
        try:
            print(pkg_resources.get_distribution('nni').version)
Shinai Yang's avatar
Shinai Yang committed
45
        except pkg_resources.ResolutionError:
46
            print_error('Get version failed, please use `pip3 list | grep nni` to check nni version!')
Gems Guo's avatar
Gems Guo committed
47
48
    else:
        print('please run "nnictl {positional argument} --help" to see nnictl guidance')
Deshui Yu's avatar
Deshui Yu committed
49
50
51

def parse_args():
    '''Definite the arguments users need to follow and input'''
52
    parser = argparse.ArgumentParser(prog='nnictl', description='use nnictl command to control nni experiments')
Gems Guo's avatar
Gems Guo committed
53
54
    parser.add_argument('--version', '-v', action='store_true')
    parser.set_defaults(func=nni_info)
Deshui Yu's avatar
Deshui Yu committed
55
56
57
58
59
60
61

    # create subparsers for args with sub values
    subparsers = parser.add_subparsers()

    # parse start command
    parser_start = subparsers.add_parser('create', help='create a new experiment')
    parser_start.add_argument('--config', '-c', required=True, dest='config', help='the path of yaml config file')
goooxu's avatar
goooxu committed
62
    parser_start.add_argument('--port', '-p', default=DEFAULT_REST_PORT, dest='port', help='the port of restful server')
63
    parser_start.add_argument('--debug', '-d', action='store_true', help=' set debug mode')
Deshui Yu's avatar
Deshui Yu committed
64
65
66
67
    parser_start.set_defaults(func=create_experiment)

    # parse resume command
    parser_resume = subparsers.add_parser('resume', help='resume a new experiment')
68
    parser_resume.add_argument('id', nargs='?', help='The id of the experiment you want to resume')
goooxu's avatar
goooxu committed
69
    parser_resume.add_argument('--port', '-p', default=DEFAULT_REST_PORT, dest='port', help='the port of restful server')
70
    parser_resume.add_argument('--debug', '-d', action='store_true', help=' set debug mode')
Deshui Yu's avatar
Deshui Yu committed
71
72
    parser_resume.set_defaults(func=resume_experiment)

SparkSnail's avatar
SparkSnail committed
73
74
75
76
77
78
    # parse view command
    parser_resume = subparsers.add_parser('view', help='view a stopped experiment')
    parser_resume.add_argument('id', nargs='?', help='The id of the experiment you want to view')
    parser_resume.add_argument('--port', '-p', default=DEFAULT_REST_PORT, dest='port', help='the port of restful server')
    parser_resume.set_defaults(func=view_experiment)

Deshui Yu's avatar
Deshui Yu committed
79
80
81
82
83
    # parse update command
    parser_updater = subparsers.add_parser('update', help='update the experiment')
    #add subparsers for parser_updater
    parser_updater_subparsers = parser_updater.add_subparsers()
    parser_updater_searchspace = parser_updater_subparsers.add_parser('searchspace', help='update searchspace')
84
    parser_updater_searchspace.add_argument('id', nargs='?', help='the id of experiment')
Deshui Yu's avatar
Deshui Yu committed
85
86
    parser_updater_searchspace.add_argument('--filename', '-f', required=True)
    parser_updater_searchspace.set_defaults(func=update_searchspace)
goooxu's avatar
goooxu committed
87
    parser_updater_concurrency = parser_updater_subparsers.add_parser('concurrency', help='update concurrency')
88
    parser_updater_concurrency.add_argument('id', nargs='?', help='the id of experiment')
goooxu's avatar
goooxu committed
89
90
91
    parser_updater_concurrency.add_argument('--value', '-v', required=True)
    parser_updater_concurrency.set_defaults(func=update_concurrency)
    parser_updater_duration = parser_updater_subparsers.add_parser('duration', help='update duration')
92
    parser_updater_duration.add_argument('id', nargs='?', help='the id of experiment')
93
    parser_updater_duration.add_argument('--value', '-v', required=True, help='the unit of time should in {\'s\', \'m\', \'h\', \'d\'}')
goooxu's avatar
goooxu committed
94
    parser_updater_duration.set_defaults(func=update_duration)
95
    parser_updater_trialnum = parser_updater_subparsers.add_parser('trialnum', help='update maxtrialnum')
SparkSnail's avatar
SparkSnail committed
96
    parser_updater_trialnum.add_argument('id', nargs='?', help='the id of experiment')
97
98
    parser_updater_trialnum.add_argument('--value', '-v', required=True)
    parser_updater_trialnum.set_defaults(func=update_trialnum)
Deshui Yu's avatar
Deshui Yu committed
99
100
101

    #parse stop command
    parser_stop = subparsers.add_parser('stop', help='stop the experiment')
102
    parser_stop.add_argument('id', nargs='?', help='the id of experiment, use \'all\' to stop all running experiments')
103
    parser_stop.add_argument('--port', '-p', dest='port', help='the port of restful server')
104
    parser_stop.add_argument('--all', '-a', action='store_true', help='stop all of experiments')
Deshui Yu's avatar
Deshui Yu committed
105
106
107
108
109
110
111
    parser_stop.set_defaults(func=stop_experiment)

    #parse trial command
    parser_trial = subparsers.add_parser('trial', help='get trial information')
    #add subparsers for parser_trial
    parser_trial_subparsers = parser_trial.add_subparsers()
    parser_trial_ls = parser_trial_subparsers.add_parser('ls', help='list trial jobs')
112
    parser_trial_ls.add_argument('id', nargs='?', help='the id of experiment')
Deshui Yu's avatar
Deshui Yu committed
113
114
    parser_trial_ls.set_defaults(func=trial_ls)
    parser_trial_kill = parser_trial_subparsers.add_parser('kill', help='kill trial jobs')
115
116
    parser_trial_kill.add_argument('id', nargs='?', help='the id of experiment')
    parser_trial_kill.add_argument('--trial_id', '-T', required=True, dest='trial_id', help='the id of trial to be killed')
Deshui Yu's avatar
Deshui Yu committed
117
    parser_trial_kill.set_defaults(func=trial_kill)
118
119
120
121
    parser_trial_codegen = parser_trial_subparsers.add_parser('codegen', help='generate trial code for a specific trial')
    parser_trial_codegen.add_argument('id', nargs='?', help='the id of experiment')
    parser_trial_codegen.add_argument('--trial_id', '-T', required=True, dest='trial_id', help='the id of trial to do code generation')
    parser_trial_codegen.set_defaults(func=trial_codegen)
Deshui Yu's avatar
Deshui Yu committed
122
123
124
125
126

    #parse experiment command
    parser_experiment = subparsers.add_parser('experiment', help='get experiment information')
    #add subparsers for parser_experiment
    parser_experiment_subparsers = parser_experiment.add_subparsers()
127
    parser_experiment_show = parser_experiment_subparsers.add_parser('show', help='show the information of experiment')
128
    parser_experiment_show.add_argument('id', nargs='?', help='the id of experiment')
129
    parser_experiment_show.set_defaults(func=list_experiment)
130
    parser_experiment_status = parser_experiment_subparsers.add_parser('status', help='show the status of experiment')
131
    parser_experiment_status.add_argument('id', nargs='?', help='the id of experiment')
132
    parser_experiment_status.set_defaults(func=experiment_status)
133
    parser_experiment_list = parser_experiment_subparsers.add_parser('list', help='list all of running experiment ids')
SparkSnail's avatar
SparkSnail committed
134
    parser_experiment_list.add_argument('--all', action='store_true', default=False, help='list all of experiments')
135
    parser_experiment_list.set_defaults(func=experiment_list)
SparkSnail's avatar
SparkSnail committed
136
137
138
139
140
141
142
143
144
145
146
147
148
    parser_experiment_clean = parser_experiment_subparsers.add_parser('delete', help='clean up the experiment data')
    parser_experiment_clean.add_argument('id', nargs='?', help='the id of experiment')
    parser_experiment_clean.add_argument('--all', action='store_true', default=False, help='delete all of experiments')
    parser_experiment_clean.set_defaults(func=experiment_clean)

    #parse experiment command
    parser_platform = subparsers.add_parser('platform', help='get platform information')
    #add subparsers for parser_experiment
    parser_platform_subparsers = parser_platform.add_subparsers()
    parser_platform_clean = parser_platform_subparsers.add_parser('clean', help='clean up the platform data')
    parser_platform_clean.add_argument('--config', '-c', required=True, dest='config', help='the path of yaml config file')
    parser_platform_clean.set_defaults(func=platform_clean)

149
150
151
152
153
154
155
156
157
158
159
    #import tuning data
    parser_import_data = parser_experiment_subparsers.add_parser('import', help='import additional data')
    parser_import_data.add_argument('id', nargs='?', help='the id of experiment')
    parser_import_data.add_argument('--filename', '-f', required=True)
    parser_import_data.set_defaults(func=import_data)
    #export trial data
    parser_trial_export = parser_experiment_subparsers.add_parser('export', help='export trial job results to csv or json')
    parser_trial_export.add_argument('id', nargs='?', help='the id of experiment')
    parser_trial_export.add_argument('--type', '-t', choices=['json', 'csv'], required=True, dest='type', help='target file type')
    parser_trial_export.add_argument('--filename', '-f', required=True, dest='path', help='target file path')
    parser_trial_export.set_defaults(func=export_trials_data)
160
161
162
163
164
165
166

    #TODO:finish webui function
    #parse board command
    parser_webui = subparsers.add_parser('webui', help='get web ui information')
    #add subparsers for parser_board
    parser_webui_subparsers = parser_webui.add_subparsers()
    parser_webui_url = parser_webui_subparsers.add_parser('url', help='show the url of web ui')
167
    parser_webui_url.add_argument('id', nargs='?', help='the id of experiment')
168
    parser_webui_url.set_defaults(func=webui_url)
Deshui Yu's avatar
Deshui Yu committed
169
170
171
172

    #parse config command
    parser_config = subparsers.add_parser('config', help='get config information')
    parser_config_subparsers = parser_config.add_subparsers()
173
    parser_config_show = parser_config_subparsers.add_parser('show', help='show the information of config')
174
    parser_config_show.add_argument('id', nargs='?', help='the id of experiment')
175
    parser_config_show.set_defaults(func=get_config)
Deshui Yu's avatar
Deshui Yu committed
176
177
178

    #parse log command
    parser_log = subparsers.add_parser('log', help='get log information')
QuanluZhang's avatar
QuanluZhang committed
179
    # add subparsers for parser_log
Deshui Yu's avatar
Deshui Yu committed
180
181
    parser_log_subparsers = parser_log.add_subparsers()
    parser_log_stdout = parser_log_subparsers.add_parser('stdout', help='get stdout information')
182
    parser_log_stdout.add_argument('id', nargs='?', help='the id of experiment')
Deshui Yu's avatar
Deshui Yu committed
183
184
    parser_log_stdout.add_argument('--tail', '-T', dest='tail', type=int, help='get tail -100 content of stdout')
    parser_log_stdout.add_argument('--head', '-H', dest='head', type=int, help='get head -100 content of stdout')
goooxu's avatar
goooxu committed
185
    parser_log_stdout.add_argument('--path', action='store_true', default=False, help='get the path of stdout file')
Deshui Yu's avatar
Deshui Yu committed
186
187
    parser_log_stdout.set_defaults(func=log_stdout)
    parser_log_stderr = parser_log_subparsers.add_parser('stderr', help='get stderr information')
188
    parser_log_stderr.add_argument('id', nargs='?', help='the id of experiment')
Deshui Yu's avatar
Deshui Yu committed
189
190
    parser_log_stderr.add_argument('--tail', '-T', dest='tail', type=int, help='get tail -100 content of stderr')
    parser_log_stderr.add_argument('--head', '-H', dest='head', type=int, help='get head -100 content of stderr')
goooxu's avatar
goooxu committed
191
    parser_log_stderr.add_argument('--path', action='store_true', default=False, help='get the path of stderr file')
Deshui Yu's avatar
Deshui Yu committed
192
    parser_log_stderr.set_defaults(func=log_stderr)
193
    parser_log_trial = parser_log_subparsers.add_parser('trial', help='get trial log path')
194
195
    parser_log_trial.add_argument('id', nargs='?', help='the id of experiment')
    parser_log_trial.add_argument('--trial_id', '-T', dest='trial_id', help='find trial log path by id')
196
197
    parser_log_trial.set_defaults(func=log_trial)

QuanluZhang's avatar
QuanluZhang committed
198
199
200
201
202
203
    #parse package command
    parser_package = subparsers.add_parser('package', help='control nni tuner and assessor packages')
    # add subparsers for parser_package
    parser_package_subparsers = parser_package.add_subparsers()
    parser_package_install = parser_package_subparsers.add_parser('install', help='install packages')
    parser_package_install.add_argument('--name', '-n', dest='name', help='package name to be installed')
204
    parser_package_install.set_defaults(func=package_install)
QuanluZhang's avatar
QuanluZhang committed
205
206
207
    parser_package_show = parser_package_subparsers.add_parser('show', help='show the information of packages')
    parser_package_show.set_defaults(func=package_show)

SparkSnail's avatar
SparkSnail committed
208
209
210
211
212
    #parse tensorboard command
    parser_tensorboard = subparsers.add_parser('tensorboard', help='manage tensorboard')
    parser_tensorboard_subparsers = parser_tensorboard.add_subparsers()
    parser_tensorboard_start = parser_tensorboard_subparsers.add_parser('start', help='start tensorboard')
    parser_tensorboard_start.add_argument('id', nargs='?', help='the id of experiment')
213
    parser_tensorboard_start.add_argument('--trial_id', '-T', dest='trial_id', help='the id of trial')
SparkSnail's avatar
SparkSnail committed
214
215
    parser_tensorboard_start.add_argument('--port', dest='port', default=6006, help='the port to start tensorboard')
    parser_tensorboard_start.set_defaults(func=start_tensorboard)
216
217
218
    parser_tensorboard_stop = parser_tensorboard_subparsers.add_parser('stop', help='stop tensorboard')
    parser_tensorboard_stop.add_argument('id', nargs='?', help='the id of experiment')
    parser_tensorboard_stop.set_defaults(func=stop_tensorboard)
SparkSnail's avatar
SparkSnail committed
219

SparkSnail's avatar
SparkSnail committed
220
221
222
223
224
225
    #parse top command
    parser_top = subparsers.add_parser('top', help='monitor the experiment')
    parser_top.add_argument('--time', '-t', dest='time', type=int, default=3, help='the time interval to update the experiment status, ' \
    'the unit is second')
    parser_top.set_defaults(func=monitor_experiment)

Deshui Yu's avatar
Deshui Yu committed
226
227
228
229
230
    args = parser.parse_args()
    args.func(args)

if __name__ == '__main__':
    parse_args()