Merge remote-tracking branch 'upstream/master' into xtensa-p6-build
Manually fixed the following conflicts: Manually fixed the following tensorflow/lite/micro/kernels/xtensa/quantize.cc
This commit is contained in:
commit
fb0d7ac1c7
@ -3,6 +3,8 @@
|
||||
/tensorflow/c/eager @qqfish @kkimdev
|
||||
/tensorflow/core/common_runtime/eager @qqfish @kkimdev
|
||||
/tenosrflow/core/debug @caisq
|
||||
/tensorflow/core/kernels/mkl/ @penpornk
|
||||
/tensorflow/core/kernels/sparse/ @penpornk
|
||||
/tensorflow/core/nccl/ @azaks2 @chsigg
|
||||
/tensorflow/core/platform/windows/ @mihaimaruseac
|
||||
/tensorflow/lite/experimental/micro @petewarden @advaitjain
|
||||
|
||||
839
RELEASE.md
839
RELEASE.md
@ -111,459 +111,448 @@ This release contains contributions from many people at Google, as well as:
|
||||
|
||||
# Release 2.4.0
|
||||
|
||||
<INSERT SMALL BLURB ABOUT RELEASE FOCUS AREA AND POTENTIAL TOOLCHAIN CHANGES>
|
||||
## Major Features and Improvements
|
||||
|
||||
* `tf.distribute` introduces experimental support for asynchronous training of
|
||||
models via the [`tf.distribute.experimental.ParameterServerStrategy`]
|
||||
(https://www.tensorflow.org/api_docs/python/tf/distribute/experimental/ParameterServerStrategy)
|
||||
API. Please see the [tutorial](https://www.tensorflow.org/tutorials/distribute/parameter_server_training)
|
||||
to learn more.
|
||||
|
||||
* [`MultiWorkerMirroredStrategy`](https://www.tensorflow.org/api_docs/python/tf/distribute/MultiWorkerMirroredStrategy)
|
||||
is now a stable API and is no longer considered experimental. Some of the
|
||||
major improvements involve handling peer failure and many bug fixes. Please
|
||||
check out the detailed tutorial on [Multi-worker training with Keras]
|
||||
(https://www.tensorflow.org/tutorials/distribute/multi_worker_with_keras).
|
||||
|
||||
* Introduces experimental support for a new module named [`tf.experimental.numpy`]
|
||||
(https://www.tensorflow.org/api_docs/python/tf/experimental/numpy) which is a
|
||||
NumPy-compatible API for writing TF programs. See the [detailed guide]
|
||||
(https://www.tensorflow.org/guide/tf_numpy) to learn more. Additional details below.
|
||||
|
||||
* Adds Support for
|
||||
[TensorFloat-32](https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/)
|
||||
on Ampere based GPUs. TensorFloat-32, or TF32 for short, is a math mode for
|
||||
NVIDIA Ampere based GPUs and is enabled by default.
|
||||
|
||||
* A major refactoring of the internals of the Keras Functional API has been
|
||||
completed, that should improve the reliability, stability, and performance of
|
||||
constructing Functional models.
|
||||
|
||||
* Keras mixed precision API [`tf.keras.mixed_precision`]
|
||||
(https://www.tensorflow.org/api_docs/python/tf/keras/mixed_precision?version=nightly)
|
||||
is no longer experimental and allows the use of 16-bit floating point formats
|
||||
during training, improving performance by up to 3x on GPUs and 60% on TPUs.
|
||||
Please see below for additional details.
|
||||
|
||||
* TensorFlow Profiler now supports profiling `MultiWorkerMirroredStrategy` and
|
||||
tracing multiple workers using the [sampling mode API]
|
||||
(https://www.tensorflow.org/guide/profiler#profiling_apis).
|
||||
|
||||
* TFLite Profiler for Android is available. See the detailed [guide]
|
||||
(https://www.tensorflow.org/lite/performance/measurement#trace_tensorflow_lite_internals_in_android)
|
||||
to learn more.
|
||||
|
||||
* TensorFlow pip packages are now built with CUDA11 and cuDNN 8.0.2.
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
* <DOCUMENT BREAKING CHANGES HERE>
|
||||
* <THIS SECTION SHOULD CONTAIN API, ABI AND BEHAVIORAL BREAKING CHANGES>
|
||||
* Certain float32 ops run in lower precsion on Ampere based GPUs, including
|
||||
matmuls and convolutions, due to the use of
|
||||
[TensorFloat-32](https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/).
|
||||
* TF Core:
|
||||
* Certain float32 ops run in lower precsion on Ampere based GPUs, including
|
||||
matmuls and convolutions, due to the use of [TensorFloat-32]
|
||||
(https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/).
|
||||
Specifically, inputs to such ops are rounded from 23 bits of precision to 10
|
||||
bits of precision. This is unlikely to cause issues in practice for deep
|
||||
learning models. In some cases, TensorFloat-32 is also used for complex64 ops.
|
||||
TensorFloat-32 can be disabled by running
|
||||
`config.experimental.enable_tensor_float_32_execution(False)`. The "Major
|
||||
Features and Improvements" section has more details.
|
||||
* The byte layout for string tensors across the C-API has been updated to match
|
||||
bits of precision. This is unlikely to cause issues in practice for deep learning
|
||||
models. In some cases, TensorFloat-32 is also used for complex64 ops.
|
||||
TensorFloat-32 can be disabled by running `tf.config.experimental.enable_tensor_float_32_execution(False)`.
|
||||
* The byte layout for string tensors across the C-API has been updated to match
|
||||
TF Core/C++; i.e., a contiguous array of `tensorflow::tstring`/`TF_TString`s.
|
||||
* C-API functions `TF_StringDecode`, `TF_StringEncode`, and
|
||||
`TF_StringEncodedSize` are no longer relevant and have been removed; see
|
||||
core/platform/ctstring.h for string access/modification in C.
|
||||
* Removed `tf.distribute.Strategy.experimental_run_v2` method, which was deprecated in TF 2.2.
|
||||
* `tensorflow.python`, `tensorflow.core` and `tensorflow.compiler` modules are
|
||||
now hidden. These modules are not part of TensorFlow public API.
|
||||
* A major refactoring of the internals of the Keras Functional API may affect code that is relying on certain internal details:
|
||||
* Code that uses `isinstance(x, tf.Tensor)` instead of `tf.is_tensor` when checking Keras symbolic inputs/outputs should switch to using `tf.is_tensor`.
|
||||
* Code that is overly dependent on the exact names attached to symbolic tensors (e.g. assumes there will be ":0" at the end of the inputs, treats names as unique identifiers instead of using `tensor.ref()`, etc.)
|
||||
* Code that uses `get_concrete_function` to trace Keras symbolic inputs directly should switch to building matching `tf.TensorSpec`s directly and tracing the `TensorSpec` objects.
|
||||
* Code that relies on the exact number and names of the op layers that TensorFlow operations were converted into. These may have changed.
|
||||
* Code that uses `tf.map_fn`/`tf.cond`/`tf.while_loop`/control flow as op layers and happens to work before TF 2.4. These will explicitly be unsupported now. Converting these ops to Functional API op layers was unreliable before TF 2.4, and prone to erroring incomprehensibly or being silently buggy.
|
||||
* Code that directly asserts on a Keras symbolic value in cases where ops like `tf.rank` used to return a static or symbolic value depending on if the input had a fully static shape or not. Now these ops always return symbolic values.
|
||||
* Code already susceptible to leaking tensors outside of graphs becomes slightly more likely to do so now.
|
||||
* Code that tries directly getting gradients with respect to symbolic Keras inputs/outputs. Use GradientTape on the actual Tensors passed to the already-constructed model instead.
|
||||
* Code that requires very tricky shape manipulation via converted op layers in order to work, where the Keras symbolic shape inference proves insufficient.
|
||||
* Code that tries manually walking a `tf.keras.Model` layer by layer and assumes layers only ever have one positional argument. This assumption doesn't hold true before TF 2.4 either, but is more likely to cause issues know.
|
||||
* Code that manually enters `keras.backend.get_graph()` before building a functional model. This is no longer needed.
|
||||
* Start enforcing input shape assumptions when calling Functional API Keras
|
||||
* C-API functions `TF_StringDecode`, `TF_StringEncode`, and `TF_StringEncodedSize`
|
||||
are no longer relevant and have been removed; see `core/platform/ctstring.h` for
|
||||
string access/modification in C.
|
||||
* `tensorflow.python`, `tensorflow.core` and `tensorflow.compiler` modules are
|
||||
now hidden. These modules are not part of TensorFlow public API.
|
||||
* `tf.raw_ops.Max` and `tf.raw_ops.Min` no longer accept inputs of type
|
||||
`tf.complex64` or `tf.complex128`, because the behavior of these ops is not
|
||||
well defined for complex types.
|
||||
* XLA:CPU and XLA:GPU devices are no longer registered by default. Use
|
||||
`TF_XLA_FLAGS=--tf_xla_enable_xla_devices` if you really need them, but this
|
||||
flag will eventually be removed in subsequent releases.
|
||||
|
||||
* `tf.keras`:
|
||||
* The `steps_per_execution` argument in `model.compile()` is no longer experimental;
|
||||
if you were passing `experimental_steps_per_execution`, rename it to
|
||||
`steps_per_execution` in your code. This argument controls the number of batches
|
||||
to run during each `tf.function` call when calling `model.fit()`. Running multiple
|
||||
batches inside a single `tf.function` call can greatly improve performance on
|
||||
TPUs or small models with a large Python overhead.
|
||||
* A **major refactoring** of the internals of the Keras Functional API may affect code that
|
||||
is relying on certain internal details:
|
||||
* Code that uses `isinstance(x, tf.Tensor)` instead of `tf.is_tensor` when
|
||||
checking Keras symbolic inputs/outputs should switch to using `tf.is_tensor`.
|
||||
* Code that is overly dependent on the exact names attached to symbolic tensors
|
||||
(e.g. assumes there will be ":0" at the end of the inputs, treats names as
|
||||
unique identifiers instead of using `tensor.ref()`, etc.) may break.
|
||||
* Code that uses full path for `get_concrete_function` to trace Keras symbolic
|
||||
inputs directly should switch to building matching `tf.TensorSpec`s directly and
|
||||
tracing the `TensorSpec` objects.
|
||||
* Code that relies on the exact number and names of the op layers that TensorFlow
|
||||
operations were converted into may have changed.
|
||||
* Code that uses `tf.map_fn`/`tf.cond`/`tf.while_loop`/control flow as op layers
|
||||
and happens to work before TF 2.4. These will explicitly be unsupported now.
|
||||
Converting these ops to Functional API op layers was unreliable before TF 2.4,
|
||||
and prone to erroring incomprehensibly or being silently buggy.
|
||||
* Code that directly asserts on a Keras symbolic value in cases where ops
|
||||
like `tf.rank` used to return a static or symbolic value depending on if the
|
||||
input had a fully static shape or not. Now these ops always return symbolic values.
|
||||
* Code already susceptible to leaking tensors outside of graphs becomes slightly
|
||||
more likely to do so now.
|
||||
* Code that tries directly getting gradients with respect to symbolic Keras
|
||||
inputs/outputs. Use `GradientTape` on the actual Tensors passed to the already-constructed
|
||||
model instead.
|
||||
* Code that requires very tricky shape manipulation via converted op layers
|
||||
in order to work, where the Keras symbolic shape inference proves insufficient.
|
||||
* Code that tries manually walking a `tf.keras.Model` layer by layer and assumes
|
||||
layers only ever have one positional argument. This assumption doesn't hold
|
||||
true before TF 2.4 either, but is more likely to cause issues now.
|
||||
* Code that manually enters `keras.backend.get_graph()` before building a
|
||||
functional model is no longer needed.
|
||||
* Start enforcing input shape assumptions when calling Functional API Keras
|
||||
models. This may potentially break some users, in case there is a mismatch
|
||||
between the shape used when creating `Input` objects in a Functional model,
|
||||
and the shape of the data passed to that model. You can fix this mismatch by
|
||||
either calling the model with correctly-shaped data, or by relaxing `Input`
|
||||
shape assumptions (note that you can pass shapes with `None` entries for axes
|
||||
that are meant to be dynamic). You can also disable the input checking
|
||||
entirely by setting `model.input_spec = None`.
|
||||
* TF pip packages now use CUDA11 and cuDNN 8.0.2.
|
||||
* XLA:CPU and XLA:GPU devices are no longer registered by default. Use
|
||||
`TF_XLA_FLAGS=--tf_xla_enable_xla_devices` if you really need them (to be
|
||||
removed).
|
||||
* `tf.raw_ops.Max` and `tf.raw_ops.Min` no longer accept inputs of type
|
||||
`tf.complex64` or `tf.complex128`, because the behavior of these ops is not
|
||||
well defined for complex types.
|
||||
* `tf.data.experimental.service.DispatchServer` now takes a config tuple
|
||||
either calling the model with correctly-shaped data, or by relaxing `Input` shape
|
||||
assumptions (note that you can pass shapes with `None` entries for axes that
|
||||
are meant to be dynamic). You can also disable the input checking entirely by
|
||||
setting `model.input_spec = None`.
|
||||
* Several changes have been made to `tf.keras.mixed_precision.experimental`.
|
||||
Note that it is now recommended to use the non-experimental
|
||||
`tf.keras.mixed_precision` API.
|
||||
* `AutoCastVariable.dtype` now refers to the actual variable dtype, not the
|
||||
dtype it will be casted to.
|
||||
* When mixed precision is enabled, `tf.keras.layers.Embedding` now outputs a
|
||||
float16 or bfloat16 tensor instead of a float32 tensor.
|
||||
* The property `tf.keras.mixed_precision.experimental.LossScaleOptimizer.loss_scale`
|
||||
is now a tensor, not a `LossScale` object. This means to get a loss scale
|
||||
of a `LossScaleOptimizer` as a tensor, you must now call `opt.loss_scale`instead of `opt.loss_scale()`.
|
||||
* The property `should_cast_variables` has been removed from `tf.keras.mixed_precision.experimental.Policy`
|
||||
* When passing a `tf.mixed_precision.experimental.DynamicLossScale` to `tf.keras.mixed_precision.experimental.LossScaleOptimizer`,
|
||||
the `DynamicLossScale`'s multiplier must be 2.
|
||||
* When passing a `tf.mixed_precision.experimental.DynamicLossScale` to
|
||||
`tf.keras.mixed_precision.experimental.LossScaleOptimizer`, the weights of
|
||||
the `DynanmicLossScale` are copied into the `LossScaleOptimizer` instead of being reused.
|
||||
This means modifying the weights of the `DynamicLossScale` will no longer affect the weights of the LossScaleOptimizer, and vice versa.
|
||||
* The global policy can no longer be set to a non-floating point policy in `tf.keras.mixed_precision.experimental.set_policy`
|
||||
* In `Layer.call`, `AutoCastVariable`s will no longer be casted within
|
||||
`MirroredStrategy.run` or `ReplicaContext.merge_call`. This is because a thread local
|
||||
variable is used to determine whether `AutoCastVariable`s are casted, and those
|
||||
two functions run with a different thread. Note this only applies if one of
|
||||
these two functions is called within `Layer.call`; if one of those two functions calls `Layer.call`, `AutoCastVariable`s will still be casted.
|
||||
|
||||
* `tf.data`:
|
||||
* `tf.data.experimental.service.DispatchServer` now takes a config tuple
|
||||
instead of individual arguments. Usages should be updated to
|
||||
`tf.data.experimental.service.DispatchServer(dispatcher_config)`.
|
||||
* `tf.data.experimental.service.WorkerServer` now takes a config tuple
|
||||
instead of individual arguments. Usages should be updated to
|
||||
`tf.data.experimental.service.WorkerServer(worker_config)`.
|
||||
* `tf.quantization.quantize_and_dequantize_v2` has been introduced, which
|
||||
updates the gradient definition for quantization which is outside the range
|
||||
to be 0. To simulate the V1 the behavior of
|
||||
tf.quantization.quantize_and_dequantize(...) use
|
||||
tf.grad_pass_through(tf.quantization.quantize_and_dequantize_v2)(...).
|
||||
* `tf.distribute.Strategy.experimental_make_numpy_dataset` is removed. Please
|
||||
use `tf.data.Dataset.from_tensor_slices` instead.
|
||||
* `experimental_hints` in `tf.distribute.StrategyExtended.reduce_to`,
|
||||
`tf.distribute.StrategyExtended.batch_reduce_to`,
|
||||
`tf.distribute.ReplicaContext.all_reduce` are renamed to `options`.
|
||||
`tf.distribute.experimental.CollectiveHints` is renamed
|
||||
`tf.distribute.experimental.CommunicationOptions`.
|
||||
`tf.distribute.experimental.CollectiveCommunication` is renamed
|
||||
`tf.distribute.experimental.CommunicationImplementation`.
|
||||
* `tf.keras.mixed_precision.experimental`:
|
||||
* `AutoCastVariable.dtype` now refers to the actual variable dtype, not the
|
||||
dtype it will be casted to.
|
||||
* When mixed precision is enabled, `tf.keras.layers.Embedding` now outputs a
|
||||
float16 or bfloat16 tensor instead of a float32 tensor.
|
||||
* The property
|
||||
`tf.keras.mixed_precision.experimental.LossScaleOptimizer.loss_scale` is now
|
||||
a tensor, not a `LossScale` object. This means to get a loss scale of a
|
||||
`LossScaleOptimizer` as a tensor, you must now call `opt.loss_scale` instead
|
||||
of `opt.loss_scale()`.
|
||||
* The property `should_cast_variables` has been removed from
|
||||
`tf.keras.mixed_precision.experimental.Policy`
|
||||
* When passing a `tf.mixed_precision.experimental.DynamicLossScale` to
|
||||
`tf.keras.mixed_precision.experimental.LossScaleOptimizer`, the
|
||||
`DynamicLossScale`'s multiplier must be 2.
|
||||
* When passing a `tf.mixed_precision.experimental.DynamicLossScale` to
|
||||
`tf.keras.mixed_precision.experimental.LossScaleOptimizer`, the weights of
|
||||
the `DynanmicLossScale` are copied into the `LossScaleOptimizer` instead of
|
||||
being reused. This means modifying the weights of the `DynamicLossScale`
|
||||
will no longer affect the weights of the LossScaleOptimizer, and vice versa.
|
||||
* The global policy can no longer be set to a non-floating point policy in
|
||||
`tf.keras.mixed_precision.experimental.set_policy`
|
||||
* In `Layer.call`, `AutoCastVariable`s will no longer be casted within
|
||||
`MirroredStrategy.run` or `ReplicaContext.merge_call`. This is because a
|
||||
thread local variable is used to determine whether `AutoCastVariable`s are
|
||||
casted, and those two functions run with a different thread. Note this only
|
||||
applies if one of these two functions is called within `Layer.call`; if one
|
||||
of those two functions calls `Layer.call`, `AutoCastVariable`s will still be
|
||||
casted.
|
||||
|
||||
## Known Caveats
|
||||
|
||||
* <CAVEATS REGARDING THE RELEASE (BUT NOT BREAKING CHANGES). E.G. ADDING A NEW DEPENDENCY, BUMPING A DEPENDENCY NUMBER, LACK OF SUPPORT ON SOME PLATFORM, ETC>
|
||||
|
||||
## Major Features and Improvements
|
||||
|
||||
* <INSERT MAJOR FEATURE HERE, USING MARKDOWN SYNTAX>
|
||||
* <IF RELEASE CONTAINS MULTIPLE FEATURES FROM SAME AREA, GROUP THEM TOGETHER>
|
||||
* A new module named `tf.experimental.numpy` is added, which is a NumPy-compatible API for writing TF programs. This module provides class `ndarray`, which mimics the `ndarray` class in NumPy, and wraps an immutable `tf.Tensor` under the hood. A subset of NumPy functions (e.g. `numpy.add`) are provided. Their inter-operation with TF facilities is seamless in most cases. See [tensorflow/python/ops/numpy_ops/README.md](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/numpy_ops/README.md) for details of what operations are supported and what are the differences from NumPy.
|
||||
* A major refactoring of the internals of the Keras Functional API has been completed, that should improve the reliability, stability, and performance of constructing Functional models.
|
||||
* Support for
|
||||
[TensorFloat-32](https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/)
|
||||
on Ampere based GPUs has been added. TensorFloat-32, or TF32 for short, is a
|
||||
math mode for NVIDIA Ampere GPUs which causes certain float32 ops, such as
|
||||
matrix multiplications and convolutions, to run much faster on Ampere GPUs but
|
||||
with reduced precision. This reduced precision has not been found to effect
|
||||
convergence quality of deep learning models in practice. TensorFloat-32 is
|
||||
enabled by default, but can be disabled with
|
||||
`tf.config.experimental.enable_tensor_float_32_execution`.
|
||||
* `tf.data.experimental.service.WorkerServer` now takes a config tuple instead
|
||||
of individual arguments. Usages should be updated to `tf.data.experimental.service.WorkerServer(worker_config)`.
|
||||
|
||||
* `tf.distribute`:
|
||||
* `MultiWorkerMirroredStrategy` is graduated out of experimental.
|
||||
* Peer failure will no longer cause the cluster to hang.
|
||||
* Major issues with saving are fixed.
|
||||
* See [Multi-worker training with Keras](https://www.tensorflow.org/tutorials/distribute/multi_worker_with_keras) for a tutorial.
|
||||
* Deprecated `experimental_distribute_datasets_from_function` method and renamed it to `distribute_datasets_from_function` as it is no longer experimental.
|
||||
* The `tf.keras.mixed_precision` API has been made non-experimental. The major
|
||||
changes to the new non-experimental API are:
|
||||
* `tf.keras.mixed_precision.Policy` no longer takes in a
|
||||
`tf.mixed_precision.experimental.LossScale` in the constructor, and no
|
||||
longer has a `LossScale` associated with it. Instead, `Model.compile` will
|
||||
automatically wrap the optimizer with a `LossScaleOptimizer` using dynamic
|
||||
loss scaling if `Policy.name` is "mixed_float16".
|
||||
* `tf.keras.mixed_precision.LossScaleOptimizer`'s constructor takes in
|
||||
different arguments. In particular, it no longer takes in a `LossScale`, and
|
||||
there is no longer a `LossScale` associated with the `LossScaleOptimizer`.
|
||||
Instead, `LossScaleOptimizer` directly implements fixed or dynamic loss
|
||||
scaling. See the documentation of
|
||||
`tf.keras.mixed_precision.experimental.LossScaleOptimizer` for details on
|
||||
the differences between the experimental `LossScaleOptimizer` and the new
|
||||
non-experimental `LossScaleOptimizer`.
|
||||
* `tf.mixed_precision.experimental.LossScale` and its subclasses are
|
||||
deprecated, as all of its functionality now exists within
|
||||
`tf.keras.mixed_precision.LossScaleOptimizer`
|
||||
* Removes `tf.distribute.Strategy.experimental_make_numpy_dataset`. Please use
|
||||
`tf.data.Dataset.from_tensor_slices` instead.
|
||||
* Renames `experimental_hints` in `tf.distribute.StrategyExtended.reduce_to`,
|
||||
`tf.distribute.StrategyExtended.batch_reduce_to`, `tf.distribute.ReplicaContext.all_reduce`
|
||||
to `options`.
|
||||
* Renames `tf.distribute.experimental.CollectiveHints` to `tf.distribute.experimental.CommunicationOptions`.
|
||||
* Renames `tf.distribute.experimental.CollectiveCommunication` to `tf.distribute.experimental.CommunicationImplementation`.
|
||||
* Renames `tf.distribute.Strategy.experimental_distribute_datasets_from_function` to `distribute_datasets_from_function` as it is no longer experimental.
|
||||
* Removes `tf.distribute.Strategy.experimental_run_v2` method, which was deprecated in TF 2.2.
|
||||
|
||||
* `tf.lite`:
|
||||
* `tf.quantization.quantize_and_dequantize_v2` has been introduced, which updates the gradient definition for quantization which is outside the range
|
||||
to be 0. To simulate the V1 the behavior of `tf.quantization.quantize_and_dequantize(...)` use
|
||||
`tf.grad_pass_through(tf.quantization.quantize_and_dequantize_v2)(...)`.
|
||||
|
||||
* Building TensorFlow:
|
||||
* Windows platform builds: TensorFlow on Windows under MSVC is now built with
|
||||
`--copt=/experimental:preprocessor --host_copt=/experimental:preprocessor`
|
||||
(see `.bazelrc` for more details). Builds including TensorFlow may fail with
|
||||
unexpected syntax errors if these flags are absent. See also
|
||||
[this thread on SIG Build](https://groups.google.com/a/tensorflow.org/g/build/c/LbAw8RILvTg/m/ttnuhYU2BgAJ).
|
||||
|
||||
## Known Caveats
|
||||
* `tf.keras.mixed_precision`
|
||||
* When using mixed precision, calling `RMSprop.apply_gradients` or
|
||||
`Nadam.apply_gradients` outside a `tf.function` does not work and will raise
|
||||
the AttributeError "Tensor.op is meaningless when eager execution is enabled".
|
||||
See this [issue](https://github.com/tensorflow/tensorflow/issues/45536) for details and a workaround.
|
||||
|
||||
## Bug Fixes and Other Changes
|
||||
|
||||
* <SIMILAR TO ABOVE SECTION, BUT FOR OTHER IMPORTANT CHANGES / BUG FIXES>
|
||||
* <IF A CHANGE CLOSES A GITHUB ISSUE, IT SHOULD BE DOCUMENTED HERE>
|
||||
* <NOTES SHOULD BE GROUPED PER AREA>
|
||||
* Security:
|
||||
* Fixes an undefined behavior causing a segfault in `tf.raw_ops.Switch`
|
||||
([CVE-2020-15190](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15190))
|
||||
* Fixes three vulnerabilities in conversion to DLPack format
|
||||
([CVE-2020-15191](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15191),
|
||||
[CVE-2020-15192](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15192),
|
||||
[CVE-2020-15193](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15193))
|
||||
* Fixes two vulnerabilities in `SparseFillEmptyRowsGrad`
|
||||
([CVE-2020-15194](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15194),
|
||||
[CVE-2020-15195](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15195))
|
||||
* Fixes several vulnerabilities in `RaggedCountSparseOutput` and
|
||||
`SparseCountSparseOutput` operations
|
||||
([CVE-2020-15196](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15196),
|
||||
[CVE-2020-15197](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15197),
|
||||
[CVE-2020-15198](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15198),
|
||||
[CVE-2020-15199](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15199),
|
||||
[CVE-2020-15200](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15200),
|
||||
[CVE-2020-15201](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15201))
|
||||
* Fixes an integer truncation vulnerability in code using the work sharder
|
||||
API
|
||||
([CVE-2020-15202](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15202))
|
||||
* Fixes a format string vulnerability in `tf.strings.as_string`
|
||||
([CVE-2020-15203](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15203))
|
||||
* Fixes segfault raised by calling session-only ops in eager mode
|
||||
([CVE-2020-15204](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15204))
|
||||
* Fixes data leak and potential ASLR violation from
|
||||
`tf.raw_ops.StringNGrams`
|
||||
([CVE-2020-15205](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15205))
|
||||
* Fixes segfaults caused by incomplete `SavedModel` validation
|
||||
([CVE-2020-15206](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15206))
|
||||
* Fixes a data corruption due to a bug in negative indexing support in
|
||||
TFLite
|
||||
([CVE-2020-15207](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15207))
|
||||
* Fixes a data corruption due to dimension mismatch in TFLite
|
||||
([CVE-2020-15208](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15208))
|
||||
* Fixes several vulnerabilities in TFLite saved model format
|
||||
([CVE-2020-15209](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15209),
|
||||
[CVE-2020-15210](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15210),
|
||||
[CVE-2020-15211](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15211))
|
||||
* Fixes several vulnerabilities in TFLite implementation of segment sum
|
||||
([CVE-2020-15212](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15212),
|
||||
[CVE-2020-15213](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15213),
|
||||
[CVE-2020-15214](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15214))
|
||||
* Fixes a segfault in `tf.quantization.quantize_and_dequantize`
|
||||
([CVE-2020-15265](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15265))
|
||||
* Fixes an undefined behavior float cast causing a crash
|
||||
([CVE-2020-15266](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15266))
|
||||
* TF Core:
|
||||
* `tf.types.experimental.TensorLike` is a new `Union` type that can be
|
||||
used as type annotation for variables representing a Tensor or a value
|
||||
that can be converted to Tensor by `tf.convert_to_tensor`.
|
||||
* Calling ops with a python constants or numpy values is now consistent
|
||||
with tf.convert_to_tensor behavior. This avoids operations like
|
||||
tf.reshape truncating inputs such as from int64 to int32.
|
||||
* Added `tf.sparse.map_values` to apply a function to the `.value`s of
|
||||
`SparseTensor` arguments.
|
||||
* The Python bitwise operators for `Tensor` (`__and__`, `__or__`,
|
||||
`__xor__` and `__invert__` now support non-`bool` arguments and apply
|
||||
the corresponding bitwise ops. `bool` arguments continue to be supported
|
||||
and dispatch to logical ops. This brings them more in line with Python
|
||||
and NumPy behavior.
|
||||
* Added `tf.SparseTensor.with_values`. This returns a new SparseTensor
|
||||
with the same sparsity pattern, but with new provided values. It is
|
||||
similar to the `with_values` function of `RaggedTensor`.
|
||||
* Added `StatelessCase` op, and uses it if none of case branches has
|
||||
stateful ops.
|
||||
* Added `tf.config.experimental.get_memory_usage` to return total memory
|
||||
usage of the device.
|
||||
* Added gradients for `RaggedTensorToVariant` and `RaggedTensorFromVariant`.
|
||||
* Improve shape inference of nested function calls by supporting constant folding across Arg nodes which makes more static values available to shape inference functions.
|
||||
* `tf.data`:
|
||||
* tf.data service:
|
||||
* Added new `tf.data.experimental.service.register_dataset` and
|
||||
`tf.data.experimental.service.from_dataset_id` APIs to enable one
|
||||
process to register a dataset with the tf.data service, and another
|
||||
process to consume data from the dataset.
|
||||
* Added support for dispatcher fault tolerance. To enable fault tolerance,
|
||||
configure a `work_dir` when running your dispatcher server and set
|
||||
`dispatcher_fault_tolerance=True`. The dispatcher will store its state
|
||||
to `work_dir`, so that on restart it can continue from its previous
|
||||
state after restart.
|
||||
* Added support for sharing dataset graphs via shared filesystem instead
|
||||
of over RPC. This reduces load on the dispatcher, improving performance
|
||||
of distributing datasets. For this to work, the dispatcher's `work_dir`
|
||||
must be accessible from workers. If the worker fails to read from the
|
||||
`work_dir`, it falls back to using RPC for dataset graph transfer.
|
||||
* Added support for a new "distributed_epoch" processing mode. This
|
||||
processing mode distributes a dataset across all tf.data workers,
|
||||
instead of having each worker process the full dataset. See
|
||||
[the tf.data service docs](https://www.tensorflow.org/api_docs/python/tf/data/experimental/service#understand_processing_mode)
|
||||
to learn more.
|
||||
* Added optional `exclude_cols` parameter to CsvDataset. This parameter is
|
||||
the complement of `select_cols`; at most one of these should be
|
||||
specified.
|
||||
* We have implemented an optimization which reorders data-discarding
|
||||
transformations such as `take` and `shard` to happen earlier in the
|
||||
dataset when it is safe to do so. The optimization can be disabled via
|
||||
the `experimental_optimization.reorder_data_discarding_ops` dataset
|
||||
option.
|
||||
* `tf.data.Options` were previously immutable and can now be overridden.
|
||||
* `tf.data.Dataset.from_generator` now supports Ragged and Sparse tensors
|
||||
with a new `output_signature` argument, which allows `from_generator` to
|
||||
produce any type describable by a `tf.TypeSpec`.
|
||||
* `tf.data.experimental.AUTOTUNE` is now available in the core API as
|
||||
`tf.data.AUTOTUNE`.
|
||||
* `tf.image`:
|
||||
* Added deterministic `tf.image.stateless_random_*` functions for each
|
||||
`tf.image.random_*` function. Added a new op
|
||||
`stateless_sample_distorted_bounding_box` which is a deterministic
|
||||
version of `sample_distorted_bounding_box` op. Given the same seed,
|
||||
these stateless functions/ops produce the same results independent of
|
||||
how many times the function is called, and independent of global seed
|
||||
settings.
|
||||
* `tf.distribute`:
|
||||
* (Experimental) Parameter server training:
|
||||
* Replaced the existing
|
||||
`tf.distribute.experimental.ParameterServerStrategy` symbol with
|
||||
a new class that is for parameter server training in TF2. Usage with
|
||||
the old symbol, usually with Estimator, should be replaced with
|
||||
`tf.compat.v1.distribute.experimental.ParameterServerStrategy`.
|
||||
* Added `tf.distribute.experimental.coordinator.*` namespace,
|
||||
including the main API `ClusterCoordinator` for coordinating the
|
||||
training cluster, the related data structure `RemoteValue`
|
||||
and `PerWorkerValue`.
|
||||
* `tf.keras`:
|
||||
* Improvements from the functional API refactoring:
|
||||
* Functional model construction does not need to maintain a global
|
||||
workspace graph, removing memory leaks especially when building many
|
||||
models or very large models.
|
||||
* Functional model construction should be ~8-10% faster on average.
|
||||
* Functional models can now contain non-symbolic values in their call
|
||||
inputs inside of the first positional argument.
|
||||
* Several classes of TF ops that were not reliably converted to Keras
|
||||
layers during functional API construction should now work, e.g.
|
||||
`tf.image.ssim_multiscale`
|
||||
* Error messages when Functional API construction goes wrong (and when
|
||||
ops cannot be converted to Keras layers automatically) should be
|
||||
clearer and easier to understand.
|
||||
* `Optimizer.minimize` can now accept a loss `Tensor` and a `GradientTape`
|
||||
as an alternative to accepting a `callable` loss.
|
||||
* Added `beta` hyperparameter to FTRL optimizer classes (Keras and others)
|
||||
to match FTRL paper
|
||||
(https://research.google.com/pubs/archive/41159.pdf).
|
||||
* Added `mobilenet_v3` to keras application model.
|
||||
* `Optimizer.__init__` now accepts a `gradient_aggregator` to allow for
|
||||
customization of how gradients are aggregated across devices, as well as
|
||||
`gradients_transformers` to allow for custom gradient transformations
|
||||
(such as gradient clipping).
|
||||
* The `steps_per_execution` argument in `compile()` is no longer
|
||||
experimental; if you were passing `experimental_steps_per_execution`,
|
||||
rename it to `steps_per_execution` in your code. This argument controls
|
||||
the number of batches to run during each `tf.function` call when calling
|
||||
`fit()`. Running multiple batches inside a single `tf.function` call can
|
||||
greatly improve performance on TPUs or small models with a large Python
|
||||
overhead.
|
||||
* Improvements to Keras preprocessing layers:
|
||||
* TextVectorization can now accept a vocabulary list or file as an
|
||||
init arg.
|
||||
* TextVectorization, StringLookup, and IntegerLookup can now accept a
|
||||
vocabulary file via the `set_vocab_from_file` method.
|
||||
* Normalization can now accept mean and variance values as init args.
|
||||
* In `Attention` and `AdditiveAttention` layers, the `call()` method now
|
||||
accepts a `return_attention_scores` argument. When set to
|
||||
True, the layer returns the attention scores as an additional output
|
||||
argument.
|
||||
* Added `tf.metrics.log_cosh` and `tf.metrics.logcosh` API entrypoints
|
||||
with the same implementation as their `tf.losses` equivalent.
|
||||
* For Keras model, the individual call of `Model.evaluate` uses no cached
|
||||
data for evaluation, while `Model.fit` uses cached data when
|
||||
`validation_data` arg is provided for better performance.
|
||||
* Added a `save_traces` argument to `model.save`/
|
||||
`tf.keras.models.save_model` which determines whether the SavedModel
|
||||
format stores the Keras model/layer call functions. The traced functions
|
||||
allow Keras to revive custom models and layers without the original
|
||||
class definition, but if this isn't required the tracing can be
|
||||
disabled with the added option.
|
||||
* `tf.function` / AutoGraph:
|
||||
* Added `experimental_follow_type_hints` argument for `tf.function`. When
|
||||
True, the function may use type annotations to optimize the tracing
|
||||
performance.
|
||||
* Added support for `iter(DistributedDataset)` in AutoGraph `for` loops.
|
||||
* AutoGraph now allows creating new symbols inside a TensorFlow loop, if
|
||||
the values of these symbols at an iteration does not depend on the
|
||||
previous iteration. These types of loops must run at least one
|
||||
iteration, and will raise a runtime error otherwise.
|
||||
* Variables contained in `tf.Module`s that are set as attributes of
|
||||
custom Keras `Layer`s and `Model`s are now tracked in
|
||||
the properties `layer.trainable_variables` and
|
||||
`layer.non_trainable_variables`.
|
||||
### TF Core:
|
||||
* Introduces experimental support for a new module named [`tf.experimental.numpy`]
|
||||
(https://www.tensorflow.org/api_docs/python/tf/experimental/numpy), which is a
|
||||
NumPy-compatible API for writing TF programs. This module provides class
|
||||
`ndarray`, which mimics the `ndarray` class in NumPy, and wraps an immutable
|
||||
`tf.Tensor` under the hood. A subset of NumPy functions (e.g. `numpy.add`) are
|
||||
provided. Their inter-operation with TF facilities is seamless in most cases.
|
||||
See [tensorflow/python/ops/numpy_ops/README.md](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/numpy_ops/README.md)
|
||||
for details of what operations are supported and what are the differences
|
||||
from NumPy.
|
||||
* `tf.types.experimental.TensorLike` is a new `Union` type that can be used as
|
||||
type annotation for variables representing a Tensor or a value
|
||||
that can be converted to Tensor by `tf.convert_to_tensor`.
|
||||
* Calling ops with a python constants or numpy values is now consistent with
|
||||
tf.convert_to_tensor behavior. This avoids operations like
|
||||
tf.reshape truncating inputs such as from int64 to int32.
|
||||
* Adds `tf.sparse.map_values` to apply a function to the `.value`s of
|
||||
`SparseTensor` arguments.
|
||||
* The Python bitwise operators for `Tensor` (`__and__`, `__or__`, `__xor__` and `__invert__` now support non-`bool`
|
||||
arguments and apply the corresponding bitwise ops. `bool` arguments continue
|
||||
to be supported and dispatch to logical ops. This brings them more in line with
|
||||
Python and NumPy behavior.
|
||||
* Adds `tf.SparseTensor.with_values`. This returns a new SparseTensor with the same sparsity pattern, but with new provided values. It is
|
||||
similar to the `with_values` function of `RaggedTensor`.
|
||||
* Adds `StatelessCase` op, and uses it if none of case branches has stateful ops.
|
||||
* Adds `tf.config.experimental.get_memory_usage` to return total memory usage of the device.
|
||||
* Adds gradients for `RaggedTensorToVariant` and `RaggedTensorFromVariant`.
|
||||
* Improve shape inference of nested function calls by supporting constant
|
||||
folding across Arg nodes which makes more static values available to shape
|
||||
inference functions.
|
||||
* `tf.debugging`:
|
||||
* `tf.debugging.assert_shapes()` now works on `SparseTensor`s (Fixes [#36268](https://github.com/tensorflow/tensorflow/issues/36268)).
|
||||
* GPU
|
||||
* Adds Support for [TensorFloat-32](https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/)
|
||||
on Ampere based GPUs.TensorFloat-32, or TF32 for short, is a math mode for
|
||||
NVIDIA Ampere based GPUs which causes certain float32 ops, such as matrix
|
||||
multiplications and convolutions, to run much faster on Ampere GPUs but with
|
||||
reduced precision. This reduced precision has not been found to effect
|
||||
convergence quality of deep learning models in practice. TensorFloat-32 is
|
||||
enabled by default, but can be disabled with `tf.config.experimental.enable_tensor_float_32_execution`.
|
||||
* `tf.math`:
|
||||
* Adds `tf.math.erfcinv`, the inverse to `tf.math.erfc`.
|
||||
* `tf.nn`:
|
||||
* `tf.nn.max_pool2d` now supports explicit padding.
|
||||
* `tf.image`:
|
||||
* Adds deterministic `tf.image.stateless_random_*` functions for each
|
||||
`tf.image.random_*` function. Added a new op `stateless_sample_distorted_bounding_box`
|
||||
which is a deterministic version of `sample_distorted_bounding_box` op.
|
||||
Given the same seed, these stateless functions/ops produce the same results
|
||||
independent of how many times the function is called, and independent of global seed settings.
|
||||
* Adds deterministic `tf.image.resize` backprop CUDA kernels for
|
||||
`method=ResizeMethod.BILINEAR` (the default method). Enable by setting the environment
|
||||
variable `TF_DETERMINISTIC_OPS` to `"true"` or `"1"`.
|
||||
* `tf.print`:
|
||||
* Bug fix in `tf.print()` with `OrderedDict` where if an `OrderedDict`
|
||||
didn't have the keys sorted, the keys and values were not being printed
|
||||
in accordance with their correct mapping.
|
||||
* `tf.train.Checkpoint`:
|
||||
* Now accepts a `root` argument in the initialization, which generates a
|
||||
checkpoint with a root object. This allows users to create a `Checkpoint`
|
||||
object that is compatible with Keras `model.save_weights()` and
|
||||
`model.load_weights`. The checkpoint is also compatible with the checkpoint
|
||||
saved in the `variables/` folder in the SavedModel.
|
||||
* When restoring, `save_path` can be a path to a SavedModel. The function will
|
||||
automatically find the checkpoint in the SavedModel.
|
||||
|
||||
Example:
|
||||
### `tf.data`:
|
||||
* Adds new `tf.data.experimental.service.register_dataset` and
|
||||
`tf.data.experimental.service.from_dataset_id` APIs to enable one process to
|
||||
register a dataset with the tf.data service, and another process to consume
|
||||
data from the dataset.
|
||||
* Adds support for dispatcher fault tolerance. To enable fault tolerance,
|
||||
configure a `work_dir` when running your dispatcher server and set
|
||||
`dispatcher_fault_tolerance=True`. The dispatcher will store its state to
|
||||
`work_dir`, so that on restart it can continue from its previous state after restart.
|
||||
* Adds support for sharing dataset graphs via shared filesystem instead of
|
||||
over RPC. This reduces load on the dispatcher, improving performance
|
||||
of distributing datasets. For this to work, the dispatcher's `work_dir`
|
||||
must be accessible from workers. If the worker fails to read from the `work_dir`,
|
||||
it falls back to using RPC for dataset graph transfer.
|
||||
* Adds support for a new "distributed_epoch" processing mode.
|
||||
This processing mode distributes a dataset across all tf.data workers,
|
||||
instead of having each worker process the full dataset. See
|
||||
[the tf.data service docs](https://www.tensorflow.org/api_docs/python/tf/data/experimental/service#understand_processing_mode)
|
||||
to learn more.
|
||||
* Adds optional `exclude_cols` parameter to CsvDataset. This parameter is the
|
||||
complement of `select_cols`; at most one of these should be specified.
|
||||
* We have implemented an optimization which reorders data-discarding
|
||||
transformations such as `take` and `shard` to happen earlier in the dataset
|
||||
when it is safe to do so. The optimization can be disabled via the
|
||||
`experimental_optimization.reorder_data_discarding_ops` dataset option.
|
||||
* `tf.data.Options` were previously immutable and can now be overridden.
|
||||
* `tf.data.Dataset.from_generator` now supports Ragged and Sparse tensors with
|
||||
a new `output_signature` argument, which allows `from_generator` to produce any
|
||||
type describable by a `tf.TypeSpec`.
|
||||
* `tf.data.experimental.AUTOTUNE` is now available in the core API as `tf.data.AUTOTUNE`.
|
||||
|
||||
```
|
||||
for batch in data:
|
||||
outputs = train_step(batch)
|
||||
tf.print('final outputs', outputs)
|
||||
```
|
||||
### `tf.distribute`:
|
||||
* Introduces experimental support for asynchronous training of models via
|
||||
`tf.distribute.experimental.ParameterServerStrategy`:
|
||||
* Replaces the existing `tf.distribute.experimental.ParameterServerStrategy`
|
||||
symbol with a new class that is for parameter server training in TF2. Usage of
|
||||
the old symbol, usually with Estimator API, should be **replaced** with
|
||||
[`tf.compat.v1.distribute.experimental.ParameterServerStrategy`].
|
||||
* Added `tf.distribute.experimental.coordinator.*` namespace, including the
|
||||
main API `ClusterCoordinator` for coordinating the training cluster, the
|
||||
related data structure `RemoteValue` and `PerWorkerValue`.
|
||||
* `MultiWorkerMirroredStrategy`](https://www.tensorflow.org/api_docs/python/tf/distribute/MultiWorkerMirroredStrategy)
|
||||
is now a stable API and is no longer considered experimental. Some of the major
|
||||
improvements involve handling peer failure and many bug fixes. Please check out
|
||||
the detailed tutorial on [Multi-worer training with Keras](https://www.tensorflow.org/tutorials/distribute/multi_worker_with_keras).
|
||||
* Adds `tf.distribute.Strategy.gather` and `tf.distribute.ReplicaContext.all_gather`
|
||||
APIs to support gathering dense distributed values.
|
||||
* Fixes various issues with saving a distributed model.
|
||||
|
||||
See tensorflow/python/autograph/g3doc/reference/limitations.md for more
|
||||
info.
|
||||
### `tf.keras`:
|
||||
* Improvements from the Functional API refactoring:
|
||||
* Functional model construction does not need to maintain a global workspace
|
||||
graph, removing memory leaks especially when building many models or very large models.
|
||||
* Functional model construction should be ~8-10% faster on average.
|
||||
* Functional models can now contain non-symbolic values in their call inputs
|
||||
inside of the first positional argument.
|
||||
* Several classes of TF ops that were not reliably converted to Keras layers
|
||||
during functional API construction should now work, e.g.`tf.image.ssim_multiscale`
|
||||
* Error messages when Functional API construction goes wrong (and when ops cannot be converted to Keras layers automatically) should be
|
||||
clearer and easier to understand.
|
||||
* `Optimizer.minimize` can now accept a loss `Tensor` and a `GradientTape`
|
||||
as an alternative to accepting a `callable` loss.
|
||||
* Adds `beta` hyperparameter to [FTRL](https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Ftrl)
|
||||
optimizer classes (Keras and others) to match [FTRL paper](https://research.google.com/pubs/archive/41159.pdf).
|
||||
* `Optimizer.__init__` now accepts a `gradient_aggregator` to allow for customization
|
||||
of how gradients are aggregated across devices, as well as `gradients_transformers`
|
||||
to allow for custom gradient transformations (such as gradient clipping).
|
||||
* Improvements to Keras preprocessing layers:
|
||||
* TextVectorization can now accept a vocabulary list or file as an init arg.
|
||||
* Normalization can now accept mean and variance values as init args.
|
||||
* In `Attention` and `AdditiveAttention` layers, the `call()` method now accepts a `return_attention_scores` argument. When set to
|
||||
True, the layer returns the attention scores as an additional output argument.
|
||||
* Adds `tf.metrics.log_cosh` and `tf.metrics.logcosh` API entrypoints with the
|
||||
same implementation as their `tf.losses` equivalent.
|
||||
* For Keras model, the individual call of `Model.evaluate` uses no cached data
|
||||
for evaluation, while `Model.fit` uses cached data when `validation_data` arg
|
||||
is provided for better performance.
|
||||
* Adds a `save_traces` argument to `model.save`/ `tf.keras.models.save_model`
|
||||
which determines whether the SavedModel format stores the Keras model/layer call
|
||||
functions. The traced functions allow Keras to revive custom models and layers
|
||||
without the original class definition, but if this isn't required the tracing
|
||||
can be disabled with the added option.
|
||||
* The `tf.keras.mixed_precision` API is now non-experimental.
|
||||
The non-experimental API differs from the experimental API in several ways.
|
||||
* `tf.keras.mixed_precision.Policy` no longer takes in a `tf.mixed_precision.
|
||||
experimental.LossScale` in the constructor, and no longer has a `LossScale`
|
||||
associated with it. Instead, `Model.compile` will automatically wrap the optimizer
|
||||
with a `LossScaleOptimizer` using dynamic loss scaling if `Policy.name`
|
||||
is "mixed_float16".
|
||||
* `tf.keras.mixed_precision.LossScaleOptimizer`'s constructor takes in different
|
||||
arguments. In particular, it no longer takes in a `LossScale`, and there is
|
||||
no longer a `LossScale` associated with the `LossScaleOptimizer`. Instead,
|
||||
`LossScaleOptimizer` directly implements fixed or dynamic loss scaling. See the
|
||||
documentation of [`tf.keras.mixed_precision.experimental.LossScaleOptimizer`]
|
||||
(https://www.tensorflow.org/api_docs/python/tf/keras/mixed_precision/experimental/LossScaleOptimizer?version=nightly)
|
||||
for details on the differences between the experimental `LossScaleOptimizer`
|
||||
and the new non-experimental `LossScaleOptimizer`.
|
||||
* `tf.mixed_precision.experimental.LossScale` and its subclasses are
|
||||
deprecated, as all of its functionality now exists within `tf.keras.mixed_precision.LossScaleOptimizer`
|
||||
|
||||
* `tf.lite`:
|
||||
### `tf.lite`:
|
||||
* `TFLiteConverter`:
|
||||
* Support optional flags `inference_input_type` and `inference_output_type`
|
||||
for full integer quantized models. This allows users to modify the model input
|
||||
and output type to integer types (`tf.int8`, `tf.uint8`) instead of defaulting
|
||||
to float type (`tf.float32`).
|
||||
* NNAPI
|
||||
* Adds NNAPI Delegation support for requantization use cases by converting
|
||||
the operation into a dequantize-quantize pair.
|
||||
* Removes deprecated `Interpreter.setUseNNAPI(boolean)` Java API. Use
|
||||
`Interpreter.Options.setUseNNAPI` instead.
|
||||
* Deprecates `Interpreter::UseNNAPI(bool)` C++ API. Use `NnApiDelegate()`
|
||||
and related delegate configuration methods directly.
|
||||
* Deprecates `Interpreter::SetAllowFp16PrecisionForFp32(bool)` C++ API.
|
||||
Prefer controlling this via delegate options, e.g. `tflite::StatefulNnApiDelegate::Options::allow_fp16'
|
||||
or `TfLiteGpuDelegateOptionsV2::is_precision_loss_allowed`.
|
||||
* GPU
|
||||
* GPU acceleration now supports quantized models by default
|
||||
* `DynamicBuffer::AddJoinedString()` will now add a separator if the first string to be joined is empty.
|
||||
* Adds support for cumulative sum (cumsum), both as builtin op and MLIR conversion.
|
||||
|
||||
* `TFLiteConverter`:
|
||||
* Support optional flags `inference_input_type` and
|
||||
`inference_output_type` for full integer quantized models. This
|
||||
allows users to modify the model input and output type to integer
|
||||
types (`tf.int8`, `tf.uint8`) instead of defaulting to float type
|
||||
(`tf.float32`).
|
||||
* TFLite Profiler for Android is available. See the detailed
|
||||
[guide](https://www.tensorflow.org/lite/performance/measurement#trace_tensorflow_lite_internals_in_android).
|
||||
* NNAPI
|
||||
* Added NNAPI Delegation support for requantization use cases by
|
||||
converting the operation into a dequantize-quantize pair.
|
||||
* Removed deprecated `Interpreter.setUseNNAPI(boolean)` Java API.
|
||||
* Use `Interpreter.Options.setUseNNAPI` instead.
|
||||
* Deprecate `Interpreter::UseNNAPI(bool)` C++ API.
|
||||
* Use `NnApiDelegate()` and related delegate configuration methods
|
||||
directly.
|
||||
* Deprecate `Interpreter::SetAllowFp16PrecisionForFp32(bool)` C++ API
|
||||
* Prefer controlling this via delegate options, e.g.
|
||||
`tflite::StatefulNnApiDelegate::Options::allow_fp16' or
|
||||
`TfLiteGpuDelegateOptionsV2::is_precision_loss_allowed`.
|
||||
* `DynamicBuffer::AddJoinedString()` will now add a separator if the first
|
||||
string to be joined is empty.
|
||||
* Added support for cumulative sum (cumsum), both as builtin op and MLIR conversion.
|
||||
* <ADD RELEASE NOTES HERE>
|
||||
### `TensorRT`
|
||||
* Issues a warning when the `session_config` parameter for the TF1 converter
|
||||
is used or the `rewrite_config_template` field in the TF2 converter parameter
|
||||
object is used.
|
||||
|
||||
* `tf.random`:
|
||||
### TPU Enhancements:
|
||||
* Adds support for the `beta` parameter of the FTRL optimizer for TPU
|
||||
embeddings. Users of other TensorFlow platforms can implement equivalent
|
||||
behavior by adjusting the `l2` parameter.
|
||||
|
||||
* <ADD RELEASE NOTES HERE>
|
||||
### XLA Support:
|
||||
* xla.experimental.compile is deprecated, use `tf.function(experimental_compile=True)` instead.
|
||||
* Adds `tf.function.experimental_get_compiler_ir` which returns compiler IR
|
||||
(currently 'hlo' and 'optimized_hlo') for given input for given function.
|
||||
|
||||
* Math and Linear Algebra:
|
||||
### Security:
|
||||
* Fixes an undefined behavior causing a segfault in `tf.raw_ops.Switch`,
|
||||
([CVE-2020-15190](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15190))
|
||||
* Fixes three vulnerabilities in conversion to DLPack format
|
||||
* [CVE-2020-15191](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15191),
|
||||
* [CVE-2020-15192](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15192),
|
||||
* [CVE-2020-15193](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15193)
|
||||
* Fixes two vulnerabilities in `SparseFillEmptyRowsGrad`
|
||||
* [CVE-2020-15194](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15194),
|
||||
* [CVE-2020-15195](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15195)
|
||||
* Fixes several vulnerabilities in `RaggedCountSparseOutput` and `SparseCountSparseOutput` operations
|
||||
* [CVE-2020-15196](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15196),
|
||||
* [CVE-2020-15197](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15197),
|
||||
* [CVE-2020-15198](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15198),
|
||||
* [CVE-2020-15199](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15199),
|
||||
* [CVE-2020-15200](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15200),
|
||||
* [CVE-2020-15201](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15201)
|
||||
* Fixes an integer truncation vulnerability in code using the work sharder API,
|
||||
([CVE-2020-15202](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15202))
|
||||
* Fixes a format string vulnerability in `tf.strings.as_string`,
|
||||
([CVE-2020-15203](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15203))
|
||||
* Fixes segfault raised by calling session-only ops in eager mode,
|
||||
([CVE-2020-15204](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15204))
|
||||
* Fixes data leak and potential ASLR violation from `tf.raw_ops.StringNGrams`,
|
||||
([CVE-2020-15205](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15205))
|
||||
* Fixes segfaults caused by incomplete `SavedModel` validation,
|
||||
([CVE-2020-15206](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15206))
|
||||
* Fixes a data corruption due to a bug in negative indexing support in TFLite,
|
||||
([CVE-2020-15207](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15207))
|
||||
* Fixes a data corruption due to dimension mismatch in TFLite,
|
||||
([CVE-2020-15208](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15208))
|
||||
* Fixes several vulnerabilities in TFLite saved model format
|
||||
* [CVE-2020-15209](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15209),
|
||||
* [CVE-2020-15210](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15210),
|
||||
* [CVE-2020-15211](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15211)
|
||||
* Fixes several vulnerabilities in TFLite implementation of segment sum
|
||||
* [CVE-2020-15212](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15212),
|
||||
* [CVE-2020-15213](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15213),
|
||||
* [CVE-2020-15214](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15214)
|
||||
* Fixes a segfault in `tf.quantization.quantize_and_dequantize`,
|
||||
([CVE-2020-15265](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15265))
|
||||
* Fixes an undefined behavior float cast causing a crash,
|
||||
([CVE-2020-15266](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15266))
|
||||
* Fixes a lack of validation in `tf.raw_ops.DataFormatVecPermute` and
|
||||
`tf.raw_ops.DataFormatDimMap` which can cause uninitialized memory access,
|
||||
read outside bounds of arrays, data corruption and segmentation faults
|
||||
([CVE-2020-26267](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-26267))
|
||||
* Fixes a crash caused by writing to read only memory region
|
||||
([CVE-2020-26268](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-26268))
|
||||
* Fixes a heap out of bounds access in filesystem globbing implementation
|
||||
([CVE-2020-26269](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-26269))
|
||||
|
||||
* Add `tf.math.erfcinv`, the inverse to `tf.math.erfc`.
|
||||
|
||||
* TPU Enhancements:
|
||||
|
||||
* Added support for the `beta` parameter of the FTRL optimizer for TPU
|
||||
embeddings. Users of other TensorFlow platforms can implement equivalent
|
||||
behavior by adjusting the `l2` parameter.
|
||||
* <ADD RELEASE NOTES HERE>
|
||||
|
||||
* XLA Support:
|
||||
|
||||
* xla.experimental.compile is deprecated, use
|
||||
`tf.function(experimental_compile=True)` instead
|
||||
* Added `tf.function.experimental_get_compiler_ir` which returns compiler
|
||||
IR (currently 'hlo' and 'optimized_hlo') for given input for given
|
||||
function.
|
||||
* <ADD RELEASE NOTES HERE>
|
||||
|
||||
* Tracing and Debugging:
|
||||
|
||||
* <ADD RELEASE NOTES HERE>
|
||||
|
||||
* `tf.train.Checkpoint`:
|
||||
|
||||
* Now accepts a `root` argument in the initialization, which generates a
|
||||
checkpoint with a root object. This allows users to create a
|
||||
`Checkpoint` object that is compatible with Keras `model.save_weights()`
|
||||
and `model.load_weights`. The checkpoint is also compatible with the
|
||||
checkpoint saved in the `variables/` folder in the SavedModel.
|
||||
* When restoring, `save_path` can be a path to a SavedModel. The function
|
||||
will automatically find the checkpoint in the SavedModel.
|
||||
|
||||
* `tf.nn`:
|
||||
|
||||
* `tf.nn.max_pool2d` now supports explicit padding.
|
||||
|
||||
* `tf.debugging`:
|
||||
|
||||
* `tf.debugging.assert_shapes()` now works on `SparseTensor`s (#36268).
|
||||
|
||||
* `tf.print`:
|
||||
|
||||
* Bug fix in `tf.print()` with `OrderedDict` where if an `OrderedDict`
|
||||
didn't have the keys sorted, the keys and values were not being printed
|
||||
in accordance with their correct mapping.
|
||||
|
||||
* `TensorRT`
|
||||
|
||||
* We now issue a warning when the `session_config` parameter for the TF1
|
||||
converter is used or the `rewrite_config_template` field in the TF2
|
||||
converter parameter object is used.
|
||||
|
||||
* Other:
|
||||
|
||||
* We have replaced uses of "whitelist" and "blacklist" with "allowlist"
|
||||
and "denylist" where possible. Please see
|
||||
https://developers.google.com/style/word-list#blacklist for more
|
||||
context.
|
||||
* Add `tf.config.experimental.mlir_bridge_rollout` which will help us
|
||||
rollout the new MLIR TPU bridge.
|
||||
* Added `tf.experimental.register_filesystem_plugin` to load modular
|
||||
filesystem plugins from Python
|
||||
* <ADD RELEASE NOTES HERE>
|
||||
### Other:
|
||||
* We have replaced uses of "whitelist" and "blacklist" with "allowlist" and
|
||||
"denylist" where possible. Please see [this list](https://developers.google.com/style/word-list#blacklist) for more context.
|
||||
* Adds `tf.config.experimental.mlir_bridge_rollout` which will help us rollout the new MLIR TPU bridge.
|
||||
* Adds `tf.experimental.register_filesystem_plugin` to load modular filesystem plugins from Python
|
||||
|
||||
## Thanks to our Contributors
|
||||
|
||||
This release contains contributions from many people at Google, as well as:
|
||||
This release contains contributions from many people at Google as well as the following external contributors:
|
||||
|
||||
stjohnso98, <NAME>, <HERE>, <USING>, <GITHUB>, <HANDLE>
|
||||
8bitmp3, aaa.jq, Abhineet Choudhary, Abolfazl Shahbazi, acxz, Adam Hillier, Adrian Garcia Badaracco, Ag Ramesh, ahmedsabie, Alan Anderson, Alexander Grund, Alexandre Lissy, Alexey Ivanov, Amedeo Cavallo, anencore94, Aniket Kumar Singh, Anthony Platanios, Ashwin Phadke, Balint Cristian, Basit Ayantunde, bbbboom, Ben Barsdell, Benjamin Chetioui, Benjamin Peterson, bhack, Bhanu Prakash Bandaru Venkata, Biagio Montaruli, Brent M. Spell, bubblebooy, bzhao, cfRod, Cheng Chen, Cheng(Kit) Chen, Chris Tessum, Christian, chuanqiw, codeadmin_peritiae, COTASPAR, CuiYifeng, danielknobe, danielyou0230, dannyfriar, daria, DarrenZhang01, Denisa Roberts, dependabot[bot], Deven Desai, Dmitry Volodin, Dmitry Zakharov, drebain, Duncan Riach, Eduard Feicho, Ehsan Toosi, Elena Zhelezina, emlaprise2358, Eugene Kuznetsov, Evaderan-Lab, Evgeniy Polyakov, Fausto Morales, Felix Johnny, fo40225, Frederic Bastien, Fredrik Knutsson, fsx950223, Gaurav Singh, Gauri1 Deshpande, George Grzegorz Pawelczak, gerbauz, Gianluca Baratti, Giorgio Arena, Gmc2, Guozhong Zhuang, Hannes Achleitner, Harirai, HarisWang, Harsh188, hedgehog91, Hemal Mamtora, Hideto Ueno, Hugh Ku, Ian Beauregard, Ilya Persky, jacco, Jakub Beránek, Jan Jongboom, Javier Montalt Tordera, Jens Elofsson, Jerry Shih, jerryyin, jgehw, Jinjing Zhou, jma, jmsmdy, Johan Nordström, John Poole, Jonah Kohn, Jonathan Dekhtiar, jpodivin, Jung Daun, Kai Katsumata, Kaixi Hou, Kamil Rakoczy, Kaustubh Maske Patil, Kazuaki Ishizaki, Kedar Sovani, Koan-Sin Tan, Koki Ibukuro, Krzysztof Laskowski, Kushagra Sharma, Kushan Ahmadian, Lakshay Tokas, Leicong Li, levinxo, Lukas Geiger, Maderator, Mahmoud Abuzaina, Mao Yunfei, Marius Brehler, markf, Martin Hwasser, Martin Kubovčík, Matt Conley, Matthias, mazharul, mdfaijul, Michael137, MichelBr, Mikhail Startsev, Milan Straka, Ml-0, Myung-Hyun Kim, Måns Nilsson, Nathan Luehr, ngc92, nikochiko, Niranjan Hasabnis, nyagato_00, Oceania2018, Oleg Guba, Ongun Kanat, OscarVanL, Patrik Laurell, Paul Tanger, Peter Sobot, Phil Pearl, PlusPlusUltra, Poedator, Prasad Nikam, Rahul-Kamat, Rajeshwar Reddy T, redwrasse, Rickard, Robert Szczepanski, Rohan Lekhwani, Sam Holt, Sami Kama, Samuel Holt, Sandeep Giri, sboshin, Sean Settle, settle, Sharada Shiddibhavi, Shawn Presser, ShengYang1, Shi,Guangyong, Shuxiang Gao, Sicong Li, Sidong-Wei, Srihari Humbarwadi, Srinivasan Narayanamoorthy, Steenu Johnson, Steven Clarkson, stjohnso98, Tamas Bela Feher, Tamas Nyiri, Tarandeep Singh, Teng Lu, Thibaut Goetghebuer-Planchon, Tim Bradley, Tomasz Strejczek, Tongzhou Wang, Torsten Rudolf, Trent Lo, Ty Mick, Tzu-Wei Sung, Varghese, Jojimon, Vignesh Kothapalli, Vishakha Agrawal, Vividha, Vladimir Menshakov, Vladimir Silyaev, VoVAllen, Võ Văn Nghĩa, wondertx, xiaohong1031, Xiaoming (Jason) Cui, Xinan Jiang, Yair Ehrenwald, Yasir Modak, Yasuhiro Matsumoto, Yimei Sun, Yiwen Li, Yixing, Yoav Ramon, Yong Tang, Yong Wu, yuanbopeng, Yunmo Koo, Zhangqiang, Zhou Peng, ZhuBaohe, zilinzhu, zmx
|
||||
|
||||
|
||||
# Release 2.3.1
|
||||
|
||||
@ -400,8 +400,9 @@ cc_library(
|
||||
"//tensorflow:internal",
|
||||
],
|
||||
deps = [
|
||||
":abstract_tensor_handle",
|
||||
":unified_api_testutil",
|
||||
"//tensorflow/c/eager:abstract_tensor_handle",
|
||||
"//tensorflow/c:tf_tensor_internal",
|
||||
"//tensorflow/c/experimental/ops:math_ops",
|
||||
"@com_google_absl//absl/types:span",
|
||||
],
|
||||
@ -417,14 +418,15 @@ tf_cuda_cc_test(
|
||||
linkstatic = tf_kernel_tests_linkstatic(),
|
||||
tags = tf_cuda_tests_tags() + [
|
||||
"no_cuda_asan", # b/175330074
|
||||
"notap", # b/175330074
|
||||
],
|
||||
deps = [
|
||||
":abstract_tensor_handle",
|
||||
":c_api_experimental",
|
||||
":gradient_checker",
|
||||
":unified_api_testutil",
|
||||
"//tensorflow/c:tf_status_helper",
|
||||
"//tensorflow/c/eager:abstract_tensor_handle",
|
||||
"//tensorflow/c/eager:c_api_experimental",
|
||||
"//tensorflow/c:tf_tensor_internal",
|
||||
"//tensorflow/c/experimental/ops",
|
||||
"//tensorflow/core:test",
|
||||
"//tensorflow/core:test_main",
|
||||
"@com_google_absl//absl/types:span",
|
||||
|
||||
@ -79,6 +79,7 @@ cc_library(
|
||||
"//tensorflow/compiler/mlir/hlo:hlo_dialect_registration",
|
||||
"//tensorflow/compiler/mlir/lite:tensorflow_lite",
|
||||
"//tensorflow/compiler/mlir/tensorflow",
|
||||
"//tensorflow/compiler/mlir/tensorflow:tensorflow_passes",
|
||||
"//tensorflow/compiler/mlir/tools/kernel_gen/ir:tf_framework_ops",
|
||||
"//tensorflow/core:lib",
|
||||
"@llvm-project//mlir:AllPassesAndDialectsNoRegistration",
|
||||
@ -112,8 +113,8 @@ cc_library(
|
||||
"//tensorflow/compiler/mlir/tensorflow:tf_dialect_passes",
|
||||
"//tensorflow/compiler/mlir/tensorflow:tf_legalize_hlo",
|
||||
"//tensorflow/compiler/mlir/tfjs:tensorflow_js_passes",
|
||||
"//tensorflow/compiler/mlir/tosa:tf_tosa_passes",
|
||||
"//tensorflow/compiler/mlir/tosa:tfl_tosa_passes",
|
||||
"//tensorflow/compiler/mlir/tosa:tf_passes",
|
||||
"//tensorflow/compiler/mlir/tosa:tfl_passes",
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@ -52,6 +52,11 @@ void PopulateGatherToTorchIndexSelectPatterns(
|
||||
void PopulateMhloToStdPatterns(OwningRewritePatternList *patterns,
|
||||
MLIRContext *ctx);
|
||||
|
||||
// Collection of rewrite patterns for lowering of dynamic HLOs to LHLO dialect.
|
||||
void populateDynamicHLOToLHLOConversionPattern(
|
||||
MLIRContext *context, BufferizeTypeConverter *converter,
|
||||
OwningRewritePatternList *patterns, bool insert_copy = true);
|
||||
|
||||
// Collection of rewrite patterns for lowering of HLO to LHLO dialect.
|
||||
void populateHLOToLHLOConversionPattern(MLIRContext *context,
|
||||
BufferizeTypeConverter *converter,
|
||||
|
||||
@ -21,8 +21,8 @@ limitations under the License.
|
||||
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/Builders.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/Location.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/Interfaces/InferTypeOpInterface.h"
|
||||
#include "mlir/Support/LLVM.h"
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ limitations under the License.
|
||||
#define TENSORFLOW_COMPILER_MLIR_HLO_INCLUDE_MLIR_HLO_UTILS_CONVERT_OP_FOLDER_H_
|
||||
|
||||
#include "mlir/IR/BuiltinAttributes.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
|
||||
namespace mlir {
|
||||
namespace hlo {
|
||||
|
||||
@ -18,8 +18,8 @@ limitations under the License.
|
||||
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/Builders.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/PatternMatch.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/TypeUtilities.h"
|
||||
|
||||
namespace mlir {
|
||||
|
||||
@ -19,9 +19,9 @@ limitations under the License.
|
||||
#include "mlir-hlo/utils/broadcast_utils.h"
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/Builders.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/Diagnostics.h"
|
||||
#include "mlir/IR/PatternMatch.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/TypeUtilities.h"
|
||||
|
||||
namespace mlir {
|
||||
|
||||
@ -42,6 +42,7 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h"
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/Builders.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/Dialect.h"
|
||||
#include "mlir/IR/Location.h"
|
||||
#include "mlir/IR/MLIRContext.h"
|
||||
@ -51,7 +52,6 @@ limitations under the License.
|
||||
#include "mlir/IR/Operation.h"
|
||||
#include "mlir/IR/OperationSupport.h"
|
||||
#include "mlir/IR/PatternMatch.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/TypeUtilities.h"
|
||||
#include "mlir/IR/Types.h"
|
||||
#include "mlir/IR/Value.h"
|
||||
|
||||
@ -31,6 +31,7 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h"
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/Builders.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/Dialect.h"
|
||||
#include "mlir/IR/Location.h"
|
||||
#include "mlir/IR/MLIRContext.h"
|
||||
@ -39,7 +40,6 @@ limitations under the License.
|
||||
#include "mlir/IR/Operation.h"
|
||||
#include "mlir/IR/OperationSupport.h"
|
||||
#include "mlir/IR/PatternMatch.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/TypeUtilities.h"
|
||||
#include "mlir/IR/Types.h"
|
||||
#include "mlir/IR/Value.h"
|
||||
|
||||
@ -32,6 +32,7 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h"
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/Builders.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/Dialect.h"
|
||||
#include "mlir/IR/Location.h"
|
||||
#include "mlir/IR/MLIRContext.h"
|
||||
@ -40,7 +41,6 @@ limitations under the License.
|
||||
#include "mlir/IR/Operation.h"
|
||||
#include "mlir/IR/OperationSupport.h"
|
||||
#include "mlir/IR/PatternMatch.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/TypeUtilities.h"
|
||||
#include "mlir/IR/Types.h"
|
||||
#include "mlir/IR/Value.h"
|
||||
|
||||
@ -192,24 +192,56 @@ struct HloToLhloCustomCallOpConverter
|
||||
}
|
||||
};
|
||||
|
||||
struct HloToLhloDynamicBroadcastInDimOpConverter
|
||||
// TODO(pifon): Consider inserting lhlo.copy as in
|
||||
// HloToLhloDynamicBroadcastInDimOpConverter.
|
||||
struct HloToLhloDynamicReshapeConverter
|
||||
: public BaseOpConversion<mhlo::DynamicReshapeOp> {
|
||||
public:
|
||||
using BaseOpConversion<mhlo::DynamicReshapeOp>::BaseOpConversion;
|
||||
|
||||
LogicalResult matchAndRewrite(
|
||||
mhlo::DynamicReshapeOp op, ArrayRef<Value> operands,
|
||||
ConversionPatternRewriter& rewriter) const final {
|
||||
Type result_type;
|
||||
if (auto ranked_type = op.getType().dyn_cast<RankedTensorType>()) {
|
||||
result_type =
|
||||
MemRefType::get(ranked_type.getShape(), ranked_type.getElementType());
|
||||
} else if (auto unranked_type =
|
||||
op.getType().dyn_cast<UnrankedTensorType>()) {
|
||||
result_type = UnrankedMemRefType::get(unranked_type.getElementType(), 0);
|
||||
} else {
|
||||
return failure();
|
||||
}
|
||||
mhlo::DynamicReshapeOp::Adaptor adaptor(operands);
|
||||
rewriter.replaceOpWithNewOp<MemRefReshapeOp>(
|
||||
op, result_type, adaptor.operand(), adaptor.output_shape());
|
||||
return success();
|
||||
}
|
||||
};
|
||||
|
||||
class HloToLhloDynamicBroadcastInDimOpConverter
|
||||
: public BaseOpConversion<mhlo::DynamicBroadcastInDimOp> {
|
||||
public:
|
||||
using BaseOpConversion<mhlo::DynamicBroadcastInDimOp>::BaseOpConversion;
|
||||
HloToLhloDynamicBroadcastInDimOpConverter(TypeConverter& converter,
|
||||
MLIRContext* ctx,
|
||||
bool insert_copy = true)
|
||||
: BaseOpConversion<mhlo::DynamicBroadcastInDimOp>(converter, ctx),
|
||||
insert_copy_(insert_copy) {}
|
||||
|
||||
LogicalResult matchAndRewrite(
|
||||
mhlo::DynamicBroadcastInDimOp op, ArrayRef<Value> operands,
|
||||
ConversionPatternRewriter& rewriter) const final {
|
||||
auto loc = op.getLoc();
|
||||
Value resultBuffer = InsertDynamicAllocAndDealloc(
|
||||
loc, op.getResult(), op.output_dimensions(), &rewriter);
|
||||
Value result = InsertDynamicMemrefCastOp(op, operands.front(), &rewriter);
|
||||
|
||||
Value transformed_operand =
|
||||
InsertDynamicMemrefCastOp(op, operands.front(), &rewriter);
|
||||
rewriter.create<lmhlo::CopyOp>(loc, transformed_operand, resultBuffer);
|
||||
|
||||
rewriter.replaceOp(op, {resultBuffer});
|
||||
if (insert_copy_) {
|
||||
auto loc = op.getLoc();
|
||||
Value result_buffer = InsertDynamicAllocAndDealloc(
|
||||
loc, op.getResult(), op.output_dimensions(), &rewriter);
|
||||
|
||||
rewriter.create<lmhlo::CopyOp>(loc, result, result_buffer);
|
||||
result = result_buffer;
|
||||
}
|
||||
rewriter.replaceOp(op, {result});
|
||||
return success();
|
||||
}
|
||||
|
||||
@ -307,31 +339,10 @@ struct HloToLhloDynamicBroadcastInDimOpConverter
|
||||
static_strides, llvm::None, sizes, strides);
|
||||
return transformed_operand;
|
||||
}
|
||||
};
|
||||
|
||||
struct HloToLhloDynamicReshapeConverter
|
||||
: public BaseOpConversion<mhlo::DynamicReshapeOp> {
|
||||
public:
|
||||
using BaseOpConversion<mhlo::DynamicReshapeOp>::BaseOpConversion;
|
||||
|
||||
LogicalResult matchAndRewrite(
|
||||
mhlo::DynamicReshapeOp op, ArrayRef<Value> operands,
|
||||
ConversionPatternRewriter& rewriter) const final {
|
||||
Type result_type;
|
||||
if (auto ranked_type = op.getType().dyn_cast<RankedTensorType>()) {
|
||||
result_type =
|
||||
MemRefType::get(ranked_type.getShape(), ranked_type.getElementType());
|
||||
} else if (auto unranked_type =
|
||||
op.getType().dyn_cast<UnrankedTensorType>()) {
|
||||
result_type = UnrankedMemRefType::get(unranked_type.getElementType(), 0);
|
||||
} else {
|
||||
return failure();
|
||||
}
|
||||
mhlo::DynamicReshapeOp::Adaptor adaptor(operands);
|
||||
rewriter.replaceOpWithNewOp<MemRefReshapeOp>(
|
||||
op, result_type, adaptor.operand(), adaptor.output_shape());
|
||||
return success();
|
||||
}
|
||||
// Keep the copy semantics and allocate a buffer for the result of the memref
|
||||
// cast.
|
||||
bool insert_copy_;
|
||||
};
|
||||
|
||||
struct HloToLhloDotGeneralOpConverter
|
||||
@ -593,15 +604,22 @@ struct HloLegalizeToLhlo
|
||||
};
|
||||
} // namespace
|
||||
|
||||
void populateDynamicHLOToLHLOConversionPattern(
|
||||
MLIRContext* context, BufferizeTypeConverter* converter,
|
||||
OwningRewritePatternList* patterns, bool insert_copy) {
|
||||
patterns->insert<HloToLhloDynamicBroadcastInDimOpConverter>(
|
||||
*converter, context, insert_copy);
|
||||
patterns->insert<HloToLhloDynamicReshapeConverter>(*converter, context);
|
||||
}
|
||||
|
||||
void populateHLOToLHLOConversionPattern(MLIRContext* context,
|
||||
BufferizeTypeConverter* converter,
|
||||
OwningRewritePatternList* patterns) {
|
||||
populateDynamicHLOToLHLOConversionPattern(context, converter, patterns);
|
||||
// clang-format off
|
||||
patterns->insert<
|
||||
HloToLhloCustomCallOpConverter,
|
||||
HloToLhloDotGeneralOpConverter,
|
||||
HloToLhloDynamicBroadcastInDimOpConverter,
|
||||
HloToLhloDynamicReshapeConverter,
|
||||
HloToLhloOpConverter<mhlo::AbsOp>,
|
||||
HloToLhloOpConverter<mhlo::AddOp>,
|
||||
HloToLhloOpConverter<mhlo::AndOp>,
|
||||
|
||||
@ -49,17 +49,17 @@ SmallVector<StringRef, 3> GetNParallelLoopsAttrs(unsigned nParallelLoops) {
|
||||
}
|
||||
|
||||
template <bool isLHLO = true>
|
||||
Value getResultValue(Operation* op) {
|
||||
Value GetResultValue(Operation* op) {
|
||||
return isLHLO ? op->getOperand(op->getNumOperands() - 1) : op->getResult(0);
|
||||
}
|
||||
|
||||
template <bool isLHLO = true>
|
||||
ShapedType getHloOpResultType(Operation* op) {
|
||||
return getResultValue<isLHLO>(op).getType().template cast<ShapedType>();
|
||||
ShapedType GetHloOpResultType(Operation* op) {
|
||||
return GetResultValue<isLHLO>(op).getType().template cast<ShapedType>();
|
||||
}
|
||||
|
||||
template <bool isLHLO = true>
|
||||
bool verifyHloOpBufferOrTensorSemantics(Operation* op) {
|
||||
bool VerifyHloOpBufferOrTensorSemantics(Operation* op) {
|
||||
auto verify_type = [&](Value val) -> bool {
|
||||
return (isLHLO && val.getType().isa<MemRefType>()) ||
|
||||
(!isLHLO && val.getType().isa<RankedTensorType>());
|
||||
@ -293,8 +293,8 @@ class DataMovementOpConverter : public OpConversionPattern<OpTy> {
|
||||
LogicalResult matchAndRewrite(
|
||||
OpTy op, ArrayRef<Value> args,
|
||||
ConversionPatternRewriter& rewriter) const final {
|
||||
if (!verifyHloOpBufferOrTensorSemantics<isLHLO>(op)) return failure();
|
||||
auto result_type = getHloOpResultType<isLHLO>(op);
|
||||
if (!VerifyHloOpBufferOrTensorSemantics<isLHLO>(op)) return failure();
|
||||
auto result_type = GetHloOpResultType<isLHLO>(op);
|
||||
|
||||
SmallVector<AffineMap, 2> indexing_maps =
|
||||
Derived::getIndexingMaps(op, &rewriter);
|
||||
@ -331,7 +331,7 @@ class BroadcastConverter
|
||||
ShapedType input_type =
|
||||
broadcast_op.operand().getType().template cast<ShapedType>();
|
||||
unsigned input_rank = input_type.getRank();
|
||||
unsigned nloops = getHloOpResultType<isLHLO>(broadcast_op).getRank();
|
||||
unsigned nloops = GetHloOpResultType<isLHLO>(broadcast_op).getRank();
|
||||
|
||||
// BroadcastOp prepends the dimensions in the `broadcast_sizes` attribute to
|
||||
// the input's dimensions.
|
||||
@ -365,7 +365,7 @@ class HloBroadcastInDimConverter
|
||||
|
||||
static SmallVector<AffineMap, 2> getIndexingMaps(
|
||||
mhlo::BroadcastInDimOp broadcast_op, Builder* b) {
|
||||
auto result_type = getHloOpResultType<false>(broadcast_op);
|
||||
auto result_type = GetHloOpResultType<false>(broadcast_op);
|
||||
auto operand_type =
|
||||
broadcast_op.operand().getType().template cast<ShapedType>();
|
||||
unsigned nloops = result_type.getRank();
|
||||
@ -563,7 +563,7 @@ class TransposeConverter
|
||||
isLHLO>::DataMovementOpConverter;
|
||||
static SmallVector<AffineMap, 2> getIndexingMaps(OpTy op, Builder* b) {
|
||||
auto result_type =
|
||||
getHloOpResultType<isLHLO>(op).template cast<ShapedType>();
|
||||
GetHloOpResultType<isLHLO>(op).template cast<ShapedType>();
|
||||
auto nloops = result_type.getRank();
|
||||
SmallVector<AffineExpr, 2> input_exprs;
|
||||
input_exprs.resize(result_type.getRank());
|
||||
@ -587,11 +587,11 @@ class ReshapeOpConverter : public OpConversionPattern<OpTy> {
|
||||
LogicalResult matchAndRewrite(
|
||||
OpTy reshape_op, ArrayRef<Value> args,
|
||||
ConversionPatternRewriter& rewriter) const final {
|
||||
if (!verifyHloOpBufferOrTensorSemantics<isLHLO>(reshape_op))
|
||||
if (!VerifyHloOpBufferOrTensorSemantics<isLHLO>(reshape_op))
|
||||
return failure();
|
||||
ShapedType operand_type =
|
||||
reshape_op.operand().getType().template cast<ShapedType>();
|
||||
ShapedType result_type = getHloOpResultType<isLHLO>(reshape_op);
|
||||
ShapedType result_type = GetHloOpResultType<isLHLO>(reshape_op);
|
||||
|
||||
if (!operand_type.hasStaticShape() || !result_type.hasStaticShape())
|
||||
return failure();
|
||||
@ -696,7 +696,7 @@ class IotaConverter : public OpConversionPattern<OpTy> {
|
||||
LogicalResult matchAndRewrite(
|
||||
OpTy iota_op, ArrayRef<Value> args,
|
||||
ConversionPatternRewriter& rewriter) const final {
|
||||
ShapedType result_shaped_type = getHloOpResultType<isLHLO>(iota_op);
|
||||
ShapedType result_shaped_type = GetHloOpResultType<isLHLO>(iota_op);
|
||||
if (!result_shaped_type) return failure();
|
||||
|
||||
auto result_element_type = result_shaped_type.getElementType();
|
||||
@ -867,7 +867,7 @@ class ReverseConverter
|
||||
isLHLO>::DataMovementOpConverter;
|
||||
static SmallVector<AffineMap, 2> getIndexingMaps(OpTy op, Builder* b) {
|
||||
auto result_type =
|
||||
getHloOpResultType<isLHLO>(op).template cast<ShapedType>();
|
||||
GetHloOpResultType<isLHLO>(op).template cast<ShapedType>();
|
||||
auto nloops = result_type.getRank();
|
||||
SmallVector<AffineExpr, 2> input_exprs;
|
||||
input_exprs.reserve(nloops);
|
||||
|
||||
@ -21,8 +21,8 @@ limitations under the License.
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "mlir/Dialect/Shape/IR/Shape.h"
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/Diagnostics.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
|
||||
namespace mlir {
|
||||
namespace hlo {
|
||||
|
||||
@ -18,7 +18,7 @@ limitations under the License.
|
||||
#include "mlir-hlo/utils/convert_op_folder.h"
|
||||
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/TypeUtilities.h"
|
||||
|
||||
namespace mlir {
|
||||
|
||||
@ -170,24 +170,31 @@ func @dyn_broadcast(%operand: memref<?x?xf32>) -> index {
|
||||
return %rank : index
|
||||
}
|
||||
// CHECK: %[[SHAPE:.*]] = tensor_from_elements
|
||||
|
||||
// CHECK: %[[C0:.*]] = constant 0 : index
|
||||
// CHECK: %[[EL0:.*]] = extract_element %[[SHAPE]]{{\[}}%[[C0]]] : tensor<3xi64>
|
||||
// CHECK: %[[SIZE_0:.*]] = index_cast %[[EL0]] : i64 to index
|
||||
// CHECK: %[[C1:.*]] = constant 1 : index
|
||||
// CHECK: %[[EL1:.*]] = extract_element %[[SHAPE]]{{\[}}%[[C1]]] : tensor<3xi64>
|
||||
// CHECK: %[[SIZE_1:.*]] = index_cast %[[EL1]] : i64 to index
|
||||
// CHECK: %[[C2:.*]] = constant 2 : index
|
||||
// CHECK: %[[EL2:.*]] = extract_element %[[SHAPE]]{{\[}}%[[C2]]] : tensor<3xi64>
|
||||
// CHECK: %[[SIZE_2:.*]] = index_cast %[[EL2]] : i64 to index
|
||||
// CHECK: %[[RESULT:.*]] = alloc(%[[SIZE_0]], %[[SIZE_1]], %[[SIZE_2]]) : memref<?x?x?xf32>
|
||||
// CHECK: %[[OPER_DIM_1:.*]] = dim %[[OPERAND]], %[[C1]] : memref<?x?xf32>
|
||||
// CHECK: %[[OP_STRIDE_0:.*]] = muli %[[C1]], %[[OPER_DIM_1]] : index
|
||||
// CHECK: %[[OPER_DIM_0:.*]] = dim %[[OPERAND]], %[[C0]] : memref<?x?xf32>
|
||||
|
||||
// CHECK: %[[EL0:.*]] = extract_element %[[SHAPE]]{{\[}}%[[C0]]] : tensor<3xi64>
|
||||
// CHECK: %[[SIZE_0:.*]] = index_cast %[[EL0]] : i64 to index
|
||||
// CHECK: %[[EL1:.*]] = extract_element %[[SHAPE]]{{\[}}%[[C1]]] : tensor<3xi64>
|
||||
|
||||
// CHECK: %[[SIZE_1:.*]] = index_cast %[[EL1]] : i64 to index
|
||||
// CHECK: %[[EXPAND_1:.*]] = cmpi "slt", %[[OPER_DIM_0]], %[[SIZE_1]] : index
|
||||
// CHECK: %[[STRIDE_1:.*]] = select %[[EXPAND_1]], %[[C0]], %[[OP_STRIDE_0]] : index
|
||||
|
||||
// CHECK: %[[C2:.*]] = constant 2 : index
|
||||
// CHECK: %[[EL2:.*]] = extract_element %[[SHAPE]]{{\[}}%[[C2]]] : tensor<3xi64>
|
||||
// CHECK: %[[SIZE_2:.*]] = index_cast %[[EL2]] : i64 to index
|
||||
// CHECK: %[[EXPAND_2:.*]] = cmpi "slt", %[[OPER_DIM_1]], %[[SIZE_2]] : index
|
||||
// CHECK: %[[STRIDE_2:.*]] = select %[[EXPAND_2]], %[[C0]], %[[C1]] : index
|
||||
|
||||
// CHECK: %[[TRANSFORMED_MEMREF:.*]] = memref_reinterpret_cast %[[OPERAND]] to offset: [0], sizes: {{\[}}%[[SIZE_0]], %[[SIZE_1]], %[[SIZE_2]]], strides: {{\[}}%[[C0]], %[[STRIDE_1]], %[[STRIDE_2]]]: memref<?x?xf32> to memref<?x?x?xf32, #map>
|
||||
|
||||
// CHECK: %[[RESULT:.*]] = alloc(%[[SIZE_0]], %[[SIZE_1]], %[[SIZE_2]]) : memref<?x?x?xf32>
|
||||
|
||||
// CHECK: "lmhlo.copy"(%[[TRANSFORMED_MEMREF]], %[[RESULT]]) : (memref<?x?x?xf32, #map>, memref<?x?x?xf32>) -> ()
|
||||
// CHECK: dealloc %[[RESULT]] : memref<?x?x?xf32>
|
||||
|
||||
|
||||
@ -15,8 +15,8 @@ limitations under the License.
|
||||
#ifndef TENSORFLOW_COMPILER_MLIR_LITE_EXPERIMENTAL_ESTIMATORS_ARITHMETIC_COUNT_UTIL_H_
|
||||
#define TENSORFLOW_COMPILER_MLIR_LITE_EXPERIMENTAL_ESTIMATORS_ARITHMETIC_COUNT_UTIL_H_
|
||||
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
|
||||
// For add/mul/div/sub and other broadcastable ops.
|
||||
class ArithmeticCountUtilHelper {
|
||||
|
||||
@ -47,10 +47,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
@ -1759,13 +1759,14 @@ Optional<std::string> Translator::TranslateInternal() {
|
||||
std::string err;
|
||||
if (!failed_flex_ops_.empty())
|
||||
err +=
|
||||
"Ops that can be supported by the flex runtime (enabled via setting "
|
||||
"the -emit-select-tf-ops flag):\n" +
|
||||
"Some ops are not supported by the native TFLite runtime, you can "
|
||||
"enable TF kernels fallback using TF Select. See instructions: "
|
||||
"https://www.tensorflow.org/lite/guide/ops_select" +
|
||||
failed_flex_ops_summary;
|
||||
if (!failed_custom_ops_.empty())
|
||||
err +=
|
||||
"Ops that need custom implementation (enabled via setting the "
|
||||
"-emit-custom-ops flag):\n" +
|
||||
"Some ops in the model are custom ops, See instructions to implement "
|
||||
"custom ops: https://www.tensorflow.org/lite/guide/ops_custom" +
|
||||
failed_custom_ops_summary;
|
||||
|
||||
auto& failed_region = named_regions[first_failed_func];
|
||||
|
||||
@ -51,12 +51,12 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
|
||||
@ -23,7 +23,7 @@ limitations under the License.
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h"
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_types.h"
|
||||
#include "tensorflow/compiler/xla/statusor.h"
|
||||
|
||||
@ -23,10 +23,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -31,11 +31,11 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -22,9 +22,9 @@ limitations under the License.
|
||||
#include "mlir/Dialect/Traits.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/DerivedAttributeOpInterface.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/InferTypeOpInterface.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/LoopLikeInterface.h" // from @llvm-project
|
||||
|
||||
@ -21,8 +21,8 @@ limitations under the License.
|
||||
#include "llvm/ADT/StringSet.h"
|
||||
#include "llvm/Support/ToolOutputFile.h"
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/FileUtilities.h" // from @llvm-project
|
||||
|
||||
@ -532,7 +532,7 @@ void QuantizationDriver::QuantizeValue(Value value, QuantParams params,
|
||||
// quantization pass. These ops can be removed without losing original
|
||||
// program accuracy.
|
||||
// TODO(fengliuai): make the attribute being part of op definition.
|
||||
quantize.setAttr(kVolatileOpAttrName, builder_.getUnitAttr());
|
||||
quantize->setAttr(kVolatileOpAttrName, builder_.getUnitAttr());
|
||||
|
||||
// `original_result` has a use to `quantize`, so this will replace that use
|
||||
// by the result of `dequantize`. Remember to reset that use afterwards
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
// CHECK: error: 'tf.MyCustomOp' op is neither a custom op nor a flex op
|
||||
// CHECK: error: failed while converting: 'main'
|
||||
// CHECK: Ops that need custom implementation (enabled via setting the -emit-custom-ops flag):
|
||||
// CHECK: Some ops in the model are custom ops, See instructions to implement
|
||||
// CHECK: tf.MyCustomOp {name = "MyCustomOp"}
|
||||
|
||||
func @main(tensor<4xf32>) -> tensor<4xf32> {
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
// CHECK: error: 'tf.Div' op is neither a custom op nor a flex op
|
||||
// CHECK: error: failed while converting: 'main'
|
||||
// CHECK: Ops that can be supported by the flex runtime (enabled via setting the -emit-select-tf-ops flag):
|
||||
// CHECK: Some ops are not supported by the native TFLite runtime
|
||||
// CHECK: tf.Div {name = "div"}
|
||||
|
||||
func @main(tensor<4xf32>) -> tensor<4xf32> {
|
||||
|
||||
@ -17,8 +17,8 @@ limitations under the License.
|
||||
#include "mlir/IR/AffineExpr.h"
|
||||
#include "mlir/IR/AffineMap.h"
|
||||
#include "mlir/IR/Attributes.h"
|
||||
#include "mlir/IR/BuiltinTypes.h"
|
||||
#include "mlir/IR/PatternMatch.h"
|
||||
#include "mlir/IR/StandardTypes.h"
|
||||
#include "mlir/Pass/Pass.h"
|
||||
#include "mlir/Support/LLVM.h"
|
||||
#include "absl/memory/memory.h"
|
||||
|
||||
@ -20,7 +20,7 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h"
|
||||
#include "tensorflow/lite/tools/optimize/sparsity/format_converter.h"
|
||||
|
||||
@ -22,9 +22,9 @@ limitations under the License.
|
||||
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/utils/validators.h"
|
||||
|
||||
@ -33,11 +33,11 @@ limitations under the License.
|
||||
#include "mlir/Dialect/Quant/QuantOps.h" // from @llvm-project
|
||||
#include "mlir/Dialect/Quant/UniformSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -36,12 +36,12 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Block.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
|
||||
@ -37,8 +37,8 @@ limitations under the License.
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
|
||||
@ -20,8 +20,8 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BlockAndValueMapping.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -27,11 +27,11 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/Visitors.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -30,10 +30,10 @@ limitations under the License.
|
||||
#include "mlir/Dialect/Quant/QuantOps.h" // from @llvm-project
|
||||
#include "mlir/Dialect/Quant/QuantTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Transforms/GreedyPatternRewriteDriver.h" // from @llvm-project
|
||||
|
||||
@ -30,9 +30,9 @@ limitations under the License.
|
||||
#include "mlir/Dialect/Quant/QuantTypes.h" // from @llvm-project
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -45,8 +45,8 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -18,8 +18,8 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h"
|
||||
#include "tensorflow/compiler/mlir/lite/transforms/passes.h"
|
||||
|
||||
@ -23,11 +23,11 @@ limitations under the License.
|
||||
#include "mlir/IR/Block.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
|
||||
@ -19,11 +19,11 @@ limitations under the License.
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Transforms/RegionUtils.h" // from @llvm-project
|
||||
|
||||
@ -14,7 +14,7 @@ limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "mlir/IR/BuiltinAttributes.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
|
||||
namespace mlir {
|
||||
namespace TFL {
|
||||
|
||||
@ -17,10 +17,10 @@ limitations under the License.
|
||||
#define TENSORFLOW_COMPILER_MLIR_LITE_UTILS_CONSTANT_UTILS_H_
|
||||
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "tensorflow/stream_executor/lib/statusor.h"
|
||||
|
||||
namespace mlir {
|
||||
|
||||
@ -16,7 +16,7 @@ limitations under the License.
|
||||
#include "tensorflow/compiler/mlir/lite/utils/convert_type.h"
|
||||
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h"
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_types.h"
|
||||
|
||||
@ -25,12 +25,12 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
@ -438,7 +438,7 @@ LogicalResult ConvertLSTMCellSimpleToFusedLSTM::RewriteFunc() {
|
||||
}
|
||||
|
||||
LogicalResult ConvertLSTMCellSimpleToFusedLSTM::InitializeFromFuncAttributes() {
|
||||
auto attr = fused_func_op_.getAttrOfType<StringAttr>(kTFImplements);
|
||||
auto attr = fused_func_op_->getAttrOfType<StringAttr>(kTFImplements);
|
||||
if (!attr) {
|
||||
return fused_func_op_.emitError()
|
||||
<< "Invalid function attribute, expected " << kTFImplements
|
||||
@ -639,7 +639,7 @@ LogicalResult ConvertKerasLSTMLayer(mlir::FuncOp func_op, OpBuilder* builder) {
|
||||
|
||||
// TFL lstm only supports time-majored inputs, so if it's not time-majored,
|
||||
// we will transpose the inputs and outputs.
|
||||
auto time_major_attr = func_op.getAttrOfType<BoolAttr>("tf.time_major");
|
||||
auto time_major_attr = func_op->getAttrOfType<BoolAttr>("tf.time_major");
|
||||
if (time_major_attr == nullptr) return failure();
|
||||
|
||||
bool time_majored = time_major_attr.getValue();
|
||||
@ -654,7 +654,7 @@ LogicalResult ConvertKerasLSTMLayer(mlir::FuncOp func_op, OpBuilder* builder) {
|
||||
|
||||
// Handle go_backwards:
|
||||
// LSTM in Keras semantic will reverse the input sequence if it's go_backwards
|
||||
auto go_backwards_attr = func_op.getAttrOfType<BoolAttr>("tf.go_backwards");
|
||||
auto go_backwards_attr = func_op->getAttrOfType<BoolAttr>("tf.go_backwards");
|
||||
|
||||
if (go_backwards_attr != nullptr && go_backwards_attr.getValue()) {
|
||||
int time_dim = time_majored ? 0 : 1;
|
||||
|
||||
@ -22,8 +22,8 @@ limitations under the License.
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h"
|
||||
|
||||
@ -28,9 +28,9 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
|
||||
@ -26,13 +26,13 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
|
||||
@ -22,8 +22,8 @@ limitations under the License.
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/lite/ir/tfl_ops.h"
|
||||
|
||||
@ -20,7 +20,7 @@ limitations under the License.
|
||||
#define TENSORFLOW_COMPILER_MLIR_LITE_UTILS_VALIDATORS_H_
|
||||
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
|
||||
namespace mlir {
|
||||
namespace TFL {
|
||||
|
||||
@ -13,7 +13,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/python/mlir_wrapper/mlir_wrapper.h"
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_types.h"
|
||||
|
||||
|
||||
@ -639,6 +639,7 @@ cc_library(
|
||||
":tensorflow_tfrt_ops_inc_gen",
|
||||
":tensorflow_traits",
|
||||
":tensorflow_types",
|
||||
":tf_pass_inc_gen",
|
||||
":tf_saved_model_inc_gen",
|
||||
"//tensorflow/compiler/mlir/lite:validators",
|
||||
"//tensorflow/core:framework",
|
||||
|
||||
@ -30,8 +30,8 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Block.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/IR/Visitors.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -31,10 +31,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Block.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/SideEffectInterfaces.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
|
||||
@ -23,11 +23,11 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Pass/PassManager.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
|
||||
@ -20,8 +20,8 @@ limitations under the License.
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "mlir/IR/BuiltinAttributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
|
||||
namespace mlir {
|
||||
namespace TF {
|
||||
|
||||
@ -30,12 +30,12 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinAttributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/UseDefLists.h" // from @llvm-project
|
||||
|
||||
@ -31,13 +31,13 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/DialectImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -24,10 +24,10 @@ limitations under the License.
|
||||
#include "mlir/Dialect/Traits.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_types.h"
|
||||
|
||||
namespace mlir {
|
||||
|
||||
@ -42,6 +42,7 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/DialectImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
@ -51,7 +52,6 @@ limitations under the License.
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
|
||||
@ -23,10 +23,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/ControlFlowInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -44,6 +44,7 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/DialectImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
@ -53,7 +54,6 @@ limitations under the License.
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
@ -1479,9 +1479,10 @@ LogicalResult Conv2DOp::UpdateDataFormat(StringRef data_format) {
|
||||
if (failed(::mlir::TF::UpdateDataFormat(data_format, this))) return failure();
|
||||
|
||||
// Update convolution attributes.
|
||||
setAttr("dilations", ShuffleArrayAttr(dilations(), perm));
|
||||
setAttr("strides", ShuffleArrayAttr(strides(), perm));
|
||||
setAttr("explicit_paddings", ShuffleArrayAttr(explicit_paddings(), perm, 2));
|
||||
(*this)->setAttr("dilations", ShuffleArrayAttr(dilations(), perm));
|
||||
(*this)->setAttr("strides", ShuffleArrayAttr(strides(), perm));
|
||||
(*this)->setAttr("explicit_paddings",
|
||||
ShuffleArrayAttr(explicit_paddings(), perm, 2));
|
||||
|
||||
return success();
|
||||
}
|
||||
@ -1553,9 +1554,10 @@ LogicalResult Conv2DBackpropFilterOp::UpdateDataFormat(StringRef data_format) {
|
||||
if (failed(::mlir::TF::UpdateDataFormat(data_format, this))) return failure();
|
||||
|
||||
// Update convolution attributes.
|
||||
setAttr("dilations", ShuffleArrayAttr(dilations(), perm));
|
||||
setAttr("strides", ShuffleArrayAttr(strides(), perm));
|
||||
setAttr("explicit_paddings", ShuffleArrayAttr(explicit_paddings(), perm, 2));
|
||||
(*this)->setAttr("dilations", ShuffleArrayAttr(dilations(), perm));
|
||||
(*this)->setAttr("strides", ShuffleArrayAttr(strides(), perm));
|
||||
(*this)->setAttr("explicit_paddings",
|
||||
ShuffleArrayAttr(explicit_paddings(), perm, 2));
|
||||
|
||||
// Permute filter sizes operand.
|
||||
OpBuilder builder(getOperation());
|
||||
@ -1618,9 +1620,10 @@ LogicalResult Conv2DBackpropInputOp::UpdateDataFormat(StringRef data_format) {
|
||||
if (failed(::mlir::TF::UpdateDataFormat(data_format, this))) return failure();
|
||||
|
||||
// Update convolution attributes.
|
||||
setAttr("dilations", ShuffleArrayAttr(dilations(), perm));
|
||||
setAttr("strides", ShuffleArrayAttr(strides(), perm));
|
||||
setAttr("explicit_paddings", ShuffleArrayAttr(explicit_paddings(), perm, 2));
|
||||
(*this)->setAttr("dilations", ShuffleArrayAttr(dilations(), perm));
|
||||
(*this)->setAttr("strides", ShuffleArrayAttr(strides(), perm));
|
||||
(*this)->setAttr("explicit_paddings",
|
||||
ShuffleArrayAttr(explicit_paddings(), perm, 2));
|
||||
|
||||
// Permute input sizes operand.
|
||||
OpBuilder builder(getOperation());
|
||||
|
||||
@ -20,10 +20,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/ControlFlowInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -370,7 +370,7 @@ LogicalResult UpdateDataFormat(StringRef data_format, Op *op) {
|
||||
if (perm.empty()) return failure();
|
||||
|
||||
// Update data format attribute.
|
||||
op->setAttr("data_format", StringAttr::get(data_format, op->getContext()));
|
||||
(*op)->setAttr("data_format", StringAttr::get(data_format, op->getContext()));
|
||||
|
||||
// Update types for all layout sensitive results.
|
||||
auto layout_sensitive = cast<LayoutSensitiveInterface>(op->getOperation());
|
||||
@ -421,12 +421,12 @@ LogicalResult FoldOperandsPermutation(
|
||||
GetDataFormatPermutation(op->data_format(), target_data_format);
|
||||
if (reverse_permutation.empty()) return failure();
|
||||
|
||||
op->setAttr("data_format", StringAttr::get(target_data_format, context));
|
||||
(*op)->setAttr("data_format", StringAttr::get(target_data_format, context));
|
||||
|
||||
for (auto pair : shuffle_attrs) {
|
||||
StringRef attr_name = pair.first;
|
||||
ArrayAttr attr_value = pair.second;
|
||||
op->setAttr(attr_name, ShuffleArrayAttr(attr_value, reverse_permutation));
|
||||
(*op)->setAttr(attr_name, ShuffleArrayAttr(attr_value, reverse_permutation));
|
||||
}
|
||||
|
||||
auto fold = cast<FoldOperandsTransposeInterface>(op->getOperation());
|
||||
|
||||
@ -45,6 +45,7 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/DialectImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
@ -54,7 +55,6 @@ limitations under the License.
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
@ -401,7 +401,7 @@ static LogicalResult Verify(ParseExampleV2Op op) {
|
||||
template <class OpClass>
|
||||
static LogicalResult VerifyPartitionedCall(OpClass op) {
|
||||
auto module = op->template getParentOfType<ModuleOp>();
|
||||
SymbolRefAttr func = op.getAttr("f").template cast<SymbolRefAttr>();
|
||||
SymbolRefAttr func = op->getAttr("f").template cast<SymbolRefAttr>();
|
||||
|
||||
auto function =
|
||||
dyn_cast_or_null<FuncOp>(SymbolTable::lookupSymbolIn(module, func));
|
||||
|
||||
@ -20,10 +20,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/ControlFlowInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -42,6 +42,7 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/DialectImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
@ -51,7 +52,6 @@ limitations under the License.
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
|
||||
@ -20,9 +20,9 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/DerivedAttributeOpInterface.h" // from @llvm-project
|
||||
|
||||
@ -25,10 +25,10 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Identifier.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
@ -342,7 +342,7 @@ LogicalResult VerifyExportedFunc(FuncOp func) {
|
||||
continue;
|
||||
}
|
||||
if (func.getArgAttr(i, "tf.resource_name")) {
|
||||
if (module.getAttr("tf_saved_model.under_construction")) continue;
|
||||
if (module->getAttr("tf_saved_model.under_construction")) continue;
|
||||
return func.emitError() << "'tf.resource_name' attribute is not allowed "
|
||||
"unless it is being under construction";
|
||||
}
|
||||
@ -355,7 +355,7 @@ LogicalResult VerifyExportedFunc(FuncOp func) {
|
||||
if (auto attr = func.getArgAttrOfType<FlatSymbolRefAttr>(
|
||||
i, "tf_saved_model.bound_input")) {
|
||||
if (!unique_bound_inputs.insert(attr.getValue()).second) {
|
||||
if (module.getAttr("tf_saved_model.under_construction")) continue;
|
||||
if (module->getAttr("tf_saved_model.under_construction")) continue;
|
||||
return func.emitError()
|
||||
<< "duplicate 'tf_saved_model.bound_input' binding";
|
||||
}
|
||||
@ -431,7 +431,7 @@ bool IsExported(Operation *op) {
|
||||
}
|
||||
|
||||
bool HasTfSavedModelSemantics(ModuleOp module) {
|
||||
return module.getAttr("tf_saved_model.semantics") != nullptr;
|
||||
return module->getAttr("tf_saved_model.semantics") != nullptr;
|
||||
}
|
||||
|
||||
Operation *LookupBoundInput(FuncOp func, int arg_index,
|
||||
@ -483,7 +483,7 @@ class OptimizeSessionInitializerPattern
|
||||
if (to_keep.empty())
|
||||
rewriter.eraseOp(op);
|
||||
else
|
||||
op.setAttr("initializers", rewriter.getArrayAttr(to_keep));
|
||||
op->setAttr("initializers", rewriter.getArrayAttr(to_keep));
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
@ -19,14 +19,13 @@ limitations under the License.
|
||||
#define TENSORFLOW_COMPILER_MLIR_TENSORFLOW_IR_TF_STRUCTS_H_
|
||||
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "tensorflow/core/util/device_name_utils.h"
|
||||
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_structs.h.inc"
|
||||
#include "tensorflow/core/util/device_name_utils.h"
|
||||
|
||||
namespace mlir {
|
||||
namespace TF {
|
||||
|
||||
@ -18,8 +18,8 @@ limitations under the License.
|
||||
#ifndef TENSORFLOW_COMPILER_MLIR_TENSORFLOW_IR_TF_TRAITS_H_
|
||||
#define TENSORFLOW_COMPILER_MLIR_TENSORFLOW_IR_TF_TRAITS_H_
|
||||
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/OpDefinition.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/SideEffectInterfaces.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -17,8 +17,8 @@ limitations under the License.
|
||||
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "mlir/Dialect/Traits.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
|
||||
namespace {
|
||||
|
||||
@ -18,10 +18,10 @@ limitations under the License.
|
||||
#ifndef TENSORFLOW_COMPILER_MLIR_TENSORFLOW_IR_TF_TYPES_H_
|
||||
#define TENSORFLOW_COMPILER_MLIR_TENSORFLOW_IR_TF_TYPES_H_
|
||||
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@ limitations under the License.
|
||||
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tfrt_ops.h"
|
||||
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
|
||||
|
||||
@ -26,9 +26,9 @@ limitations under the License.
|
||||
#include "mlir/Analysis/LoopAnalysis.h" // from @llvm-project
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -25,9 +25,9 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -18,8 +18,8 @@ limitations under the License.
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Dialect.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
|
||||
@ -15,7 +15,7 @@ limitations under the License.
|
||||
|
||||
#include "tensorflow/compiler/mlir/tensorflow/transforms/decompose_resource_ops.h"
|
||||
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_types.h"
|
||||
|
||||
|
||||
@ -33,9 +33,9 @@ limitations under the License.
|
||||
#include "mlir/Analysis/LoopAnalysis.h" // from @llvm-project
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/OpImplementation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -24,11 +24,11 @@ limitations under the License.
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
|
||||
@ -21,9 +21,9 @@ limitations under the License.
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "mlir/Dialect/Traits.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
#include "mlir/Transforms/GreedyPatternRewriteDriver.h" // from @llvm-project
|
||||
|
||||
@ -34,11 +34,11 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Block.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
|
||||
@ -22,8 +22,8 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/IR/Verifier.h" // from @llvm-project
|
||||
|
||||
@ -31,12 +31,12 @@ limitations under the License.
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
|
||||
@ -20,11 +20,11 @@ limitations under the License.
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/Matchers.h" // from @llvm-project
|
||||
#include "mlir/IR/PatternMatch.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeRange.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
|
||||
@ -23,8 +23,8 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -401,6 +401,9 @@ CreateTPUCompileOpReplicationPass();
|
||||
|
||||
} // namespace TFTPU
|
||||
|
||||
#define GEN_PASS_REGISTRATION
|
||||
#include "tensorflow/compiler/mlir/tensorflow/transforms/tf_passes.h.inc"
|
||||
|
||||
} // namespace mlir
|
||||
|
||||
#endif // TENSORFLOW_COMPILER_MLIR_TENSORFLOW_TRANSFORMS_PASSES_H_
|
||||
|
||||
@ -59,7 +59,7 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
|
||||
@ -22,7 +22,7 @@ limitations under the License.
|
||||
#include "mlir/Dialect/StandardOps/IR/Ops.h" // from @llvm-project
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
|
||||
@ -33,10 +33,10 @@ limitations under the License.
|
||||
#include "mlir/IR/BlockAndValueMapping.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/Region.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
|
||||
@ -15,7 +15,7 @@ limitations under the License.
|
||||
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Pass/PassRegistry.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
|
||||
@ -34,11 +34,11 @@ limitations under the License.
|
||||
#include "mlir/IR/Block.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Diagnostics.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/Operation.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/Value.h" // from @llvm-project
|
||||
#include "mlir/Interfaces/CallInterfaces.h" // from @llvm-project
|
||||
|
||||
@ -13,7 +13,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==============================================================================*/
|
||||
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LLVM.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
@ -36,9 +36,6 @@ class ShapeInference : public TensorFlowShapeInferencePassBase<ShapeInference> {
|
||||
}
|
||||
};
|
||||
|
||||
PassRegistration<ShapeInference> pass(
|
||||
"tf-shape-inference", "Simple Shape Inference on TensorFlow Dialect");
|
||||
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<OperationPass<ModuleOp>> CreateTFShapeInferencePass() {
|
||||
|
||||
@ -27,9 +27,9 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
|
||||
@ -27,9 +27,9 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Location.h" // from @llvm-project
|
||||
#include "mlir/IR/MLIRContext.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/SymbolTable.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
|
||||
@ -20,8 +20,8 @@ limitations under the License.
|
||||
#include "mlir/Pass/PassManager.h"
|
||||
#include "mlir/Transforms/DialectConversion.h"
|
||||
#include "mlir/Transforms/Passes.h"
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/OperationSupport.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/Types.h" // from @llvm-project
|
||||
#include "mlir/Pass/PassOptions.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
|
||||
@ -23,7 +23,7 @@ limitations under the License.
|
||||
#include "mlir/IR/Attributes.h" // from @llvm-project
|
||||
#include "mlir/IR/Builders.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinOps.h" // from @llvm-project
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/TypeUtilities.h" // from @llvm-project
|
||||
#include "mlir/Pass/Pass.h" // from @llvm-project
|
||||
#include "mlir/Support/LogicalResult.h" // from @llvm-project
|
||||
|
||||
@ -15,7 +15,7 @@ limitations under the License.
|
||||
|
||||
#include "tensorflow/compiler/mlir/tensorflow/transforms/tf_data_optimization.h"
|
||||
|
||||
#include "mlir/IR/StandardTypes.h" // from @llvm-project
|
||||
#include "mlir/IR/BuiltinTypes.h" // from @llvm-project
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_ops.h"
|
||||
#include "tensorflow/compiler/mlir/tensorflow/ir/tf_types.h"
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@ def TensorFlowShapeInferencePass : Pass<"tf-shape-inference", "ModuleOp"> {
|
||||
let summary = "Simple Shape Inference on TensorFlow Dialect";
|
||||
// TODO(jpienaar): Write `description`.
|
||||
|
||||
let constructor = "CreateTFShapeInferencePass()";
|
||||
let constructor = "TF::CreateTFShapeInferencePass()";
|
||||
|
||||
let options = [
|
||||
Option<"max_iterations_", "max-iterations", "int64_t", /*default=*/"10",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user