#!/usr/bin/env python # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """Diagnose script for checking OS/hardware/python/pip/mxnet/network. The output of this script can be a very good hint to issue/problem. """ import os import platform import socket import subprocess import sys import time try: from urllib.request import urlopen from urllib.parse import urlparse except ImportError: from urlparse import urlparse from urllib2 import urlopen import argparse def parse_args(): """Parse arguments.""" parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, description='Diagnose script for checking the current system.') choices = ['python', 'pip', 'mxnet', 'os', 'hardware', 'network'] for choice in choices: parser.add_argument('--' + choice, default=1, type=int, help='Diagnose {}.'.format(choice)) parser.add_argument('--region', default='', type=str, help="Additional sites in which region(s) to test. \ Specify 'cn' for example to test mirror sites in China.") parser.add_argument('--timeout', default=10, type=int, help="Connection test timeout threshold, 0 to disable.") args = parser.parse_args() return args URLS = { 'MXNet': 'https://github.com/apache/incubator-mxnet', 'Gluon Tutorial(en)': 'http://gluon.mxnet.io', 'Gluon Tutorial(cn)': 'https://zh.gluon.ai', 'FashionMNIST': 'https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/dataset/fashion-mnist/train-labels-idx1-ubyte.gz', 'PYPI': 'https://pypi.python.org/pypi/pip', 'Conda': 'https://repo.continuum.io/pkgs/free/', } REGIONAL_URLS = { 'cn': { 'PYPI(douban)': 'https://pypi.douban.com/', 'Conda(tsinghua)': 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/', } } def connection_test(name, url, timeout=10): """Simple connection test""" urlinfo = urlparse(url) start = time.time() try: ip = socket.gethostbyname(urlinfo.netloc) except Exception as e: print('Error resolving DNS for {}: {}, {}'.format(name, url, e)) return dns_elapsed = time.time() - start start = time.time() try: _ = urlopen(url, timeout=timeout) except Exception as e: print("Error open {}: {}, {}, DNS finished in {} sec.".format(name, url, e, dns_elapsed)) return load_elapsed = time.time() - start print("Timing for {}: {}, DNS: {:.4f} sec, LOAD: {:.4f} sec.".format(name, url, dns_elapsed, load_elapsed)) def check_python(): print('----------Python Info----------') print('Version :', platform.python_version()) print('Compiler :', platform.python_compiler()) print('Build :', platform.python_build()) print('Arch :', platform.architecture()) def check_pip(): print('------------Pip Info-----------') try: import pip print('Version :', pip.__version__) print('Directory :', os.path.dirname(pip.__file__)) except ImportError: print('No corresponding pip install for current python.') def check_mxnet(): print('----------MXNet Info-----------') try: import mxnet print('Version :', mxnet.__version__) mx_dir = os.path.dirname(mxnet.__file__) print('Directory :', mx_dir) commit_hash = os.path.join(mx_dir, 'COMMIT_HASH') with open(commit_hash, 'r') as f: ch = f.read().strip() print('Commit Hash :', ch) except ImportError: print('No MXNet installed.') except IOError: print('Hashtag not found. Not installed from pre-built package.') except Exception as e: import traceback if not isinstance(e, IOError): print("An error occured trying to import mxnet.") print("This is very likely due to missing missing or incompatible library files.") print(traceback.format_exc()) def check_os(): print('----------System Info----------') print('Platform :', platform.platform()) print('system :', platform.system()) print('node :', platform.node()) print('release :', platform.release()) print('version :', platform.version()) def check_hardware(): print('----------Hardware Info----------') print('machine :', platform.machine()) print('processor :', platform.processor()) if sys.platform.startswith('darwin'): pipe = subprocess.Popen(('sysctl', '-a'), stdout=subprocess.PIPE) output = pipe.communicate()[0] for line in output.split(b'\n'): if b'brand_string' in line or b'features' in line: print(line.strip()) elif sys.platform.startswith('linux'): subprocess.call(['lscpu']) elif sys.platform.startswith('win32'): subprocess.call(['wmic', 'cpu', 'get', 'name']) def check_network(args): print('----------Network Test----------') if args.timeout > 0: print('Setting timeout: {}'.format(args.timeout)) socket.setdefaulttimeout(10) for region in args.region.strip().split(','): r = region.strip().lower() if not r: continue if r in REGIONAL_URLS: URLS.update(REGIONAL_URLS[r]) else: import warnings warnings.warn('Region {} do not need specific test, please refer to global sites.'.format(r)) for name, url in URLS.items(): connection_test(name, url, args.timeout) if __name__ == '__main__': args = parse_args() if args.python: check_python() if args.pip: check_pip() if args.mxnet: check_mxnet() if args.os: check_os() if args.hardware: check_hardware() if args.network: check_network(args)