From 3d1e4e9e2b0c3190e80adf6bd36f921aaa1783ff Mon Sep 17 00:00:00 2001 From: "Shinai Yang (FA TALENT)" Date: Fri, 14 Sep 2018 16:40:27 +0800 Subject: [PATCH 1/4] fix nnictl bug --- tools/nnicmd/nnictl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/nnicmd/nnictl.py b/tools/nnicmd/nnictl.py index 73b2950a55..9dd9f8dfa9 100644 --- a/tools/nnicmd/nnictl.py +++ b/tools/nnicmd/nnictl.py @@ -29,7 +29,7 @@ def nni_help_info(*args): def parse_args(): '''Definite the arguments users need to follow and input''' - parser = argparse.ArgumentParser(prog='nni ctl', description='use nni control') + parser = argparse.ArgumentParser(prog='nnictl', description='use nnictl command to control nni experiments') parser.set_defaults(func=nni_help_info) # create subparsers for args with sub values From 65f48cb37248cede0732200cbed02b0c68d7a80d Mon Sep 17 00:00:00 2001 From: "Shinai Yang (FA TALENT)" Date: Tue, 18 Sep 2018 20:58:16 +0800 Subject: [PATCH 2/4] support package install --- tools/nnicmd/constants.py | 5 +++ tools/nnicmd/nnictl.py | 17 +++++++++- tools/nnicmd/package_management.py | 51 ++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tools/nnicmd/package_management.py diff --git a/tools/nnicmd/constants.py b/tools/nnicmd/constants.py index 5f57da15f5..e626c87721 100644 --- a/tools/nnicmd/constants.py +++ b/tools/nnicmd/constants.py @@ -49,3 +49,8 @@ '4. nnictl trial kill kill a trial job by id\n' \ '5. nnictl --help get help information about nnictl\n' \ '6. nnictl webui url get the url of web ui' + +PACKAGE_REQUIREMENTS = { + 'SMAC': {'install':['git+https://github.com/QuanluZhang/ConfigSpace.git','git+https://github.com/QuanluZhang/SMAC3.git'], + 'uninstall':['ConfigSpace', 'smac']} +} \ No newline at end of file diff --git a/tools/nnicmd/nnictl.py b/tools/nnicmd/nnictl.py index 9dd9f8dfa9..9a55012800 100644 --- a/tools/nnicmd/nnictl.py +++ b/tools/nnicmd/nnictl.py @@ -23,6 +23,7 @@ from .launcher import create_experiment, resume_experiment from .updater import update_searchspace, update_concurrency, update_duration from .nnictl_utils import * +from .package_management import * def nni_help_info(*args): print('please run "nnictl --help" to see nnictl guidance') @@ -104,7 +105,7 @@ def parse_args(): #parse log command parser_log = subparsers.add_parser('log', help='get log information') - # add subparsers for parser_rest + # add subparsers for parser_log parser_log_subparsers = parser_log.add_subparsers() parser_log_stdout = parser_log_subparsers.add_parser('stdout', help='get stdout information') parser_log_stdout.add_argument('--tail', '-T', dest='tail', type=int, help='get tail -100 content of stdout') @@ -117,6 +118,20 @@ def parse_args(): parser_log_stderr.add_argument('--path', '-p', action='store_true', default=False, help='get the path of stderr file') parser_log_stderr.set_defaults(func=log_stderr) + #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', choices=['SMAC'], help='package name to be installed') + parser_package_install.set_defaults(func=package_install) + parser_package_uninstall = parser_package_subparsers.add_parser('uninstall', help='uninstall packages') + parser_package_uninstall.add_argument('--name', '-n', dest='name', choices=['SMAC'], help='package name to be uninstalled') + parser_package_uninstall.set_defaults(func=package_uninstall) + parser_package_show = parser_package_subparsers.add_parser('show', help='show the information of packages') + parser_package_show.set_defaults(func=package_show) + + args = parser.parse_args() args.func(args) diff --git a/tools/nnicmd/package_management.py b/tools/nnicmd/package_management.py new file mode 100644 index 0000000000..74a9e269b5 --- /dev/null +++ b/tools/nnicmd/package_management.py @@ -0,0 +1,51 @@ +# 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 nni +import os +from subprocess import call +from .constants import PACKAGE_REQUIREMENTS +from .common_utils import print_normal + +def manage_smac(mode): + if mode == 'install': + for package in PACKAGE_REQUIREMENTS.get('SMAC').get('install'): + print_normal('installing ' + package) + cmds = ['pip3', 'install', '--user', package] + call(cmds) + else: + for package in PACKAGE_REQUIREMENTS.get('SMAC').get('uninstall'): + print_normal('uninstalling ' + package) + cmds = ['pip3', 'uninstall', '-y', package] + call(cmds) + +def package_install(args): + '''install packages''' + if args.name == 'SMAC': + manage_smac('install') + +def package_uninstall(args): + '''uninstall packages''' + if args.name == 'SMAC': + manage_smac('uninstall') + +def package_show(args): + '''show all packages''' + print(' '.join(PACKAGE_REQUIREMENTS.keys())) \ No newline at end of file From a0ceca4fbeb5a385224b3cbbd91f34ebc16d7d12 Mon Sep 17 00:00:00 2001 From: "Shinai Yang (FA TALENT)" Date: Tue, 18 Sep 2018 20:59:54 +0800 Subject: [PATCH 3/4] update --- tools/nnicmd/constants.py | 2 +- tools/nnicmd/package_management.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/nnicmd/constants.py b/tools/nnicmd/constants.py index e626c87721..991d470f84 100644 --- a/tools/nnicmd/constants.py +++ b/tools/nnicmd/constants.py @@ -53,4 +53,4 @@ PACKAGE_REQUIREMENTS = { 'SMAC': {'install':['git+https://github.com/QuanluZhang/ConfigSpace.git','git+https://github.com/QuanluZhang/SMAC3.git'], 'uninstall':['ConfigSpace', 'smac']} -} \ No newline at end of file +} diff --git a/tools/nnicmd/package_management.py b/tools/nnicmd/package_management.py index 74a9e269b5..205796045e 100644 --- a/tools/nnicmd/package_management.py +++ b/tools/nnicmd/package_management.py @@ -48,4 +48,5 @@ def package_uninstall(args): def package_show(args): '''show all packages''' - print(' '.join(PACKAGE_REQUIREMENTS.keys())) \ No newline at end of file + print(' '.join(PACKAGE_REQUIREMENTS.keys())) + \ No newline at end of file From 1d3bacb95b76c8a737e43bc72ba4fc47cf986114 Mon Sep 17 00:00:00 2001 From: "Shinai Yang (FA TALENT)" Date: Wed, 19 Sep 2018 12:07:20 +0800 Subject: [PATCH 4/4] update package install logic --- tools/nnicmd/constants.py | 3 +-- tools/nnicmd/nnictl.py | 5 +---- tools/nnicmd/package_management.py | 26 ++++++++------------------ 3 files changed, 10 insertions(+), 24 deletions(-) diff --git a/tools/nnicmd/constants.py b/tools/nnicmd/constants.py index 991d470f84..b03b1bdcbe 100644 --- a/tools/nnicmd/constants.py +++ b/tools/nnicmd/constants.py @@ -51,6 +51,5 @@ '6. nnictl webui url get the url of web ui' PACKAGE_REQUIREMENTS = { - 'SMAC': {'install':['git+https://github.com/QuanluZhang/ConfigSpace.git','git+https://github.com/QuanluZhang/SMAC3.git'], - 'uninstall':['ConfigSpace', 'smac']} + 'SMAC': 'smac_tuner' } diff --git a/tools/nnicmd/nnictl.py b/tools/nnicmd/nnictl.py index 9a55012800..b677d10c6d 100644 --- a/tools/nnicmd/nnictl.py +++ b/tools/nnicmd/nnictl.py @@ -123,11 +123,8 @@ def parse_args(): # 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', choices=['SMAC'], help='package name to be installed') + parser_package_install.add_argument('--name', '-n', dest='name', help='package name to be installed') parser_package_install.set_defaults(func=package_install) - parser_package_uninstall = parser_package_subparsers.add_parser('uninstall', help='uninstall packages') - parser_package_uninstall.add_argument('--name', '-n', dest='name', choices=['SMAC'], help='package name to be uninstalled') - parser_package_uninstall.set_defaults(func=package_uninstall) parser_package_show = parser_package_subparsers.add_parser('show', help='show the information of packages') parser_package_show.set_defaults(func=package_show) diff --git a/tools/nnicmd/package_management.py b/tools/nnicmd/package_management.py index 205796045e..bb9b96b705 100644 --- a/tools/nnicmd/package_management.py +++ b/tools/nnicmd/package_management.py @@ -22,30 +22,20 @@ import os from subprocess import call from .constants import PACKAGE_REQUIREMENTS -from .common_utils import print_normal +from .common_utils import print_normal, print_error -def manage_smac(mode): - if mode == 'install': - for package in PACKAGE_REQUIREMENTS.get('SMAC').get('install'): - print_normal('installing ' + package) - cmds = ['pip3', 'install', '--user', package] - call(cmds) +def process_install(package_name): + if PACKAGE_REQUIREMENTS.get(package_name) is None: + print_error('{0} is not supported!' % package_name) else: - for package in PACKAGE_REQUIREMENTS.get('SMAC').get('uninstall'): - print_normal('uninstalling ' + package) - cmds = ['pip3', 'uninstall', '-y', package] - call(cmds) + requirements_path = os.path.join(nni.__path__[0], PACKAGE_REQUIREMENTS[package_name], 'requirements.txt') + cmds = ['python3', '-m', 'pip', 'install', '--user', requirements_path] + call(cmds) def package_install(args): '''install packages''' - if args.name == 'SMAC': - manage_smac('install') + process_install(args.name) -def package_uninstall(args): - '''uninstall packages''' - if args.name == 'SMAC': - manage_smac('uninstall') - def package_show(args): '''show all packages''' print(' '.join(PACKAGE_REQUIREMENTS.keys()))