Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenDAS
nni
Commits
e1a4a80a
Unverified
Commit
e1a4a80a
authored
May 30, 2019
by
SparkSnail
Committed by
GitHub
May 30, 2019
Browse files
Merge pull request #175 from microsoft/master
merge master
parents
bee8f84e
e267a737
Changes
34
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
252 additions
and
89 deletions
+252
-89
src/sdk/pynni/nni/hyperband_advisor/hyperband_advisor.py
src/sdk/pynni/nni/hyperband_advisor/hyperband_advisor.py
+2
-1
src/sdk/pynni/nni/hyperopt_tuner/hyperopt_tuner.py
src/sdk/pynni/nni/hyperopt_tuner/hyperopt_tuner.py
+3
-1
src/sdk/pynni/nni/metis_tuner/metis_tuner.py
src/sdk/pynni/nni/metis_tuner/metis_tuner.py
+1
-1
src/sdk/pynni/nni/smac_tuner/smac_tuner.py
src/sdk/pynni/nni/smac_tuner/smac_tuner.py
+4
-0
src/sdk/pynni/nni/smartparam.py
src/sdk/pynni/nni/smartparam.py
+41
-1
src/sdk/pynni/nni/utils.py
src/sdk/pynni/nni/utils.py
+23
-0
tools/nni_annotation/code_generator.py
tools/nni_annotation/code_generator.py
+91
-0
tools/nni_annotation/search_space_generator.py
tools/nni_annotation/search_space_generator.py
+18
-1
tools/nni_annotation/testcase/mutable_layer_usercode/simple.py
.../nni_annotation/testcase/mutable_layer_usercode/simple.py
+53
-0
tools/nni_cmd/config_utils.py
tools/nni_cmd/config_utils.py
+0
-23
tools/nni_cmd/launcher.py
tools/nni_cmd/launcher.py
+11
-12
tools/nni_cmd/nnictl.py
tools/nni_cmd/nnictl.py
+0
-9
tools/nni_cmd/nnictl_utils.py
tools/nni_cmd/nnictl_utils.py
+2
-35
tools/nni_cmd/tensorboard_utils.py
tools/nni_cmd/tensorboard_utils.py
+3
-5
No files found.
src/sdk/pynni/nni/hyperband_advisor/hyperband_advisor.py
View file @
e1a4a80a
...
...
@@ -31,7 +31,7 @@ import json_tricks
from
nni.protocol
import
CommandType
,
send
from
nni.msg_dispatcher_base
import
MsgDispatcherBase
from
nni.common
import
init_logger
from
nni.utils
import
NodeType
,
OptimizeMode
,
extract_scalar_reward
from
nni.utils
import
NodeType
,
OptimizeMode
,
extract_scalar_reward
,
randint_to_quniform
import
nni.parameter_expressions
as
parameter_expressions
_logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -357,6 +357,7 @@ class Hyperband(MsgDispatcherBase):
number of trial jobs
"""
self
.
searchspace_json
=
data
randint_to_quniform
(
self
.
searchspace_json
)
self
.
random_state
=
np
.
random
.
RandomState
()
def
handle_trial_end
(
self
,
data
):
...
...
src/sdk/pynni/nni/hyperopt_tuner/hyperopt_tuner.py
View file @
e1a4a80a
...
...
@@ -27,7 +27,7 @@ import logging
import
hyperopt
as
hp
import
numpy
as
np
from
nni.tuner
import
Tuner
from
nni.utils
import
NodeType
,
OptimizeMode
,
extract_scalar_reward
,
split_index
from
nni.utils
import
NodeType
,
OptimizeMode
,
extract_scalar_reward
,
split_index
,
randint_to_quniform
logger
=
logging
.
getLogger
(
'hyperopt_AutoML'
)
...
...
@@ -231,6 +231,8 @@ class HyperoptTuner(Tuner):
search_space : dict
"""
self
.
json
=
search_space
randint_to_quniform
(
self
.
json
)
search_space_instance
=
json2space
(
self
.
json
)
rstate
=
np
.
random
.
RandomState
()
trials
=
hp
.
Trials
()
...
...
src/sdk/pynni/nni/metis_tuner/metis_tuner.py
View file @
e1a4a80a
...
...
@@ -133,7 +133,7 @@ class MetisTuner(Tuner):
self
.
x_bounds
[
idx
]
=
bounds
self
.
x_types
[
idx
]
=
'discrete_int'
elif
key_type
==
'randint'
:
self
.
x_bounds
[
idx
]
=
[
0
,
key_range
[
0
]]
self
.
x_bounds
[
idx
]
=
[
key_range
[
0
]
,
key_range
[
1
]]
self
.
x_types
[
idx
]
=
'range_int'
elif
key_type
==
'uniform'
:
self
.
x_bounds
[
idx
]
=
[
key_range
[
0
],
key_range
[
1
]]
...
...
src/sdk/pynni/nni/smac_tuner/smac_tuner.py
View file @
e1a4a80a
...
...
@@ -37,6 +37,9 @@ from ConfigSpaceNNI import Configuration
from
.convert_ss_to_scenario
import
generate_scenario
from
nni.tuner
import
Tuner
from
nni.utils
import
OptimizeMode
,
extract_scalar_reward
,
randint_to_quniform
class
SMACTuner
(
Tuner
):
"""
...
...
@@ -136,6 +139,7 @@ class SMACTuner(Tuner):
search_space:
search space
"""
randint_to_quniform
(
search_space
)
if
not
self
.
update_ss_done
:
self
.
categorical_dict
=
generate_scenario
(
search_space
)
if
self
.
categorical_dict
is
None
:
...
...
src/sdk/pynni/nni/smartparam.py
View file @
e1a4a80a
...
...
@@ -36,7 +36,8 @@ __all__ = [
'qnormal'
,
'lognormal'
,
'qlognormal'
,
'function_choice'
'function_choice'
,
'mutable_layer'
]
...
...
@@ -78,6 +79,9 @@ if trial_env_vars.NNI_PLATFORM is None:
def
function_choice
(
*
funcs
,
name
=
None
):
return
random
.
choice
(
funcs
)()
def
mutable_layer
():
raise
RuntimeError
(
'Cannot call nni.mutable_layer in this mode'
)
else
:
def
choice
(
options
,
name
=
None
,
key
=
None
):
...
...
@@ -113,6 +117,42 @@ else:
def
function_choice
(
funcs
,
name
=
None
,
key
=
None
):
return
funcs
[
_get_param
(
key
)]()
def
mutable_layer
(
mutable_id
,
mutable_layer_id
,
funcs
,
funcs_args
,
fixed_inputs
,
optional_inputs
,
optional_input_size
=
0
):
'''execute the chosen function and inputs.
Below is an example of chosen function and inputs:
{
"mutable_id": {
"mutable_layer_id": {
"chosen_layer": "pool",
"chosen_inputs": ["out1", "out3"]
}
}
}
Parameters:
---------------
mutable_id: the name of this mutable_layer block (which could have multiple mutable layers)
mutable_layer_id: the name of a mutable layer in this block
funcs: dict of function calls
funcs_args:
fixed_inputs:
optional_inputs: dict of optional inputs
optional_input_size: number of candidate inputs to be chosen
'''
mutable_block
=
_get_param
(
mutable_id
)
chosen_layer
=
mutable_block
[
mutable_layer_id
][
"chosen_layer"
]
chosen_inputs
=
mutable_block
[
mutable_layer_id
][
"chosen_inputs"
]
real_chosen_inputs
=
[
optional_inputs
[
input_name
]
for
input_name
in
chosen_inputs
]
layer_out
=
funcs
[
chosen_layer
]([
fixed_inputs
,
real_chosen_inputs
],
*
funcs_args
[
chosen_layer
])
return
layer_out
def
_get_param
(
key
):
if
trial
.
_params
is
None
:
trial
.
get_next_parameter
()
...
...
src/sdk/pynni/nni/utils.py
View file @
e1a4a80a
...
...
@@ -40,6 +40,7 @@ class OptimizeMode(Enum):
Minimize
=
'minimize'
Maximize
=
'maximize'
class
NodeType
:
"""Node Type class
"""
...
...
@@ -83,6 +84,7 @@ def extract_scalar_reward(value, scalar_key='default'):
raise
RuntimeError
(
'Incorrect final result: the final result should be float/int, or a dict which has a key named "default" whose value is float/int.'
)
return
reward
def
convert_dict2tuple
(
value
):
"""
convert dict type to tuple to solve unhashable problem.
...
...
@@ -94,9 +96,30 @@ def convert_dict2tuple(value):
else
:
return
value
def
init_dispatcher_logger
():
""" Initialize dispatcher logging configuration"""
logger_file_path
=
'dispatcher.log'
if
dispatcher_env_vars
.
NNI_LOG_DIRECTORY
is
not
None
:
logger_file_path
=
os
.
path
.
join
(
dispatcher_env_vars
.
NNI_LOG_DIRECTORY
,
logger_file_path
)
init_logger
(
logger_file_path
,
dispatcher_env_vars
.
NNI_LOG_LEVEL
)
def
randint_to_quniform
(
in_x
):
if
isinstance
(
in_x
,
dict
):
if
NodeType
.
TYPE
in
in_x
.
keys
():
if
in_x
[
NodeType
.
TYPE
]
==
'randint'
:
value
=
in_x
[
NodeType
.
VALUE
]
value
.
append
(
1
)
in_x
[
NodeType
.
TYPE
]
=
'quniform'
in_x
[
NodeType
.
VALUE
]
=
value
elif
in_x
[
NodeType
.
TYPE
]
==
'choice'
:
randint_to_quniform
(
in_x
[
NodeType
.
VALUE
])
else
:
for
key
in
in_x
.
keys
():
randint_to_quniform
(
in_x
[
key
])
elif
isinstance
(
in_x
,
list
):
for
temp
in
in_x
:
randint_to_quniform
(
temp
)
tools/nni_annotation/code_generator.py
View file @
e1a4a80a
...
...
@@ -25,6 +25,94 @@ from nni_cmd.common_utils import print_warning
# pylint: disable=unidiomatic-typecheck
def
parse_annotation_mutable_layers
(
code
,
lineno
):
"""Parse the string of mutable layers in annotation.
Return a list of AST Expr nodes
code: annotation string (excluding '@')
"""
module
=
ast
.
parse
(
code
)
assert
type
(
module
)
is
ast
.
Module
,
'internal error #1'
assert
len
(
module
.
body
)
==
1
,
'Annotation mutable_layers contains more than one expression'
assert
type
(
module
.
body
[
0
])
is
ast
.
Expr
,
'Annotation is not expression'
call
=
module
.
body
[
0
].
value
nodes
=
[]
mutable_id
=
'mutable_block_'
+
str
(
lineno
)
mutable_layer_cnt
=
0
for
arg
in
call
.
args
:
fields
=
{
'layer_choice'
:
False
,
'fixed_inputs'
:
False
,
'optional_inputs'
:
False
,
'optional_input_size'
:
False
,
'layer_output'
:
False
}
for
k
,
value
in
zip
(
arg
.
keys
,
arg
.
values
):
if
k
.
id
==
'layer_choice'
:
assert
not
fields
[
'layer_choice'
],
'Duplicated field: layer_choice'
assert
type
(
value
)
is
ast
.
List
,
'Value of layer_choice should be a list'
call_funcs_keys
=
[]
call_funcs_values
=
[]
call_kwargs_values
=
[]
for
call
in
value
.
elts
:
assert
type
(
call
)
is
ast
.
Call
,
'Element in layer_choice should be function call'
call_name
=
astor
.
to_source
(
call
).
strip
()
call_funcs_keys
.
append
(
ast
.
Str
(
s
=
call_name
))
call_funcs_values
.
append
(
call
.
func
)
assert
not
call
.
args
,
'Number of args without keyword should be zero'
kw_args
=
[]
kw_values
=
[]
for
kw
in
call
.
keywords
:
kw_args
.
append
(
kw
.
arg
)
kw_values
.
append
(
kw
.
value
)
call_kwargs_values
.
append
(
ast
.
Dict
(
keys
=
kw_args
,
values
=
kw_values
))
call_funcs
=
ast
.
Dict
(
keys
=
call_funcs_keys
,
values
=
call_funcs_values
)
call_kwargs
=
ast
.
Dict
(
keys
=
call_funcs_keys
,
values
=
call_kwargs_values
)
fields
[
'layer_choice'
]
=
True
elif
k
.
id
==
'fixed_inputs'
:
assert
not
fields
[
'fixed_inputs'
],
'Duplicated field: fixed_inputs'
assert
type
(
value
)
is
ast
.
List
,
'Value of fixed_inputs should be a list'
fixed_inputs
=
value
fields
[
'fixed_inputs'
]
=
True
elif
k
.
id
==
'optional_inputs'
:
assert
not
fields
[
'optional_inputs'
],
'Duplicated field: optional_inputs'
assert
type
(
value
)
is
ast
.
List
,
'Value of optional_inputs should be a list'
var_names
=
[
ast
.
Str
(
s
=
astor
.
to_source
(
var
).
strip
())
for
var
in
value
.
elts
]
optional_inputs
=
ast
.
Dict
(
keys
=
var_names
,
values
=
value
.
elts
)
fields
[
'optional_inputs'
]
=
True
elif
k
.
id
==
'optional_input_size'
:
assert
not
fields
[
'optional_input_size'
],
'Duplicated field: optional_input_size'
assert
type
(
value
)
is
ast
.
Num
,
'Value of optional_input_size should be a number'
optional_input_size
=
value
fields
[
'optional_input_size'
]
=
True
elif
k
.
id
==
'layer_output'
:
assert
not
fields
[
'layer_output'
],
'Duplicated field: layer_output'
assert
type
(
value
)
is
ast
.
Name
,
'Value of layer_output should be ast.Name type'
layer_output
=
value
fields
[
'layer_output'
]
=
True
else
:
raise
AssertionError
(
'Unexpected field in mutable layer'
)
# make call for this mutable layer
assert
fields
[
'layer_choice'
],
'layer_choice must exist'
assert
fields
[
'layer_output'
],
'layer_output must exist'
mutable_layer_id
=
'mutable_layer_'
+
str
(
mutable_layer_cnt
)
mutable_layer_cnt
+=
1
target_call_attr
=
ast
.
Attribute
(
value
=
ast
.
Name
(
id
=
'nni'
,
ctx
=
ast
.
Load
()),
attr
=
'mutable_layer'
,
ctx
=
ast
.
Load
())
target_call_args
=
[
ast
.
Str
(
s
=
mutable_id
),
ast
.
Str
(
s
=
mutable_layer_id
),
call_funcs
,
call_kwargs
]
if
fields
[
'fixed_inputs'
]:
target_call_args
.
append
(
fixed_inputs
)
else
:
target_call_args
.
append
(
ast
.
NameConstant
(
value
=
None
))
if
fields
[
'optional_inputs'
]:
target_call_args
.
append
(
optional_inputs
)
assert
fields
[
'optional_input_size'
],
'optional_input_size must exist when optional_inputs exists'
target_call_args
.
append
(
optional_input_size
)
else
:
target_call_args
.
append
(
ast
.
NameConstant
(
value
=
None
))
target_call
=
ast
.
Call
(
func
=
target_call_attr
,
args
=
target_call_args
,
keywords
=
[])
node
=
ast
.
Assign
(
targets
=
[
layer_output
],
value
=
target_call
)
nodes
.
append
(
node
)
return
nodes
def
parse_annotation
(
code
):
"""Parse an annotation string.
...
...
@@ -235,6 +323,9 @@ class Transformer(ast.NodeTransformer):
or
string
.
startswith
(
'@nni.get_next_parameter('
):
return
parse_annotation
(
string
[
1
:])
# expand annotation string to code
if
string
.
startswith
(
'@nni.mutable_layers('
):
return
parse_annotation_mutable_layers
(
string
[
1
:],
node
.
lineno
)
if
string
.
startswith
(
'@nni.variable('
)
\
or
string
.
startswith
(
'@nni.function_choice('
):
self
.
stack
[
-
1
]
=
string
[
1
:]
# mark that the next expression is annotated
...
...
tools/nni_annotation/search_space_generator.py
View file @
e1a4a80a
...
...
@@ -38,7 +38,8 @@ _ss_funcs = [
'qnormal'
,
'lognormal'
,
'qlognormal'
,
'function_choice'
'function_choice'
,
'mutable_layer'
]
...
...
@@ -50,6 +51,18 @@ class SearchSpaceGenerator(ast.NodeTransformer):
self
.
search_space
=
{}
self
.
last_line
=
0
# last parsed line, useful for error reporting
def
generate_mutable_layer_search_space
(
self
,
args
):
mutable_block
=
args
[
0
].
s
mutable_layer
=
args
[
1
].
s
if
mutable_block
not
in
self
.
search_space
:
self
.
search_space
[
mutable_block
]
=
dict
()
self
.
search_space
[
mutable_block
][
mutable_layer
]
=
{
'layer_choice'
:
[
key
.
s
for
key
in
args
[
2
].
keys
],
'optional_inputs'
:
[
key
.
s
for
key
in
args
[
5
].
keys
],
'optional_input_size'
:
args
[
6
].
n
}
def
visit_Call
(
self
,
node
):
# pylint: disable=invalid-name
self
.
generic_visit
(
node
)
...
...
@@ -68,6 +81,10 @@ class SearchSpaceGenerator(ast.NodeTransformer):
self
.
last_line
=
node
.
lineno
if
func
==
'mutable_layer'
:
self
.
generate_mutable_layer_search_space
(
node
.
args
)
return
node
if
node
.
keywords
:
# there is a `name` argument
assert
len
(
node
.
keywords
)
==
1
,
'Smart parameter has keyword argument other than "name"'
...
...
tools/nni_annotation/testcase/mutable_layer_usercode/simple.py
0 → 100644
View file @
e1a4a80a
import
time
def
add_one
(
inputs
):
return
inputs
+
1
def
add_two
(
inputs
):
return
inputs
+
2
def
add_three
(
inputs
):
return
inputs
+
3
def
add_four
(
inputs
):
return
inputs
+
4
def
main
():
images
=
5
"""@nni.mutable_layers(
{
layer_choice: [add_one(), add_two(), add_three(), add_four()],
optional_inputs: [images],
optional_input_size: 1,
layer_output: layer_1_out
},
{
layer_choice: [add_one(), add_two(), add_three(), add_four()],
optional_inputs: [layer_1_out],
optional_input_size: 1,
layer_output: layer_2_out
},
{
layer_choice: [add_one(), add_two(), add_three(), add_four()],
optional_inputs: [layer_1_out, layer_2_out],
optional_input_size: 1,
layer_output: layer_3_out
}
)"""
"""@nni.report_intermediate_result(layer_1_out)"""
time
.
sleep
(
2
)
"""@nni.report_intermediate_result(layer_2_out)"""
time
.
sleep
(
2
)
"""@nni.report_intermediate_result(layer_3_out)"""
time
.
sleep
(
2
)
layer_3_out
=
layer_3_out
+
10
"""@nni.report_final_result(layer_3_out)"""
if
__name__
==
'__main__'
:
main
()
tools/nni_cmd/config_utils.py
View file @
e1a4a80a
...
...
@@ -23,7 +23,6 @@ import os
import
json
import
shutil
from
.constants
import
NNICTL_HOME_DIR
from
.common_utils
import
print_error
class
Config
:
'''a util class to load and save config'''
...
...
@@ -121,25 +120,3 @@ class Experiments:
except
ValueError
:
return
{}
return
{}
class
HDFSConfig
:
'''manage hdfs configuration'''
def
__init__
(
self
):
os
.
makedirs
(
NNICTL_HOME_DIR
,
exist_ok
=
True
)
self
.
hdfs_config_file
=
os
.
path
.
join
(
NNICTL_HOME_DIR
,
'.hdfs'
)
def
get_config
(
self
):
if
os
.
path
.
exists
(
self
.
hdfs_config_file
):
try
:
with
open
(
self
.
hdfs_config_file
,
'r'
)
as
file
:
return
json
.
load
(
file
)
except
Exception
as
exception
:
print_error
(
exception
)
return
None
else
:
return
None
def
set_config
(
self
,
host
,
user_name
):
with
open
(
self
.
hdfs_config_file
,
'w'
)
as
file
:
json
.
dump
({
'host'
:
host
,
'userName'
:
user_name
},
file
)
tools/nni_cmd/launcher.py
View file @
e1a4a80a
...
...
@@ -125,8 +125,7 @@ def start_rest_server(port, platform, mode, config_file_name, experiment_id=None
if
mode
==
'resume'
:
cmds
+=
[
'--experiment_id'
,
experiment_id
]
stdout_full_path
,
stderr_full_path
=
get_log_path
(
config_file_name
)
stdout_file
=
open
(
stdout_full_path
,
'a+'
)
stderr_file
=
open
(
stderr_full_path
,
'a+'
)
with
open
(
stdout_full_path
,
'a+'
)
as
stdout_file
,
open
(
stderr_full_path
,
'a+'
)
as
stderr_file
:
time_now
=
time
.
strftime
(
'%Y-%m-%d %H:%M:%S'
,
time
.
localtime
(
time
.
time
()))
#add time information in the header of log files
log_header
=
LOG_HEADER
%
str
(
time_now
)
...
...
tools/nni_cmd/nnictl.py
View file @
e1a4a80a
...
...
@@ -194,15 +194,6 @@ def parse_args():
'the unit is second'
)
parser_top
.
set_defaults
(
func
=
monitor_experiment
)
parser_hdfs
=
subparsers
.
add_parser
(
'hdfs'
,
help
=
'monitor hdfs files'
)
parser_hdfs_subparsers
=
parser_hdfs
.
add_subparsers
()
parser_hdfs_set
=
parser_hdfs_subparsers
.
add_parser
(
'set'
,
help
=
'set the host and userName of hdfs'
)
parser_hdfs_set
.
add_argument
(
'--host'
,
required
=
True
,
dest
=
'host'
,
help
=
'the host of hdfs'
)
parser_hdfs_set
.
add_argument
(
'--user_name'
,
required
=
True
,
dest
=
'user_name'
,
help
=
'the userName of hdfs'
)
parser_hdfs_set
.
set_defaults
(
func
=
hdfs_set
)
parser_hdfs_list
=
parser_hdfs_subparsers
.
add_parser
(
'clean'
,
help
=
'clean hdfs files'
)
parser_hdfs_list
.
set_defaults
(
func
=
hdfs_clean
)
args
=
parser
.
parse_args
()
args
.
func
(
args
)
...
...
tools/nni_cmd/nnictl_utils.py
View file @
e1a4a80a
...
...
@@ -27,8 +27,7 @@ import time
from
subprocess
import
call
,
check_output
from
.rest_utils
import
rest_get
,
rest_delete
,
check_rest_server_quick
,
check_response
from
.url_utils
import
trial_jobs_url
,
experiment_url
,
trial_job_id_url
,
export_data_url
from
pyhdfs
import
HdfsClient
,
HdfsFileNotFoundException
from
.config_utils
import
Config
,
Experiments
,
HDFSConfig
from
.config_utils
import
Config
,
Experiments
from
.constants
import
NNICTL_HOME_DIR
,
EXPERIMENT_INFORMATION_FORMAT
,
EXPERIMENT_DETAIL_FORMAT
,
\
EXPERIMENT_MONITOR_INFO
,
TRIAL_MONITOR_HEAD
,
TRIAL_MONITOR_CONTENT
,
TRIAL_MONITOR_TAIL
,
REST_TIME_OUT
from
.common_utils
import
print_normal
,
print_error
,
print_warning
,
detect_process
...
...
@@ -487,35 +486,3 @@ def export_trials_data(args):
print_error
(
'Export failed...'
)
else
:
print_error
(
'Restful server is not Running'
)
\ No newline at end of file
def
hdfs_set
(
args
):
hdfsConfig
=
HDFSConfig
()
hdfsConfig
.
set_config
(
args
.
host
,
args
.
user_name
)
print_normal
(
'HDFS account update success!'
)
def
hdfs_clean
(
args
):
hdfsConfig
=
HDFSConfig
()
if
not
hdfsConfig
.
get_config
():
print_error
(
'Please use
\'
nnictl hdfs set
\'
command to set hdfs account first!'
)
exit
(
1
)
host
=
hdfsConfig
.
get_config
().
get
(
'host'
)
user_name
=
hdfsConfig
.
get_config
().
get
(
'userName'
)
hdfs_client
=
HdfsClient
(
hosts
=
'{0}:80'
.
format
(
host
),
user_name
=
user_name
,
webhdfs_path
=
'/webhdfs/api/v1'
,
timeout
=
5
)
root_path
=
os
.
path
.
join
(
'/'
,
user_name
,
'nni'
,
'experiments'
)
while
True
:
inputs
=
input
(
'INFO: clean up all files in {0}, do you want to continue?[Y/N]:'
.
format
(
root_path
))
if
inputs
.
lower
()
not
in
[
'y'
,
'n'
,
'yes'
,
'no'
]:
print_warning
(
'please input Y or N!'
)
elif
inputs
.
lower
()
in
[
'n'
,
'no'
]:
exit
(
0
)
else
:
break
path_list
=
hdfs_client
.
listdir
(
root_path
)
for
path
in
path_list
:
full_path
=
os
.
path
.
join
(
root_path
,
path
)
print_normal
(
'deleting {0}'
.
format
(
full_path
))
if
hdfs_client
.
delete
(
full_path
,
recursive
=
True
):
print_normal
(
'delete success!'
)
else
:
print_normal
(
'delete failed!'
)
print_normal
(
'DONE'
)
tools/nni_cmd/tensorboard_utils.py
View file @
e1a4a80a
...
...
@@ -94,9 +94,7 @@ def start_tensorboard_process(args, nni_config, path_list, temp_nni_path):
if
detect_port
(
args
.
port
):
print_error
(
'Port %s is used by another process, please reset port!'
%
str
(
args
.
port
))
exit
(
1
)
stdout_file
=
open
(
os
.
path
.
join
(
temp_nni_path
,
'tensorboard_stdout'
),
'a+'
)
stderr_file
=
open
(
os
.
path
.
join
(
temp_nni_path
,
'tensorboard_stderr'
),
'a+'
)
with
open
(
os
.
path
.
join
(
temp_nni_path
,
'tensorboard_stdout'
),
'a+'
)
as
stdout_file
,
open
(
os
.
path
.
join
(
temp_nni_path
,
'tensorboard_stderr'
),
'a+'
)
as
stderr_file
:
cmds
=
[
'tensorboard'
,
'--logdir'
,
format_tensorboard_log_path
(
path_list
),
'--port'
,
str
(
args
.
port
)]
tensorboard_process
=
Popen
(
cmds
,
stdout
=
stdout_file
,
stderr
=
stderr_file
)
url_list
=
get_local_urls
(
args
.
port
)
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment