Skip to content

Commit b14e9c7

Browse files
authored
Removing duplicate logs (#512)
Signed-off-by: Igor Gitman <igitman@nvidia.com>
1 parent fc8f391 commit b14e9c7

4 files changed

Lines changed: 58 additions & 17 deletions

File tree

nemo_skills/pipeline/utils/cluster.py

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535

3636
LOG = logging.getLogger(get_logger_name(__file__))
3737

38+
# Add a module-level set to track which environment variables have been logged
39+
_logged_required_env_vars = set()
40+
_logged_optional_env_vars = set()
41+
3842

3943
def get_timeout(cluster_config, partition):
4044
if 'timeouts' not in cluster_config:
@@ -67,20 +71,30 @@ def get_env_variables(cluster_config):
6771
Returns:
6872
dict: dictionary of environment
6973
"""
74+
global _logged_required_env_vars, _logged_optional_env_vars
75+
7076
env_vars = {}
7177
# Check for user requested env variables
7278
required_env_vars = cluster_config.get("required_env_vars", [])
7379
for env_var in required_env_vars:
80+
env_var_name = env_var.split('=')[0].strip() if "=" in env_var else env_var
81+
7482
if "=" in env_var:
7583
if env_var.count("=") == 1:
76-
env_var, value = env_var.split("=")
84+
env_var_name, value = env_var.split("=")
85+
env_var_name = env_var_name.strip()
86+
value = value.strip()
7787
else:
7888
raise ValueError(f"Invalid required environment variable format: {env_var}")
79-
env_vars[env_var.strip()] = value.strip()
80-
logging.info(f"Adding required environment variable {env_var}")
89+
env_vars[env_var_name] = value
90+
if env_var_name not in _logged_required_env_vars:
91+
LOG.info(f"Adding required environment variable {env_var_name} from config")
92+
_logged_required_env_vars.add(env_var_name)
8193
elif env_var in os.environ:
82-
logging.info(f"Adding required environment variable {env_var} from environment")
8394
env_vars[env_var] = os.environ[env_var]
95+
if env_var not in _logged_required_env_vars:
96+
LOG.info(f"Adding required environment variable {env_var} from environment")
97+
_logged_required_env_vars.add(env_var)
8498
else:
8599
raise ValueError(f"Required environment variable {env_var} not found.")
86100

@@ -94,21 +108,33 @@ def get_env_variables(cluster_config):
94108
# Add optional env variables
95109
optional_env_vars = cluster_config.get("env_vars", [])
96110
for env_var in optional_env_vars + always_optional_env_vars:
111+
env_var_name = env_var.split('=')[0].strip() if "=" in env_var else env_var
112+
97113
if "=" in env_var:
98114
if env_var.count("=") == 1:
99-
env_var, value = env_var.split("=")
115+
env_var_name, value = env_var.split("=")
116+
env_var_name = env_var_name.strip()
117+
value = value.strip()
100118
else:
101119
raise ValueError(f"Invalid optional environment variable format: {env_var}")
102-
env_vars[env_var.strip()] = value.strip()
103-
logging.info(f"Adding optional environment variable {env_var}")
120+
env_vars[env_var_name] = value
121+
if env_var_name not in _logged_optional_env_vars:
122+
LOG.info(f"Adding optional environment variable {env_var_name} from config")
123+
_logged_optional_env_vars.add(env_var_name)
104124
elif env_var in os.environ:
105-
logging.info(f"Adding optional environment variable {env_var} from environment")
106125
env_vars[env_var] = os.environ[env_var]
126+
if env_var not in _logged_optional_env_vars:
127+
LOG.info(f"Adding optional environment variable {env_var} from environment")
128+
_logged_optional_env_vars.add(env_var)
107129
elif env_var in default_factories:
108130
env_vars[env_var] = default_factories[env_var]()
109-
logging.info(f"Adding optional environment variable {env_var} from environment")
131+
if env_var not in _logged_optional_env_vars:
132+
LOG.info(f"Adding optional environment variable {env_var} from environment")
133+
_logged_optional_env_vars.add(env_var)
110134
else:
111-
logging.info(f"Optional environment variable {env_var} not found in user environment; skipping.")
135+
if env_var not in _logged_optional_env_vars:
136+
LOG.info(f"Optional environment variable {env_var} not found in user environment; skipping.")
137+
_logged_optional_env_vars.add(env_var)
112138

113139
return env_vars
114140

nemo_skills/pipeline/utils/exp.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from nemo_skills.pipeline.utils.mounts import get_mounts_from_config, get_unmounted_path
3030
from nemo_skills.pipeline.utils.packager import get_packager
3131
from nemo_skills.pipeline.utils.server import get_free_port, get_server_command
32-
from nemo_skills.utils import get_logger_name
32+
from nemo_skills.utils import get_logger_name, remove_handlers
3333

3434
LOG = logging.getLogger(get_logger_name(__file__))
3535

@@ -497,6 +497,8 @@ def run_exp(exp, cluster_config, sequential=None):
497497

498498

499499
def get_exp(expname, cluster_config):
500+
# nemo-run redefines the handlers, so removing ours to avoid duplicate logs
501+
remove_handlers()
500502
if cluster_config['executor'] == 'slurm':
501503
return run.Experiment(expname)
502504
# hiding all nemo-run logs otherwise as they are not useful locally

nemo_skills/pipeline/utils/packager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def get_packager(extra_package_dirs: tuple[str] | None = None):
127127
if repo_path:
128128
# Do we have nemo_skills package in this repo? If no, we need to pick it up from installed location
129129
if not (Path(repo_path) / 'nemo_skills').is_dir():
130-
logging.info(
130+
LOG.info(
131131
"Not running from NeMo-Skills repo, trying to upload installed package. "
132132
"Make sure there are no extra files in %s",
133133
str(nemo_skills_dir / '*'),
@@ -147,7 +147,7 @@ def get_packager(extra_package_dirs: tuple[str] | None = None):
147147
check_uncommitted_changes=check_uncommited_changes,
148148
)
149149
else:
150-
logging.info(
150+
LOG.info(
151151
"Not running from a git repo, trying to upload installed package. Make sure there are no extra files in %s",
152152
str(nemo_skills_dir / '*'),
153153
)

nemo_skills/utils.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import glob
1615
import inspect
1716
import io
1817
import logging
@@ -86,8 +85,15 @@ def setup_logging(disable_hydra_logs: bool = True, log_level: int = logging.INFO
8685
if use_rich:
8786
handler = RichHandler(
8887
rich_tracebacks=True,
89-
show_path=False,
90-
show_time=False,
88+
show_time=True,
89+
show_level=True,
90+
show_path=True,
91+
)
92+
handler.setFormatter(
93+
logging.Formatter(
94+
"%(message)s",
95+
datefmt="[%X]",
96+
)
9197
)
9298
for hdlr in logger.handlers[:]:
9399
logger.removeHandler(hdlr)
@@ -107,6 +113,13 @@ def setup_logging(disable_hydra_logs: bool = True, log_level: int = logging.INFO
107113
return logger
108114

109115

116+
def remove_handlers():
117+
"""Can be used to remove all nemo-skills log handlers."""
118+
logger = logging.getLogger('nemo_skills')
119+
for handler in logger.handlers[:]:
120+
logger.removeHandler(handler)
121+
122+
110123
def get_logger_name(file):
111124
return 'nemo_skills' + file.split('nemo_skills')[1].replace('/', '.').replace('.py', '')
112125

@@ -288,7 +301,7 @@ def get_help_message(dataclass_obj, help_message="", **kwargs):
288301
docstring = re.sub(r'{([^}]+(?=\s)[^}]*)}', r'{{\1}}', docstring)
289302
# Might need to add some other edge-case handling
290303
# here, so that formatting does not complain
291-
docstring = dataclass_obj.__doc__ + "\n\n" + docstring.format(**kwargs)
304+
docstring = dataclass_obj.__doc__ + "\n\n" + docstring.format(**kwargs)
292305

293306
full_help = f"{heading}\n{'-' * 75}\n{docstring}"
294307
if help_message:

0 commit comments

Comments
 (0)