| #!/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 os |
| import socket |
| from string import Template |
| from typing import List, Any |
| |
| |
| def get_env_variable_or_raise(env_name: str) -> str: |
| r""" |
| Tries to retrieve environment variable. Raises ``ValueError`` |
| if no environment variable found. |
| |
| Args: |
| env_name (str): Name of the env variable |
| """ |
| value = os.environ.get(env_name, None) |
| if value is None: |
| msg = f"Environment variable {env_name} expected, but not set" |
| raise ValueError(msg) |
| return value |
| |
| |
| def get_socket_with_port() -> socket.socket: |
| addrs = socket.getaddrinfo( |
| host="localhost", port=None, family=socket.AF_UNSPEC, type=socket.SOCK_STREAM |
| ) |
| for addr in addrs: |
| family, type, proto, _, _ = addr |
| s = socket.socket(family, type, proto) |
| try: |
| s.bind(("localhost", 0)) |
| s.listen(0) |
| return s |
| except OSError as e: |
| s.close() |
| raise RuntimeError("Failed to create a socket") |
| |
| |
| class macros: |
| """ |
| Defines simple macros for caffe2.distributed.launch cmd args substitution |
| """ |
| |
| local_rank = "${local_rank}" |
| |
| @staticmethod |
| def substitute(args: List[Any], local_rank: str) -> List[str]: |
| args_sub = [] |
| for arg in args: |
| if isinstance(arg, str): |
| sub = Template(arg).safe_substitute(local_rank=local_rank) |
| args_sub.append(sub) |
| else: |
| args_sub.append(arg) |
| return args_sub |