mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-21 05:34:18 +08:00
Summary: Pull Request resolved: https://github.com/pytorch/pytorch/pull/53172 Pull Request resolved: https://github.com/pytorch/elastic/pull/141 Upstreams two modules to torch: 1. `torchelastic.rendezvous` 2. `torchelastic.utils` These modules were chosen as `[1/n]` since they are the leaf modules in torchelastic. ==== NOTES: ==== 1. I'm disabling etcd_rendezvous and etcd_server tests in CIRCLECI for the moment since I need to edit the test dockers to contain the etcd server binary (there's 4-5 test dockers - one for each platform so this is going to take some time for me to set up the environments and test) - T85992919. 2. I've fixed all lint errors on python files but there are ones on the cpp files on the ZeusRendezvous. I took a look at them, and I don't want to fix the linter errors right now for 2 major reasons: 1. Some of them are more than formatting changes (e.g. std::move vs pass by value) and I don't want to introduce bundled changes with the move 1. The old rendezvous code (the one we forked from in caffe2/fb) has the same problems and I think its better for us to deal with this when we deprecate caffe2/fb/rendezvous in favor of the one in torchelastic -T86012579. Test Plan: ``` buck test mode/dev-nosan //caffe2/torch/distributed/elastic/utils/test/... buck test mode/dev-nosan //caffe2/torch/distributed/elastic/utils/data/test/... buck test mode/dev-nosan //caffe2/torch/distributed/elastic/rendezvous/test/... buck test mode/dev-nosan //caffe2/torch/distributed/elastic/rendezvous/fb/... buck test mode/dev-nosan //pytorch/elastic/torchelastic/... ``` \+ Sandcastle Reviewed By: H-Huang Differential Revision: D26718746 fbshipit-source-id: 67cc0350c3d847221cb3c3038f98f47915362f51
68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
# Copyright (c) Facebook, Inc. and its affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the BSD-style license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
import inspect
|
|
import logging
|
|
import os
|
|
import warnings
|
|
from typing import Optional
|
|
|
|
|
|
def get_logger(name: Optional[str] = None):
|
|
"""
|
|
Util function to set up a simple logger that writes
|
|
into stderr. The loglevel is fetched from the LOGLEVEL
|
|
env. variable or INFO as default. The function will use the
|
|
module name of the caller if no name is provided.
|
|
|
|
Args:
|
|
name: Name of the logger. If no name provided, the name will
|
|
be derived from the call stack.
|
|
"""
|
|
|
|
# Derive the name of the caller, if none provided
|
|
# Use depth=2 since this function takes up one level in the call stack
|
|
return _setup_logger(name or _derive_module_name(depth=2))
|
|
|
|
|
|
def _setup_logger(name: Optional[str] = None):
|
|
log = logging.getLogger(name)
|
|
log.setLevel(os.environ.get("LOGLEVEL", "INFO"))
|
|
return log
|
|
|
|
|
|
def _derive_module_name(depth: int = 1) -> Optional[str]:
|
|
"""
|
|
Derives the name of the caller module from the stack frames.
|
|
|
|
Args:
|
|
depth: The position of the frame in the stack.
|
|
"""
|
|
try:
|
|
stack = inspect.stack()
|
|
assert depth < len(stack)
|
|
# FrameInfo is just a named tuple: (frame, filename, lineno, function, code_context, index)
|
|
frame_info = stack[depth]
|
|
filename = frame_info[1]
|
|
|
|
module = inspect.getmodule(frame_info[0])
|
|
if module:
|
|
module_name = module.__name__
|
|
else:
|
|
# inspect.getmodule(frame_info[0]) does NOT work (returns None) in
|
|
# binaries built with @mode/opt
|
|
# return the filename (minus the .py extension) as modulename
|
|
module_name = os.path.splitext(os.path.basename(filename))[0]
|
|
return module_name
|
|
except Exception as e:
|
|
warnings.warn(
|
|
f"Error deriving logger module name, using <None>. Exception: {e}",
|
|
RuntimeWarning,
|
|
)
|
|
return None
|