"""Generate a mock model for LLVM tests for Register Allocation. The generated model is not a neural net - it is just a tf.function with the correct input and output parameters. """ ## By construction, the mock model will always output the first liverange that can be evicted. import os import sys import tensorflow as tf POLICY_DECISION_LABEL = "priority" POLICY_OUTPUT_SPEC = """ [ { "logging_name": "priority", "tensor_spec": { "name": "StatefulPartitionedCall", "port": 0, "type": "float", "shape": [ 1 ] } } ] """ PER_LIVEINTERVAL_INT64_FEATURE_LIST = ["li_size", "stage"] PER_LIVEINTERVAL_FLOAT32_FEATURE_LIST = ["weight"] PER_LIVEINTERVAL_FEATURE_LIST = ( PER_LIVEINTERVAL_FLOAT32_FEATURE_LIST + PER_LIVEINTERVAL_INT64_FEATURE_LIST ) CONTEXT_FEATURE_LIST = ("discount", "reward", "step_type") def get_input_signature(): """Returns (time_step_spec, action_spec) for LLVM register allocation.""" inputs = dict( (key, tf.TensorSpec(dtype=tf.int64, shape=(), name=key)) for key in PER_LIVEINTERVAL_INT64_FEATURE_LIST ) inputs.update( dict( (key, tf.TensorSpec(dtype=tf.float32, shape=(), name=key)) for key in PER_LIVEINTERVAL_FLOAT32_FEATURE_LIST ) ) inputs.update( dict( (key, tf.TensorSpec(dtype=tf.float32, shape=(), name=key)) for key in ["discount", "reward"] ) ) inputs.update( dict( (key, tf.TensorSpec(dtype=tf.int32, shape=(), name=key)) for key in ["step_type"] ) ) return inputs def get_output_spec_path(path): return os.path.join(path, "output_spec.json") def build_mock_model(path): """Build and save the mock model with the given signature.""" module = tf.Module() # We have to set this useless variable in order for the TF C API to correctly # intake it module.var = tf.Variable(0, dtype=tf.float32) def action(*inputs): s1 = tf.reduce_sum( [ tf.cast(inputs[0][key], tf.float32) for key in PER_LIVEINTERVAL_FEATURE_LIST ], axis=0, ) s2 = tf.reduce_sum( [tf.cast(inputs[0][key], tf.float32) for key in CONTEXT_FEATURE_LIST] ) # Add a large number so s won't be 0. s = s1 + s2 result = s + module.var return {POLICY_DECISION_LABEL: result} module.action = tf.function()(action) action = {"action": module.action.get_concrete_function(get_input_signature())} tf.saved_model.save(module, path, signatures=action) output_spec_path = get_output_spec_path(path) with open(output_spec_path, "w") as f: print(f"Writing output spec to {output_spec_path}.") f.write(POLICY_OUTPUT_SPEC) def main(argv): assert len(argv) == 2 model_path = argv[1] build_mock_model(model_path) if __name__ == "__main__": main(sys.argv)