sh_commands.py 6.2 KB
Newer Older
1 2 3 4 5
import sh
import re
import time
import falcon_cli

L
Liangliang He 已提交
6

7 8 9 10
################################
# common
################################
def strip_invalid_utf8(str):
L
Liangliang He 已提交
11 12
    return sh.iconv(str, "-c", "-t", "UTF-8")

13 14

def make_output_processor(buff):
L
Liangliang He 已提交
15 16 17 18 19 20
    def process_output(line):
        print(line.strip())
        buff.append(line)

    return process_output

21 22 23 24 25

################################
# adb commands
################################
def adb_split_stdout(stdout_str):
L
Liangliang He 已提交
26 27 28 29
    stdout_str = strip_invalid_utf8(stdout_str)
    # Filter out last empty line
    return [l.strip() for l in stdout_str.split('\n') if len(l.strip()) > 0]

30 31

def adb_devices(target_socs=None):
32 33 34 35 36 37 38
    device_ids = []
    p = re.compile(r'(\w+)\s+device')
    for line in adb_split_stdout(sh.adb("devices")):
        m = p.match(line)
        if m:
            device_ids.append(m.group(1))

L
Liangliang He 已提交
39 40 41 42 43 44 45 46 47 48 49
    if target_socs is not None:
        target_socs_set = set(target_socs)
        target_devices = []
        for serialno in device_ids:
            props = adb_getprop_by_serialno(serialno)
            if props["ro.board.platform"] in target_socs_set:
                target_devices.append(serialno)
        return target_devices
    else:
        return device_ids

50 51

def adb_getprop_by_serialno(serialno):
L
Liangliang He 已提交
52 53 54
    outputs = sh.adb("-s", serialno, "shell", "getprop")
    raw_props = adb_split_stdout(outputs)
    props = {}
55
    p = re.compile(r'\[(.+)\]: \[(.+)\]')
L
Liangliang He 已提交
56 57 58 59 60 61
    for raw_prop in raw_props:
        m = p.match(raw_prop)
        if m:
            props[m.group(1)] = m.group(2)
    return props

62

63
def adb_supported_abis(serialno):
L
Liangliang He 已提交
64 65 66 67 68
    props = adb_getprop_by_serialno(serialno)
    abilist_str = props["ro.product.cpu.abilist"]
    abis = [abi.strip() for abi in abilist_str.split(',')]
    return abis

69

70
def adb_get_all_socs():
L
Liangliang He 已提交
71 72 73 74 75
    socs = []
    for d in adb_devices():
        props = adb_getprop_by_serialno(d)
        socs.append(props["ro.board.platform"])
    return set(socs)
76

L
Liangliang He 已提交
77 78 79 80

def adb_run(serialno,
            host_bin_path,
            bin_name,
81 82 83
            args="",
            opencl_profiling=1,
            vlog_level=0,
84 85
            device_bin_path="/data/local/tmp/mace",
            out_of_range_check=1):
L
Liangliang He 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
    host_bin_full_path = "%s/%s" % (host_bin_path, bin_name)
    device_bin_full_path = "%s/%s" % (device_bin_path, bin_name)
    props = adb_getprop_by_serialno(serialno)
    print(
        "====================================================================="
    )
    print("Run on device: %s, %s, %s" % (serialno, props["ro.board.platform"],
                                         props["ro.product.model"]))
    sh.adb("-s", serialno, "shell", "rm -rf %s" % device_bin_path)
    sh.adb("-s", serialno, "shell", "mkdir -p %s" % device_bin_path)
    print("Push %s to %s" % (host_bin_full_path, device_bin_full_path))
    sh.adb("-s", serialno, "push", host_bin_full_path, device_bin_full_path)
    print("Run %s" % device_bin_full_path)
    stdout_buff = []
    process_output = make_output_processor(stdout_buff)
    p = sh.adb(
        "-s",
        serialno,
        "shell",
        "MACE_OUT_OF_RANGE_CHECK=%d MACE_OPENCL_PROFILING=%d "
        "MACE_CPP_MIN_VLOG_LEVEL=%d %s %s" %
        (out_of_range_check, opencl_profiling, vlog_level,
         device_bin_full_path, args),
        _out=process_output,
        _bg=True,
        _err_to_out=True)
    p.wait()
    return "".join(stdout_buff)
114 115 116 117 118 119


################################
# bazel commands
################################
def bazel_build(target, strip="always", abi="armeabi-v7a"):
L
Liangliang He 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
    print("Build %s with ABI %s" % (target, abi))
    stdout_buff = []
    process_output = make_output_processor(stdout_buff)
    p = sh.bazel(
        "build",
        "-c",
        "opt",
        "--strip",
        strip,
        "--verbose_failures",
        target,
        "--crosstool_top=//external:android/crosstool",
        "--host_crosstool_top=@bazel_tools//tools/cpp:toolchain",
        "--cpu=%s" % abi,
        "--copt=-std=c++11",
        "--copt=-D_GLIBCXX_USE_C99_MATH_TR1",
        "--copt=-DMACE_DISABLE_NO_TUNING_WARNING",
        "--copt=-Werror=return-type",
        "--copt=-O3",
        "--define",
        "neon=true",
        "--define",
        "openmp=true",
        _out=process_output,
        _bg=True,
        _err_to_out=True)
    p.wait()
    return "".join(stdout_buff)

149 150

def bazel_target_to_bin(target):
L
Liangliang He 已提交
151 152 153 154 155 156 157 158
    # change //mace/a/b:c to bazel-bin/mace/a/b/c
    prefix, bin_name = target.split(':')
    prefix = prefix.replace('//', '/')
    if prefix.startswith('/'):
        prefix = prefix[1:]
    host_bin_path = "bazel-bin/%s" % prefix
    return host_bin_path, bin_name

159 160 161 162 163 164

################################
# mace commands
################################
# TODO this should be refactored
def gen_encrypted_opencl_source(codegen_path="mace/codegen"):
L
Liangliang He 已提交
165 166 167 168 169 170
    sh.mkdir("-p", "%s/opencl" % codegen_path)
    sh.python(
        "mace/python/tools/encrypt_opencl_codegen.py",
        "--cl_kernel_dir=./mace/kernels/opencl/cl/",
        "--output_path=%s/opencl/opencl_encrypt_program.cc" % codegen_path)

171 172

def gen_mace_version(codegen_path="mace/codegen"):
L
Liangliang He 已提交
173 174 175 176
    sh.mkdir("-p", "%s/version" % codegen_path)
    sh.bash("mace/tools/git/gen_version_source.sh",
            "%s/version/version.cc" % codegen_path)

177

L
liuqi 已提交
178
def gen_compiled_opencl_source(codegen_path="mace/codegen"):
L
Liangliang He 已提交
179 180 181 182 183
    sh.mkdir("-p", "%s/opencl" % codegen_path)
    sh.python(
        "mace/python/tools/opencl_codegen.py",
        "--output_path=%s/opencl/opencl_compiled_program.cc" % codegen_path)

L
liuqi 已提交
184

185 186 187
################################
# falcon
################################
L
Liangliang He 已提交
188
def falcon_tags(tags_dict):
L
Liangliang He 已提交
189 190 191 192 193 194 195
    tags = ""
    for k, v in tags_dict.iteritems():
        if tags == "":
            tags = "%s=%s" % (k, v)
        else:
            tags = tags + ",%s=%s" % (k, v)
    return tags
L
Liangliang He 已提交
196

197

L
Liangliang He 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211
def falcon_push_metrics(metrics, endpoint="mace_dev", tags={}):
    cli = falcon_cli.FalconCli.connect(
        server="transfer.falcon.miliao.srv", port=8433, debug=False)
    ts = int(time.time())
    falcon_metrics = [{
        "endpoint": endpoint,
        "metric": key,
        "tags": falcon_tags(tags),
        "timestamp": ts,
        "value": value,
        "step": 86400,
        "counterType": "GAUGE"
    } for key, value in metrics.iteritems()]
    cli.update(falcon_metrics)