mutation_executor.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # -*-coding:UTF-8-*-
  2. import argparse
  3. import sys
  4. import os
  5. sys.path.append("../")
  6. from scripts.logger.lemon_logger import Logger
  7. import warnings
  8. import datetime
  9. import configparser
  10. from scripts.tools import utils
  11. """Init cuda"""
  12. warnings.filterwarnings("ignore")
  13. os.environ["KERAS_BACKEND"] = "tensorflow"
  14. os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" # 只显示 warning 和 Error
  15. os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
  16. os.environ["CUDA_VISIBLE_DEVICES"] = ""
  17. """Setting random seed"""
  18. if __name__ == "__main__":
  19. # config_name = sys.argv[1]
  20. config_name = "demo.conf"
  21. parse = argparse.ArgumentParser()
  22. parse.add_argument(
  23. "--exp",
  24. type=str,
  25. choices=[
  26. "lexnet-cifar10",
  27. "lenet5-fashion-mnist",
  28. "fashion2",
  29. "svhn",
  30. "lenet5-mnist",
  31. "alexnet-cifar10",
  32. "mobilenet.1.00.224-imagenet",
  33. "vgg16-imagenet",
  34. ],
  35. help="experiments identifiers",
  36. )
  37. parse.add_argument("--root_dir", type=str, help="root dir")
  38. parse.add_argument(
  39. "--output_dir", type=str, help="relative path of output dir(from root dir)"
  40. )
  41. parse.add_argument(
  42. "--mutate_num",
  43. type=int,
  44. help="number of variant models generated by each mutation operator",
  45. )
  46. parse.add_argument("--config_name", type=str, help="config name,like demo.conf")
  47. flags_input, unparsed = parse.parse_known_args(sys.argv[1:])
  48. lemon_cfg = configparser.ConfigParser()
  49. cfg_path = os.path.join(flags_input.root_dir, "config", flags_input.config_name)
  50. lemon_cfg.read(cfg_path)
  51. parameters = lemon_cfg["parameters"]
  52. flags = argparse.Namespace(
  53. mutate_ops=parameters["mutate_ops"],
  54. exps=flags_input.exp.lstrip().rstrip().split(" "),
  55. origin_model_dir=os.path.join(
  56. flags_input.root_dir, parameters["origin_model_dir"]
  57. ),
  58. output_dir=flags_input.output_dir,
  59. backend=parameters["backend"],
  60. mutate_num=flags_input.mutate_num,
  61. mutate_ratio=parameters.getfloat("mutate_ratio"),
  62. test_size=parameters.getint("test_size"),
  63. threshold=parameters.getfloat("threshold"),
  64. redis_db=lemon_cfg["parameters"].getint("redis_db"),
  65. python_prefix=parameters["python_prefix"].rstrip("/"),
  66. )
  67. parse = argparse.ArgumentParser()
  68. if not os.path.exists(flags.output_dir):
  69. os.makedirs(flags.output_dir)
  70. main_log = Logger()
  71. """Lemon process"""
  72. main_log.logger.info("Success: Lemon start successfully!")
  73. start_time = datetime.datetime.now()
  74. for exp_identifier in flags.exps:
  75. """Make directory"""
  76. experiment_dir = os.path.join(
  77. flags.output_dir, exp_identifier
  78. ) # exp : like lenet5-mnist
  79. mut_dir = os.path.join(experiment_dir, "mut_model")
  80. crash_dir = os.path.join(experiment_dir, "crash")
  81. nan_dir = os.path.join(experiment_dir, "nan")
  82. inner_output_dir = os.path.join(experiment_dir, "inner_output")
  83. metrics_result_dir = os.path.join(experiment_dir, "metrics_result")
  84. print(experiment_dir)
  85. if not os.path.exists(experiment_dir):
  86. os.makedirs(experiment_dir)
  87. if not os.path.exists(mut_dir):
  88. os.makedirs(mut_dir)
  89. if not os.path.exists(crash_dir):
  90. os.makedirs(crash_dir)
  91. if not os.path.exists(nan_dir):
  92. os.makedirs(nan_dir)
  93. if not os.path.exists(inner_output_dir):
  94. os.makedirs(inner_output_dir)
  95. if not os.path.exists(metrics_result_dir):
  96. os.makedirs(metrics_result_dir)
  97. try:
  98. """Mutate and get output of different backends"""
  99. main_log.info("INFO:Lemon mutation starting!")
  100. main_log.info("INFO:Lemon for exp: {}".format(exp_identifier))
  101. if "svhn" in exp_identifier or "fashion2" in exp_identifier:
  102. origin_model_name = "{}_origin.hdf5".format(exp_identifier)
  103. else:
  104. origin_model_name = "{}_origin.h5".format(exp_identifier)
  105. origin_model_file = os.path.join(flags.origin_model_dir, origin_model_name)
  106. mutate_lemon = (
  107. "{}/lemon/bin/python -u -m mutate_lemon --mutate_op {} --model {} --output_dir {}"
  108. " --backends {} --mutate_num {} --mutate_ratio {} --exp {} --test_size {} --redis_db {} --config_name {}".format(
  109. flags.python_prefix,
  110. flags.mutate_ops,
  111. origin_model_file,
  112. flags.output_dir,
  113. flags.backend,
  114. flags.mutate_num,
  115. flags.mutate_ratio,
  116. exp_identifier,
  117. flags.test_size,
  118. flags.redis_db,
  119. config_name,
  120. )
  121. )
  122. os.system(mutate_lemon)
  123. print(mutate_lemon)
  124. except Exception:
  125. main_log.error("Error: Lemon for exp:{} Failed!".format(exp_identifier))
  126. main_log.exception(sys.exc_info())
  127. end_time = datetime.datetime.now()
  128. time_delta = end_time - start_time
  129. h, m, s = utils.ToolUtils.get_HH_mm_ss(time_delta)
  130. main_log.info(
  131. "INFO:Lemon is done: Time used: {} hour,{} min,{} sec".format(h, m, s)
  132. )