diff --git a/.drone.yml b/.drone.yml index 53138df6..4235983f 100644 --- a/.drone.yml +++ b/.drone.yml @@ -25,3 +25,4 @@ steps: - coverage run --source pytorch_lightning -m py.test pytorch_lightning tests -v --doctest-modules # --flake8 - coverage report - codecov --token $CODECOV_TOKEN # --pr $DRONE_PULL_REQUEST --build $DRONE_BUILD_NUMBER --branch $DRONE_BRANCH --commit $DRONE_COMMIT --tag $DRONE_TAG + - python tests/collect_env_details.py diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5312cf39..8d0ab369 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -40,12 +40,12 @@ Minimal means having the shortest code but still preserving the bug. --> ### Environment Please copy and paste the output from our -[environment collection script](https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py) +[environment collection script](https://raw.githubusercontent.com/PyTorchLightning/pytorch-lightning/master/tests/collect_env_details.py) (or fill out the checklist below manually). You can get the script and run it with: ``` -wget https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py +wget https://raw.githubusercontent.com/PyTorchLightning/pytorch-lightning/master/tests/collect_env_details.py # For security purposes, please check the contents of collect_env.py before running it. python collect_env.py ``` diff --git a/setup.cfg b/setup.cfg index 1db2a972..8759d159 100644 --- a/setup.cfg +++ b/setup.cfg @@ -13,10 +13,6 @@ markers = filterwarnings gpus_param_tests -[pycodestyle] -ignore = E731,W504 -max-line-length = 120 - [coverage:report] exclude_lines = pragma: no-cover @@ -56,4 +52,5 @@ license_file = LICENSE convention = pep257 # D104, D107: Ignore missing docstrings in __init__ files and methods. # D202: Ignore a blank line after docstring (collision with Python Black in decorators) -add-ignore = D104, D107, D202 +add-ignore = D104,D107,D202 +max-line-length = 120 diff --git a/tests/collect_env_details.py b/tests/collect_env_details.py new file mode 100644 index 00000000..957397f3 --- /dev/null +++ b/tests/collect_env_details.py @@ -0,0 +1,98 @@ +"""Diagnose your system and show basic information + +This server mainly to get detail info for better bug reporting. + +""" + +import os +import re +import sys +import platform + +import numpy +import tensorboard +import torch +import tqdm + +sys.path += [os.path.abspath('..'), os.path.abspath('.')] +import pytorch_lightning # noqa: E402 + +LEVEL_OFFSET = '\t' +KEY_PADDING = 20 + + +def run_and_parse_first_match(run_lambda, command, regex): + """Runs command using run_lambda, returns the first regex match if it exists""" + rc, out, _ = run_lambda(command) + if rc != 0: + return None + match = re.search(regex, out) + if match is None: + return None + return match.group(1) + + +def get_running_cuda_version(run_lambda): + return run_and_parse_first_match(run_lambda, 'nvcc --version', r'V(.*)$') + + +def info_system(): + return { + 'OS': platform.system(), + 'architecture': platform.architecture(), + 'version': platform.version(), + 'processor': platform.processor(), + 'python': platform.python_version(), + } + + +def info_cuda(): + return { + 'GPU': set([torch.cuda.get_device_name(i) for i in range(torch.cuda.device_count())]), + # 'nvidia_driver': get_nvidia_driver_version(run_lambda), + 'available': torch.cuda.is_available(), + 'version': torch.version.cuda, + } + + +def info_packages(): + return { + 'numpy': numpy.__version__, + "pyTorch_version": torch.__version__, + 'pyTorch_debug': torch.version.debug, + 'pytorch-lightning': pytorch_lightning.__version__, + 'tensorboard': tensorboard.__version__, + 'tqdm': tqdm.__version__, + } + + +def nice_print(details, level=0): + lines = [] + for k in sorted(details): + key = f'{k}:' + if isinstance(details[k], dict): + lines += [level * LEVEL_OFFSET + key] + lines += nice_print(details[k], level + 1) + elif isinstance(details[k], (set, list, tuple)): + lines += [level * LEVEL_OFFSET + key] + lines += [(level + 1) * LEVEL_OFFSET + v for v in details[k]] + else: + template = '{:%is} {}' % KEY_PADDING + key_val = template.format(key, details[k]) + lines += [(level * LEVEL_OFFSET) + key_val] + return lines + + +def main(): + details = { + "system": info_system(), + 'cuda': info_cuda(), + 'packages': info_packages(), + } + lines = nice_print(details) + text = os.linesep.join(lines) + print(text) + + +if __name__ == '__main__': + main()