Spaces:
Running
Running
#!/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) | |