From 8e584759fbcfd25fa828725c7be6bcb0c4590f45 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Mon, 7 Sep 2020 15:02:02 +0800 Subject: [PATCH 01/11] Modular TensorFlow Graph C API --- ...20201027-modular-tensorflow-graph-c-api.md | 527 ++++++++++++++++++ .../flow.png | Bin 0 -> 134535 bytes 2 files changed, 527 insertions(+) create mode 100644 rfcs/20201027-modular-tensorflow-graph-c-api.md create mode 100644 rfcs/20201027-modular-tensorflow-graph-c-api/flow.png diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md new file mode 100644 index 000000000..998002f61 --- /dev/null +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -0,0 +1,527 @@ +# Modular TensorFlow Graph C API + +| Status | Proposed | +:-------------- |:---------------------------------------------------- | +| **RFC #** | [314](https://github.com/tensorflow/community/pull/314)| +| **Author(s)** | Yang Sheng (yang.sheng@intel.com), Zhoulong Jiang (zhoulong.jiang@intel.com), Yiqiang Li (yiqiang.li@intel.com), Eric Lin (eric.lin@intel.com), Jianhui Li (jian.hui.li@intel.com) | +| **Sponsor** | Rasmus Larsen (rmlarsen@google.com) | +| **Updated** | 2020-10-27 | + +## **Objective** + +TensorFlow currently provides a C++ API for registering a custom graph optimizer in [Grappler](https://www.tensorflow.org/guide/graph_optimization). This project aims to create a modular/plugin-based TensorFlow implementation with C APIs. Plugins will be able to register custom graph optimizers. Users only need to install the plugin in a specified directory, and the mechanism is able to discover and plug in the capabilities offered by the plugin. + +This RFC is based on the Modular TensorFlow [RFC](https://github.com/tensorflow/community/blob/master/rfcs/20190305-modular-tensorflow.md), which aims at extending the TensorFlow design to plug in capabilities like adding a new graph optimizer. + +## **Motivation** + +When extending TensorFlow to support a graph optimizer, one needs to inherit a new optimizer from `CustomGraphOptimizer`. However, there are no ABI-stable APIs provided. +Modular TensorFlow RFC designs a plugin architecture for several TensorFlow components(`Networking`, `Filesystems`, `Kernel`, `Graph` and `Accelerator backends`) through a stable ABI. This RFC describes the `Graph` module in the TensorFlow proper side, by introducing pluggable custom graph optimizer to the TensorFlow Grappler classes. +The pluggable graph optimizer discovery and initialization is transparent to end users. As long as the graph plugin libraries follow the design described in this RFC, it can be plugged to TensorFlow proper and add a new graph optimizer into TensorFlow Grappler. + +Caveat: The proposed C API in its current form will not be compatible with the new TensorFlow runtime ([TFRT](https://blog.tensorflow.org/2020/04/tfrt-new-tensorflow-runtime.html)) and graph compiler. +1. The nature and order of passes in the new compiler will differ significantly, probably allowing only limited reuse of algorithms or patterns from plugins developed for the existing runtime. +2. The graph compiler will not communicate with the plugin using a GraphDef based format, but some TBD format, likely based on serialized [MLIR](https://www.tensorflow.org/mlir). + + +## **User Benefit** + +This RFC provides a plugin infrastructure for TensorFlow to optimize graph with new custom optimizers, as long as users set up the system properly installing the graph plugin. + +## **Design Proposal** + +### Design Overview + +This RFC is intended to provide a new mechanism for custom graph optimizers, along with C APIs for users to implement and register their own plugable graph optimizers in Grappler. +The C APIs follows current implementation C++ API, [TF_Buffer](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/c/c_api.h#L109-L113) and related proto files are the interface between proper and plugin. +When initializing, TensorFlow loads the plugin and registers a new graph optimizer into Grappler. In the [Optimize](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/grappler/optimizers/graph_optimizer.h#L58) function, plugin authors need to deserialize `TF_Buffer` to `plugin::GraphDef` object to do some graph transformations, and serialize the optimized `plugin::GraphDef` object back to `TF_Buffer` as output. + +

+ +

+ + + +### Struct/Function/Object Overview +- Struct + - Struct that should be filled by the plugin: `P_OptimizerConfigFns`, `P_RegistrationParams`, `TF_OptimizerBuilder` + - Struct that should be filled by the proper: `TF_GrapplerItem`, `TF_GraphProperties`, `TF_FunctionLibraryDefinition` +- Function + - Function that should be implemented by plugin: + - Creation/Deletion/Optimization function of optimizer. + - `P_MessageToBuffer`, `P_BufferToMessage`: Serialization/Deserialization of objects generated by protobuf. + - `TF_InitGraphPlugin`: Optimizer registration. + - (Optional)Util function for graph transformation. +- Object: + - Object defined in plugin: [Object](#proto) generated by protobuf + +### Usage Overview + +* **Graph Optimization function** + + Graph [Optimize](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/grappler/optimizers/graph_optimizer.h#L58) function is the main part that plugin authors need to implement. The C API looks like below. Both input and output graphs are represented by serialized `TF_Buffer` objects: + ```cpp + void P_Optimize(void* optimizer, TF_Buffer* graph_buf, TF_Buffer* optimized_graph_buf, TF_Status* s); + ``` + +* **TF_Buffer and protobuf class** + + Grappler uses `GraphDef` to represent a graph and operations. It is a C++ object and is generated by protobuf toolchain with a predefined structure in graph.proto. `TF_Buffer` is a C struct representing a pointer to a block of data and its associated length, thus it can be used as a serialized protobuf object across the C API. + + In plugin side, plugin authors should first deserialize `TF_Buffer` into a `plugin::GraphDef` object, and then transform the graph. To successfully deserialize the buffer, plugin authors must keep a copy of `graph.proto` in plugin, and make it exactly the same as that in proper side, along with all other proto files which help to build a graph. Here lists all files needed and objects generated: + - [attr_value.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/attr_value.proto): AttrValue, NameAttrList + - [cost_graph.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/cost_graph.proto): CostGraphDef + - [function.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/function.proto): FunctionDefLibrary, FunctionDef, GradientDef + - [graph.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/graph.proto): GraphDef + - [node_def.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/node_def.proto): NodeDef + - [op_def.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/op_def.proto): OpDef, OpDeprecation, OpList + - [op_performance_data.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/grappler/costs/op_performance_data.proto): SessionInfo, OpInfo, NormalDistribution, LogNormalDistribution, OpPerformance, OpPerformanceList + - [resource_handle.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/resource_handle.proto): ResourceHandleProto + - [tensor.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/tensor.proto): TensorProto, VariantTensorDataProto + - [tensor_shape.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/tensor_shape.proto): TensorShapeProto + - [types.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/types.proto): DataType, SpecializedType + - [versions.proto](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/framework/versions.proto): VersionDef + + After optimizing, plugin authors need to serialize the optimized `GraphDef` object into `TF_Buffer` as output. + + Serialization function `MessageToBuffer` is already defined, desearization function `BufferToMessage` will be added in proper to convert plugin passed `TF_Buffer` back to proper's `GraphDef`. In plugin side, plugin authors need to define `P_MessageToBuffer` and `P_BufferToMessage`, which should be the same as those defined in proper, except the namespace of protobuf. + + Proper: + ```cpp + Status MessageToBuffer(const tensorflow::protobuf::MessageLite& in, TF_Buffer* out); + Status BufferToMessage(const TF_Buffer* in, tensorflow::protobuf::MessageLite& out); + ``` + + Plugin: + ```cpp + Status P_MessageToBuffer(const plugin::protobuf::MessageLite& in, TF_Buffer* out); + Status P_BufferToMessage(const TF_Buffer* in, plugin::protobuf::MessageLite& out); + ``` + +* **Util functions** + + TensorFlow proper provides a series of functions to help modify graphs more conveniently in [core/grappler/utils](https://github.com/tensorflow/tensorflow/tree/r2.3/tensorflow/core/grappler/utils) folder. Since creating C APIs for these functions is very messy, they would not be included in C APIs. Plugin authors can manually copy this part into plugin side, or they can write their own util functions. + +* **Registration** + 1. Core TensorFlow links to plugin's dynamic library and loads the function `TF_InitGraphPlugin`. + 2. In `TF_InitGraphPlugin`, + - Plugin populates `P_RegistrationParams`. + - Plugin creates an optimizer `TF_OptimizerBuilder` with creation/optimization/deletion functions. + - Plugin calls `TF_RegisterOptimizer` to register the optimizer with params. + +### Supported User Scenarios + +This section describes user scenarios for plugin graph optimization. +Plugin graph optimization is targeting backend device specific optimization, and only one optimizer is allowed to be registered per device type, so device type will be used as key to decide whether TensorFlow proper needs to run this optimizer by checking graph device type and registered device type. To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizers register to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizers they want to use by unloading the conflicting plugin. + +* **Enabling plugin optimizers** + + Front-end python users can turn on/off all registered plugin optimizers through python API. + By default, the registered optimizer are turned on, users can turn off them. The registered optimizers would be runnning if they are turned on and the graph device type is matched with registered device type. + ```python + >> from tensorflow.core.protobuf import rewriter_config_pb2 + >> config = tf.compat.v1.ConfigProto() + >> config.graph_options.rewrite_options.use_plugin_optimizers = rewriter_config_pb2.RewriterConfig.ON + ``` + +* **Configuring existing optimizers** + + If pluggable graph optimizer is registered to a device type, e.g., GPU, its optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `P_RegistrationParams`. + + ```cpp + TF_Bool get_remapping() { return false; } + TF_Bool get_auto_mixed_precision() { return true; } + + void TF_InitGraphPlugin(P_RegistrationParams* params, TF_Status* status) { + // Plugin authors can turn on/off some optimizers. + params.config_fns.get_remapping = get_remapping; + params.config_fns.get_auto_mixed_precision = get_auto_mixed_precision; + // ... + } + ``` + + If user turns on the optimizer, the recommended configuration is automatically applied and printed through the same API. If optimizers are turned off, default configuration is used. + + ```python + >> config.graph_options.rewrite_options.use_plugin_optimizers = rewriter_config_pb2.RewriterConfig.ON + {'remapping': False, 'auto_mixed_precision': False, ...} + ``` + + When multiple plugins are registered and running for a graph, an error would be raised if their recommended configurations are different. Users should unload one of the plugins or disable plugin optimizers to resolve the conflict. + +* **Execution order** + + Custom optimizers will be registered at the end of Grappler’s meta-optimizer. Plugin authors should be aware of the restrictions of their pass running at this specific point in the execution pipeline. + +### Versioning Strategy and Stability + +* **Graph C API** + + Version strategy of Graph C API follows Semantic Versioning 2.0.0 ([semver](http://semver.org/)). Each release version has a format `MAJOR.MINOR.PATCH`, as outlined in [TensorFlow version compatibility](https://www.tensorflow.org/guide/versions#semantic_versioning_20). Struct size is used to track compatibility. More details can be found in [StreamExecutor C API Versioning Strategy RFC](https://github.com/tensorflow/community/blob/master/rfcs/20200612-stream-executor-c-api/C_API_versioning_strategy.md) + +* **GraphDef** + + The compatibility of `GraphDef` between plugin and proper is guaranteed by protobuf library. + +### Detailed C APIs + +* **Graph optimization** + ```cpp + #ifdef __cplusplus + extern "C" { + #endif + + // TF_GrapplerItem represents a combination of a graph, one of more fetch nodes, + // and potentially a set of nodes to feed. + typedef struct TF_GrapplerItem TF_GrapplerItem; + + // Get TF_GrapplerItem from TF_Buffer. + TF_GrapplerItem* TF_GetGrapplerItem(TF_Buffer* buffer); + + // Get a set of node names that must be preserved. This includes feed and + // fetch nodes, keep_ops, init_ops. Fills in `max_values` and `storage_size`, + // they will be used in `TF_GetNodesToPreserve` + void TF_GetNodesToPreserveMeta(TF_GrapplerItem* item, int* max_values, + int* storage_size); + + // Get a set of node names that must be preserved. This includes feed and + // fetch nodes, keep_ops, init_ops. Fills in + // `values` and `lengths`, each of which must point to an array of length at + // least `max_values`. + // + // The elements of values will point to addresses in `storage` which must be at + // least `storage_size` bytes in length. `max_values` and `storage` can be + // obtained from TF_GetNodesToPreserveMeta + // + // Fails if storage_size is too small to hold the requested number of strings. + void TF_GetNodesToPreserve(TF_GrapplerItem* item, void** values, + size_t* lengths, int max_values, void* storage, + size_t storage_size, TF_Status* status); + + // Get a set of node names for fetch nodes. Fills in `values` and `lengths`, + // they will be used in `TF_GetFetch` + void TF_GetFetchMeta(TF_GrapplerItem* item, int* max_values, int* storage_size); + + + // Get a set of node names for fetch nodes. Fills in + // `values` and `lengths`, each of which must point to an array of length at + // least `max_values`. + // + // The elements of values will point to addresses in `storage` which must be at + // least `storage_size` bytes in length. `max_values` and `storage` can be + // obtained from TF_GetFetchMeta + // + // Fails if storage_size is too small to hold the requested number of strings. + void TF_GetFetch(TF_GrapplerItem* item, void** values, size_t* lengths, + int max_values, void* storage, size_t storage_size, + TF_Status* status); + + // Infer OpInfo::TensorProperties for graph nodes inputs/outputs. + // + // Typical use case, is to infer tensor properties from a graph, before doing + // optimization pass. Nodes modified during optimization pass have to be + // invalidated, to prevent further incorrect optimizations based on wrong shape + // and data type properties. + typedef struct TF_GraphProperties TF_GraphProperties; + + // Create GraphProperties. The item must outlive the properties. + TF_GraphProperties* TF_NewGraphProperties(TF_GrapplerItem* item); + + // Destroy GraphProperties. + void TF_DeleteGraphProperties(TF_GraphProperties* p); + + // Infer tensor shapes through abstract interpretation. + // If assume_valid_feeds is true, it can help infer shapes in the fanout of fed + // nodes. This may cause incorrectness in graph analyses, but is useful for + // simulation or scheduling. + // If aggressive_shape_inference is true, nodes are executed on the host to + // identify output values when possible and does other aggressive strategies. + // This may cause incorrectness in graph analyses, but is useful for simulation + // or scheduling. + // If include_input_tensor_values is true, the values of constant + // tensors will included in the input properties. + // If include_output_tensor_values is true, the values of constant tensors will + // be included in the output properties. + void TF_InferStatically(TF_GraphProperties* g_prop, TF_Bool assume_valid_feeds, + TF_Bool aggressive_shape_inference, + TF_Bool include_input_tensor_values, + TF_Bool include_output_tensor_values, TF_Status* s); + + // Get the size of input OpInfo::TensorProperties given node name. + void TF_GetInputPropertiesSize(TF_GraphProperties* g_prop, const char* name, + int* max_size); + + // Get the size of output OpInfo::TensorProperties given node name. + void TF_GetOutputPropertiesSize(TF_GraphProperties* g_prop, const char* name, + int* max_size); + + // Get a list of input OpInfo::TensorProperties given node name. + // OpInfo::TensorProperties is represented as TF_Buffer*. + void TF_GetInputProperties(TF_GraphProperties* g_prop, const char* name, + TF_Buffer** prop, int max_size); + + // Get a list of output OpInfo::TensorProperties given node name. + // OpInfo::TensorProperties is represented as TF_Buffer*. + void TF_GetOutputProperties(TF_GraphProperties* g_prop, const char* name, + TF_Buffer** prop, int max_size); + + // Helper to maintain a map between function names in a given + // FunctionDefLibrary and function definitions. + // Typical use case, is to look up an OpDef by type name. + typedef struct TF_FunctionLibraryDefinition TF_FunctionLibraryDefinition; + + // Create NewFunctionLibraryDefinition. + TF_FunctionLibraryDefinition* TF_NewFunctionLibraryDefinition( + TF_Buffer* graph_buf); + + // Delete NewFunctionLibraryDefinition. + void TF_DeleteFunctionLibraryDefinition(TF_FunctionLibraryDefinition* f_lib); + + // Shorthand for calling LookUp to get the OpDef from FunctionLibraryDefinition + // given op name. The returned OpDef is represented by TF_Buffer. + void TF_LookUpOpDef(TF_FunctionLibraryDefinition* f_lib, const char* name, + TF_Buffer* buf, TF_Status* s); + + #ifdef __cplusplus + } // extern "C" + #endif + ``` + +* **Registration** + + ```cpp + #ifdef __cplusplus + extern "C" { + #endif + + // Flags indicating whether existing optimizers should be turned on/off. + // It's optional for plugin to set functions to return true/false. If not + // set, proper uses default configuration. + typedef struct P_OptimizerConfigFns { + size_t struct_size; + void* ext; // reserved for future use + TF_Bool (*get_disable_model_pruning)(); + TF_Bool (*get_implementation_selector)(); + TF_Bool (*get_function_optimization)(); + TF_Bool (*get_common_subgraph_elimination)(); + TF_Bool (*get_arithmetic_optimization)(); + TF_Bool (*get_debug_stripper)(); + TF_Bool (*get_constant_folding)(); + TF_Bool (*get_shape_optimization)(); + TF_Bool (*get_auto_mixed_precision)(); + TF_Bool (*get_auto_mixed_precision_mkl)(); + TF_Bool (*get_pin_to_host_optimization)(); + TF_Bool (*get_arithmetic_optimization)(); + TF_Bool (*get_layout_optimizer)(); + TF_Bool (*get_remapping)(); + TF_Bool (*get_loop_optimization)(); + TF_Bool (*get_dependency_optimization)(); + TF_Bool (*get_memory_optimization)(); + TF_Bool (*get_auto_parallel)(); + TF_Bool (*get_scoped_allocator_optimization)(); + } P_OptimizerConfigFns; + + #define P_OPTIMIZERCONFIG_FNS_STRUCT_SIZE \ + TF_OFFSET_OF_END(P_OptimizerConfigFns, get_scoped_allocator_optimization) + + typedef struct P_RegistrationParams { + size_t struct_size; + void* ext; // reserved for future use + + int32_t major_version; + int32_t minor_version; + int32_t patch_version; + + // device_type optimizer is registered. + const char* device_type; + P_OptimizerConfigFns* config_fns; + } P_RegistrationParams; + + #define P_REGISTRATIONPARAMS_STRUCT_SIZE \ + TF_OFFSET_OF_END(P_RegistrationParams, config_fns) + + void TF_InitGraphPlugin(P_RegistrationParams* params, TF_Status* status); + + // Struct for Optimizer builder. Plugin authors must provide an optimize function. + // Creation and deletion functions are optional. + typedef struct TF_OptimizerBuilder { + void* (*create_func)(), + void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*), + void (*delete_func)(void*) + } TF_OptimizerBuilder; + + // Register plugin optimizer TF_OptimizerBuilder with P_RegistrationParams. + void TF_RegisterOptimizer(TF_OptimizerBuilder* builder, P_RegistrationParams* params, TF_Status* status); + + #ifdef __cplusplus + } // extern "C" + #endif + ``` + +### Usage Example +* **Plugin** + + Define creation, optimization, deletion function for custom optimizer. + + ```cpp + typedef struct PluginOptimizer { ... } PluginOptimizer; + + // Plugin authors must provide an optimize function. Creation and deletion functions are optional. + static void* P_Create() { + auto* optimizer = new PluginOptimizer; + return (void*)optimizer; + } + static void P_Delete(void* optimizer) { + delete static_cast(optimizer); + } + static void P_Optimize( + void* optimizer, TF_Buffer* graph_buf, + TF_Buffer* optimized_graph_buf, TF_Status* s) { + // 1. Get TF_GrapplerItem from graph_buf(optional) + TF_GrapplerItem* item = TF_GetGrapplerItem(graph_buf); + + // 2. Deserialize graph_buf into plugin::GraphDef + plugin::GraphDef graph_def; + P_BufferToMessage(graph_buf, graph_def); + + // 3. Infer shapes(optional) + TF_GraphProperties g_prop = TF_NewGraphProperties(item); + TF_InferStatically(g_prop, 0, 0, 0, 0); + int max_size; + TF_GetInputPropertiesSize(g_prop, "node1", &max_size); + std::vector in_prop_buf(max_size); + for (int i = 0; i < max_size; i++) { + in_prop_buf[i] = TF_NewBuffer(); + } + TF_GetInputProperties(g_prop, "node1", in_prop_buf.data(), &max_size); + plugin::OpInfo::TensorProperties in_prop; + P_BufferToMessage(in_prop_buf, in_prop); + for (int i = 0; i < max_size; i++) + TF_DeleteBuffer(in_prop_buf[i]); + + // 4. Get OpDef(optional) + TF_FunctionLibraryDefinition* f_lib = TF_NewFunctionLibraryDefinition(graph_buf); + plugin::OpDef op_def; + TF_Buffer* op_buf = TF_NewBuffer(); + plugin::NodeDef node_def = graph_def.node(0); + TF_LookUpOpDef(f_lib, node_def.name(), op_buf); + P_BufferToMessage(op_buf, op_def); + TF_DeleteBuffer(op_buf); + plugin::DataType dt = op_def.input_arg(0).type(); + + // 5. Transform graph(optional) + + // 6. Serialize output plugin::GraphDef into optimized_graph_buf. + P_MessageToBuffer(graph_def, optimized_graph_buf); + TF_DeleteGraphProperties(g_prop); + TF_DeleteFunctionLibraryDefinition(f_lib); + } + ``` + + Define `TF_InitGraphPlugin` that TensorFlow will call when registering the plugin: + + ```cpp + TF_Bool get_remapping() { return false; } + TF_Bool get_auto_mixed_precision() { return true; } + + void TF_InitGraphPlugin(P_RegistrationParams* params, TF_Status* status) { + params.device_type = "GPU"; + // Define some flags indicating whether existing optimizers should be turned on/off + params.config_fns.get_remapping = get_remapping; + params.config_fns.get_auto_mixed_precision = get_auto_mixed_precision; + // ... + + // Create a new builder and register it with TF_RegisterOptimizer + TF_OptimizerBuilder* builder = + TF_OptimizerBuilder(&P_Create, &P_Optimize, &P_Delete); + TF_RegisterOptimizer(builder, params, status); + if (TF_GetCode(status) != TF_OK) { /* handle errors */ } + } + ``` + +* **Proper** + + During the plugin library initialization, TensorFlow proper calls `TF_InitGraphPlugin` API (part of Graph C API). It is defined in plugin and plugin authors need to implement it to register a new custom graph optimizer. + + ```cpp + static Status InitGraphModule(void* dso_handle) { + void* dso_symbol; + tensorflow::Env* env = tensorflow::Env::Default(); + env->GetSymbolFromLibrary(dso_handle, "TF_InitGraphPlugin", &dso_symbol).IgnoreError(); + + using TF_InitGraphPlugin = void(*)(P_RegistrationParams*, TF_Status*); + auto init_plugin_fn = reinterpret_cast(dso_symbol); + + P_RegistrationParams params; + TF_Status status; + init_plugin_fn(¶ms, status); + } + ``` + + `TF_RegisterOptimizer` C API relies on `CCustomGraphOptimizer`, which might look as follows: + ```cpp + class CCustomGraphOptimizer : public CustomGraphOptimizer { + public: + explicit CCustomGraphOptimizer( + const char* device_type, + void* (*create_func)(), + void (*delete_func)(void*) + void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*, TF_Status* s)) + : optimize_func_(optimize_func), delete_func_(delete_func) { + if (create_func != nullptr) { + c_optimizer_ = (*create_func)(); + } else { + c_optimizer_ = nullptr; + } + } + Status Optimize(Cluster* cluster, const GrapplerItem& item, GraphDef* optimized_graph_def) override { + // Call C optimize_func + } + private: + void (*optimize_func_)(void*, TF_Buffer*, TF_Buffer*); + void (*delete_func_)(void*); + void* c_optimizer_; + } + ``` + +### Testing + +Minor TensorFlow releases may break graph optimizations in plugins, since op versions and graph patterns used to implement a particular public TensorFlow python API are not covered by TensorFlow’s compatibility guarantees. Therefore, plugin authors have to test both end to end python tests and golden graphs to ensure that their optimizations work as expected. + +### **Alternatives Considered** + +### **Performance Implications** + +The roundtrip serialization of protobuf objects is a performance risk, but it should be acceptable since it is only done once per session or concrete function instantiation. + +### **Dependencies** + +* It depends on third-party library [ProtoBuf](https://developers.google.com/protocol-buffers/) + +* It depends on a series of proto files defined in TensorFlow. Plugin authors must keep a copy of those files in plugin. + +* It depends on Modular TensorFlow [RFC](https://github.com/tensorflow/community/blob/master/rfcs/20190305-modular-tensorflow.md) + +### **Engineering Impact** + +* The impact to binary size / startup time / build time / test times are minimum. + +* The TensorFlow team will maintain this code. Graph C API will be packaged along with other C APIs that TensorFlow currently has. + +### **Platforms and Environments** + +* The pluggable graph mechanism is based on `LoadLibrary()` so it should work on all the platforms supported by `LoadLibrary`. The other enhancement to TensorFlow proper is platform independent. + +### **Best Practices** + +* This works with Modular TensorFlow which will be the only way to integrate new custome graph optimizers to the current TensorFlow stack. + +### **Compatibility** + +* The RFC promotes the current TensorFlow ecosystem as it supports plugging new graph optimizers to TensorFlow. + +* We don't expect this proposal to impact other parts of the TensorFlow ecosystem. It doesn't support TFLite and the new TensorFlow runtime(TFRT). It should not impede distribution strategies and would not interact with tf.function and SaveModel. diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api/flow.png b/rfcs/20201027-modular-tensorflow-graph-c-api/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..b1cbd46d260ae668a4e58c3f99769fcf2afe8746 GIT binary patch literal 134535 zcmeEuXH-*N_h$eR1OW>Of`U921O!B?AVshNN)Nq=NbkKDMMOowLJ^SO6B0m3=mbGU z=`92ZArz^hNePfZGB>Et`_5W3-{!-7_}{gZmE_)Y_St9e{oC!_m%7?_*;sg4Kp+sC z#=TqmAP`d|2*i-Yd>HuV1#y2L_(SKTe^(6z?>@5td^qHA^TACJs3L)N&xR5Be8lsf zsSgNr!k6}sZrolV5CozYXxzGK7-+SGV{I_BYoz{i$TBFBK6z`gIQ5?vY8lg!Tb~KC z6}sYf4?kpEs)`-c`ob#WXjSv!=SAJxM3$r@B1cRuzMSw$KYV$Lu98akw$nV?qT%tJ zVT=miA=6>iVaUn{8)8rFOzR$BM9G<6cS)%4ju!wXzfUG~4VPk|BK;7R< zHR(Kvwy@t<Uc_v-X!@v5khJK+bvkL%s3TaaSqo$|%S(ebKKW?-&4{h$53rAK!Z zRD2o2!zQX?e(gcJY!?jnQarZa4JqudRFJJXQq#sEgu9c3j5Zuheuos|rDXb#I>ikr zlb5E&yB>fW!^p%3tPy@x&#*ruM(!O0F@SU#Ig#CIG97~$40a97RpWLWC#|y4DdjE< zo~idE7*&Suu77jFBHf6ea@1q$%B~(yHCu^lCJ#d9b7Dq+`KUvU%iNFNQv!b# z;c;Uf723u}pxmrIKQr3TcBUe6`Xv3CtgIHiGvyJ@sDo4s^f@dNlu5;=RgQYDWmXxA z0pjy=P4SaA)|wfJ^3H*|H7YCD9)CY3}rt>V6^x4W=1Y|{r+*0R`tCQVb z8l+}~D<)qt?T1LTlb)h0Z0}Y-c13%NQ6i2WtY5g~(*t#_+d5Yh+P8V;zq~xzHCSSR z({FHQ*VfHQWGE@RzLlFIF~j*@NC#f>^cj*pGOt^KaD^PyZ*F1)aoR49<|lR?QuBznncr1u1mo&3QfdS{rWVznxLJ@+Fn!c zDJ~*RXHl<1mOS9eultBh1y;s~Eb;{MP((KM%X2iM^`l>~YE`kLlwo|AJCs~(4ys~fWKkg8a>zwQyOcE!A=18O55}Oze;QKhix08f-B_qo*y~Frd`Vl2 z2{zAsW^jd+%cHcDee(6@v~-rl`XonC2G8t5lUYpoml%RutVAJ=^O5bdtk!oD_}y3& zMoHDvx4A8Unw5B}E8TSdAjZg-HdJbAn-Bphs<7B3%OBM;tSy>@`t58v;mopvuQRmY zT$SWvxTE9!;i}EkutxG#o%f@4_c6Qgxdz<{?l0co5sKOgbKfQRm;~ilI zH$$`|^f~W9t6MK{mRt}48SOxoTU*;NFb45v>Ano(nRV)qbtNv1#5u@2b=O3F&Z*z}Hj}dYg!A!Wuj;-;EhPE5f%yyfD3zfl z;WzyrZAgU$GgL||{u7JbH8zG1Jy#8E=#t8YJA98KPCVaJUtf@cZ=2kk%+>hVF)OuOxo)FdaYJ(vtrS^TapfCN4f+<>{Y?6iM>itEQiZFifw;NN0UaGh^}8N> zdUdSc1?`rjQwc82?~ zi+9Hwf;PtV-(P)*=D@mAd!Ca`xvF}U$))C+FEb5WP#&~;J;as{#h zZbn)N!o$a&<2gPpPp?rK+&bO}sxO_!W)8u!gSHmYPE-dwb0Hcp2O&deLau!E>Ui{h zPChrBAZ}4}b$L5KyePT;(*xfz^Q5=A_%+C&TUF~kPyMa z7;+=Opv`(~gy;Fr%ng6@A8oJAMJ2hKtH*;~Mn7AE_ZM%!*Vz#jS%4=>97o(EhtISp zIoX<9`JutYjuW7BTet5C78%FGoveapxcG>7irzFmY{Pxi5sXIl5n3hYPc$lj%$=;5 zr@o}YR-8>Kg}Ut!DDsA_XLfV5Ks;+Dn`@mUKp?#>Wnec;X<~LCtLdWzZZ}c)SL;vF z)|WlB@S%#uyak`DaJ^RS8QN`^U$p1ao||^hV@DSSt5f{u{UPyd)uefkLfhcXc!uOk z7WtABfU#^ltE*Wi9;#|;#!n}xj3cfY zY^8>8yYx#&x*8%%KkLeq=z*wGanBXbC%Y(325*_{`RgQq zjpeR4a+dD}q^?Jd>+Vjb!B#zYSeVl*{l2Ft%N<@!J_a_F(nILO-%aYy98z-V{#b=U zq2iPc%*;%R=F%6GN(h<@pE|^SV2Mopfz60(1C)XA*I14bqQ_1x0UB}pvri5GgE}{a z<}J{fc*S$Z)?o-2t^}%WjK?*qeJ@|LwZQfzT{*tGj1_{%9HyXSBWQYuyPRJ%w2#E` z#*=Sz*0n3bp7P)%&dN=_iTVqfn5iYdwrv@Jn=wm`7V!5X3l31wGZdsv0MnGj_WL2W zbJq<=O1AyrC1RKF9fexSMElBGpu+dZ^qqvI!Q58?HHQq>V0VP`kI4i#t_Zxc643Ut zEPs|%J(-I38mxSlvPyMO-iuSzGUFPaq?(qYD0MCeG0hwCrQKsC@cgaxV89MKDTORP zb_Ht@ZUvsr63=JRZF?!R@F9Lhz{t|2G5E@Uch6kl4T$=VoDov@waE5;L*{Hu3cnDE z^h)1x7~z8XhK(-s>ieY((^-8InxI$GZ(3%FvmzLk`SndduZyF9U}^1`oVT6t{qFv% zhGkJhfuZlm2dg?BUte*-xpc@TWF4}kyUM&btZXpV=%UswP=jONKN!upF5`Ci$NlvC z65>?*H7+$hmT)dL=huul@ugR)Riz!QLDTaUhFnnUPL(^A?u2{P_(!ucV)S@bbZ`1i z50=L3xmc*&TWUgefy0}h=SzG0WgmxJ0hGQ~++D?yda6zUbRk_?bTjp>3*=UG`1SkO z_O0hpZ=AD=gL0X0SGfEt!8)F`vXHQ!OcZWFS9qSqule3E5%P0+#m_h7X|l^7Yn1bWU+zX>-grxku0|V! zw#xqIJAV9~pj%OUJz*<8aIgaJD{1pJ(O?1LXKa;p5$aDTFz z5tQRmRS`v+%Az?^iEOM2S0Qu$5ZQ=PD9!4AyT5cLCbS1=%i(7QdE>jYQVL8{Aqt=ko zW}hBwjPCC%$EB%6gpV$JKN$7MnfJF(uc89p5KiTg*W?o%qE)$`wfPB4ps*7pL$^(|P5SER}h}ViP zt9TP{u#0t4Y~4n!p`c48c>BbZVBVxR%6$Y!R(U`_X_vV!Em#hMq6CXeTy01M{lh5JR9C`xmIs&f+RU^ zH&wkaQ#Putt6Sj2X-~_ngfqyFYY(h&=O{7!7zo}dxzlfYO2NlwJ9a3Oiwkay&F%2b zDB7AGfZg5ZEIc^XpN$T#1cI3#uX$x4BN6t&$0z8MPlR+bm&`_luf{dm>@n$A^=#?;B?RwG#?%{W21erfBp*FX&7!6G`4C5DAL|MjF2In*JukYL;hU?)U37`^5qc6k6%5`jA)W z{kDWyv6Y|x(F#`ZlT&`7Xx3PV7U3(7{dLps(?yQwip0~x?m=ylBlL=Av1|#1#irff zUx8;k;(huxgldg8TCQD4kIzD*(RLZqOAg|}`!P0-mxA5qSn{`cIq*7trK0hlj%8S! zc%GpL{6=7_f6{ZSngdVOGjsSL*SOZg3I|*CO*I!^?d(QK_y&E5jaL6L^y=1YI*S)I za{lrQ9ctpiHVaEnTs^M!MJ%OKDt}eQdxTE&xtHvkil&Z*tTuMh&%A-xueXch^cQ3A z!Ks6r4J!>B-LHGJdW80L0+vS+z!bGaC<(@ax;Hb*ZG+#cCCxEKYNil6Y{jn6XGd9x zQXwmzkF0+O8oG>b(vET3yZpvtLT=T;l1sRHIos|PWZ(1v(DQtMOX!i9mB zH7%O`$_yi#V%j~dpJ6|G{IYvDXaTY~8f-JeBCMss)oOD({E~VMyB{nOPo-=F0A$Ji zGuUb}qE69&$rCo!&Sej6z-l#)g3-5==V*cMjyGLZ{Dqk-V5sy(5iDhErU1Vmo zMd!I0oeG5})X3E~sdDC;SG&WLG9VCNd*iUM#(fT$3DbyA#t%*wtuddHMDeTR;bb>V z`vaU}TVqMyN$XRf3t!{p#^=pStd31J^+spy>nLp{x)cl~beG5OIdf$)=S$|y>$B3< zq$_N=%WXv8lP=eT096@PDQwE2cH>+SVqoYtkVcW*1Y>>@hG4N>g)KcyJe7~WvS2jX zwvF!Zp6a}y@lRbOyEXG9Yd%bPZ|id&yDpRfkQ|ibkb1##GfIJUbKJ}e?G4gh*qqT* zIn!Fv>CpLM(rh6f$XQ^n%_`z|waw7w^!i}R;?XY`c4p;J3uYx!FB7iMekgS?gld}L z?n$1Z5edpZqkVmb6Qd@7-&z@ro4l3M_2T5I!^O;HCoZpT;n;dIm9Y0yuN6$Z8XI~= zd}qv-`XWB;`RzontPGnM=JO8Uk#5*AC6~MZ&`$`eKd&)bobb4KW-vp_L3=tDETE>q zlhISt`1O=g(<%MyW63R^=U1*I5SOv_$rY19W9iqihASNApvzyjQPi*ydOi7)4xasc zEGhyr?jeO#<8H;(8yHQ$xUotH9mS(hhR`&ZuiY9Zg@lG)WTQ`$zFWW4o1<lsZwMih@^rmiW$*a;J2gh{tr~-ClOB+pz_S12^SjJ#r%z-g=KJkR9rJtI1;A6kvH>*dTTs99 zOaGa7P68~AHxKryUGPTu=~KwS-BZiO3M(DfluzamZJXQHfqQ2hg}0Kqjgm$AAo&$Y znM;9}ApLRtW$m{oy_H+D!nW)2eqy%TN?V2)hy^J1MKT#-En@CWdHqW$+;|n$0umH-Wn$YDCE76%M7Mwbeqm_~+ykMvMf81os8jaxE5*g9RPXlmhV%WKu}RmoW#*PTc;sg#e{rUYc*&b@g*_t=|iP9N1oEK z;#HR56+q_-5e`C_q zB{+;Av$Vn5g(wvq&0Spxt(P`h$;%l}7Pm}Gj&(F`&Au(_WFE2vAFk>e-3B~i59#1d z$AAZ~;_+X>)K~Ef(WWVx(4m~37mhjE5l6#_<3RRurGNC@2arj`PLil`VRW-Xy{5;7 z#vhwg2~D6qRxy0|0PFGOT*B>QDeV@H(|{M7Kbfw#zT9sjz#i;QDrd$JppJPC_n%GQ zG-6o}X_Q0=NMEw$q1f|b_2EqbGH>LGP{(eqdZ_0&b?gRM;fi9n76z?m6!@K#j zw%Qc^LW%JDl~2o;&tlj^st12fv7c2K-rAWiY)bQJd3MC#sw;f`eU`N7Pkrtt7Oz~g zZi za#cRdN;QiiS^}nXfWJ-UIT4}F{37#^F6)VtpxEwn`pjpDyKoga=)W8Jb-l=Dz(+7(S`s z!dT*6WQEwpV507a7mED zPzjAm$~>t+mdz4wub>T^<1(U;RSD;-=9vDbeK?o%%p!v8dDL!y$kL1R@t#_+lg4k) z+^w$t`A)0fJKus+9Pc~uz+G61T04+jt1GxEH$a?aiBOukJIb-UqG+d`3VHSZiXL70 zyh=Y9YQ(kK#u3fXSAECgw)dIF@-2aYO_c`M;H^bFAaniB2gmYUhGJWgwBwK)mc87y z9s64OXq7-qvkD(f#r?j`-<>~vwi4}ikC7dK%gR>H85VxuE2h;0lFL__hrD{!qTV`Z z@8`@xZ9fNxPx_ofaUfKxID{8(Hf@gT%hv#<45<*JtNDE(CG%2zqfD}qT_({4$*;j$ zunmm}i@6@pZ=A)ZFnP1OFT`5ihV=S;R;fByd9bx3ZgLqtv;nq%*E6SW-XGqJT=d8f zdke$P-LDdmbsuxYW;LkWbi>PNZ1E-FdkDpcYx#z*`C+0P% zcQ^HWfznBYgl6X1H7mbDBR|S;Ef_w#?c1Wb@{U zf<-&<)a=wYN-Y2;iZ%7DonLJLyxV$#z3@|EZyc>Tc&?rUtem^lv@-pR^{j!fxjhRP z_5*?X6z$Tr5bG+8{KC|%ahw|{5VZ^8-^}WN z&ETgXoh(B}Vh>DsiM z)SIWAj(&Lb;ot8-pnJ?Bk$)5d`0|_}^Z$H0V9x)~oLKZjFR(TjYTBJ@suzX7>~|7&&Lrt`vBiH6lcbMc-SRR1u&T7?5}>hQxmTc*j&0gv ztbV4c4mzmI9SmidBj({+2}beGRgW36H8{548*rksubePsp?~;yE>L!RF?3Gw|bEJczL zcgJh8|7o%ABVK-eXXd}VMj&5k1h-{jeIm!QQ0%ia zOlAIBj-rQ}W$rUP)3F|YI4fp}gY?S1k40@dN%=b}MTP&_mty8a%}G%pp34>m#?)Y+ zGTu8m5BY45PVnZJ2aGMNNZrj0iQOG%K#6PYh?;E+TBo@RXxT{pOS;(|rCK8fE`eOP z;~)$Vn9T1z`}5sll%6v4(C-k5c4xF+VIIqbbGiGp3+G{^B>e<$4##0X)~oB^80}cY z^Fq;H=1R(chg6j@+q>oW3}uCQhSsklrAyA4-|VD4%E^IR6=g#0KWQlrKx>K+I|}x#LOv{a6xLi! zCp>A$zAzSbrO zc)}KS-LUD>hnkN7s;7=7LgB~$;sFS>psoBV)&(4sX{kJEMni=oxh$hWTE_JSi+S$Q z68e7u;vQzYci$4KaHhdJ1fynt4y64isKdzEZL7>U4rlx?zZ3f>-q+O|`SD0*C%EK@ z9Rmq{2h78?8Cnb6{Ff|{V}E#=()}Jdx)1gV`Cc*-dy39etrWYHHnMKN6_8cRVz2bq zB?W<`Pb*f9BSg#*t`6^xgM_|J_qch(7VmQX3rnhX#~H{Uw8>z9I~cNTv<|8bgv!r$ zw(7dz;QdVe=JVfm5!&p{>54WVT)>4ccQc*qp?9$VfV5v+@TD$YEJ-{4m%3~d8cR-F zSf_F!&mZ2b0Jl4a0BorM>>&WEe=m&!k%>%8l}SLM>%yCsb0umnR>=U<4*zoZrk}X* zANnI7>2r6)7QQb108d^f-iLi$ru%Qp0#;bYe=hwfS=gm+tQ3CH=mJK8{-NQS?qmN- z!FTN(0w92+_LI}e` z9Cy^ndD8OlaBl?sT5oJaY%cbgxTf^f3lyEG%erF^EU<6oya2%1wvm7St`QV{TCzML zX!kR;%MDLb>x+6A-Dp-eRMvLW?mWOa?-XK6e^H3Pzu3PIa86B0gpD3X05-}Mz0<%F zhGu|qgd?mV;ZSuP9B07?UU?%Wluom@T4)V{Go)ja42M(;N@ylZm%X0X9f;#;*Q*%( zc2X3cq8cRTZsIZI7TUEJjI*ztiF30DfC~G=Ks=A%419eouY)4HvplkO@}~^=6-fT( zHylN3qme0mIT`X^Bo(cr1Ty3eKbOp{LVvLSg636n`)7}cY`5stcWPGP-F}3RcQ2#w zQwzm)Aa=L1=JTxjkFaD9=AxU6!)YoZB@GF>@^DMNO#Gnn<@b84j?#IyjQRI*TR=${ za-RMbpvVhQV$S6!W~!i%S0VIGJ6c)(T4;4_>E|zh_ds=qr7fOOHx)2P_Za+)4L(5J z3P^tiK5|i&*<#bz?A~7KJ@yJyZ#kVq$ef*KL6t;vxTL91G&ki zpo%)r50AcZ4g^0AsROSCW2>7c#Dyi4n)pNd2HzGAP?8Md{$lfP&13_`-nbPuyD(yl zyZCD{#1~mjo>s^ErzBz`x=`)Pl-ueA+(p%08U;^4HQy`%jK`h}Jdo~w1N3V9Y1<`R z(Sz<&fR;$-jph23bQEPdqO$_WF3Yr9olsv@+wpu0vGG;MwcICr2pGt%%pKznkK?Tb z@Wq}K#b!VL3BB@eO0O3xUIgAUKVqrFpz4A~TThu?X38k}-QQDzAa3tVpaP!kcIsJn zomC0z4<&?f)M^d5?SH*c=~18XLEAz5T122veLbfhnu5);yqV|!g1j%M>wS_ zBg?;&ir6TwR2~?3jzWb^ay&y72N?pZh+%msohPMicy=#FF5m;8NK!rf7^wYRNCY-4 z&Pv3u5QyHFwk9K_V)%#qd`HWo7W(WW`1VAW3Su2V8edH_W^OYcSk7$DSHH+swq*XD z3gT?O$G8n|CVol$!7r|s_p`8a%R4ddsGXxyJNf6A!e-E@rK>(ErP}ql9`_qPAHyHX zNiEe0q*khgB_;ry~+QmP317L;awqRS0u& z*j&lTdSE*H9x%>GqGknJUq*0Lci!zuv62g*K1#9-xQFWS!wm{h`|t0xJMalexTl-H zVwo7ddC}7@mtKCP7<5M}ILbP}J;MBKsmS=-sCX~T;7EjDcVyGK;&x*J<~kVt!xrm5 z;;FH{<0CP$E2pi}-L0-vf99e3h@&cLbE#rB-TFq~xbf$lONg@5UJ$nDd6zO&nnOdg z8t+p(nmjz9k;taI4pL!D$12-mlpR|gER`QmS!~QLucn3Hr3wV}1lFythKEL9Uz=X; zjIQ1v95*KH5bzXt%;{>jv&8X%vFj_bvgd}D(FI$`YN~U!=}qZ35`f1z5FdaKfN@^S zd@KmMV?@$*r+l_>5RD>RNe_tq0Z>)98WNM%a%i(;%t&oOYtX*iWM|!jvU)9j&SZY< z^23d__Yxn0?}<%NM4kbZ6a~|tYj-A)#URvXZU7ej-~8IDMR=MF`1QLYdyqIKIg2T zHLC_42c19f#}KwZ#^o-YxG1ytYfkpp6Sm*H%`Uvm4Br0E5+XBOhA9hhwwNHyDL}*NJ=s@PT!tUcSyMv|J_}EOtOh{kO;;T?!TQ#QlzXgR4xWLi3 zY)T;!^`W_WBcxajq`4FL?40*wjLvY7Me!9EtI)6A+v6Lp{ws}0zakg9uj$t$M( z#OY$+XU$1ZBqQI)fq1&+qvS}FA-__T-GstGSJD*vEz@#2jzl+uA_F^&_QxsA4f|74 zV;2_&xdw{Zm74eFv^<90^V@Gauo0LFza61JASOD56s^=H@#bGsw32y@YiPXl(M`;z%Cd)lgEz1`Wz->-ceRH8Sn? zA3%yKV&`*D7SbmgrBFexme>;{ep%T?S-8w`XQhVUNAPS0V#jx(Y)_>0QU-ac#?v6e zh0S7H%Jez&uB8NP(2N?e8SHdddF^<&16IJTX-O135hgKwPF~t$#JRG@rV(i84J1hx z3Opf6@@%WS02-89?ce0kGtTA|YUMYbFZpCpsp=c?Nc{`q^o}!}Fi0ueH69`O8dcOK z5p7v^E1tBF3G4Gb&6M!q8xg1)ucv;vgtF^GZhTU>1I&%Q(7zfOw+qFS*XPry4s&{o z(OPYc@yq_@`?#e9Hb?l(eWmBO7my^JKs*_WpJfU!ZG_$Fo^4ni^H3ir!}q;yFMi^; zZe!s*im!a^Hxhi2K`mlufE}Y&BJ64`n3aWWsOYkMe{KKsVZL^kx|PhCqx+^aKuYNH zKn)54iqC^*D=uR`ixtePpRZ#FsSb=ZHH~5h65wIjurK~6&-Qba_weJ;ofeyXSg;Sx zl(FvxDsIfX<>AEA#^jyfjBJh?4J>qO%uwS^lTkChr-l6F1n>?LSX`nzIep8#b3w?zgB&AzAYbT}UvpNU zd@_b%UQeX1yKnkRIc#5opZNpI)d=#0K&C-XuI-LiJt*sAYtqfNWBZcHDpUs_nFhA#LG*na6+ zd6(Q5e87~;$VYokcfAbB9uZbrF!dd*Y~tKcktu_u*pP7ocg-fg>TMW#-nuGsSh98`foAVl0+_43d6 zU0??oDXcZIZxmFcyM>kjZ%I;)@%M$;nL4fY3 zna?guBjw@x2#+%YM`H%Ls=lr2IYPJge&u)+#U1CIQD0E;h`@ADA6xoubFyWaBe2Pz zKF;@M3eKq6_PB~z-Q4;I1ow)LC#S!JMCNVlm3IaNcv#G-QWhuRYuEkfTI4zg^|M*RR1QZ#i9jBD|gG}8I!2F&H#G<}qe)#$NlGFt~EV#;H z6t?GZb-(i^}kh^dti9f?FrN<_6Z`!51Vq;FuZY6axtv-3gJu@p)X$Y>q`5}c}apZX` zlC_ylj=()p@&iNGqdde(W2OjQa*>JpZyfbyV$3Y{~ zvEXceuX~>OXbgXU^JazP;=Ss`T#mPbCr@+y z&3i=V|FZ|(W`A=WK$Q+ebHNj`uDmn+kfCJhNmD1hQ;$tTA-i{a(*K zgS<}tahu;!$duBaO=(s*8RBM4@|mfQ*lH(^0t4PKr;t$gxcG=PKSinyWsM?UInzj$ zQKU45G?Bdpjt`;HBSB=2q14P}DjG- zfl2{i2f|3_8T9M?F&g)ESv06&)V7!=H}*Y~5bPz;os!4FZpSG`hokEgs51hy4jvR7 zBZ}&asrpDi`I#xSH#8W}@!>cVHNBoQ>Gk)f! zM++4ZZXga$@&UNL6xeK#7O-3TZ+@v)VM|FNorX$##AuZd803m?3jNH@9jt%o)sUaI zs~?(lnq07TrGuwXlmNcN1g|4cMNiUsK6M(ijzd9fi>~?uP~Wbc9ZI;5J8d2_2l--rO;tNl}|p|7J$Wx7YXNT7I`6NRN#@bSrfb$7GClGTulp*g!&*7 zk%zkiU6&g@>r?C4i9gOjswqeWGO~lEA4}R3R z+nSEW6{s#8ry$v);fqgAxlpuyUg<{`Ky0m#TL@zf3BR+2$D$!X<~r3}vm}vY8UUdJ z)2of%-*|l1-&z9Bkzr;XNy|d?G{uDiCbmri(AN1nnr)@O{q4ft-&qgX+baAvEqdJr z9FMCscWC$LX}RH!Jr9az1bmNJW<}dmio@qXfTnYIQTOayeEJsY2 z?xSkb)fEp}mXJJ4U6&gZKnmPP3lyop?r``(XCfDgYXRL-A>ljtPP+i*C2=~tbHZqsQu}OgEA=RGjv5?)@%n6kpUh5?Q$mc&({$z_*;r5(SdZ zozmT9E%*!IZvW8@>rS7d(81@QFDunWYJ*h5-GLK56M8cq1x!k#O*OwFWA1+-By{*N++xOv3yvMqyV|r6*G|7ZDxyf{zf+-eGzUKoYMPusE%#f z{c6)a5+0}j$?=MkQlR!gKm!h+W4 z>Lc0v&iYP5{Ekk9wjF|0&E1vLrHvY?UmPu-4P^uvFl%^`W=V#{v)?bx3=ol)YI(lQ zkWR_;d%R2!^rbG{}yn_y+UlK{HA#-Pt@ zjT&f`9W#(w>`L~ZEKc^d%R8{>HRC}pU)T){QVnErJ9H;qLne;Qcb6`pN|8`(K?bSX zFhBWw|MG)~66CjUjg;*OAF)JwfIV+(euXQ6_aOuaKRU}e!x2K8T(`YvSb!qMtEozv zu_KMLR&>@M-r?U+8RDHVBU*@99i&x_Wbc*DUR8QoOmVNJ34NzIa#ZYVp5px2{6CO} z`NOm`+yIX3HI<#&BQm9xVs~{Ei5@VUD-->KAoxEl_qgRs1GIh(GH!mgCRLe3_&1W_ zNZZ6&$QoE45jMhE&8hPl-l7(5l{UwcRH-+y7k#om70AEWX!RQHcv}TOYaaQtTH8Rff9*c-7zRm|igQH^XAoB( z&MDO`d5As$Tben3_x_&xeq)iowpV0CGgoA8fkXCjSf+%ECjytHXFfh`Unt>PZsYBu zhQH5QnsC-kfINIzsp(@1lc1-4!{LrtfhPyMsz0$EHZxJJ();tx-Emo(0e3I)ucAK8 z7@^eqyC3;_3p7U0!i&yW?8yxMj5Oz!6*)xl?di4$a*o&4Z!3LMX1G*W5Xj;x&0Y?4 zkSR6%ICV&L%;@{F6TUdO#_+QT=S@%SL`M*ivTU1{F|pcXK4`j3r2kVJN;F%hjD)Nt zCZuI9Q_x~LCi5ospzx2Qv{2=6eE5x#+m&aKJ80_ zRec-18>u1at9*B&tME$EO_0|{4=v)?j5ke4=}zny-fB0%-Ck%uTH`BlwpUUC?~~4%Sh^8BviD_x zYMa|B{kZyl2jXLp+O-SE1rOXFfQO0W8y?gFg!4cd{vVJy01#I=LofgA0B4xrX9)&d zLfY7bH#eOHcjEL@dX$+dcq+~=s>FN$!6!YLPacbzS(^NDI38b znZiQnc@#Wpq?SFW?&#KoIef-);B(o|zTV55iAdq2OHVEc9{S_qMD`bNff7MA(#(

7t=`-11Mn@-di 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 literal 0 HcmV?d00001 From 84411a9b2a0b4ac366fd960975ecd0360c389ef0 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Tue, 27 Oct 2020 19:03:04 +0800 Subject: [PATCH 02/11] Update RFC PR number --- rfcs/20201027-modular-tensorflow-graph-c-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index 998002f61..550da27fa 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -2,7 +2,7 @@ | Status | Proposed | :-------------- |:---------------------------------------------------- | -| **RFC #** | [314](https://github.com/tensorflow/community/pull/314)| +| **RFC #** | [318](https://github.com/tensorflow/community/pull/318)| | **Author(s)** | Yang Sheng (yang.sheng@intel.com), Zhoulong Jiang (zhoulong.jiang@intel.com), Yiqiang Li (yiqiang.li@intel.com), Eric Lin (eric.lin@intel.com), Jianhui Li (jian.hui.li@intel.com) | | **Sponsor** | Rasmus Larsen (rmlarsen@google.com) | | **Updated** | 2020-10-27 | From 639e1dcc51bae3031faec55437bb9b0f3640969a Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Thu, 5 Nov 2020 08:54:18 +0800 Subject: [PATCH 03/11] Update Sponsor --- rfcs/20201027-modular-tensorflow-graph-c-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index 550da27fa..e634b6fdf 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -4,7 +4,7 @@ :-------------- |:---------------------------------------------------- | | **RFC #** | [318](https://github.com/tensorflow/community/pull/318)| | **Author(s)** | Yang Sheng (yang.sheng@intel.com), Zhoulong Jiang (zhoulong.jiang@intel.com), Yiqiang Li (yiqiang.li@intel.com), Eric Lin (eric.lin@intel.com), Jianhui Li (jian.hui.li@intel.com) | -| **Sponsor** | Rasmus Larsen (rmlarsen@google.com) | +| **Sponsor** | Eugene Zhulenev (ezhulenev@google.com) | | **Updated** | 2020-10-27 | ## **Objective** From ee01d15d3e23c099031ef23d0c4d0d57a7992cb0 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Tue, 17 Nov 2020 18:57:44 +0800 Subject: [PATCH 04/11] Changing struct name with TP_ prefix. Making TP_OptimizerBuilder as a struct. --- ...20201027-modular-tensorflow-graph-c-api.md | 86 ++++++++++--------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index e634b6fdf..6ea8a02b4 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -48,12 +48,12 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz ### Struct/Function/Object Overview - Struct - - Struct that should be filled by the plugin: `P_OptimizerConfigFns`, `P_RegistrationParams`, `TF_OptimizerBuilder` + - Struct that should be filled by the plugin: `TP_OptimizerConfigFns`, `TP_RegistrationParams`, `TP_OptimizerBuilder` - Struct that should be filled by the proper: `TF_GrapplerItem`, `TF_GraphProperties`, `TF_FunctionLibraryDefinition` - Function - Function that should be implemented by plugin: - Creation/Deletion/Optimization function of optimizer. - - `P_MessageToBuffer`, `P_BufferToMessage`: Serialization/Deserialization of objects generated by protobuf. + - `plugin::MessageToBuffer`, `plugin::BufferToMessage`: Serialization/Deserialization of objects generated by protobuf. - `TF_InitGraphPlugin`: Optimizer registration. - (Optional)Util function for graph transformation. - Object: @@ -88,18 +88,18 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz After optimizing, plugin authors need to serialize the optimized `GraphDef` object into `TF_Buffer` as output. - Serialization function `MessageToBuffer` is already defined, desearization function `BufferToMessage` will be added in proper to convert plugin passed `TF_Buffer` back to proper's `GraphDef`. In plugin side, plugin authors need to define `P_MessageToBuffer` and `P_BufferToMessage`, which should be the same as those defined in proper, except the namespace of protobuf. + Serialization function `tensorflow::MessageToBuffer` is already defined, desearization function `tensorflow::BufferToMessage` will be added in proper to convert plugin passed `TF_Buffer` back to proper's `GraphDef`. In plugin side, plugin authors need to define `plugin::MessageToBuffer` and `plugin::BufferToMessage`, which should be the same as those defined in proper, except the namespace of protobuf. To be noticed, these two are internal defined functions, they are not a part of C API interface. Proper: ```cpp - Status MessageToBuffer(const tensorflow::protobuf::MessageLite& in, TF_Buffer* out); - Status BufferToMessage(const TF_Buffer* in, tensorflow::protobuf::MessageLite& out); + Status tensorflow::MessageToBuffer(const tensorflow::protobuf::MessageLite& in, TF_Buffer* out); + Status tensorflow::BufferToMessage(const TF_Buffer* in, tensorflow::protobuf::MessageLite& out); ``` Plugin: ```cpp - Status P_MessageToBuffer(const plugin::protobuf::MessageLite& in, TF_Buffer* out); - Status P_BufferToMessage(const TF_Buffer* in, plugin::protobuf::MessageLite& out); + Status plugin::MessageToBuffer(const plugin::protobuf::MessageLite& in, TF_Buffer* out); + Status plugin::BufferToMessage(const TF_Buffer* in, plugin::protobuf::MessageLite& out); ``` * **Util functions** @@ -109,8 +109,8 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz * **Registration** 1. Core TensorFlow links to plugin's dynamic library and loads the function `TF_InitGraphPlugin`. 2. In `TF_InitGraphPlugin`, - - Plugin populates `P_RegistrationParams`. - - Plugin creates an optimizer `TF_OptimizerBuilder` with creation/optimization/deletion functions. + - Plugin populates `TP_RegistrationParams`. + - Plugin populates `TP_OptimizerBuilder` with creation/optimization/deletion functions. - Plugin calls `TF_RegisterOptimizer` to register the optimizer with params. ### Supported User Scenarios @@ -130,13 +130,13 @@ Plugin graph optimization is targeting backend device specific optimization, and * **Configuring existing optimizers** - If pluggable graph optimizer is registered to a device type, e.g., GPU, its optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `P_RegistrationParams`. + If pluggable graph optimizer is registered to a device type, e.g., GPU, its optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_RegistrationParams`. ```cpp TF_Bool get_remapping() { return false; } TF_Bool get_auto_mixed_precision() { return true; } - void TF_InitGraphPlugin(P_RegistrationParams* params, TF_Status* status) { + void TF_InitGraphPlugin(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status) { // Plugin authors can turn on/off some optimizers. params.config_fns.get_remapping = get_remapping; params.config_fns.get_auto_mixed_precision = get_auto_mixed_precision; @@ -301,7 +301,7 @@ Plugin graph optimization is targeting backend device specific optimization, and // Flags indicating whether existing optimizers should be turned on/off. // It's optional for plugin to set functions to return true/false. If not // set, proper uses default configuration. - typedef struct P_OptimizerConfigFns { + typedef struct TP_OptimizerConfigFns { size_t struct_size; void* ext; // reserved for future use TF_Bool (*get_disable_model_pruning)(); @@ -323,12 +323,12 @@ Plugin graph optimization is targeting backend device specific optimization, and TF_Bool (*get_memory_optimization)(); TF_Bool (*get_auto_parallel)(); TF_Bool (*get_scoped_allocator_optimization)(); - } P_OptimizerConfigFns; + } TP_OptimizerConfigFns; - #define P_OPTIMIZERCONFIG_FNS_STRUCT_SIZE \ - TF_OFFSET_OF_END(P_OptimizerConfigFns, get_scoped_allocator_optimization) + #define TP_OPTIMIZERCONFIG_FNS_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_OptimizerConfigFns, get_scoped_allocator_optimization) - typedef struct P_RegistrationParams { + typedef struct TP_RegistrationParams { size_t struct_size; void* ext; // reserved for future use @@ -338,24 +338,30 @@ Plugin graph optimization is targeting backend device specific optimization, and // device_type optimizer is registered. const char* device_type; - P_OptimizerConfigFns* config_fns; - } P_RegistrationParams; + TP_OptimizerConfigFns* config_fns; + } TP_RegistrationParams; - #define P_REGISTRATIONPARAMS_STRUCT_SIZE \ - TF_OFFSET_OF_END(P_RegistrationParams, config_fns) - - void TF_InitGraphPlugin(P_RegistrationParams* params, TF_Status* status); + #define TP_REGISTRATIONPARAMS_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_RegistrationParams, config_fns) // Struct for Optimizer builder. Plugin authors must provide an optimize function. // Creation and deletion functions are optional. - typedef struct TF_OptimizerBuilder { + typedef struct TP_OptimizerBuilder { + size_t struct_size; + void* ext; // reserved for future use + void* (*create_func)(), void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*), void (*delete_func)(void*) - } TF_OptimizerBuilder; + } TP_OptimizerBuilder; - // Register plugin optimizer TF_OptimizerBuilder with P_RegistrationParams. - void TF_RegisterOptimizer(TF_OptimizerBuilder* builder, P_RegistrationParams* params, TF_Status* status); + #define TP_OPTIMIZERBUILDER_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_OptimizerBuilder, delete_func) + + void TF_InitGraphPlugin(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status); + + // Register plugin optimizer TP_OptimizerBuilder with TP_RegistrationParams. + void TF_RegisterOptimizer(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status); #ifdef __cplusplus } // extern "C" @@ -386,7 +392,7 @@ Plugin graph optimization is targeting backend device specific optimization, and // 2. Deserialize graph_buf into plugin::GraphDef plugin::GraphDef graph_def; - P_BufferToMessage(graph_buf, graph_def); + plugin::BufferToMessage(graph_buf, graph_def); // 3. Infer shapes(optional) TF_GraphProperties g_prop = TF_NewGraphProperties(item); @@ -399,7 +405,7 @@ Plugin graph optimization is targeting backend device specific optimization, and } TF_GetInputProperties(g_prop, "node1", in_prop_buf.data(), &max_size); plugin::OpInfo::TensorProperties in_prop; - P_BufferToMessage(in_prop_buf, in_prop); + plugin::BufferToMessage(in_prop_buf, in_prop); for (int i = 0; i < max_size; i++) TF_DeleteBuffer(in_prop_buf[i]); @@ -409,14 +415,14 @@ Plugin graph optimization is targeting backend device specific optimization, and TF_Buffer* op_buf = TF_NewBuffer(); plugin::NodeDef node_def = graph_def.node(0); TF_LookUpOpDef(f_lib, node_def.name(), op_buf); - P_BufferToMessage(op_buf, op_def); + plugin::BufferToMessage(op_buf, op_def); TF_DeleteBuffer(op_buf); plugin::DataType dt = op_def.input_arg(0).type(); // 5. Transform graph(optional) // 6. Serialize output plugin::GraphDef into optimized_graph_buf. - P_MessageToBuffer(graph_def, optimized_graph_buf); + plugin::MessageToBuffer(graph_def, optimized_graph_buf); TF_DeleteGraphProperties(g_prop); TF_DeleteFunctionLibraryDefinition(f_lib); } @@ -428,16 +434,17 @@ Plugin graph optimization is targeting backend device specific optimization, and TF_Bool get_remapping() { return false; } TF_Bool get_auto_mixed_precision() { return true; } - void TF_InitGraphPlugin(P_RegistrationParams* params, TF_Status* status) { - params.device_type = "GPU"; + void TF_InitGraphPlugin(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status) { + params->device_type = "GPU"; // Define some flags indicating whether existing optimizers should be turned on/off - params.config_fns.get_remapping = get_remapping; - params.config_fns.get_auto_mixed_precision = get_auto_mixed_precision; + params->config_fns->get_remapping = get_remapping; + params->config_fns->get_auto_mixed_precision = get_auto_mixed_precision; // ... // Create a new builder and register it with TF_RegisterOptimizer - TF_OptimizerBuilder* builder = - TF_OptimizerBuilder(&P_Create, &P_Optimize, &P_Delete); + builder->create_func = MyOptimizer_Create; + builder->optimize_func = MyOptimizer_Optimize; + builder->delete_func = MyOptimizer_Delete; TF_RegisterOptimizer(builder, params, status); if (TF_GetCode(status) != TF_OK) { /* handle errors */ } } @@ -453,12 +460,13 @@ Plugin graph optimization is targeting backend device specific optimization, and tensorflow::Env* env = tensorflow::Env::Default(); env->GetSymbolFromLibrary(dso_handle, "TF_InitGraphPlugin", &dso_symbol).IgnoreError(); - using TF_InitGraphPlugin = void(*)(P_RegistrationParams*, TF_Status*); + using TF_InitGraphPlugin = void(*)(TP_OptimizerBuilder*, TP_RegistrationParams*, TF_Status*); auto init_plugin_fn = reinterpret_cast(dso_symbol); - P_RegistrationParams params; + TP_OptimizerBuilder builder; + TP_RegistrationParams params; TF_Status status; - init_plugin_fn(¶ms, status); + init_plugin_fn(&builder, ¶ms, status); } ``` From a8d42e734ea46b8eee8c10ebe5ce86760a741a59 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Wed, 18 Nov 2020 14:28:58 +0800 Subject: [PATCH 05/11] update --- ...20201027-modular-tensorflow-graph-c-api.md | 302 +++++++++--------- .../flow.png | Bin 134535 -> 56836 bytes 2 files changed, 146 insertions(+), 156 deletions(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index 6ea8a02b4..f6661f677 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -19,9 +19,11 @@ When extending TensorFlow to support a graph optimizer, one needs to inherit a n Modular TensorFlow RFC designs a plugin architecture for several TensorFlow components(`Networking`, `Filesystems`, `Kernel`, `Graph` and `Accelerator backends`) through a stable ABI. This RFC describes the `Graph` module in the TensorFlow proper side, by introducing pluggable custom graph optimizer to the TensorFlow Grappler classes. The pluggable graph optimizer discovery and initialization is transparent to end users. As long as the graph plugin libraries follow the design described in this RFC, it can be plugged to TensorFlow proper and add a new graph optimizer into TensorFlow Grappler. -Caveat: The proposed C API in its current form will not be compatible with the new TensorFlow runtime ([TFRT](https://blog.tensorflow.org/2020/04/tfrt-new-tensorflow-runtime.html)) and graph compiler. -1. The nature and order of passes in the new compiler will differ significantly, probably allowing only limited reuse of algorithms or patterns from plugins developed for the existing runtime. -2. The graph compiler will not communicate with the plugin using a GraphDef based format, but some TBD format, likely based on serialized [MLIR](https://www.tensorflow.org/mlir). +Caveat: +- The proposed C API in its current form will not be compatible with the new TensorFlow runtime ([TFRT](https://blog.tensorflow.org/2020/04/tfrt-new-tensorflow-runtime.html)) and graph compiler. + 1. The nature and order of passes in the new compiler will differ significantly, probably allowing only limited reuse of algorithms or patterns from plugins developed for the existing runtime. + 2. The graph compiler will not communicate with the plugin using a GraphDef based format, but some TBD format, likely based on serialized [MLIR](https://www.tensorflow.org/mlir). +- Execution order. Plugin optimizers will be registered at the end of Grappler’s meta-optimizer. Plugin authors should be aware of the restrictions of their pass running at this specific point in the execution pipeline. ## **User Benefit** @@ -40,34 +42,32 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz

- - ### Struct/Function/Object Overview - Struct - - Struct that should be filled by the plugin: `TP_OptimizerConfigFns`, `TP_RegistrationParams`, `TP_OptimizerBuilder` + - Struct that should be filled by the plugin: `TP_OptimizerConfigFns`, `TP_Optimizer`, `TP_OptimizerRegistrationParams` - Struct that should be filled by the proper: `TF_GrapplerItem`, `TF_GraphProperties`, `TF_FunctionLibraryDefinition` - Function - Function that should be implemented by plugin: - Creation/Deletion/Optimization function of optimizer. - `plugin::MessageToBuffer`, `plugin::BufferToMessage`: Serialization/Deserialization of objects generated by protobuf. - `TF_InitGraphPlugin`: Optimizer registration. - - (Optional)Util function for graph transformation. + - (Optional)Internal util functions for graph transformation. - Object: - Object defined in plugin: [Object](#proto) generated by protobuf ### Usage Overview -* **Graph Optimization function** +* **Graph Optimizer function** Graph [Optimize](https://github.com/tensorflow/tensorflow/blob/r2.3/tensorflow/core/grappler/optimizers/graph_optimizer.h#L58) function is the main part that plugin authors need to implement. The C API looks like below. Both input and output graphs are represented by serialized `TF_Buffer` objects: ```cpp void P_Optimize(void* optimizer, TF_Buffer* graph_buf, TF_Buffer* optimized_graph_buf, TF_Status* s); ``` +* **Registration** + 1. Core TensorFlow links to plugin's dynamic library and loads the function `TF_InitGraphPlugin`. + 2. In `TF_InitGraphPlugin`, plugin populates `TP_OptimizerRegistrationParams`, including `TP_OptimizerConfigFns` and `TP_Optimizer`. + * **TF_Buffer and protobuf class** Grappler uses `GraphDef` to represent a graph and operations. It is a C++ object and is generated by protobuf toolchain with a predefined structure in graph.proto. `TF_Buffer` is a C struct representing a pointer to a block of data and its associated length, thus it can be used as a serialized protobuf object across the C API. @@ -102,60 +102,55 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz Status plugin::BufferToMessage(const TF_Buffer* in, plugin::protobuf::MessageLite& out); ``` -* **Util functions** +* **Plugin util C API** - TensorFlow proper provides a series of functions to help modify graphs more conveniently in [core/grappler/utils](https://github.com/tensorflow/tensorflow/tree/r2.3/tensorflow/core/grappler/utils) folder. Since creating C APIs for these functions is very messy, they would not be included in C APIs. Plugin authors can manually copy this part into plugin side, or they can write their own util functions. + Plugin util C API provides additional structs to help retrieve necessary graph information: + - `TF_GrapplerItem` represents a combination of a graph, and some more information about feed/fetch nodes, reserved nodes. + - `TF_GraphProperties` can be used to infer OpInfo::TensorProperties, typical use case is to infer tensor shapes. + - `TF_FunctionLibraryDefinition` maintains a map between op names and op definitions, typical use case is to look up an OpDef by op name, and then get some op attributes. -* **Registration** - 1. Core TensorFlow links to plugin's dynamic library and loads the function `TF_InitGraphPlugin`. - 2. In `TF_InitGraphPlugin`, - - Plugin populates `TP_RegistrationParams`. - - Plugin populates `TP_OptimizerBuilder` with creation/optimization/deletion functions. - - Plugin calls `TF_RegisterOptimizer` to register the optimizer with params. +* **Internal util functions** -### Supported User Scenarios + TensorFlow proper provides a series of functions to help modify graphs more conveniently in [core/grappler/utils](https://github.com/tensorflow/tensorflow/tree/r2.3/tensorflow/core/grappler/utils) folder. Since creating C APIs for these functions is very messy, they would not be included in C APIs. Plugin authors can manually copy this part into plugin side, or they can write their own util functions. -This section describes user scenarios for plugin graph optimization. -Plugin graph optimization is targeting backend device specific optimization, and only one optimizer is allowed to be registered per device type, so device type will be used as key to decide whether TensorFlow proper needs to run this optimizer by checking graph device type and registered device type. To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizers register to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizers they want to use by unloading the conflicting plugin. +### Supported User Scenarios -* **Enabling plugin optimizers** +This section describes user scenarios for plugin graph optimizer. +Plugin graph optimizer is targeting backend device specific optimization, and only one optimizer is allowed to be registered per device type, so device type will be used as key to decide whether TensorFlow proper needs to run this optimizer by checking graph device type and registered device type. To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizer is registered to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizer they want to use by unloading the conflicting plugin. - Front-end python users can turn on/off all registered plugin optimizers through python API. - By default, the registered optimizer are turned on, users can turn off them. The registered optimizers would be runnning if they are turned on and the graph device type is matched with registered device type. - ```python - >> from tensorflow.core.protobuf import rewriter_config_pb2 - >> config = tf.compat.v1.ConfigProto() - >> config.graph_options.rewrite_options.use_plugin_optimizers = rewriter_config_pb2.RewriterConfig.ON - ``` +### Front-end python use case -* **Configuring existing optimizers** +Flag `use_plugin_optimizers` is provided for front-end python users to control the behaviour of plugin graph optimizers. +```python +## TF-1.x +>> from tensorflow.core.protobuf import rewriter_config_pb2 +>> config = tf.compat.v1.ConfigProto() +>> config.graph_options.rewrite_options.use_plugin_optimizers = rewriter_config_pb2.RewriterConfig.OFF +## TF-2.x +>> tf.config.optimizer.set_experimental_options({"use_plugin_optimizers", False}) +``` - If pluggable graph optimizer is registered to a device type, e.g., GPU, its optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_RegistrationParams`. +This API can be used to: +1. Turn on/off all registered plugin graph optimizers. By default, the registered optimizers are turned on, users can turn off them. If the registered optimizers are turned on and the graph device type is matched with registered device type, they would be runnning. +2. Use recommended configuration of existing optimizers. +If pluggable graph optimizer is registered to a device type, e.g., GPU, it is optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_OptimizerRegistrationParams`. ```cpp TF_Bool get_remapping() { return false; } TF_Bool get_auto_mixed_precision() { return true; } - void TF_InitGraphPlugin(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status) { + void TF_InitGraphPlugin(TP_OptimizerRegistrationParams* params, TF_Status* status) { // Plugin authors can turn on/off some optimizers. - params.config_fns.get_remapping = get_remapping; - params.config_fns.get_auto_mixed_precision = get_auto_mixed_precision; + params->config_fns->get_remapping = get_remapping; + params->config_fns->get_auto_mixed_precision = get_auto_mixed_precision; // ... } ``` - If user turns on the optimizer, the recommended configuration is automatically applied and printed through the same API. If optimizers are turned off, default configuration is used. - - ```python - >> config.graph_options.rewrite_options.use_plugin_optimizers = rewriter_config_pb2.RewriterConfig.ON - {'remapping': False, 'auto_mixed_precision': False, ...} - ``` + If user turns on the optimizer, the recommended configuration is automatically applied. If optimizers are turned off, default configuration is used. When multiple plugins are registered and running for a graph, an error would be raised if their recommended configurations are different. Users should unload one of the plugins or disable plugin optimizers to resolve the conflict. -* **Execution order** - - Custom optimizers will be registered at the end of Grappler’s meta-optimizer. Plugin authors should be aware of the restrictions of their pass running at this specific point in the execution pipeline. ### Versioning Strategy and Stability @@ -169,7 +164,81 @@ Plugin graph optimization is targeting backend device specific optimization, and ### Detailed C APIs -* **Graph optimization** +* **Graph optimizer initialization** + + ```cpp + #ifdef __cplusplus + extern "C" { + #endif + + // Flags indicating whether existing optimizers should be turned on/off. + // It's optional for plugin to set functions to return true/false. If not + // set, proper uses default configuration. + typedef struct TP_OptimizerConfigFns { + size_t struct_size; + void* ext; // reserved for future use + TF_Bool (*get_disable_model_pruning)(); + TF_Bool (*get_implementation_selector)(); + TF_Bool (*get_function_optimization)(); + TF_Bool (*get_common_subgraph_elimination)(); + TF_Bool (*get_arithmetic_optimization)(); + TF_Bool (*get_debug_stripper)(); + TF_Bool (*get_constant_folding)(); + TF_Bool (*get_shape_optimization)(); + TF_Bool (*get_auto_mixed_precision)(); + TF_Bool (*get_auto_mixed_precision_mkl)(); + TF_Bool (*get_pin_to_host_optimization)(); + TF_Bool (*get_arithmetic_optimization)(); + TF_Bool (*get_layout_optimizer)(); + TF_Bool (*get_remapping)(); + TF_Bool (*get_loop_optimization)(); + TF_Bool (*get_dependency_optimization)(); + TF_Bool (*get_memory_optimization)(); + TF_Bool (*get_auto_parallel)(); + TF_Bool (*get_scoped_allocator_optimization)(); + } TP_OptimizerConfigFns; + + #define TP_OPTIMIZER_CONFIG_FNS_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_OptimizerConfigFns, get_scoped_allocator_optimization) + + // Struct for Optimizer. Plugin authors must provide an optimize function. + // Creation and deletion functions are optional. + typedef struct TP_Optimizer { + size_t struct_size; + void* ext; // reserved for future use + void* (*create_func)(); + void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*); + void (*delete_func)(void*); + } TP_Optimizer; + + #define TP_OPTIMIZER_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_Optimizer, delete_func) + + typedef struct TP_OptimizerRegistrationParams { + size_t struct_size; + void* ext; // reserved for future use + + int32_t major_version; + int32_t minor_version; + int32_t patch_version; + + // device_type optimizer is registered. + const char* device_type; + TP_OptimizerConfigFns* config_fns; + TP_Optimizer* optimizer; + } TP_OptimizerRegistrationParams; + + #define TP_OPTIMIZER_REGISTRARION_PARAMS_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_OptimizerRegistrationParams, optimizer) + + void TF_InitGraphPlugin(TP_OptimizerRegistrationParams* params, TF_Status* status); + + #ifdef __cplusplus + } // extern "C" + #endif + ``` + +* **Plugin util C API** ```cpp #ifdef __cplusplus extern "C" { @@ -184,8 +253,8 @@ Plugin graph optimization is targeting backend device specific optimization, and // Get a set of node names that must be preserved. This includes feed and // fetch nodes, keep_ops, init_ops. Fills in `max_values` and `storage_size`, - // they will be used in `TF_GetNodesToPreserve` - void TF_GetNodesToPreserveMeta(TF_GrapplerItem* item, int* max_values, + // they will be used in `TF_GetNodesToPreserveList` + void TF_GetNodesToPreserveSize(TF_GrapplerItem* item, int* max_values, int* storage_size); // Get a set of node names that must be preserved. This includes feed and @@ -195,16 +264,16 @@ Plugin graph optimization is targeting backend device specific optimization, and // // The elements of values will point to addresses in `storage` which must be at // least `storage_size` bytes in length. `max_values` and `storage` can be - // obtained from TF_GetNodesToPreserveMeta + // obtained from TF_GetNodesToPreserveSize // // Fails if storage_size is too small to hold the requested number of strings. - void TF_GetNodesToPreserve(TF_GrapplerItem* item, void** values, - size_t* lengths, int max_values, void* storage, - size_t storage_size, TF_Status* status); + void TF_GetNodesToPreserveList(TF_GrapplerItem* item, void** values, + size_t* lengths, int max_values, void* storage, + size_t storage_size, TF_Status* status); // Get a set of node names for fetch nodes. Fills in `values` and `lengths`, - // they will be used in `TF_GetFetch` - void TF_GetFetchMeta(TF_GrapplerItem* item, int* max_values, int* storage_size); + // they will be used in `TF_GetFetchNodesList` + void TF_GetFetchNodesSize(TF_GrapplerItem* item, int* max_values, int* storage_size); // Get a set of node names for fetch nodes. Fills in @@ -213,12 +282,12 @@ Plugin graph optimization is targeting backend device specific optimization, and // // The elements of values will point to addresses in `storage` which must be at // least `storage_size` bytes in length. `max_values` and `storage` can be - // obtained from TF_GetFetchMeta + // obtained from TF_GetFetchNodesSize // // Fails if storage_size is too small to hold the requested number of strings. - void TF_GetFetch(TF_GrapplerItem* item, void** values, size_t* lengths, - int max_values, void* storage, size_t storage_size, - TF_Status* status); + void TF_GetFetchNodesList(TF_GrapplerItem* item, void** values, size_t* lengths, + int max_values, void* storage, size_t storage_size, + TF_Status* status); // Infer OpInfo::TensorProperties for graph nodes inputs/outputs. // @@ -291,83 +360,6 @@ Plugin graph optimization is targeting backend device specific optimization, and #endif ``` -* **Registration** - - ```cpp - #ifdef __cplusplus - extern "C" { - #endif - - // Flags indicating whether existing optimizers should be turned on/off. - // It's optional for plugin to set functions to return true/false. If not - // set, proper uses default configuration. - typedef struct TP_OptimizerConfigFns { - size_t struct_size; - void* ext; // reserved for future use - TF_Bool (*get_disable_model_pruning)(); - TF_Bool (*get_implementation_selector)(); - TF_Bool (*get_function_optimization)(); - TF_Bool (*get_common_subgraph_elimination)(); - TF_Bool (*get_arithmetic_optimization)(); - TF_Bool (*get_debug_stripper)(); - TF_Bool (*get_constant_folding)(); - TF_Bool (*get_shape_optimization)(); - TF_Bool (*get_auto_mixed_precision)(); - TF_Bool (*get_auto_mixed_precision_mkl)(); - TF_Bool (*get_pin_to_host_optimization)(); - TF_Bool (*get_arithmetic_optimization)(); - TF_Bool (*get_layout_optimizer)(); - TF_Bool (*get_remapping)(); - TF_Bool (*get_loop_optimization)(); - TF_Bool (*get_dependency_optimization)(); - TF_Bool (*get_memory_optimization)(); - TF_Bool (*get_auto_parallel)(); - TF_Bool (*get_scoped_allocator_optimization)(); - } TP_OptimizerConfigFns; - - #define TP_OPTIMIZERCONFIG_FNS_STRUCT_SIZE \ - TF_OFFSET_OF_END(TP_OptimizerConfigFns, get_scoped_allocator_optimization) - - typedef struct TP_RegistrationParams { - size_t struct_size; - void* ext; // reserved for future use - - int32_t major_version; - int32_t minor_version; - int32_t patch_version; - - // device_type optimizer is registered. - const char* device_type; - TP_OptimizerConfigFns* config_fns; - } TP_RegistrationParams; - - #define TP_REGISTRATIONPARAMS_STRUCT_SIZE \ - TF_OFFSET_OF_END(TP_RegistrationParams, config_fns) - - // Struct for Optimizer builder. Plugin authors must provide an optimize function. - // Creation and deletion functions are optional. - typedef struct TP_OptimizerBuilder { - size_t struct_size; - void* ext; // reserved for future use - - void* (*create_func)(), - void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*), - void (*delete_func)(void*) - } TP_OptimizerBuilder; - - #define TP_OPTIMIZERBUILDER_STRUCT_SIZE \ - TF_OFFSET_OF_END(TP_OptimizerBuilder, delete_func) - - void TF_InitGraphPlugin(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status); - - // Register plugin optimizer TP_OptimizerBuilder with TP_RegistrationParams. - void TF_RegisterOptimizer(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status); - - #ifdef __cplusplus - } // extern "C" - #endif - ``` - ### Usage Example * **Plugin** @@ -434,19 +426,17 @@ Plugin graph optimization is targeting backend device specific optimization, and TF_Bool get_remapping() { return false; } TF_Bool get_auto_mixed_precision() { return true; } - void TF_InitGraphPlugin(TP_OptimizerBuilder* builder, TP_RegistrationParams* params, TF_Status* status) { + void TF_InitGraphPlugin(TP_OptimizerRegistrationParams* params, TF_Status* status) { params->device_type = "GPU"; // Define some flags indicating whether existing optimizers should be turned on/off params->config_fns->get_remapping = get_remapping; params->config_fns->get_auto_mixed_precision = get_auto_mixed_precision; // ... - // Create a new builder and register it with TF_RegisterOptimizer - builder->create_func = MyOptimizer_Create; - builder->optimize_func = MyOptimizer_Optimize; - builder->delete_func = MyOptimizer_Delete; - TF_RegisterOptimizer(builder, params, status); - if (TF_GetCode(status) != TF_OK) { /* handle errors */ } + // Set functions to create a new optimizer. + params->optimizer->create_func = P_Create; + params->optimizer->optimize_func = P_Optimize; + params->optimizer->delete_func = P_Delete; } ``` @@ -460,26 +450,27 @@ Plugin graph optimization is targeting backend device specific optimization, and tensorflow::Env* env = tensorflow::Env::Default(); env->GetSymbolFromLibrary(dso_handle, "TF_InitGraphPlugin", &dso_symbol).IgnoreError(); - using TF_InitGraphPlugin = void(*)(TP_OptimizerBuilder*, TP_RegistrationParams*, TF_Status*); + using TF_InitGraphPlugin = void(*)(TP_OptimizerRegistrationParams*, TF_Status*); auto init_plugin_fn = reinterpret_cast(dso_symbol); - TP_OptimizerBuilder builder; - TP_RegistrationParams params; - TF_Status status; - init_plugin_fn(&builder, ¶ms, status); + TP_OptimizerRegistrationParams params{TP_OPTIMIZER_REGISTRARION_PARAMS_STRUCT_SIZE}; + TP_OptimizerConfigFns config_fns{TP_OPTIMIZER_CONFIG_FNS_STRUCT_SIZE}; + TP_Optimizer optimizer{TP_OPTIMIZER_STRUCT_SIZE}; + params->config_fns = &config_fns; + params->optimizer = &optimizer; + + TF_Status* status = TF_NewStatus(); + init_plugin_fn(¶ms, status); + TF_DeleteStatus(status); } ``` - `TF_RegisterOptimizer` C API relies on `CCustomGraphOptimizer`, which might look as follows: + Optimizers relies on `CCustomGraphOptimizer`, which might look as follows: ```cpp class CCustomGraphOptimizer : public CustomGraphOptimizer { public: explicit CCustomGraphOptimizer( - const char* device_type, - void* (*create_func)(), - void (*delete_func)(void*) - void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*, TF_Status* s)) - : optimize_func_(optimize_func), delete_func_(delete_func) { + const char* device_type, TP_Optimizer* optimizer) : optimizer_(optimizer) { if (create_func != nullptr) { c_optimizer_ = (*create_func)(); } else { @@ -490,15 +481,14 @@ Plugin graph optimization is targeting backend device specific optimization, and // Call C optimize_func } private: - void (*optimize_func_)(void*, TF_Buffer*, TF_Buffer*); - void (*delete_func_)(void*); + TP_Optimizer* optimizer_; void* c_optimizer_; } ``` ### Testing -Minor TensorFlow releases may break graph optimizations in plugins, since op versions and graph patterns used to implement a particular public TensorFlow python API are not covered by TensorFlow’s compatibility guarantees. Therefore, plugin authors have to test both end to end python tests and golden graphs to ensure that their optimizations work as expected. +Minor TensorFlow releases may break graph optimizations in plugins, since op versions and graph patterns used to implement a particular public TensorFlow python API are not covered by TensorFlow’s compatibility guarantees. Therefore, plugin authors have to test both end to end python tests and golden graphs to ensure that their optimizers work as expected. ### **Alternatives Considered** diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api/flow.png b/rfcs/20201027-modular-tensorflow-graph-c-api/flow.png index b1cbd46d260ae668a4e58c3f99769fcf2afe8746..59b61575d9b34851b7f33ad98917e61cbe4b7ebc 100644 GIT binary patch literal 56836 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 literal 134535 zcmeEuXH-*N_h$eR1OW>Of`U921O!B?AVshNN)Nq=NbkKDMMOowLJ^SO6B0m3=mbGU z=`92ZArz^hNePfZGB>Et`_5W3-{!-7_}{gZmE_)Y_St9e{oC!_m%7?_*;sg4Kp+sC z#=TqmAP`d|2*i-Yd>HuV1#y2L_(SKTe^(6z?>@5td^qHA^TACJs3L)N&xR5Be8lsf zsSgNr!k6}sZrolV5CozYXxzGK7-+SGV{I_BYoz{i$TBFBK6z`gIQ5?vY8lg!Tb~KC z6}sYf4?kpEs)`-c`ob#WXjSv!=SAJxM3$r@B1cRuzMSw$KYV$Lu98akw$nV?qT%tJ zVT=miA=6>iVaUn{8)8rFOzR$BM9G<6cS)%4ju!wXzfUG~4VPk|BK;7R< zHR(Kvwy@t<Uc_v-X!@v5khJK+bvkL%s3TaaSqo$|%S(ebKKW?-&4{h$53rAK!Z zRD2o2!zQX?e(gcJY!?jnQarZa4JqudRFJJXQq#sEgu9c3j5Zuheuos|rDXb#I>ikr zlb5E&yB>fW!^p%3tPy@x&#*ruM(!O0F@SU#Ig#CIG97~$40a97RpWLWC#|y4DdjE< zo~idE7*&Suu77jFBHf6ea@1q$%B~(yHCu^lCJ#d9b7Dq+`KUvU%iNFNQv!b# z;c;Uf723u}pxmrIKQr3TcBUe6`Xv3CtgIHiGvyJ@sDo4s^f@dNlu5;=RgQYDWmXxA z0pjy=P4SaA)|wfJ^3H*|H7YCD9)CY3}rt>V6^x4W=1Y|{r+*0R`tCQVb z8l+}~D<)qt?T1LTlb)h0Z0}Y-c13%NQ6i2WtY5g~(*t#_+d5Yh+P8V;zq~xzHCSSR z({FHQ*VfHQWGE@RzLlFIF~j*@NC#f>^cj*pGOt^KaD^PyZ*F1)aoR49<|lR?QuBznncr1u1mo&3QfdS{rWVznxLJ@+Fn!c zDJ~*RXHl<1mOS9eultBh1y;s~Eb;{MP((KM%X2iM^`l>~YE`kLlwo|AJCs~(4ys~fWKkg8a>zwQyOcE!A=18O55}Oze;QKhix08f-B_qo*y~Frd`Vl2 z2{zAsW^jd+%cHcDee(6@v~-rl`XonC2G8t5lUYpoml%RutVAJ=^O5bdtk!oD_}y3& zMoHDvx4A8Unw5B}E8TSdAjZg-HdJbAn-Bphs<7B3%OBM;tSy>@`t58v;mopvuQRmY zT$SWvxTE9!;i}EkutxG#o%f@4_c6Qgxdz<{?l0co5sKOgbKfQRm;~ilI zH$$`|^f~W9t6MK{mRt}48SOxoTU*;NFb45v>Ano(nRV)qbtNv1#5u@2b=O3F&Z*z}Hj}dYg!A!Wuj;-;EhPE5f%yyfD3zfl z;WzyrZAgU$GgL||{u7JbH8zG1Jy#8E=#t8YJA98KPCVaJUtf@cZ=2kk%+>hVF)OuOxo)FdaYJ(vtrS^TapfCN4f+<>{Y?6iM>itEQiZFifw;NN0UaGh^}8N> zdUdSc1?`rjQwc82?~ zi+9Hwf;PtV-(P)*=D@mAd!Ca`xvF}U$))C+FEb5WP#&~;J;as{#h zZbn)N!o$a&<2gPpPp?rK+&bO}sxO_!W)8u!gSHmYPE-dwb0Hcp2O&deLau!E>Ui{h zPChrBAZ}4}b$L5KyePT;(*xfz^Q5=A_%+C&TUF~kPyMa z7;+=Opv`(~gy;Fr%ng6@A8oJAMJ2hKtH*;~Mn7AE_ZM%!*Vz#jS%4=>97o(EhtISp zIoX<9`JutYjuW7BTet5C78%FGoveapxcG>7irzFmY{Pxi5sXIl5n3hYPc$lj%$=;5 zr@o}YR-8>Kg}Ut!DDsA_XLfV5Ks;+Dn`@mUKp?#>Wnec;X<~LCtLdWzZZ}c)SL;vF z)|WlB@S%#uyak`DaJ^RS8QN`^U$p1ao||^hV@DSSt5f{u{UPyd)uefkLfhcXc!uOk z7WtABfU#^ltE*Wi9;#|;#!n}xj3cfY zY^8>8yYx#&x*8%%KkLeq=z*wGanBXbC%Y(325*_{`RgQq zjpeR4a+dD}q^?Jd>+Vjb!B#zYSeVl*{l2Ft%N<@!J_a_F(nILO-%aYy98z-V{#b=U zq2iPc%*;%R=F%6GN(h<@pE|^SV2Mopfz60(1C)XA*I14bqQ_1x0UB}pvri5GgE}{a z<}J{fc*S$Z)?o-2t^}%WjK?*qeJ@|LwZQfzT{*tGj1_{%9HyXSBWQYuyPRJ%w2#E` z#*=Sz*0n3bp7P)%&dN=_iTVqfn5iYdwrv@Jn=wm`7V!5X3l31wGZdsv0MnGj_WL2W zbJq<=O1AyrC1RKF9fexSMElBGpu+dZ^qqvI!Q58?HHQq>V0VP`kI4i#t_Zxc643Ut zEPs|%J(-I38mxSlvPyMO-iuSzGUFPaq?(qYD0MCeG0hwCrQKsC@cgaxV89MKDTORP zb_Ht@ZUvsr63=JRZF?!R@F9Lhz{t|2G5E@Uch6kl4T$=VoDov@waE5;L*{Hu3cnDE z^h)1x7~z8XhK(-s>ieY((^-8InxI$GZ(3%FvmzLk`SndduZyF9U}^1`oVT6t{qFv% zhGkJhfuZlm2dg?BUte*-xpc@TWF4}kyUM&btZXpV=%UswP=jONKN!upF5`Ci$NlvC z65>?*H7+$hmT)dL=huul@ugR)Riz!QLDTaUhFnnUPL(^A?u2{P_(!ucV)S@bbZ`1i z50=L3xmc*&TWUgefy0}h=SzG0WgmxJ0hGQ~++D?yda6zUbRk_?bTjp>3*=UG`1SkO z_O0hpZ=AD=gL0X0SGfEt!8)F`vXHQ!OcZWFS9qSqule3E5%P0+#m_h7X|l^7Yn1bWU+zX>-grxku0|V! zw#xqIJAV9~pj%OUJz*<8aIgaJD{1pJ(O?1LXKa;p5$aDTFz z5tQRmRS`v+%Az?^iEOM2S0Qu$5ZQ=PD9!4AyT5cLCbS1=%i(7QdE>jYQVL8{Aqt=ko zW}hBwjPCC%$EB%6gpV$JKN$7MnfJF(uc89p5KiTg*W?o%qE)$`wfPB4ps*7pL$^(|P5SER}h}ViP zt9TP{u#0t4Y~4n!p`c48c>BbZVBVxR%6$Y!R(U`_X_vV!Em#hMq6CXeTy01M{lh5JR9C`xmIs&f+RU^ zH&wkaQ#Putt6Sj2X-~_ngfqyFYY(h&=O{7!7zo}dxzlfYO2NlwJ9a3Oiwkay&F%2b zDB7AGfZg5ZEIc^XpN$T#1cI3#uX$x4BN6t&$0z8MPlR+bm&`_luf{dm>@n$A^=#?;B?RwG#?%{W21erfBp*FX&7!6G`4C5DAL|MjF2In*JukYL;hU?)U37`^5qc6k6%5`jA)W z{kDWyv6Y|x(F#`ZlT&`7Xx3PV7U3(7{dLps(?yQwip0~x?m=ylBlL=Av1|#1#irff zUx8;k;(huxgldg8TCQD4kIzD*(RLZqOAg|}`!P0-mxA5qSn{`cIq*7trK0hlj%8S! zc%GpL{6=7_f6{ZSngdVOGjsSL*SOZg3I|*CO*I!^?d(QK_y&E5jaL6L^y=1YI*S)I za{lrQ9ctpiHVaEnTs^M!MJ%OKDt}eQdxTE&xtHvkil&Z*tTuMh&%A-xueXch^cQ3A z!Ks6r4J!>B-LHGJdW80L0+vS+z!bGaC<(@ax;Hb*ZG+#cCCxEKYNil6Y{jn6XGd9x zQXwmzkF0+O8oG>b(vET3yZpvtLT=T;l1sRHIos|PWZ(1v(DQtMOX!i9mB zH7%O`$_yi#V%j~dpJ6|G{IYvDXaTY~8f-JeBCMss)oOD({E~VMyB{nOPo-=F0A$Ji zGuUb}qE69&$rCo!&Sej6z-l#)g3-5==V*cMjyGLZ{Dqk-V5sy(5iDhErU1Vmo zMd!I0oeG5})X3E~sdDC;SG&WLG9VCNd*iUM#(fT$3DbyA#t%*wtuddHMDeTR;bb>V z`vaU}TVqMyN$XRf3t!{p#^=pStd31J^+spy>nLp{x)cl~beG5OIdf$)=S$|y>$B3< zq$_N=%WXv8lP=eT096@PDQwE2cH>+SVqoYtkVcW*1Y>>@hG4N>g)KcyJe7~WvS2jX zwvF!Zp6a}y@lRbOyEXG9Yd%bPZ|id&yDpRfkQ|ibkb1##GfIJUbKJ}e?G4gh*qqT* zIn!Fv>CpLM(rh6f$XQ^n%_`z|waw7w^!i}R;?XY`c4p;J3uYx!FB7iMekgS?gld}L z?n$1Z5edpZqkVmb6Qd@7-&z@ro4l3M_2T5I!^O;HCoZpT;n;dIm9Y0yuN6$Z8XI~= zd}qv-`XWB;`RzontPGnM=JO8Uk#5*AC6~MZ&`$`eKd&)bobb4KW-vp_L3=tDETE>q zlhISt`1O=g(<%MyW63R^=U1*I5SOv_$rY19W9iqihASNApvzyjQPi*ydOi7)4xasc zEGhyr?jeO#<8H;(8yHQ$xUotH9mS(hhR`&ZuiY9Zg@lG)WTQ`$zFWW4o1<lsZwMih@^rmiW$*a;J2gh{tr~-ClOB+pz_S12^SjJ#r%z-g=KJkR9rJtI1;A6kvH>*dTTs99 zOaGa7P68~AHxKryUGPTu=~KwS-BZiO3M(DfluzamZJXQHfqQ2hg}0Kqjgm$AAo&$Y znM;9}ApLRtW$m{oy_H+D!nW)2eqy%TN?V2)hy^J1MKT#-En@CWdHqW$+;|n$0umH-Wn$YDCE76%M7Mwbeqm_~+ykMvMf81os8jaxE5*g9RPXlmhV%WKu}RmoW#*PTc;sg#e{rUYc*&b@g*_t=|iP9N1oEK z;#HR56+q_-5e`C_q zB{+;Av$Vn5g(wvq&0Spxt(P`h$;%l}7Pm}Gj&(F`&Au(_WFE2vAFk>e-3B~i59#1d z$AAZ~;_+X>)K~Ef(WWVx(4m~37mhjE5l6#_<3RRurGNC@2arj`PLil`VRW-Xy{5;7 z#vhwg2~D6qRxy0|0PFGOT*B>QDeV@H(|{M7Kbfw#zT9sjz#i;QDrd$JppJPC_n%GQ zG-6o}X_Q0=NMEw$q1f|b_2EqbGH>LGP{(eqdZ_0&b?gRM;fi9n76z?m6!@K#j zw%Qc^LW%JDl~2o;&tlj^st12fv7c2K-rAWiY)bQJd3MC#sw;f`eU`N7Pkrtt7Oz~g zZi za#cRdN;QiiS^}nXfWJ-UIT4}F{37#^F6)VtpxEwn`pjpDyKoga=)W8Jb-l=Dz(+7(S`s z!dT*6WQEwpV507a7mED zPzjAm$~>t+mdz4wub>T^<1(U;RSD;-=9vDbeK?o%%p!v8dDL!y$kL1R@t#_+lg4k) z+^w$t`A)0fJKus+9Pc~uz+G61T04+jt1GxEH$a?aiBOukJIb-UqG+d`3VHSZiXL70 zyh=Y9YQ(kK#u3fXSAECgw)dIF@-2aYO_c`M;H^bFAaniB2gmYUhGJWgwBwK)mc87y z9s64OXq7-qvkD(f#r?j`-<>~vwi4}ikC7dK%gR>H85VxuE2h;0lFL__hrD{!qTV`Z z@8`@xZ9fNxPx_ofaUfKxID{8(Hf@gT%hv#<45<*JtNDE(CG%2zqfD}qT_({4$*;j$ zunmm}i@6@pZ=A)ZFnP1OFT`5ihV=S;R;fByd9bx3ZgLqtv;nq%*E6SW-XGqJT=d8f zdke$P-LDdmbsuxYW;LkWbi>PNZ1E-FdkDpcYx#z*`C+0P% zcQ^HWfznBYgl6X1H7mbDBR|S;Ef_w#?c1Wb@{U zf<-&<)a=wYN-Y2;iZ%7DonLJLyxV$#z3@|EZyc>Tc&?rUtem^lv@-pR^{j!fxjhRP z_5*?X6z$Tr5bG+8{KC|%ahw|{5VZ^8-^}WN z&ETgXoh(B}Vh>DsiM z)SIWAj(&Lb;ot8-pnJ?Bk$)5d`0|_}^Z$H0V9x)~oLKZjFR(TjYTBJ@suzX7>~|7&&Lrt`vBiH6lcbMc-SRR1u&T7?5}>hQxmTc*j&0gv ztbV4c4mzmI9SmidBj({+2}beGRgW36H8{548*rksubePsp?~;yE>L!RF?3Gw|bEJczL zcgJh8|7o%ABVK-eXXd}VMj&5k1h-{jeIm!QQ0%ia zOlAIBj-rQ}W$rUP)3F|YI4fp}gY?S1k40@dN%=b}MTP&_mty8a%}G%pp34>m#?)Y+ zGTu8m5BY45PVnZJ2aGMNNZrj0iQOG%K#6PYh?;E+TBo@RXxT{pOS;(|rCK8fE`eOP z;~)$Vn9T1z`}5sll%6v4(C-k5c4xF+VIIqbbGiGp3+G{^B>e<$4##0X)~oB^80}cY z^Fq;H=1R(chg6j@+q>oW3}uCQhSsklrAyA4-|VD4%E^IR6=g#0KWQlrKx>K+I|}x#LOv{a6xLi! zCp>A$zAzSbrO zc)}KS-LUD>hnkN7s;7=7LgB~$;sFS>psoBV)&(4sX{kJEMni=oxh$hWTE_JSi+S$Q z68e7u;vQzYci$4KaHhdJ1fynt4y64isKdzEZL7>U4rlx?zZ3f>-q+O|`SD0*C%EK@ z9Rmq{2h78?8Cnb6{Ff|{V}E#=()}Jdx)1gV`Cc*-dy39etrWYHHnMKN6_8cRVz2bq zB?W<`Pb*f9BSg#*t`6^xgM_|J_qch(7VmQX3rnhX#~H{Uw8>z9I~cNTv<|8bgv!r$ zw(7dz;QdVe=JVfm5!&p{>54WVT)>4ccQc*qp?9$VfV5v+@TD$YEJ-{4m%3~d8cR-F zSf_F!&mZ2b0Jl4a0BorM>>&WEe=m&!k%>%8l}SLM>%yCsb0umnR>=U<4*zoZrk}X* zANnI7>2r6)7QQb108d^f-iLi$ru%Qp0#;bYe=hwfS=gm+tQ3CH=mJK8{-NQS?qmN- z!FTN(0w92+_LI}e` z9Cy^ndD8OlaBl?sT5oJaY%cbgxTf^f3lyEG%erF^EU<6oya2%1wvm7St`QV{TCzML zX!kR;%MDLb>x+6A-Dp-eRMvLW?mWOa?-XK6e^H3Pzu3PIa86B0gpD3X05-}Mz0<%F zhGu|qgd?mV;ZSuP9B07?UU?%Wluom@T4)V{Go)ja42M(;N@ylZm%X0X9f;#;*Q*%( zc2X3cq8cRTZsIZI7TUEJjI*ztiF30DfC~G=Ks=A%419eouY)4HvplkO@}~^=6-fT( zHylN3qme0mIT`X^Bo(cr1Ty3eKbOp{LVvLSg636n`)7}cY`5stcWPGP-F}3RcQ2#w zQwzm)Aa=L1=JTxjkFaD9=AxU6!)YoZB@GF>@^DMNO#Gnn<@b84j?#IyjQRI*TR=${ za-RMbpvVhQV$S6!W~!i%S0VIGJ6c)(T4;4_>E|zh_ds=qr7fOOHx)2P_Za+)4L(5J z3P^tiK5|i&*<#bz?A~7KJ@yJyZ#kVq$ef*KL6t;vxTL91G&ki zpo%)r50AcZ4g^0AsROSCW2>7c#Dyi4n)pNd2HzGAP?8Md{$lfP&13_`-nbPuyD(yl zyZCD{#1~mjo>s^ErzBz`x=`)Pl-ueA+(p%08U;^4HQy`%jK`h}Jdo~w1N3V9Y1<`R z(Sz<&fR;$-jph23bQEPdqO$_WF3Yr9olsv@+wpu0vGG;MwcICr2pGt%%pKznkK?Tb z@Wq}K#b!VL3BB@eO0O3xUIgAUKVqrFpz4A~TThu?X38k}-QQDzAa3tVpaP!kcIsJn zomC0z4<&?f)M^d5?SH*c=~18XLEAz5T122veLbfhnu5);yqV|!g1j%M>wS_ zBg?;&ir6TwR2~?3jzWb^ay&y72N?pZh+%msohPMicy=#FF5m;8NK!rf7^wYRNCY-4 z&Pv3u5QyHFwk9K_V)%#qd`HWo7W(WW`1VAW3Su2V8edH_W^OYcSk7$DSHH+swq*XD z3gT?O$G8n|CVol$!7r|s_p`8a%R4ddsGXxyJNf6A!e-E@rK>(ErP}ql9`_qPAHyHX zNiEe0q*khgB_;ry~+QmP317L;awqRS0u& z*j&lTdSE*H9x%>GqGknJUq*0Lci!zuv62g*K1#9-xQFWS!wm{h`|t0xJMalexTl-H zVwo7ddC}7@mtKCP7<5M}ILbP}J;MBKsmS=-sCX~T;7EjDcVyGK;&x*J<~kVt!xrm5 z;;FH{<0CP$E2pi}-L0-vf99e3h@&cLbE#rB-TFq~xbf$lONg@5UJ$nDd6zO&nnOdg z8t+p(nmjz9k;taI4pL!D$12-mlpR|gER`QmS!~QLucn3Hr3wV}1lFythKEL9Uz=X; zjIQ1v95*KH5bzXt%;{>jv&8X%vFj_bvgd}D(FI$`YN~U!=}qZ35`f1z5FdaKfN@^S zd@KmMV?@$*r+l_>5RD>RNe_tq0Z>)98WNM%a%i(;%t&oOYtX*iWM|!jvU)9j&SZY< z^23d__Yxn0?}<%NM4kbZ6a~|tYj-A)#URvXZU7ej-~8IDMR=MF`1QLYdyqIKIg2T zHLC_42c19f#}KwZ#^o-YxG1ytYfkpp6Sm*H%`Uvm4Br0E5+XBOhA9hhwwNHyDL}*NJ=s@PT!tUcSyMv|J_}EOtOh{kO;;T?!TQ#QlzXgR4xWLi3 zY)T;!^`W_WBcxajq`4FL?40*wjLvY7Me!9EtI)6A+v6Lp{ws}0zakg9uj$t$M( z#OY$+XU$1ZBqQI)fq1&+qvS}FA-__T-GstGSJD*vEz@#2jzl+uA_F^&_QxsA4f|74 zV;2_&xdw{Zm74eFv^<90^V@Gauo0LFza61JASOD56s^=H@#bGsw32y@YiPXl(M`;z%Cd)lgEz1`Wz->-ceRH8Sn? zA3%yKV&`*D7SbmgrBFexme>;{ep%T?S-8w`XQhVUNAPS0V#jx(Y)_>0QU-ac#?v6e zh0S7H%Jez&uB8NP(2N?e8SHdddF^<&16IJTX-O135hgKwPF~t$#JRG@rV(i84J1hx z3Opf6@@%WS02-89?ce0kGtTA|YUMYbFZpCpsp=c?Nc{`q^o}!}Fi0ueH69`O8dcOK z5p7v^E1tBF3G4Gb&6M!q8xg1)ucv;vgtF^GZhTU>1I&%Q(7zfOw+qFS*XPry4s&{o z(OPYc@yq_@`?#e9Hb?l(eWmBO7my^JKs*_WpJfU!ZG_$Fo^4ni^H3ir!}q;yFMi^; zZe!s*im!a^Hxhi2K`mlufE}Y&BJ64`n3aWWsOYkMe{KKsVZL^kx|PhCqx+^aKuYNH zKn)54iqC^*D=uR`ixtePpRZ#FsSb=ZHH~5h65wIjurK~6&-Qba_weJ;ofeyXSg;Sx zl(FvxDsIfX<>AEA#^jyfjBJh?4J>qO%uwS^lTkChr-l6F1n>?LSX`nzIep8#b3w?zgB&AzAYbT}UvpNU zd@_b%UQeX1yKnkRIc#5opZNpI)d=#0K&C-XuI-LiJt*sAYtqfNWBZcHDpUs_nFhA#LG*na6+ zd6(Q5e87~;$VYokcfAbB9uZbrF!dd*Y~tKcktu_u*pP7ocg-fg>TMW#-nuGsSh98`foAVl0+_43d6 zU0??oDXcZIZxmFcyM>kjZ%I;)@%M$;nL4fY3 zna?guBjw@x2#+%YM`H%Ls=lr2IYPJge&u)+#U1CIQD0E;h`@ADA6xoubFyWaBe2Pz zKF;@M3eKq6_PB~z-Q4;I1ow)LC#S!JMCNVlm3IaNcv#G-QWhuRYuEkfTI4zg^|M*RR1QZ#i9jBD|gG}8I!2F&H#G<}qe)#$NlGFt~EV#;H z6t?GZb-(i^}kh^dti9f?FrN<_6Z`!51Vq;FuZY6axtv-3gJu@p)X$Y>q`5}c}apZX` zlC_ylj=()p@&iNGqdde(W2OjQa*>JpZyfbyV$3Y{~ zvEXceuX~>OXbgXU^JazP;=Ss`T#mPbCr@+y z&3i=V|FZ|(W`A=WK$Q+ebHNj`uDmn+kfCJhNmD1hQ;$tTA-i{a(*K zgS<}tahu;!$duBaO=(s*8RBM4@|mfQ*lH(^0t4PKr;t$gxcG=PKSinyWsM?UInzj$ zQKU45G?Bdpjt`;HBSB=2q14P}DjG- zfl2{i2f|3_8T9M?F&g)ESv06&)V7!=H}*Y~5bPz;os!4FZpSG`hokEgs51hy4jvR7 zBZ}&asrpDi`I#xSH#8W}@!>cVHNBoQ>Gk)f! zM++4ZZXga$@&UNL6xeK#7O-3TZ+@v)VM|FNorX$##AuZd803m?3jNH@9jt%o)sUaI zs~?(lnq07TrGuwXlmNcN1g|4cMNiUsK6M(ijzd9fi>~?uP~Wbc9ZI;5J8d2_2l--rO;tNl}|p|7J$Wx7YXNT7I`6NRN#@bSrfb$7GClGTulp*g!&*7 zk%zkiU6&g@>r?C4i9gOjswqeWGO~lEA4}R3R z+nSEW6{s#8ry$v);fqgAxlpuyUg<{`Ky0m#TL@zf3BR+2$D$!X<~r3}vm}vY8UUdJ z)2of%-*|l1-&z9Bkzr;XNy|d?G{uDiCbmri(AN1nnr)@O{q4ft-&qgX+baAvEqdJr z9FMCscWC$LX}RH!Jr9az1bmNJW<}dmio@qXfTnYIQTOayeEJsY2 z?xSkb)fEp}mXJJ4U6&gZKnmPP3lyop?r``(XCfDgYXRL-A>ljtPP+i*C2=~tbHZqsQu}OgEA=RGjv5?)@%n6kpUh5?Q$mc&({$z_*;r5(SdZ zozmT9E%*!IZvW8@>rS7d(81@QFDunWYJ*h5-GLK56M8cq1x!k#O*OwFWA1+-By{*N++xOv3yvMqyV|r6*G|7ZDxyf{zf+-eGzUKoYMPusE%#f z{c6)a5+0}j$?=MkQlR!gKm!h+W4 z>Lc0v&iYP5{Ekk9wjF|0&E1vLrHvY?UmPu-4P^uvFl%^`W=V#{v)?bx3=ol)YI(lQ zkWR_;d%R2!^rbG{}yn_y+UlK{HA#-Pt@ zjT&f`9W#(w>`L~ZEKc^d%R8{>HRC}pU)T){QVnErJ9H;qLne;Qcb6`pN|8`(K?bSX zFhBWw|MG)~66CjUjg;*OAF)JwfIV+(euXQ6_aOuaKRU}e!x2K8T(`YvSb!qMtEozv zu_KMLR&>@M-r?U+8RDHVBU*@99i&x_Wbc*DUR8QoOmVNJ34NzIa#ZYVp5px2{6CO} z`NOm`+yIX3HI<#&BQm9xVs~{Ei5@VUD-->KAoxEl_qgRs1GIh(GH!mgCRLe3_&1W_ zNZZ6&$QoE45jMhE&8hPl-l7(5l{UwcRH-+y7k#om70AEWX!RQHcv}TOYaaQtTH8Rff9*c-7zRm|igQH^XAoB( z&MDO`d5As$Tben3_x_&xeq)iowpV0CGgoA8fkXCjSf+%ECjytHXFfh`Unt>PZsYBu zhQH5QnsC-kfINIzsp(@1lc1-4!{LrtfhPyMsz0$EHZxJJ();tx-Emo(0e3I)ucAK8 z7@^eqyC3;_3p7U0!i&yW?8yxMj5Oz!6*)xl?di4$a*o&4Z!3LMX1G*W5Xj;x&0Y?4 zkSR6%ICV&L%;@{F6TUdO#_+QT=S@%SL`M*ivTU1{F|pcXK4`j3r2kVJN;F%hjD)Nt zCZuI9Q_x~LCi5ospzx2Qv{2=6eE5x#+m&aKJ80_ zRec-18>u1at9*B&tME$EO_0|{4=v)?j5ke4=}zny-fB0%-Ck%uTH`BlwpUUC?~~4%Sh^8BviD_x zYMa|B{kZyl2jXLp+O-SE1rOXFfQO0W8y?gFg!4cd{vVJy01#I=LofgA0B4xrX9)&d zLfY7bH#eOHcjEL@dX$+dcq+~=s>FN$!6!YLPacbzS(^NDI38b znZiQnc@#Wpq?SFW?&#KoIef-);B(o|zTV55iAdq2OHVEc9{S_qMD`bNff7MA(#(

7t=`-11Mn@-di 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 From 302e0ac3d1dc239117594ed3c80c0a4f2a5a0666 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Thu, 19 Nov 2020 15:49:24 +0800 Subject: [PATCH 06/11] Update user scenarios --- ...20201027-modular-tensorflow-graph-c-api.md | 41 +++++++++++++----- .../scenario1.png | Bin 0 -> 11395 bytes .../scenario2.png | Bin 0 -> 10647 bytes .../scenario3.png | Bin 0 -> 6790 bytes 4 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 rfcs/20201027-modular-tensorflow-graph-c-api/scenario1.png create mode 100644 rfcs/20201027-modular-tensorflow-graph-c-api/scenario2.png create mode 100644 rfcs/20201027-modular-tensorflow-graph-c-api/scenario3.png diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index f6661f677..ce3282d7c 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -116,7 +116,27 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz ### Supported User Scenarios This section describes user scenarios for plugin graph optimizer. -Plugin graph optimizer is targeting backend device specific optimization, and only one optimizer is allowed to be registered per device type, so device type will be used as key to decide whether TensorFlow proper needs to run this optimizer by checking graph device type and registered device type. To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizer is registered to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizer they want to use by unloading the conflicting plugin. + +* **Supported scenario**: Each plugin can register its own graph optimizer. + + Plugin graph optimizer is targeting backend device specific optimization. Proper should fully control the behaviour of plugin, plugin can register its own graph optimizer, and optimizers with other device types are not allowed. TensorFlow proper would run plugin optimizer if graph device type and registered device type are matched. + +

+ +

+ +* **Unsupported scenario**: Plugin can not register multiple graph optimizers. + + To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizer is registered to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizer they want to use by unloading the conflicting plugin. +

+ +

+ +* **Undefined scenario**: Registering graph optimizer without pluggable device. + +

+ +

### Front-end python use case @@ -131,9 +151,9 @@ Flag `use_plugin_optimizers` is provided for front-end python users to control t ``` This API can be used to: -1. Turn on/off all registered plugin graph optimizers. By default, the registered optimizers are turned on, users can turn off them. If the registered optimizers are turned on and the graph device type is matched with registered device type, they would be runnning. -2. Use recommended configuration of existing optimizers. -If pluggable graph optimizer is registered to a device type, e.g., GPU, it is optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_OptimizerRegistrationParams`. +* Turn on/off all registered plugin graph optimizers. By default, the registered optimizers are turned on, users can turn off them. If the registered optimizers are turned on and the graph device type is matched with registered device type, they would be runnning. +* Use recommended configuration of existing optimizers. + If pluggable graph optimizer is registered to a device type, e.g., GPU, it is optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_OptimizerRegistrationParams`. ```cpp TF_Bool get_remapping() { return false; } @@ -208,11 +228,11 @@ If pluggable graph optimizer is registered to a device type, e.g., GPU, it is op void* ext; // reserved for future use void* (*create_func)(); void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*); - void (*delete_func)(void*); + void (*destory_func)(void*); } TP_Optimizer; #define TP_OPTIMIZER_STRUCT_SIZE \ - TF_OFFSET_OF_END(TP_Optimizer, delete_func) + TF_OFFSET_OF_END(TP_Optimizer, destory_func) typedef struct TP_OptimizerRegistrationParams { size_t struct_size; @@ -239,6 +259,7 @@ If pluggable graph optimizer is registered to a device type, e.g., GPU, it is op ``` * **Plugin util C API** + ```cpp #ifdef __cplusplus extern "C" { @@ -330,12 +351,12 @@ If pluggable graph optimizer is registered to a device type, e.g., GPU, it is op // Get a list of input OpInfo::TensorProperties given node name. // OpInfo::TensorProperties is represented as TF_Buffer*. - void TF_GetInputProperties(TF_GraphProperties* g_prop, const char* name, + void TF_GetInputPropertiesList(TF_GraphProperties* g_prop, const char* name, TF_Buffer** prop, int max_size); // Get a list of output OpInfo::TensorProperties given node name. // OpInfo::TensorProperties is represented as TF_Buffer*. - void TF_GetOutputProperties(TF_GraphProperties* g_prop, const char* name, + void TF_GetOutputPropertiesList(TF_GraphProperties* g_prop, const char* name, TF_Buffer** prop, int max_size); // Helper to maintain a map between function names in a given @@ -395,7 +416,7 @@ If pluggable graph optimizer is registered to a device type, e.g., GPU, it is op for (int i = 0; i < max_size; i++) { in_prop_buf[i] = TF_NewBuffer(); } - TF_GetInputProperties(g_prop, "node1", in_prop_buf.data(), &max_size); + TF_GetInputPropertiesList(g_prop, "node1", in_prop_buf.data(), &max_size); plugin::OpInfo::TensorProperties in_prop; plugin::BufferToMessage(in_prop_buf, in_prop); for (int i = 0; i < max_size; i++) @@ -436,7 +457,7 @@ If pluggable graph optimizer is registered to a device type, e.g., GPU, it is op // Set functions to create a new optimizer. params->optimizer->create_func = P_Create; params->optimizer->optimize_func = P_Optimize; - params->optimizer->delete_func = P_Delete; + params->optimizer->destory_func = P_Destory; } ``` diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api/scenario1.png b/rfcs/20201027-modular-tensorflow-graph-c-api/scenario1.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ff4093b2772dd14cda33f87bc4dfbaa202fdbe GIT binary patch literal 11395 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 literal 0 HcmV?d00001 diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api/scenario2.png b/rfcs/20201027-modular-tensorflow-graph-c-api/scenario2.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8f91ff834564ce538e9590ae895383b5a27f80 GIT binary patch literal 10647 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 P7}1pERpqK=%tHPjA*%K6 literal 0 HcmV?d00001 diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api/scenario3.png b/rfcs/20201027-modular-tensorflow-graph-c-api/scenario3.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa2bae79ad6a7254b01ef09c433b202de900fa5 GIT binary patch literal 6790 zcmbtZS5(u_woU;80){G`gd!j)9Rbmh&=EyInu1ipNRuY@M~4KEUPP&(qacEUQl$it zP7qO~cd$?ck|^c!zxSNA&cl7V>pslP-VZZ-&&--{zHcVZ$WWL04DT5b2*j+fr)2^H zLExu$4?Xm>c8E&vK5f80Cb}A+>S6xxrw+{n%uNgkRGZ9rXit0UI~v_E)z;9^I5k;V zSXfzEkw~P7h={DLtfHbK8jaS~)ip9QvaqnQv$K2n@S&%tXHZa3czAeRTwHQ;^0Q~p z3JMC!%gbNCeqCQ*-`3VfBoaqPMo1*m%*@Q(+}y8UzqYovPEJm)$4&nDCl_B6!`pM_ z@mwOO4uhxO9Ul;gi}jxZ?iVAggFrk5`dS#%0Go|_-yJ4f*pB!i(Iy_*WuiBcDFWBFgd!AlAIk5dovcvjfV?ik3vLZb%f>%Qkr5KF`u=Jx85=+re zp^(;+rebE{!aUgY9GBGdP*N5s0UEacw9NpYV870auR`V76S!ax zen=AZo4+q+CLchDcu<*wg3Ib;1f8sPZX�#C9S%0p3oL)v=~QB+y(y&_x?1m9G-n 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 literal 0 HcmV?d00001 From e00711be08c6dc74fecfb8294a424ac5345414bb Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Fri, 20 Nov 2020 06:55:55 +0800 Subject: [PATCH 07/11] update param name --- ...20201027-modular-tensorflow-graph-c-api.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index ce3282d7c..eb4347428 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -125,22 +125,22 @@ This section describes user scenarios for plugin graph optimizer.

-* **Unsupported scenario**: Plugin can not register multiple graph optimizers. +* **Supported scenario**: Registering graph optimizer without pluggable device. - To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizer is registered to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizer they want to use by unloading the conflicting plugin.

- +

-* **Undefined scenario**: Registering graph optimizer without pluggable device. +* **Unsupported scenario**: Plugin can not register multiple graph optimizers. + To simplify multiple optimizers coordination and avoid optimization conflict, multiple optimizers cannot register to the same device type. If more than one optimizer is registered to the same device type, these optimizers's initialization would fail due to registration conflict. Users need to manually select which optimizer they want to use by unloading the conflicting plugin.

- +

### Front-end python use case -Flag `use_plugin_optimizers` is provided for front-end python users to control the behaviour of plugin graph optimizers. +Flag `use_plugin_optimizers` is provided for front-end python users to control the plugin graph optimizers. ```python ## TF-1.x >> from tensorflow.core.protobuf import rewriter_config_pb2 @@ -273,41 +273,41 @@ This API can be used to: TF_GrapplerItem* TF_GetGrapplerItem(TF_Buffer* buffer); // Get a set of node names that must be preserved. This includes feed and - // fetch nodes, keep_ops, init_ops. Fills in `max_values` and `storage_size`, + // fetch nodes, keep_ops, init_ops. Fills in `num_values` and `storage_size`, // they will be used in `TF_GetNodesToPreserveList` - void TF_GetNodesToPreserveSize(TF_GrapplerItem* item, int* max_values, + void TF_GetNodesToPreserveSize(TF_GrapplerItem* item, int* num_values, int* storage_size); // Get a set of node names that must be preserved. This includes feed and // fetch nodes, keep_ops, init_ops. Fills in // `values` and `lengths`, each of which must point to an array of length at - // least `max_values`. + // least `num_values`. // // The elements of values will point to addresses in `storage` which must be at - // least `storage_size` bytes in length. `max_values` and `storage` can be + // least `storage_size` bytes in length. `num_values` and `storage` can be // obtained from TF_GetNodesToPreserveSize // // Fails if storage_size is too small to hold the requested number of strings. void TF_GetNodesToPreserveList(TF_GrapplerItem* item, void** values, - size_t* lengths, int max_values, void* storage, + size_t* lengths, int num_values, void* storage, size_t storage_size, TF_Status* status); // Get a set of node names for fetch nodes. Fills in `values` and `lengths`, // they will be used in `TF_GetFetchNodesList` - void TF_GetFetchNodesSize(TF_GrapplerItem* item, int* max_values, int* storage_size); + void TF_GetFetchNodesSize(TF_GrapplerItem* item, int* num_values, int* storage_size); // Get a set of node names for fetch nodes. Fills in // `values` and `lengths`, each of which must point to an array of length at - // least `max_values`. + // least `num_values`. // // The elements of values will point to addresses in `storage` which must be at - // least `storage_size` bytes in length. `max_values` and `storage` can be + // least `storage_size` bytes in length. `num_values` and `storage` can be // obtained from TF_GetFetchNodesSize // // Fails if storage_size is too small to hold the requested number of strings. void TF_GetFetchNodesList(TF_GrapplerItem* item, void** values, size_t* lengths, - int max_values, void* storage, size_t storage_size, + int num_values, void* storage, size_t storage_size, TF_Status* status); // Infer OpInfo::TensorProperties for graph nodes inputs/outputs. From 444b95f151a0ddf43927e9c1d057c9703c04acbd Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Mon, 23 Nov 2020 13:05:08 +0800 Subject: [PATCH 08/11] Clarify on conflicting optimizer configurations --- ...20201027-modular-tensorflow-graph-c-api.md | 152 +++++++++--------- 1 file changed, 79 insertions(+), 73 deletions(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index eb4347428..2cfeeed0d 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -44,7 +44,7 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz ### Struct/Function/Object Overview - Struct - - Struct that should be filled by the plugin: `TP_OptimizerConfigFns`, `TP_Optimizer`, `TP_OptimizerRegistrationParams` + - Struct that should be filled by the plugin: `TP_OptimizerConfigs`, `TP_Optimizer`, `TP_OptimizerRegistrationParams` - Struct that should be filled by the proper: `TF_GrapplerItem`, `TF_GraphProperties`, `TF_FunctionLibraryDefinition` - Function - Function that should be implemented by plugin: @@ -66,7 +66,7 @@ When initializing, TensorFlow loads the plugin and registers a new graph optimiz * **Registration** 1. Core TensorFlow links to plugin's dynamic library and loads the function `TF_InitGraphPlugin`. - 2. In `TF_InitGraphPlugin`, plugin populates `TP_OptimizerRegistrationParams`, including `TP_OptimizerConfigFns` and `TP_Optimizer`. + 2. In `TF_InitGraphPlugin`, plugin populates `TP_OptimizerRegistrationParams`, including `TP_OptimizerConfigs` and `TP_Optimizer`. * **TF_Buffer and protobuf class** @@ -140,7 +140,7 @@ This section describes user scenarios for plugin graph optimizer. ### Front-end python use case -Flag `use_plugin_optimizers` is provided for front-end python users to control the plugin graph optimizers. +Flag `use_plugin_optimizers` is provided for front-end python users to turn on/off the plugin graph optimizers. ```python ## TF-1.x >> from tensorflow.core.protobuf import rewriter_config_pb2 @@ -151,26 +151,28 @@ Flag `use_plugin_optimizers` is provided for front-end python users to control t ``` This API can be used to: -* Turn on/off all registered plugin graph optimizers. By default, the registered optimizers are turned on, users can turn off them. If the registered optimizers are turned on and the graph device type is matched with registered device type, they would be runnning. +* Turn on/off all registered plugin graph optimizers. By default, the registered optimizers are turned on if they are successfully registered, users can turn off them. If the registered optimizers are turned on and the graph device type is matched with registered device type, they would be runnning. * Use recommended configuration of existing optimizers. - If pluggable graph optimizer is registered to a device type, e.g., GPU, it is optional for plugin authors to provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_OptimizerRegistrationParams`. + If pluggable graph optimizer is registered to a device type, e.g., GPU, plugin authors can provide a recommended configuration indicate whether some of existing optimizers in proper can be turned on/off, by populating flags in `TP_OptimizerConfigs`. If user turns on the optimizer, the recommended configuration is automatically applied. Otherwise user-set configuration is used. ```cpp - TF_Bool get_remapping() { return false; } - TF_Bool get_auto_mixed_precision() { return true; } - void TF_InitGraphPlugin(TP_OptimizerRegistrationParams* params, TF_Status* status) { // Plugin authors can turn on/off some optimizers. - params->config_fns->get_remapping = get_remapping; - params->config_fns->get_auto_mixed_precision = get_auto_mixed_precision; + params->configs->remapping = TF_TriState_Off; + params->configs->auto_mixed_precision = TF_TriState_On; // ... } ``` - If user turns on the optimizer, the recommended configuration is automatically applied. If optimizers are turned off, default configuration is used. - - When multiple plugins are registered and running for a graph, an error would be raised if their recommended configurations are different. Users should unload one of the plugins or disable plugin optimizers to resolve the conflict. + When multiple plugins are successfully registered and running for a graph, their recommended configurations may differ with each other. If any of the config has turned off the optimizer, the optimizer will be disabled. The following table lists all possible scenarios. In the table, plugin's config is represented by tristates, `ON` means turn on optimizer, `OFF` means turn off optimzier, and `DEFAULT` means uses proper's config. + | Proper's config | Plugin1's config | Plugin2's config | Final config | Notes| + |:-------------- |:-------------- |:-------------- |:-------------- |:-------------- | + | ON | ON/DEFAULT | ON/DEFAULT | **ON**| The optimizer is enabled. | + | ON | OFF | OFF | **OFF**| The optimizer is disabled, unless users manually unload the plugin. Grappler prints warnings to remind users that config has been changed based on plugin's config.| + | ON | ON/DEFAULT | OFF | **OFF**| The optimizer is disabled if at least one plugin turns off it. Grappler prints warnings to remind users that config has been changed based on plugin's config, and potention performance regression may happen due to the conflict configs.| + | ON | OFF | ON/DEFAULT | **OFF**| Same as previous scenario.| + | OFF | ON/DEFAULT/OFF | ON/DEFAULT/OFF | **OFF**| The optimizer is always disabled when user turns off it. | ### Versioning Strategy and Stability @@ -191,35 +193,42 @@ This API can be used to: extern "C" { #endif + // TF_TriState is the C API typedef for tri-state. + typedef enum TF_TriState { + TF_TriState_Default = 0, + TF_TriState_Off, + TF_TriState_On, + } TF_TriState; + // Flags indicating whether existing optimizers should be turned on/off. // It's optional for plugin to set functions to return true/false. If not - // set, proper uses default configuration. - typedef struct TP_OptimizerConfigFns { + // set, proper uses configuration set by user. + typedef struct TP_OptimizerConfigs { size_t struct_size; void* ext; // reserved for future use - TF_Bool (*get_disable_model_pruning)(); - TF_Bool (*get_implementation_selector)(); - TF_Bool (*get_function_optimization)(); - TF_Bool (*get_common_subgraph_elimination)(); - TF_Bool (*get_arithmetic_optimization)(); - TF_Bool (*get_debug_stripper)(); - TF_Bool (*get_constant_folding)(); - TF_Bool (*get_shape_optimization)(); - TF_Bool (*get_auto_mixed_precision)(); - TF_Bool (*get_auto_mixed_precision_mkl)(); - TF_Bool (*get_pin_to_host_optimization)(); - TF_Bool (*get_arithmetic_optimization)(); - TF_Bool (*get_layout_optimizer)(); - TF_Bool (*get_remapping)(); - TF_Bool (*get_loop_optimization)(); - TF_Bool (*get_dependency_optimization)(); - TF_Bool (*get_memory_optimization)(); - TF_Bool (*get_auto_parallel)(); - TF_Bool (*get_scoped_allocator_optimization)(); - } TP_OptimizerConfigFns; - - #define TP_OPTIMIZER_CONFIG_FNS_STRUCT_SIZE \ - TF_OFFSET_OF_END(TP_OptimizerConfigFns, get_scoped_allocator_optimization) + TF_TriState disable_model_pruning; + TF_TriState implementation_selector; + TF_TriState function_optimization; + TF_TriState common_subgraph_elimination; + TF_TriState arithmetic_optimization; + TF_TriState debug_stripper; + TF_TriState constant_folding; + TF_TriState shape_optimization; + TF_TriState auto_mixed_precision; + TF_TriState auto_mixed_precision_mkl; + TF_TriState pin_to_host_optimization; + TF_TriState arithmetic_optimization; + TF_TriState layout_optimizer; + TF_TriState remapping; + TF_TriState loop_optimization; + TF_TriState dependency_optimization; + TF_TriState memory_optimization; + TF_TriState auto_parallel; + TF_TriState scoped_allocator_optimization; + } TP_OptimizerConfigs; + + #define TP_OPTIMIZER_CONFIGS_STRUCT_SIZE \ + TF_OFFSET_OF_END(TP_OptimizerConfigs, scoped_allocator_optimization) // Struct for Optimizer. Plugin authors must provide an optimize function. // Creation and deletion functions are optional. @@ -244,7 +253,7 @@ This API can be used to: // device_type optimizer is registered. const char* device_type; - TP_OptimizerConfigFns* config_fns; + TP_OptimizerConfigs* configs; TP_Optimizer* optimizer; } TP_OptimizerRegistrationParams; @@ -272,16 +281,17 @@ This API can be used to: // Get TF_GrapplerItem from TF_Buffer. TF_GrapplerItem* TF_GetGrapplerItem(TF_Buffer* buffer); - // Get a set of node names that must be preserved. This includes feed and - // fetch nodes, keep_ops, init_ops. Fills in `num_values` and `storage_size`, - // they will be used in `TF_GetNodesToPreserveList` + // Get a set of node names that must be preserved. They can not be transformed + // or removed during the graph transformation. This includes feed and fetch + // nodes, keep_ops, init_ops. Fills in `num_values` and `storage_size`, they + // will be used in `TF_GetNodesToPreserveList`. void TF_GetNodesToPreserveSize(TF_GrapplerItem* item, int* num_values, int* storage_size); - // Get a set of node names that must be preserved. This includes feed and - // fetch nodes, keep_ops, init_ops. Fills in - // `values` and `lengths`, each of which must point to an array of length at - // least `num_values`. + // Get a set of node names that must be preserved. They can not be transformed + // or removed during the graph transformation. This includes feed and fetch + // nodes, keep_ops, init_ops. Fills in `values` and `lengths`, each of which + // must point to an array of length at least `num_values`. // // The elements of values will point to addresses in `storage` which must be at // least `storage_size` bytes in length. `num_values` and `storage` can be @@ -297,9 +307,8 @@ This API can be used to: void TF_GetFetchNodesSize(TF_GrapplerItem* item, int* num_values, int* storage_size); - // Get a set of node names for fetch nodes. Fills in - // `values` and `lengths`, each of which must point to an array of length at - // least `num_values`. + // Get a set of node names for fetch nodes. Fills in `values` and `lengths`, + // each of which must point to an array of length at least `num_values`. // // The elements of values will point to addresses in `storage` which must be at // least `storage_size` bytes in length. `num_values` and `storage` can be @@ -321,7 +330,7 @@ This API can be used to: // Create GraphProperties. The item must outlive the properties. TF_GraphProperties* TF_NewGraphProperties(TF_GrapplerItem* item); - // Destroy GraphProperties. + // Delete GraphProperties. void TF_DeleteGraphProperties(TF_GraphProperties* p); // Infer tensor shapes through abstract interpretation. @@ -343,21 +352,21 @@ This API can be used to: // Get the size of input OpInfo::TensorProperties given node name. void TF_GetInputPropertiesSize(TF_GraphProperties* g_prop, const char* name, - int* max_size); + int* size); // Get the size of output OpInfo::TensorProperties given node name. void TF_GetOutputPropertiesSize(TF_GraphProperties* g_prop, const char* name, - int* max_size); + int* size); // Get a list of input OpInfo::TensorProperties given node name. // OpInfo::TensorProperties is represented as TF_Buffer*. void TF_GetInputPropertiesList(TF_GraphProperties* g_prop, const char* name, - TF_Buffer** prop, int max_size); + TF_Buffer** prop, int size); // Get a list of output OpInfo::TensorProperties given node name. // OpInfo::TensorProperties is represented as TF_Buffer*. void TF_GetOutputPropertiesList(TF_GraphProperties* g_prop, const char* name, - TF_Buffer** prop, int max_size); + TF_Buffer** prop, int size); // Helper to maintain a map between function names in a given // FunctionDefLibrary and function definitions. @@ -394,7 +403,7 @@ This API can be used to: auto* optimizer = new PluginOptimizer; return (void*)optimizer; } - static void P_Delete(void* optimizer) { + static void P_Destory(void* optimizer) { delete static_cast(optimizer); } static void P_Optimize( @@ -402,26 +411,26 @@ This API can be used to: TF_Buffer* optimized_graph_buf, TF_Status* s) { // 1. Get TF_GrapplerItem from graph_buf(optional) TF_GrapplerItem* item = TF_GetGrapplerItem(graph_buf); - + // 2. Deserialize graph_buf into plugin::GraphDef plugin::GraphDef graph_def; plugin::BufferToMessage(graph_buf, graph_def); - + // 3. Infer shapes(optional) TF_GraphProperties g_prop = TF_NewGraphProperties(item); TF_InferStatically(g_prop, 0, 0, 0, 0); - int max_size; - TF_GetInputPropertiesSize(g_prop, "node1", &max_size); - std::vector in_prop_buf(max_size); - for (int i = 0; i < max_size; i++) { + int size; + TF_GetInputPropertiesSize(g_prop, "node1", &size); + std::vector in_prop_buf(size); + for (int i = 0; i < size; i++) { in_prop_buf[i] = TF_NewBuffer(); } - TF_GetInputPropertiesList(g_prop, "node1", in_prop_buf.data(), &max_size); + TF_GetInputPropertiesList(g_prop, "node1", in_prop_buf.data(), &size); plugin::OpInfo::TensorProperties in_prop; plugin::BufferToMessage(in_prop_buf, in_prop); - for (int i = 0; i < max_size; i++) + for (int i = 0; i < size; i++) TF_DeleteBuffer(in_prop_buf[i]); - + // 4. Get OpDef(optional) TF_FunctionLibraryDefinition* f_lib = TF_NewFunctionLibraryDefinition(graph_buf); plugin::OpDef op_def; @@ -431,9 +440,9 @@ This API can be used to: plugin::BufferToMessage(op_buf, op_def); TF_DeleteBuffer(op_buf); plugin::DataType dt = op_def.input_arg(0).type(); - + // 5. Transform graph(optional) - + // 6. Serialize output plugin::GraphDef into optimized_graph_buf. plugin::MessageToBuffer(graph_def, optimized_graph_buf); TF_DeleteGraphProperties(g_prop); @@ -444,14 +453,11 @@ This API can be used to: Define `TF_InitGraphPlugin` that TensorFlow will call when registering the plugin: ```cpp - TF_Bool get_remapping() { return false; } - TF_Bool get_auto_mixed_precision() { return true; } - void TF_InitGraphPlugin(TP_OptimizerRegistrationParams* params, TF_Status* status) { params->device_type = "GPU"; // Define some flags indicating whether existing optimizers should be turned on/off - params->config_fns->get_remapping = get_remapping; - params->config_fns->get_auto_mixed_precision = get_auto_mixed_precision; + params->configs->remapping = TF_TriState_Off; + params->configs->auto_mixed_precision = TF_TriState_On; // ... // Set functions to create a new optimizer. @@ -475,9 +481,9 @@ This API can be used to: auto init_plugin_fn = reinterpret_cast(dso_symbol); TP_OptimizerRegistrationParams params{TP_OPTIMIZER_REGISTRARION_PARAMS_STRUCT_SIZE}; - TP_OptimizerConfigFns config_fns{TP_OPTIMIZER_CONFIG_FNS_STRUCT_SIZE}; + TP_OptimizerConfigs configs{TP_OPTIMIZER_CONFIGS_STRUCT_SIZE}; TP_Optimizer optimizer{TP_OPTIMIZER_STRUCT_SIZE}; - params->config_fns = &config_fns; + params->configs = &configs; params->optimizer = &optimizer; TF_Status* status = TF_NewStatus(); From a8b679e1859bffe8ddefa785b0839188a1cecf74 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Wed, 2 Dec 2020 08:45:33 +0800 Subject: [PATCH 09/11] Fix typos --- rfcs/20201027-modular-tensorflow-graph-c-api.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index 2cfeeed0d..335a1e4a6 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -164,15 +164,17 @@ This API can be used to: } ``` - When multiple plugins are successfully registered and running for a graph, their recommended configurations may differ with each other. If any of the config has turned off the optimizer, the optimizer will be disabled. The following table lists all possible scenarios. In the table, plugin's config is represented by tristates, `ON` means turn on optimizer, `OFF` means turn off optimzier, and `DEFAULT` means uses proper's config. + When multiple plugins are successfully registered and running for a graph, their recommended configurations may differ with each other. If any of the config has turned off the optimizer, the optimizer will be disabled. The following table lists all possible scenarios. In the table, plugin's config is represented by tristates, `ON` means turn on optimizer, `OFF` means turn off optimizer, and `DEFAULT` means uses proper's config. | Proper's config | Plugin1's config | Plugin2's config | Final config | Notes| |:-------------- |:-------------- |:-------------- |:-------------- |:-------------- | | ON | ON/DEFAULT | ON/DEFAULT | **ON**| The optimizer is enabled. | | ON | OFF | OFF | **OFF**| The optimizer is disabled, unless users manually unload the plugin. Grappler prints warnings to remind users that config has been changed based on plugin's config.| - | ON | ON/DEFAULT | OFF | **OFF**| The optimizer is disabled if at least one plugin turns off it. Grappler prints warnings to remind users that config has been changed based on plugin's config, and potention performance regression may happen due to the conflict configs.| + | ON | ON/DEFAULT | OFF | **OFF**| The optimizer is disabled if at least one plugin turns it off. Grappler prints warnings to remind users that config has been changed based on plugin's config, and potention performance regression may happen due to the conflict configs.| | ON | OFF | ON/DEFAULT | **OFF**| Same as previous scenario.| - | OFF | ON/DEFAULT/OFF | ON/DEFAULT/OFF | **OFF**| The optimizer is always disabled when user turns off it. | + | OFF | ON/DEFAULT/OFF | ON/DEFAULT/OFF | **OFF**| The optimizer is always disabled when user turns it off. | + + Plugins should also run a set of performance benchmarks to ensure that turning off some existing optimizers doesn't cause nontrivial performance degradations. ### Versioning Strategy and Stability @@ -237,11 +239,11 @@ This API can be used to: void* ext; // reserved for future use void* (*create_func)(); void (*optimize_func)(void*, TF_Buffer*, TF_Buffer*); - void (*destory_func)(void*); + void (*destroy_func)(void*); } TP_Optimizer; #define TP_OPTIMIZER_STRUCT_SIZE \ - TF_OFFSET_OF_END(TP_Optimizer, destory_func) + TF_OFFSET_OF_END(TP_Optimizer, destroy_func) typedef struct TP_OptimizerRegistrationParams { size_t struct_size; @@ -403,7 +405,7 @@ This API can be used to: auto* optimizer = new PluginOptimizer; return (void*)optimizer; } - static void P_Destory(void* optimizer) { + static void P_Destroy(void* optimizer) { delete static_cast(optimizer); } static void P_Optimize( @@ -463,7 +465,7 @@ This API can be used to: // Set functions to create a new optimizer. params->optimizer->create_func = P_Create; params->optimizer->optimize_func = P_Optimize; - params->optimizer->destory_func = P_Destory; + params->optimizer->destroy_func = P_Destroy; } ``` From 29efd56a5a1da944949608227d9c832a4b756acd Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Wed, 9 Dec 2020 08:37:06 +0800 Subject: [PATCH 10/11] Update compatibility description --- rfcs/20201027-modular-tensorflow-graph-c-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index 335a1e4a6..e899740bd 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -184,7 +184,7 @@ This API can be used to: * **GraphDef** - The compatibility of `GraphDef` between plugin and proper is guaranteed by protobuf library. + The compatibility of `GraphDef` between plugin and proper follows the same compatibility [rules](https://developers.google.com/protocol-buffers/docs/cpptutorial?hl=en#extending-a-protocol-buffer) and [guarantees](https://developers.google.com/protocol-buffers/docs/proto3?hl=en#updating) as protobuf library. ### Detailed C APIs From 20d592bfbb93880a56a2083ab6a185fc5580358b Mon Sep 17 00:00:00 2001 From: ematejska Date: Thu, 10 Dec 2020 13:54:40 -0800 Subject: [PATCH 11/11] Update 20201027-modular-tensorflow-graph-c-api.md --- rfcs/20201027-modular-tensorflow-graph-c-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/20201027-modular-tensorflow-graph-c-api.md b/rfcs/20201027-modular-tensorflow-graph-c-api.md index e899740bd..8e7d4a5fb 100644 --- a/rfcs/20201027-modular-tensorflow-graph-c-api.md +++ b/rfcs/20201027-modular-tensorflow-graph-c-api.md @@ -1,6 +1,6 @@ # Modular TensorFlow Graph C API -| Status | Proposed | +| Status | Accepted | :-------------- |:---------------------------------------------------- | | **RFC #** | [318](https://github.com/tensorflow/community/pull/318)| | **Author(s)** | Yang Sheng (yang.sheng@intel.com), Zhoulong Jiang (zhoulong.jiang@intel.com), Yiqiang Li (yiqiang.li@intel.com), Eric Lin (eric.lin@intel.com), Jianhui Li (jian.hui.li@intel.com) |