def wrap_model(model, target_dir, language): builder = wrap.ModuleBuilder() args = [ model, "--outdir", os.path.join(target_dir, "model"), "--language", language, "--target", "host", "--module_name", "model" ] builder.parse_command_line(args) builder.run()
def wrap_model(self, model, target_dir, module_name, language): if os.path.isdir(target_dir): rmtree(target_dir) builder = wrap.ModuleBuilder() args = [ "--model_file", model, "--outdir", os.path.join(target_dir), "--language", language, "--target", "host", "--module_name", module_name ] builder.parse_command_line(args) builder.run()
def run(self): model_id_string = "{} ({})".format( self.profiler_data.model_name, self.profiler_data.profile_options.to_long_string()) global_logger = logger.setup( format="{} %(message)s".format(model_id_string)) global_logger.info("Compiling model {} ...".format(model_id_string)) profile_src_path = os.path.join(self.ell_build_root, "tools", "utilities", "profile") # Take all .cpp, .h, .cmd, .sh, and .cmake files from the build/tools/utilities/profile directory, and only hard-code the CMakeLists file to take all_profile_files = os.listdir(profile_src_path) profile_extensions_to_deploy = [".cpp", ".h", ".cmd", ".sh", ".cmake"] profile_src_files = [ filename for filename in all_profile_files if True in [filename.endswith(ext) for ext in profile_extensions_to_deploy] ] cmakelists_file_to_deploy = "CMakeLists-device-parallel.txt.in" profile_src_files.append(cmakelists_file_to_deploy) profile_src_file_renames = { cmakelists_file_to_deploy: "CMakeLists.txt" } base_wrap_args = [ "--model_file", self.profiler_data.model_path, "--module_name", "ELL", # Profiler C++ code assumes the module name is ELL "--target", self.target, "--language", self.language, "--outdir", self.profiler_data.built_profilers_path, ] base_wrap_args.extend( self.profiler_data.profile_options.base_wrap_args()) opt_wrap_args = ["--llvm_format", "ir"] no_opt_wrap_args = [ "--no_opt_tool", "--no_llc_tool", "--llvm_format", "obj" ] profile_wrap_args = ["--profile"] profile_options_additional_compile_args = self.profiler_data.profile_options.additional_compile_args( ) if profile_options_additional_compile_args: additional_compile_args = [ "--" ] + profile_options_additional_compile_args else: additional_compile_args = [] no_opt_noprofile_builder = wrap.ModuleBuilder() no_opt_noprofile_wrap_args = base_wrap_args + no_opt_wrap_args + additional_compile_args no_opt_noprofile_builder.parse_command_line(no_opt_noprofile_wrap_args) no_opt_profile_builder = wrap.ModuleBuilder() no_opt_profile_wrap_args = base_wrap_args + no_opt_wrap_args + profile_wrap_args + additional_compile_args no_opt_profile_builder.parse_command_line(no_opt_profile_wrap_args) opt_noprofile_builder = wrap.ModuleBuilder() opt_noprofile_wrap_args = base_wrap_args + opt_wrap_args + additional_compile_args opt_noprofile_builder.parse_command_line(opt_noprofile_wrap_args) opt_profile_builder = wrap.ModuleBuilder() opt_profile_wrap_args = base_wrap_args + opt_wrap_args + profile_wrap_args + additional_compile_args opt_profile_builder.parse_command_line(opt_profile_wrap_args) # Profiler and ExecuteModel binaries expect to find the following header and object files, built with different compile args: # compiled_model.o # compiled_model.h # compiled_model_opt.o # compiled_model_opt.h # compiled_model_noprofile.o # compiled_model_noprofile.h # compiled_model_noprofile_opt.o # compiled_model_noprofile_opt.h built_name_prefix = "compiled_model" noprofile_suffix = "_noprofile" opt_suffix = "_opt" obj_suffix = ".o" header_suffix = ".h" file_suffixes = [obj_suffix, header_suffix] base_model_filename = os.path.basename(self.profiler_data.model_path) base_model_name = os.path.splitext(base_model_filename)[0] no_opt_noprofile_renames = { (base_model_name + file_suffix): (built_name_prefix + noprofile_suffix + file_suffix) for file_suffix in file_suffixes } no_opt_profile_renames = {(base_model_name + file_suffix): (built_name_prefix + file_suffix) for file_suffix in file_suffixes} opt_noprofile_renames = { (base_model_name + file_suffix): (built_name_prefix + noprofile_suffix + opt_suffix + file_suffix) for file_suffix in file_suffixes } opt_profile_renames = {(base_model_name + file_suffix): (built_name_prefix + opt_suffix + file_suffix) for file_suffix in file_suffixes} builders_and_rename_maps = [(no_opt_profile_builder, no_opt_profile_renames), (opt_profile_builder, opt_profile_renames)] if self.include_exercise_models: builders_and_rename_maps.extend([ (no_opt_noprofile_builder, no_opt_noprofile_renames), (opt_noprofile_builder, opt_noprofile_renames) ]) target_files = [] for builder_and_rename_map in builders_and_rename_maps: target_files.extend([ builder_and_rename_map[1][filename] for filename in builder_and_rename_map[1] ]) existing_files = os.listdir(self.profiler_data.built_profilers_path) need_to_build = False in [ filename in existing_files for filename in target_files ] if need_to_build: try: for builder_and_rename_map in builders_and_rename_maps: builder = builder_and_rename_map[0] rename_map = builder_and_rename_map[1] builder.run() for filename in rename_map: src_path = os.path.join( self.profiler_data.built_profilers_path, filename) dst_path = os.path.join( self.profiler_data.built_profilers_path, rename_map[filename]) shutil.copy(src_path, dst_path) except: errorType, value, traceback = sys.exc_info() msg = "### WrapException: %s: %s" % (str(errorType), str(value)) global_logger.error(msg) sys.exit(1) else: global_logger.info( "Target files already exist in path {}, skipping build".format( self.profiler_data.built_profilers_path)) keep_files = target_files # Copy profile source code into place for filename in profile_src_files: src_path = os.path.join(profile_src_path, filename) dst_name = profile_src_file_renames[ filename] if filename in profile_src_file_renames else filename dst_path = os.path.join(self.profiler_data.built_profilers_path, dst_name) keep_files.append(dst_name) shutil.copy(src_path, dst_path) all_built_files = os.listdir(self.profiler_data.built_profilers_path) delete_files = [ filename for filename in all_built_files if filename not in keep_files ] for filename in delete_files: full_path = os.path.join(self.profiler_data.built_profilers_path, filename) if os.path.isfile(full_path): global_logger.info( "Cleaning temporary build file {}".format(full_path)) os.remove(full_path) global_logger.info("Done compiling model {}.".format(model_id_string))