Skip to content
This repository has been archived by the owner on Sep 18, 2024. It is now read-only.

Commit

Permalink
Improve logging for standalone mode (#1768)
Browse files Browse the repository at this point in the history
  • Loading branch information
liuzhe-lz authored and QuanluZhang committed Nov 22, 2019
1 parent dbf9871 commit a63f2ed
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 10 deletions.
21 changes: 21 additions & 0 deletions src/sdk/pynni/nni/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,27 @@ def init_logger(logger_file_path, log_level_name='info'):

sys.stdout = _LoggerFileWrapper(logger_file)

def init_standalone_logger():
"""
Initialize root logger for standalone mode.
This will set NNI's log level to INFO and print its log to stdout.
"""
fmt = '[%(asctime)s] %(levelname)s (%(name)s) %(message)s'
formatter = logging.Formatter(fmt, _time_format)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
nni_logger = logging.getLogger('nni')
nni_logger.addHandler(handler)
nni_logger.setLevel(logging.INFO)
nni_logger.propagate = False

# Following line does not affect NNI loggers, but without this user's logger won't be able to
# print log even it's level is set to INFO, so we do it for user's convenience.
# If this causes any issue in future, remove it and use `logging.info` instead of
# `logging.getLogger('xxx')` in all examples.
logging.basicConfig()


_multi_thread = False
_multi_phase = False

Expand Down
26 changes: 20 additions & 6 deletions src/sdk/pynni/nni/platform/standalone.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,26 @@
import logging
import json_tricks

from ..common import init_standalone_logger

# print INFO log to stdout
logging.basicConfig()
logging.getLogger('nni').setLevel(logging.INFO)
__all__ = [
'get_next_parameter',
'get_experiment_id',
'get_trial_id',
'get_sequence_id',
'send_metric',
]

init_standalone_logger()
_logger = logging.getLogger('nni')


def get_next_parameter():
pass
_logger.warning('Requesting parameter without NNI framework, returning empty dict')
return {
'parameter_id': None,
'parameters': {}
}

def get_experiment_id():
pass
Expand All @@ -43,6 +55,8 @@ def get_sequence_id():
def send_metric(string):
metric = json_tricks.loads(string)
if metric['type'] == 'FINAL':
print('Final result:', metric['value'])
_logger.info('Final result: %s', metric['value'])
elif metric['type'] == 'PERIODICAL':
print('Intermediate result:', metric['value'])
_logger.info('Intermediate result: %s (Index %s)', metric['value'], metric['sequence'])
else:
_logger.error('Unexpected metric: %s', string)
10 changes: 6 additions & 4 deletions src/sdk/pynni/nni/trial.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,10 @@ def report_intermediate_result(metric):
serializable object.
"""
global _intermediate_seq
assert _params is not None, 'nni.get_next_parameter() needs to be called before report_intermediate_result'
assert _params or trial_env_vars.NNI_PLATFORM is None, \
'nni.get_next_parameter() needs to be called before report_intermediate_result'
metric = json_tricks.dumps({
'parameter_id': _params['parameter_id'],
'parameter_id': _params['parameter_id'] if _params else None,
'trial_job_id': trial_env_vars.NNI_TRIAL_JOB_ID,
'type': 'PERIODICAL',
'sequence': _intermediate_seq,
Expand All @@ -147,9 +148,10 @@ def report_final_result(metric):
metric:
serializable object.
"""
assert _params is not None, 'nni.get_next_parameter() needs to be called before report_final_result'
assert _params or trial_env_vars.NNI_PLATFORM is None, \
'nni.get_next_parameter() needs to be called before report_final_result'
metric = json_tricks.dumps({
'parameter_id': _params['parameter_id'],
'parameter_id': _params['parameter_id'] if _params else None,
'trial_job_id': trial_env_vars.NNI_TRIAL_JOB_ID,
'type': 'FINAL',
'sequence': 0,
Expand Down

0 comments on commit a63f2ed

Please sign in to comment.