From 5ce4c9aa0405bb28dbe374aa741044025d63f05c Mon Sep 17 00:00:00 2001 From: Mircea Trofin Date: Fri, 5 Aug 2022 20:28:49 -0700 Subject: [PATCH] [mlgo] Use TFLite for 'development' mode. TLite is a lightweight, statically linkable[1], model evaluator, supporting a subset of what the full tensorflow library does, sufficient for the types of scenarios we envision having. It is also faster. We still use saved models as "source of truth" - 'release' mode's AOT starts from a saved model; and the ML training side operates in terms of saved models. Using TFLite solves the following problems compared to using the full TF C API: - a compiler-friendly implementation for runtime-loadable (as opposed to AOT-embedded) models: it's statically linked; it can be built via cmake; - solves an issue we had when building the compiler with both AOT and full TF C API support, whereby, due to a packaging issue on the TF side, we needed to have the pip package and the TF C API library at the same version. We have no such constraints now. The main liability is it supporting a subset of what the full TF framework does. We do not expect that to cause an issue, but should that be the case, we can always revert back to using the full framework (after also figuring out a way to address the problems that motivated the move to TFLite). Details: This change switches the development mode to TFLite. Models are still expected to be placed in a directory - i.e. the parameters to clang don't change; what changes is the directory content: we still need an `output_spec.json` file; but instead of the saved_model protobuf and the `variables` directory, we now just have one file, `model.tflite`. The change includes a utility showing how to take a saved model and convert it to TFLite, which it uses for testing. The full TF implementation can still be built (not side-by-side). We intend to remove it shortly, after patching downstream dependencies. The build behavior, however, prioritizes TFLite - i.e. trying to enable both full TF C API and TFLite will just pick TFLite. [1] thanks to @petrhosek's changes to TFLite's cmake support and its deps! --- llvm/CMakeLists.txt | 23 +- llvm/cmake/modules/TensorFlowCompile.cmake | 15 ++ llvm/include/llvm/Config/llvm-config.h.cmake | 3 + llvm/lib/Analysis/CMakeLists.txt | 13 +- llvm/lib/Analysis/TFLiteUtils.cpp | 232 ++++++++++++++++++ llvm/lib/Analysis/TFUtils.cpp | 2 +- .../Analysis/models/saved-model-to-tflite.py | 37 +++ .../CodeGen/MLRegalloc/dev-mode-log-2-fcts.ll | 5 +- .../CodeGen/MLRegalloc/dev-mode-logging.ll | 5 +- .../CodeGen/MLRegalloc/dev-rel-equivalence.ll | 3 +- .../Inline/ML/bounds-checks-rewards.ll | 4 +- .../Inline/ML/development-training-log.ll | 5 +- .../Inline/ML/ml-test-development-mode.ll | 6 +- .../ir2native_x86_64_model/model.tflite | Bin 0 -> 88300 bytes llvm/unittests/Analysis/TFUtilsTest.cpp | 9 - utils/bazel/llvm_configs/llvm-config.h.cmake | 3 + 16 files changed, 336 insertions(+), 29 deletions(-) create mode 100644 llvm/lib/Analysis/TFLiteUtils.cpp create mode 100644 llvm/lib/Analysis/models/saved-model-to-tflite.py create mode 100644 llvm/unittests/Analysis/Inputs/ir2native_x86_64_model/model.tflite diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index b52e2d04b646..67cb5ce7d0e5 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -944,15 +944,17 @@ if(LLVM_INCLUDE_TESTS) get_errc_messages(LLVM_LIT_ERRC_MESSAGES) endif() -# For up-to-date instructions for installing the Tensorflow dependency, refer to +# For up-to-date instructions for installing the TFLite dependency, refer to # the bot setup script: https://github.com/google/ml-compiler-opt/blob/main/buildbot/buildbot_init.sh -# In this case, the latest C API library is available for download from -# https://www.tensorflow.org/install/lang_c. -# We will expose the conditional compilation variable, -# LLVM_HAVE_TF_API, through llvm-config.h, so that a user of the LLVM library may -# also leverage the dependency. set(TENSORFLOW_C_LIB_PATH "" CACHE PATH "Path to TensorFlow C library install") -if (TENSORFLOW_C_LIB_PATH) +set(LLVM_HAVE_TFLITE "" CACHE BOOL "Use tflite") +if (LLVM_HAVE_TFLITE) + find_package(protobuf REQUIRED) + find_package(tensorflow-lite REQUIRED) + set(LLVM_HAVE_TF_API "ON" CACHE BOOL "Full Tensorflow API available") + set(LLVM_PROTOBUF_OUT_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/protobuf_gen) + include_directories(${LLVM_PROTOBUF_OUT_DIR}) +elseif (TENSORFLOW_C_LIB_PATH) find_library(tensorflow_c_api tensorflow PATHS ${TENSORFLOW_C_LIB_PATH}/lib NO_DEFAULT_PATH REQUIRED) # Currently, the protobuf headers are distributed with the pip package that corresponds to the version # of the C API library. @@ -989,7 +991,12 @@ if (NOT TENSORFLOW_AOT_PATH STREQUAL "") set(TENSORFLOW_AOT_COMPILER "${TENSORFLOW_AOT_PATH}/../../../../bin/saved_model_cli" CACHE PATH "Path to the Tensorflow AOT compiler") - include_directories(${TENSORFLOW_AOT_PATH}/include) + # This needs to happen to avoid clashing protobuf codegen when building both AOT and development mode. + # We plan to replace protobuf with a simpler alternative, so this will go away. + file(COPY ${TENSORFLOW_AOT_PATH}/include DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/tensorflow + PATTERN "google/*" EXCLUDE + PATTERN "*.pb.h" EXCLUDE) + include_directories(${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/tensorflow/include) add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime) install(TARGETS tf_xla_runtime EXPORT LLVMExports diff --git a/llvm/cmake/modules/TensorFlowCompile.cmake b/llvm/cmake/modules/TensorFlowCompile.cmake index d5ff44c9330d..45ec3fe7c327 100644 --- a/llvm/cmake/modules/TensorFlowCompile.cmake +++ b/llvm/cmake/modules/TensorFlowCompile.cmake @@ -116,3 +116,18 @@ function(tf_find_and_compile model default_url default_path test_model_generator set(MLLinkDeps ${MLLinkDeps} tf_xla_runtime PARENT_SCOPE) add_definitions(-DLLVM_HAVE_TF_AOT_${fname_allcaps}) endfunction() + +function(build_proto) + foreach (P ${ARGV}) + set(PB_SRCS ${PB_SRCS} ${LLVM_PROTOBUF_OUT_DIR}/${P}.pb.cc) + set(PB_HDRS ${PB_HDRS} ${LLVM_PROTOBUF_OUT_DIR}/${P}.pb.h) + set(PBS ${PBS} ${TENSORFLOW_SRC_DIR}/${P}.proto) + endforeach() + add_custom_command(OUTPUT ${PB_SRCS} ${PB_HDRS} + COMMAND protobuf::protoc + ARGS --proto_path=${TENSORFLOW_SRC_DIR} --cpp_out=${LLVM_PROTOBUF_OUT_DIR} ${PBS}) + set_source_files_properties(${PB_SRCS} PROPERTIES + GENERATED 1) + set(GeneratedMLSources ${GeneratedMLSources} ${PB_SRCS} PARENT_SCOPE) + set(MLDeps ${MLDeps} ${MLDeps} PARENT_SCOPE) +endfunction() diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake b/llvm/include/llvm/Config/llvm-config.h.cmake index 96fbe6f771d2..b289db1d46ec 100644 --- a/llvm/include/llvm/Config/llvm-config.h.cmake +++ b/llvm/include/llvm/Config/llvm-config.h.cmake @@ -101,6 +101,9 @@ /* Define if LLVM was built with a dependency to the libtensorflow dynamic library */ #cmakedefine LLVM_HAVE_TF_API +/* Define if LLVM is using tflite instead of libtensorflow */ +#cmakedefine LLVM_HAVE_TFLITE + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYSEXITS_H ${HAVE_SYSEXITS_H} diff --git a/llvm/lib/Analysis/CMakeLists.txt b/llvm/lib/Analysis/CMakeLists.txt index a122851e5495..4bf14a86225d 100644 --- a/llvm/lib/Analysis/CMakeLists.txt +++ b/llvm/lib/Analysis/CMakeLists.txt @@ -18,7 +18,17 @@ if (DEFINED LLVM_HAVE_TF_AOT OR DEFINED LLVM_HAVE_TF_API) endif() if (DEFINED LLVM_HAVE_TF_API) - list(APPEND MLLinkDeps ${tensorflow_c_api} ${tensorflow_fx}) + if (DEFINED LLVM_HAVE_TFLITE) + build_proto( + tensorflow/core/protobuf/error_codes + tensorflow/core/example/feature + tensorflow/core/example/example) + list(APPEND MLLinkDeps + tensorflow-lite::tensorflow-lite + protobuf::libprotobuf) + else() + list(APPEND MLLinkDeps ${tensorflow_c_api} ${tensorflow_fx}) + endif() endif() endif() @@ -130,6 +140,7 @@ add_llvm_component_library(LLVMAnalysis SyncDependenceAnalysis.cpp SyntheticCountsUtils.cpp TFUtils.cpp + TFLiteUtils.cpp TargetLibraryInfo.cpp TargetTransformInfo.cpp TensorSpec.cpp diff --git a/llvm/lib/Analysis/TFLiteUtils.cpp b/llvm/lib/Analysis/TFLiteUtils.cpp new file mode 100644 index 000000000000..96eabb2b2c38 --- /dev/null +++ b/llvm/lib/Analysis/TFLiteUtils.cpp @@ -0,0 +1,232 @@ +//===- TFUtils.cpp - tensorflow evaluation utilities ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements utilities for interfacing with tensorflow C APIs. +// +//===----------------------------------------------------------------------===// +#include "llvm/Config/config.h" +#if defined(LLVM_HAVE_TFLITE) + +#include "llvm/ADT/Twine.h" +#include "llvm/Analysis/Utils/TFUtils.h" +#include "llvm/Support/Base64.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/JSON.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" + +#include "tensorflow/lite/interpreter.h" +#include "tensorflow/lite/kernels/register.h" +#include "tensorflow/lite/model.h" +#include "tensorflow/lite/model_builder.h" +#include "tensorflow/lite/op_resolver.h" + +#include +#include + +using namespace llvm; + +namespace llvm { +class EvaluationResultImpl { +public: + EvaluationResultImpl(const std::vector &Outputs) + : Outputs(Outputs){}; + + const TfLiteTensor *getOutput(size_t I) { return Outputs[I]; } + + EvaluationResultImpl(const EvaluationResultImpl &) = delete; + EvaluationResultImpl(EvaluationResultImpl &&Other) = delete; + +private: + const std::vector Outputs; +}; + +class TFModelEvaluatorImpl { +public: + TFModelEvaluatorImpl(StringRef SavedModelPath, + const std::vector &InputSpecs, + function_ref GetOutputSpecs, + size_t OutputSpecsSize, const char *Tags); + + bool isValid() const { return IsValid; } + size_t outputSize() const { return Output.size(); } + + std::unique_ptr evaluate() { + Interpreter->Invoke(); + return std::make_unique(Output); + } + + const std::vector &getInput() const { return Input; } + + ~TFModelEvaluatorImpl(); + +private: + std::unique_ptr Model; + + /// The objects necessary for carrying out an evaluation of the SavedModel. + /// They are expensive to set up, and we maintain them accross all the + /// evaluations of the model. + std::unique_ptr Interpreter; + + /// The input tensors. We set up the tensors once and just mutate theirs + /// scalars before each evaluation. The input tensors keep their value after + /// an evaluation. + std::vector Input; + + /// The output nodes. + std::vector Output; + + void invalidate() { IsValid = false; } + + bool IsValid = true; + + /// Reusable utility for ensuring we can bind the requested Name to a node in + /// the SavedModel Graph. + bool checkReportAndInvalidate(const TfLiteTensor *Tensor, + const TensorSpec &Spec); +}; + +} // namespace llvm + +TFModelEvaluatorImpl::TFModelEvaluatorImpl( + StringRef SavedModelPath, const std::vector &InputSpecs, + function_ref GetOutputSpecs, size_t OutputSpecsSize, + const char *Tags = "serve") + : Input(InputSpecs.size()), Output(OutputSpecsSize) { + // FIXME: make ErrorReporter a member (may also need subclassing + // StatefulErrorReporter) to easily get the latest error status, for + // debugging. + tflite::StderrReporter ErrorReporter; + SmallVector TFLitePathBuff; + llvm::sys::path::append(TFLitePathBuff, SavedModelPath, "model.tflite"); + StringRef TFLitePath(TFLitePathBuff.data(), TFLitePathBuff.size()); + Model = tflite::FlatBufferModel::BuildFromFile(TFLitePath.str().c_str(), + &ErrorReporter); + if (!Model) { + invalidate(); + return; + } + + tflite::ops::builtin::BuiltinOpResolver Resolver; + tflite::InterpreterBuilder Builder(*Model, Resolver); + Builder(&Interpreter); + + if (!Interpreter || + Interpreter->AllocateTensors() != TfLiteStatus::kTfLiteOk) { + invalidate(); + return; + } + // Known inputs and outputs + StringMap InputsMap; + StringMap OutputsMap; + for (size_t I = 0; I < Interpreter->inputs().size(); ++I) + InputsMap[Interpreter->GetInputName(I)] = I; + for (size_t I = 0; I < Interpreter->outputs().size(); ++I) + OutputsMap[Interpreter->GetOutputName(I)] = I; + + for (size_t I = 0; I < InputSpecs.size(); ++I) { + auto &InputSpec = InputSpecs[I]; + auto MapI = InputsMap.find(InputSpec.name() + ":" + + std::to_string(InputSpec.port())); + if (MapI == InputsMap.end()) { + Input[I] = nullptr; + continue; + } + Input[I] = Interpreter->tensor(MapI->second); + if (!checkReportAndInvalidate(Input[I], InputSpec)) + return; + std::memset(Input[I]->data.data, 0, + InputSpecs[I].getTotalTensorBufferSize()); + } + + for (size_t I = 0; I < OutputSpecsSize; ++I) { + auto OutputSpec = GetOutputSpecs(I); + Output[I] = Interpreter->output_tensor( + OutputsMap[OutputSpec.name() + ":" + + std::to_string(OutputSpec.port())]); + if (!checkReportAndInvalidate(Output[I], OutputSpec)) + return; + } +} + +TFModelEvaluator::TFModelEvaluator( + StringRef SavedModelPath, const std::vector &InputSpecs, + function_ref GetOutputSpecs, size_t OutputSpecsSize, + const char *Tags) + : Impl(new TFModelEvaluatorImpl(SavedModelPath, InputSpecs, GetOutputSpecs, + OutputSpecsSize, Tags)) { + if (!Impl->isValid()) + Impl.reset(); +} + +TFModelEvaluator::TFModelEvaluator(StringRef SavedModelPath, + const std::vector &InputSpecs, + const std::vector &OutputSpecs, + const char *Tags) + : TFModelEvaluator( + SavedModelPath, InputSpecs, [&](size_t I) { return OutputSpecs[I]; }, + OutputSpecs.size(), Tags) {} + +TFModelEvaluatorImpl::~TFModelEvaluatorImpl() {} + +bool TFModelEvaluatorImpl::checkReportAndInvalidate(const TfLiteTensor *Tensor, + const TensorSpec &Spec) { + if (!Tensor) { + errs() << "Could not find TF_Output named: " + Spec.name(); + IsValid = false; + } + if (Spec.getTotalTensorBufferSize() != Tensor->bytes) + IsValid = false; + + // If the total sizes match, there could still be a mismatch in the shape. + // We ignore that for now. + + return IsValid; +} + +Optional TFModelEvaluator::evaluate() { + if (!isValid()) + return None; + return EvaluationResult(Impl->evaluate()); +} + +void *TFModelEvaluator::getUntypedInput(size_t Index) { + TfLiteTensor *T = Impl->getInput()[Index]; + if (!T) + return nullptr; + return T->data.data; +} + +TFModelEvaluator::EvaluationResult::EvaluationResult( + std::unique_ptr Impl) + : Impl(std::move(Impl)) {} + +TFModelEvaluator::EvaluationResult::EvaluationResult(EvaluationResult &&Other) + : Impl(std::move(Other.Impl)) {} + +TFModelEvaluator::EvaluationResult & +TFModelEvaluator::EvaluationResult::operator=(EvaluationResult &&Other) { + Impl = std::move(Other.Impl); + return *this; +} + +void *TFModelEvaluator::EvaluationResult::getUntypedTensorValue(size_t Index) { + return Impl->getOutput(Index)->data.data; +} + +const void * +TFModelEvaluator::EvaluationResult::getUntypedTensorValue(size_t Index) const { + return Impl->getOutput(Index)->data.data; +} + +TFModelEvaluator::EvaluationResult::~EvaluationResult() {} +TFModelEvaluator::~TFModelEvaluator() {} + +#endif // defined(LLVM_HAVE_TF_API) diff --git a/llvm/lib/Analysis/TFUtils.cpp b/llvm/lib/Analysis/TFUtils.cpp index de5dde8d2ea4..980ee5908f98 100644 --- a/llvm/lib/Analysis/TFUtils.cpp +++ b/llvm/lib/Analysis/TFUtils.cpp @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" -#if defined(LLVM_HAVE_TF_API) +#if defined(LLVM_HAVE_TF_API) && !defined(LLVM_HAVE_TFLITE) #include "llvm/ADT/Twine.h" #include "llvm/Analysis/Utils/TFUtils.h" diff --git a/llvm/lib/Analysis/models/saved-model-to-tflite.py b/llvm/lib/Analysis/models/saved-model-to-tflite.py new file mode 100644 index 000000000000..e9d45fdf983b --- /dev/null +++ b/llvm/lib/Analysis/models/saved-model-to-tflite.py @@ -0,0 +1,37 @@ +"""Convert a saved model to tflite model. + +Usage: python3 saved-model-to-tflite.py + +The will contain: + model.tflite: this is the converted saved model + output_spec.json: the output spec, copied from the saved_model dir. +""" + +import tensorflow as tf +import os +import sys +from tf_agents.policies import greedy_policy + + +def main(argv): + assert len(argv) == 3 + sm_dir = argv[1] + tfl_dir = argv[2] + tf.io.gfile.makedirs(tfl_dir) + tfl_path = os.path.join(tfl_dir, 'model.tflite') + converter = tf.lite.TFLiteConverter.from_saved_model(sm_dir) + converter.target_spec.supported_ops = [ + tf.lite.OpsSet.TFLITE_BUILTINS, + ] + tfl_model = converter.convert() + with tf.io.gfile.GFile(tfl_path, 'wb') as f: + f.write(tfl_model) + + json_file = 'output_spec.json' + src_json = os.path.join(sm_dir, json_file) + if tf.io.gfile.exists(src_json): + tf.io.gfile.copy(src_json, + os.path.join(tfl_dir, json_file)) + +if __name__ == '__main__': + main(sys.argv) diff --git a/llvm/test/CodeGen/MLRegalloc/dev-mode-log-2-fcts.ll b/llvm/test/CodeGen/MLRegalloc/dev-mode-log-2-fcts.ll index c22d95d698a4..14183ca8a9b6 100644 --- a/llvm/test/CodeGen/MLRegalloc/dev-mode-log-2-fcts.ll +++ b/llvm/test/CodeGen/MLRegalloc/dev-mode-log-2-fcts.ll @@ -11,8 +11,9 @@ ; RUN: sed -i 's/\\n/ /g' %t1 ; RUN: FileCheck --input-file %t1 %s -; RUN: rm -rf %t && mkdir %t -; RUN: %python %S/../../../lib/Analysis/models/gen-regalloc-eviction-test-model.py %t +; RUN: rm -rf %t %t_savedmodel +; RUN: %python %S/../../../lib/Analysis/models/gen-regalloc-eviction-test-model.py %t_savedmodel +; RUN: %python %S/../../../lib/Analysis/models/saved-model-to-tflite.py %t_savedmodel %t ; RUN: llc -mtriple=x86_64-linux-unknown -regalloc=greedy -regalloc-enable-advisor=development \ ; RUN: -regalloc-training-log=%t2 -tfutils-text-log -regalloc-model=%t < %s ; RUN: sed -i 's/ \+/ /g' %t2 diff --git a/llvm/test/CodeGen/MLRegalloc/dev-mode-logging.ll b/llvm/test/CodeGen/MLRegalloc/dev-mode-logging.ll index 351d46376cb8..e1a3dada665e 100644 --- a/llvm/test/CodeGen/MLRegalloc/dev-mode-logging.ll +++ b/llvm/test/CodeGen/MLRegalloc/dev-mode-logging.ll @@ -12,8 +12,9 @@ ; RUN: FileCheck --input-file %t1 %s --check-prefixes=CHECK,NOML ; RUN: diff %t1 %S/Inputs/reference-log-noml.txt -; RUN: rm -rf %t && mkdir %t -; RUN: %python %S/../../../lib/Analysis/models/gen-regalloc-eviction-test-model.py %t +; RUN: rm -rf %t_savedmodel %t +; RUN: %python %S/../../../lib/Analysis/models/gen-regalloc-eviction-test-model.py %t_savedmodel +; RUN: %python %S/../../../lib/Analysis/models/saved-model-to-tflite.py %t_savedmodel %t ; RUN: llc -mtriple=x86_64-linux-unknown -regalloc=greedy -regalloc-enable-advisor=development \ ; RUN: -regalloc-training-log=%t2 -tfutils-text-log -regalloc-model=%t < %S/Inputs/input.ll ; RUN: sed -i 's/ \+/ /g' %t2 diff --git a/llvm/test/CodeGen/MLRegalloc/dev-rel-equivalence.ll b/llvm/test/CodeGen/MLRegalloc/dev-rel-equivalence.ll index 6f1b265480b4..43c363750f93 100644 --- a/llvm/test/CodeGen/MLRegalloc/dev-rel-equivalence.ll +++ b/llvm/test/CodeGen/MLRegalloc/dev-rel-equivalence.ll @@ -11,7 +11,8 @@ ; RUN: llc -mtriple=x86_64-linux-unknown -regalloc=greedy -regalloc-enable-advisor=release \ ; RUN: %S/Inputs/input.ll -o %t.release -; RUN: rm -rf %t && mkdir %t +; RUN: rm -rf %t %t_savedmodel +; RUN: %python %S/../../../../lib/Analysis/models/saved-model-to-tflite.py %t_savedmodel %t ; RUN: %python %S/../../../lib/Analysis/models/gen-regalloc-eviction-test-model.py %t ; RUN: llc -mtriple=x86_64-linux-unknown -regalloc=greedy -regalloc-enable-advisor=development \ ; RUN: -regalloc-model=%t %S/Inputs/input.ll -o %t.development diff --git a/llvm/test/Transforms/Inline/ML/bounds-checks-rewards.ll b/llvm/test/Transforms/Inline/ML/bounds-checks-rewards.ll index 48c2e0a301a9..d272bb0f7a83 100644 --- a/llvm/test/Transforms/Inline/ML/bounds-checks-rewards.ll +++ b/llvm/test/Transforms/Inline/ML/bounds-checks-rewards.ll @@ -8,7 +8,9 @@ ; ; Generate mock model ; RUN: rm -rf %t -; RUN: %python %S/../../../../lib/Analysis/models/gen-inline-oz-test-model.py %t +; RUN: rm -rf %t_savedmodel +; RUN: %python %S/../../../../lib/Analysis/models/gen-inline-oz-test-model.py %t_savedmodel +; RUN: %python %S/../../../../lib/Analysis/models/saved-model-to-tflite.py %t_savedmodel %t ; ; When the bounds are very wide ("no bounds"), all inlinings happen. ; RUN: opt -passes=scc-oz-module-inliner -ml-inliner-ir2native-model=%S/../../../../unittests/Analysis/Inputs/ir2native_x86_64_model -ml-inliner-model-under-training=%t -training-log=- -tfutils-text-log -enable-ml-inliner=development -ml-advisor-size-increase-threshold=10.0 -S < %s 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=NOBOUNDS diff --git a/llvm/test/Transforms/Inline/ML/development-training-log.ll b/llvm/test/Transforms/Inline/ML/development-training-log.ll index 7d3b59207582..a0b8d730a19b 100644 --- a/llvm/test/Transforms/Inline/ML/development-training-log.ll +++ b/llvm/test/Transforms/Inline/ML/development-training-log.ll @@ -1,8 +1,9 @@ ; Test that we can produce a log if we have or do not have a model, in development mode. ; REQUIRES: have_tf_api ; Generate mock model -; RUN: rm -rf %t -; RUN: %python %S/../../../../lib/Analysis/models/gen-inline-oz-test-model.py %t +; RUN: rm -rf %t_savedmodel %t +; RUN: %python %S/../../../../lib/Analysis/models/gen-inline-oz-test-model.py %t_savedmodel +; RUN: %python %S/../../../../lib/Analysis/models/saved-model-to-tflite.py %t_savedmodel %t ; ; RUN: opt -enable-ml-inliner=development -passes=scc-oz-module-inliner -training-log=- -tfutils-text-log -ml-inliner-model-under-training=%t -ml-inliner-ir2native-model=%S/../../../../unittests/Analysis/Inputs/ir2native_x86_64_model -S < %s | FileCheck %s ; RUN: opt -enable-ml-inliner=development -passes=scc-oz-module-inliner -training-log=- -tfutils-text-log -ml-inliner-model-under-training=%t -ml-inliner-ir2native-model=%S/../../../../unittests/Analysis/Inputs/ir2native_x86_64_model -ml-inliner-output-spec-override=%S/Inputs/test_output_spec.json -S < %s | FileCheck %s --check-prefixes=EXTRA-OUTPUTS,CHECK diff --git a/llvm/test/Transforms/Inline/ML/ml-test-development-mode.ll b/llvm/test/Transforms/Inline/ML/ml-test-development-mode.ll index d902b9e4c778..3bfb9b628949 100644 --- a/llvm/test/Transforms/Inline/ML/ml-test-development-mode.ll +++ b/llvm/test/Transforms/Inline/ML/ml-test-development-mode.ll @@ -6,7 +6,9 @@ ; for the 'release' mode. ; ; REQUIRES: have_tf_api -; RUN: rm -rf %t && mkdir %t -; RUN: %python %S/../../../../lib/Analysis/models/gen-inline-oz-test-model.py %t +; RUN: rm -rf %t +; RUN: rm -rf %t_savedmodel +; RUN: %python %S/../../../../lib/Analysis/models/gen-inline-oz-test-model.py %t_savedmodel +; RUN: %python %S/../../../../lib/Analysis/models/saved-model-to-tflite.py %t_savedmodel %t ; RUN: opt -passes=scc-oz-module-inliner -enable-ml-inliner=default -S < %S/Inputs/test-module.ll 2>&1 | FileCheck %S/Inputs/test-module.ll --check-prefix=DEFAULT ; RUN: opt -passes=scc-oz-module-inliner -enable-ml-inliner=development -ml-inliner-model-under-training=%t -S < %S/Inputs/test-module.ll 2>&1 | FileCheck %S/Inputs/test-module.ll --check-prefix=CHECK diff --git a/llvm/unittests/Analysis/Inputs/ir2native_x86_64_model/model.tflite b/llvm/unittests/Analysis/Inputs/ir2native_x86_64_model/model.tflite new file mode 100644 index 0000000000000000000000000000000000000000..7d4097256911b91d01ce94a9b51795c006d7a957 GIT binary patch literal 88300 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 a9I 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 literal 0 HcmV?d00001 diff --git a/llvm/unittests/Analysis/TFUtilsTest.cpp b/llvm/unittests/Analysis/TFUtilsTest.cpp index 6d70ab08636e..fe3b115822be 100644 --- a/llvm/unittests/Analysis/TFUtilsTest.cpp +++ b/llvm/unittests/Analysis/TFUtilsTest.cpp @@ -89,15 +89,6 @@ TEST(TFUtilsTest, EvalError) { TensorSpec::createSpec("StatefulPartitionedCall", {1})}; TFModelEvaluator Evaluator(getModelPath(), InputSpecs, OutputSpecs); - EXPECT_TRUE(Evaluator.isValid()); - - int32_t *V = Evaluator.getInput(0); - // Fill it up with 1's, we know the output. - for (auto I = 0; I < KnownSize; ++I) { - V[I] = 1; - } - auto ER = Evaluator.evaluate(); - EXPECT_FALSE(ER.hasValue()); EXPECT_FALSE(Evaluator.isValid()); } diff --git a/utils/bazel/llvm_configs/llvm-config.h.cmake b/utils/bazel/llvm_configs/llvm-config.h.cmake index 96fbe6f771d2..b289db1d46ec 100644 --- a/utils/bazel/llvm_configs/llvm-config.h.cmake +++ b/utils/bazel/llvm_configs/llvm-config.h.cmake @@ -101,6 +101,9 @@ /* Define if LLVM was built with a dependency to the libtensorflow dynamic library */ #cmakedefine LLVM_HAVE_TF_API +/* Define if LLVM is using tflite instead of libtensorflow */ +#cmakedefine LLVM_HAVE_TFLITE + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYSEXITS_H ${HAVE_SYSEXITS_H}