| | |
| |
|
| |
|
| |
|
| |
|
| |
|
| | import string |
| |
|
| | import argparse |
| |
|
| | import numpy as np |
| |
|
| | from caffe2.python.model_helper import ModelHelper |
| | from caffe2.python.predictor import mobile_exporter |
| | from caffe2.python import core, workspace, brew, utils |
| |
|
| |
|
| | def parse_kwarg(kwarg_str): |
| | key, value = map(string.strip, kwarg_str.split("=", 1)) |
| | try: |
| | value = int(value) |
| | except ValueError: |
| | try: |
| | value = float(value) |
| | except ValueError: |
| | pass |
| | return key, value |
| |
|
| |
|
| | def main(args): |
| | |
| | kwargs = {"order": "NCHW"} |
| | kwargs.update(dict(args.kwargs)) |
| |
|
| | model = ModelHelper(name=args.benchmark_name) |
| |
|
| | op_type = args.operator |
| | input_name = args.input_name |
| | output_name = args.output_name |
| |
|
| | iters = int(args.iters) |
| | for i in range(iters): |
| | input_blob_name = input_name + (str(i) if i > 0 and args.chain else '') |
| | output_blob_name = output_name + str(i + 1) |
| | add_op = getattr(brew, op_type) |
| | add_op(model, input_blob_name, output_blob_name, **kwargs) |
| | if args.chain: |
| | input_name, output_name = output_name, input_name |
| |
|
| | workspace.RunNetOnce(model.param_init_net) |
| | extra_init_net_ops = [] |
| |
|
| | def make_blob_on_context(blob_name, blob_data, context): |
| | if context.upper() != "CPU": |
| | blob_name_modified = "{}_CPU".format(blob_name) |
| | else: |
| | blob_name_modified = blob_name |
| |
|
| | fill_op = core.CreateOperator( |
| | "GivenTensorFill", [], [blob_name_modified], |
| | arg=[ |
| | utils.MakeArgument("shape", blob_data.shape), |
| | utils.MakeArgument("values", blob_data) |
| | ] |
| | ) |
| | extra_init_net_ops.append(fill_op) |
| |
|
| | |
| | |
| | if context.upper() == "OPENGL": |
| | copy_op = core.CreateOperator("CopyToOpenGL", [blob_name_modified], |
| | [blob_name]) |
| | extra_init_net_ops.append(copy_op) |
| |
|
| | for unparsed_blob in args.blob: |
| | name, unparsed_dims = unparsed_blob.split('=') |
| | dims = [int(d) for d in unparsed_dims.split(',')] |
| | np_input = np.random.rand(*dims).astype(np.float32) |
| | make_blob_on_context(name, np_input, args.context) |
| |
|
| | init_net, predict_net = mobile_exporter.Export( |
| | workspace, model.net, model.params |
| | ) |
| | init_net.op.extend(extra_init_net_ops) |
| |
|
| | |
| | if args.context.upper() == "OPENGL": |
| | old_ops = [op for op in predict_net.op] |
| | del predict_net.op[:] |
| | for op in old_ops: |
| | op.type = 'OpenGL{}'.format(op.type) |
| | predict_net.op.extend(old_ops) |
| |
|
| | if args.debug: |
| | print("init_net:") |
| | for op in init_net.op: |
| | print(" ", op.type, op.input, "-->", op.output) |
| | print("predict_net:") |
| | for op in predict_net.op: |
| | print(" ", op.type, op.input, "-->", op.output) |
| |
|
| | with open(args.predict_net, 'wb') as f: |
| | f.write(predict_net.SerializeToString()) |
| | with open(args.init_net, 'wb') as f: |
| | f.write(init_net.SerializeToString()) |
| |
|
| | if __name__ == "__main__": |
| | parser = argparse.ArgumentParser( |
| | description="Utility to generate Caffe2 benchmark models.") |
| | parser.add_argument("operator", help="Caffe2 operator to benchmark.") |
| | parser.add_argument("-b", "--blob", |
| | help="Instantiate a blob --blob name=dim1,dim2,dim3", |
| | action='append') |
| | parser.add_argument("--context", help="Context to run on.", default="CPU") |
| | parser.add_argument("--kwargs", help="kwargs to pass to operator.", |
| | nargs="*", type=parse_kwarg, default=[]) |
| | parser.add_argument("--init_net", help="Output initialization net.", |
| | default="init_net.pb") |
| | parser.add_argument("--predict_net", help="Output prediction net.", |
| | default="predict_net.pb") |
| | parser.add_argument("--benchmark_name", |
| | help="Name of the benchmark network", |
| | default="benchmark") |
| | parser.add_argument("--input_name", help="Name of the input blob.", |
| | default="data") |
| | parser.add_argument("--output_name", help="Name of the output blob.", |
| | default="output") |
| | parser.add_argument("--iters", |
| | help="Number of iterations to run the operator.", |
| | default="1") |
| | parser.add_argument("-d", "--debug", help="Print debug information.", |
| | action='store_true') |
| | parser.add_argument("-c", "--chain", |
| | help="Chain ops together (create data dependencies)", |
| | action='store_true') |
| | args = parser.parse_args() |
| | main(args) |
| |
|