Remove pyiree.compiler and switch everything to pyiree.compiler2. * Also remove the pyiree.tf.compiler and remove build support for pyiree.xla.compiler (will be transitioned after). * Also removes bazel build support for python packages. PiperOrigin-RevId: 346446168
diff --git a/bindings/python/BUILD b/bindings/python/BUILD index 691f117..c44dcad 100644 --- a/bindings/python/BUILD +++ b/bindings/python/BUILD
@@ -24,3 +24,8 @@ name = "pathsetup", imports = ["."], ) + +filegroup( + name = "python_extension_headers", + srcs = glob(["**/*.h"]), +)
diff --git a/bindings/python/pyiree/common/BUILD b/bindings/python/pyiree/common/BUILD deleted file mode 100644 index 3c102c8..0000000 --- a/bindings/python/pyiree/common/BUILD +++ /dev/null
@@ -1,41 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "pybind_cc_library", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -pybind_cc_library( - name = "common", - srcs = [ - "status_utils.cc", - ], - hdrs = [ - "binding.h", - "status_utils.h", - ], - deps = [ - "//iree/base:api", - "//iree/base:status", - "@com_google_absl//absl/strings", - "@com_google_absl//absl/types:optional", - ], -)
diff --git a/bindings/python/pyiree/compiler/BUILD b/bindings/python/pyiree/compiler/BUILD deleted file mode 100644 index 48917ed..0000000 --- a/bindings/python/pyiree/compiler/BUILD +++ /dev/null
@@ -1,91 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "NUMPY_DEPS", - "PYBIND_COPTS", - "PYBIND_EXTENSION_COPTS", - "PYBIND_FEATURES", - "PYTHON_CPP_EXTRA_DEPS", - "iree_py_extension", - "iree_py_library", - "iree_py_test", - "pybind_cc_library", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -iree_py_library( - name = "compiler", - srcs = [ - "__init__.py", - ], - srcs_version = "PY3", - deps = PYTHON_CPP_EXTRA_DEPS + [ - ":binding", - "//bindings/python:pathsetup", # build_cleaner: keep - ], -) - -iree_py_extension( - name = "binding", - srcs = [ - "initialize_module.cc", - ], - copts = PYBIND_COPTS + PYBIND_EXTENSION_COPTS, - features = PYBIND_FEATURES, - linkstatic = 1, - win_def_file = "export.def", - deps = [ - ":compiler_library", - "//bindings/python/pyiree/common", - ], -) - -pybind_cc_library( - name = "compiler_library", - srcs = [ - "compiler.cc", - ], - hdrs = [ - "compiler.h", - ], - deps = [ - "//bindings/python/pyiree/common", - "//iree/compiler/Dialect/VM/Target:init_targets", - "//iree/compiler/Dialect/VM/Target/Bytecode", - "//iree/tools:init_passes_and_dialects", - "//iree/tools:init_targets", - "@llvm-project//llvm:Support", - "@llvm-project//mlir:IR", - "@llvm-project//mlir:Parser", - "@llvm-project//mlir:Pass", - ], -) - -iree_py_test( - name = "compiler_test", - srcs = ["compiler_test.py"], - python_version = "PY3", - deps = NUMPY_DEPS + [ - "//bindings/python:pathsetup", # build_cleaner: keep - "@absl_py//absl/testing:absltest", - "//bindings/python/pyiree/compiler", - ], -)
diff --git a/bindings/python/pyiree/compiler/CMakeLists.txt b/bindings/python/pyiree/compiler/CMakeLists.txt deleted file mode 100644 index ffc8a30..0000000 --- a/bindings/python/pyiree/compiler/CMakeLists.txt +++ /dev/null
@@ -1,62 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -iree_py_library( - NAME - compiler - SRCS - "__init__.py" - PYEXT_DEPS - ::PyExtCompiler -) - -iree_pyext_module( - NAME - PyExtCompiler - MODULE_NAME - binding - UNIX_LINKER_SCRIPT - "unix_version.lds" - SRCS - "initialize_module.cc" - PYEXT_DEPS - ::PyExtCompilerLib - bindings::python::pyiree::common::PyextCommonLib -) - -iree_pyext_library( - NAME - PyExtCompilerLib - SRCS - "compiler.h" - "compiler.cc" - PYEXT_DEPS - bindings::python::pyiree::common::PyextCommonLib - DEPS - iree::compiler::Dialect::VM::Target::Bytecode - iree::compiler::Dialect::VM::Target::init_targets - iree::tools::init_passes_and_dialects - iree::tools::init_targets - LLVMSupport - MLIRIR - MLIRParser - MLIRPass -) - -iree_py_test( - NAME - compiler_test - SRCS - "compiler_test.py" -)
diff --git a/bindings/python/pyiree/compiler/__init__.py b/bindings/python/pyiree/compiler/__init__.py deleted file mode 100644 index 94d2f7c..0000000 --- a/bindings/python/pyiree/compiler/__init__.py +++ /dev/null
@@ -1,28 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Module init for the python bindings.""" - -# pylint: disable=g-multiple-import -# pylint: disable=g-bad-import-order -# pylint: disable=g-import-not-at-top -# pylint: disable=wildcard-import - -from . import binding as binding - -# Native aliases. -llvm = binding.llvm -Context = binding.CompilerContext -Module = binding.CompilerModule -CompileOptions = binding.CompileOptions -OutputFormat = binding.OutputFormat
diff --git a/bindings/python/pyiree/compiler/compiler.cc b/bindings/python/pyiree/compiler/compiler.cc deleted file mode 100644 index 94d96ff..0000000 --- a/bindings/python/pyiree/compiler/compiler.cc +++ /dev/null
@@ -1,473 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "bindings/python/pyiree/compiler/compiler.h" - -#include <stdexcept> -#include <string> - -#include "bindings/python/pyiree/common/binding.h" -#include "bindings/python/pyiree/common/status_utils.h" -#include "iree/compiler/Dialect/VM/Target/Bytecode/BytecodeModuleTarget.h" -#include "iree/compiler/Dialect/VM/Target/init_targets.h" -#include "iree/tools/init_dialects.h" -#include "iree/tools/init_passes.h" -#include "iree/tools/init_targets.h" -#include "llvm/ADT/TypeSwitch.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/PrettyStackTrace.h" -#include "llvm/Support/Signals.h" -#include "llvm/Support/SourceMgr.h" -#include "llvm/Support/raw_ostream.h" -#include "mlir/IR/Attributes.h" -#include "mlir/IR/Dialect.h" -#include "mlir/IR/Location.h" -#include "mlir/Parser.h" -#include "mlir/Pass/PassManager.h" -#include "mlir/Pass/PassRegistry.h" - -namespace py = pybind11; - -using namespace mlir; -using namespace mlir::iree_compiler; - -using mlir::iree_compiler::IREE::HAL::TargetOptions; -using mlir::iree_compiler::IREE::VM::BytecodeOutputFormat; -using mlir::iree_compiler::IREE::VM::BytecodeTargetOptions; - -using llvm::MemoryBuffer; -using llvm::MemoryBufferRef; -using llvm::raw_ostream; -using llvm::raw_string_ostream; -using llvm::StringRef; - -namespace iree { -namespace python { - -/* static */ std::mutex CompilerContextBundle::static_config_lock_; -/* static */ absl::optional<std::string> - CompilerContextBundle::default_crash_reproducer_path_; - -namespace { - -bool LLVMOnceInit() { - // Enable LLVM's signal handler to get nice stack traces. - llvm::sys::SetOneShotPipeSignalFunction( - llvm::sys::DefaultOneShotPipeSignalHandler); - llvm::sys::PrintStackTraceOnErrorSignal("pyiree"); - - mlir::iree_compiler::registerAllPasses(); - mlir::iree_compiler::registerHALTargetBackends(); - - // Register any pass manager command line options. - mlir::registerPassManagerCLOptions(); - - std::string program_name = "pyiree"; - std::vector<const char*> default_options = {program_name.c_str(), nullptr}; - llvm::cl::ParseCommandLineOptions(1, default_options.data()); - return true; -} - -void SetupLLVMModule(pybind11::module m) { - m.def("print_help_message", []() { llvm::cl::PrintHelpMessage(); }); - m.def( - "add_option", - [](std::string name, absl::optional<std::string> value) { - auto options_map = llvm::cl::getRegisteredOptions(); - auto found_it = options_map.find(name); - if (found_it == options_map.end()) { - std::string message = "Unknown LLVM option: "; - message.append(name); - throw RaiseValueError(message.c_str()); - } - - std::string value_sr = value ? *value : ""; - found_it->getValue()->addOccurrence(1, name, value_sr); - }, - py::arg("name"), py::arg("value") = absl::optional<std::string>()); - m.def( - "reset_option", - [](std::string name) { - auto options_map = llvm::cl::getRegisteredOptions(); - auto found_it = options_map.find(name); - if (found_it == options_map.end()) { - std::string message = "Unknown LLVM option: "; - message.append(name); - throw RaiseValueError(message.c_str()); - } - found_it->getValue()->setDefault(); - }, - py::arg("name")); -} - -OwningModuleRef parseMLIRModuleFromString(StringRef contents, - MLIRContext* context) { - std::unique_ptr<MemoryBuffer> contents_buffer; - if (contents.back() == 0) { - // If it has a nul terminator, just use as-is. - contents_buffer = MemoryBuffer::getMemBuffer(contents.drop_back()); - } else { - // Otherwise, make a copy. - contents_buffer = MemoryBuffer::getMemBufferCopy(contents, "EMBED"); - } - - llvm::SourceMgr source_mgr; - source_mgr.AddNewSourceBuffer(std::move(contents_buffer), llvm::SMLoc()); - OwningModuleRef mlir_module = parseSourceFile(source_mgr, context); - return mlir_module; -} - -} // namespace - -DiagnosticCapture::DiagnosticCapture(mlir::MLIRContext* mlir_context, - DiagnosticCapture* parent) - : mlir_context_(mlir_context), parent_(parent) { - handler_id_ = mlir_context_->getDiagEngine().registerHandler( - [&](Diagnostic& d) -> LogicalResult { - diagnostics_.push_back(std::move(d)); - return success(); - }); -} -DiagnosticCapture::~DiagnosticCapture() { - if (mlir_context_) { - mlir_context_->getDiagEngine().eraseHandler(handler_id_); - if (parent_) { - for (auto& d : diagnostics_) { - parent_->diagnostics_.push_back(std::move(d)); - } - } - } -} - -DiagnosticCapture::DiagnosticCapture(DiagnosticCapture&& other) { - mlir_context_ = other.mlir_context_; - parent_ = other.parent_; - diagnostics_.swap(other.diagnostics_); - handler_id_ = other.handler_id_; - other.mlir_context_ = nullptr; -} - -// Custom location printer that prints prettier, multi-line file output -// suitable for human readable error messages. The standard printer just prints -// a long nested expression not particularly human friendly). Note that there -// is a location pretty printer in the MLIR AsmPrinter. It is private and -// doesn't do any path shortening, which seems to make long Python stack traces -// a bit easier to scan. -void PrintLocation(Location loc, raw_ostream& out) { - TypeSwitch<Location>(loc) - .Case<OpaqueLoc>( - [&](OpaqueLoc loc) { PrintLocation(loc.getFallbackLocation(), out); }) - .Case<UnknownLoc>([&](UnknownLoc) { out << " [unknown location]\n"; }) - .Case<FileLineColLoc>([&](FileLineColLoc line_col_loc) { - StringRef this_filename = line_col_loc.getFilename(); - auto slash_pos = this_filename.find_last_of("/\\"); - // We print both the basename and extended names with a structure like - // `foo.py:35:4`. Even though technically the line/col - // information is redundant to include in both names, having it on both - // makes it easier to paste the paths into an editor and jump to the - // exact location. - std::string line_col_suffix = - ":" + std::to_string(line_col_loc.getLine()) + ":" + - std::to_string(line_col_loc.getColumn()); - bool has_basename = false; - StringRef basename = this_filename; - if (slash_pos != StringRef::npos) { - has_basename = true; - basename = this_filename.substr(slash_pos + 1); - } - out << " at: " << basename << line_col_suffix; - if (has_basename) { - // When running through bazel, such as in our e2e test suite, - // the paths involved can be quite large, and will have a very long - // prefix before the sandboxed "runfiles" directory that the program - // runs in. Trim off that long prefix. By convention, the path names - // with this prefix dropped will correspond to the path in the source - // directory, which is probably what we want anyway. - StringRef kRunfiles(".runfiles/"); - StringRef extended_name = this_filename; - auto runfiles_pos = extended_name.rfind(kRunfiles); - if (runfiles_pos != StringRef::npos) { - extended_name = - extended_name.drop_front(runfiles_pos + kRunfiles.size()); - } - // Print out two tabs, as basenames usually vary in length by more - // than one tab width. - out << "\t\t( " << extended_name << line_col_suffix << " )"; - } - out << "\n"; - }) - .Case<NameLoc>([&](NameLoc name_loc) { - out << " @'" << name_loc.getName() << "':\n"; - auto child_loc = name_loc.getChildLoc(); - if (!child_loc.isa<UnknownLoc>()) { - out << "(...\n"; - PrintLocation(child_loc, out); - out << ")\n"; - } - }) - .Case<CallSiteLoc>([&](CallSiteLoc call_site) { - PrintLocation(call_site.getCaller(), out); - PrintLocation(call_site.getCallee(), out); - }); -} - -std::string DiagnosticCapture::ConsumeDiagnosticsAsString( - const char* error_message) { - std::string s; - raw_string_ostream sout(s); - bool first = true; - if (error_message) { - sout << error_message; - first = false; - } - for (auto& d : diagnostics_) { - if (!first) { - sout << "\n\n"; - } else { - first = false; - } - - switch (d.getSeverity()) { - case DiagnosticSeverity::Note: - sout << "[NOTE]"; - break; - case DiagnosticSeverity::Warning: - sout << "[WARNING]"; - break; - case DiagnosticSeverity::Error: - sout << "[ERROR]"; - break; - case DiagnosticSeverity::Remark: - sout << "[REMARK]"; - break; - default: - sout << "[UNKNOWN]"; - } - // Message. - sout << ": " << d << "\n"; - PrintLocation(d.getLocation(), sout); - } - - diagnostics_.clear(); - return sout.str(); -} - -void DiagnosticCapture::ClearDiagnostics() { diagnostics_.clear(); } - -CompilerContextBundle::CompilerContextBundle() - : default_capture_(&mlir_context_, nullptr) { - mlir::iree_compiler::registerAllDialects(mlir_context_.getDialectRegistry()); -} -CompilerContextBundle::~CompilerContextBundle() = default; - -CompilerModuleBundle CompilerContextBundle::ParseAsm( - const std::string& asm_text) { - // Arrange to get a view that includes a terminating null to avoid additional - // copy. - const char* asm_chars = asm_text.c_str(); - StringRef asm_sr(asm_chars, asm_text.size() + 1); - - auto diag_capture = CaptureDiagnostics(); - auto module_ref = parseMLIRModuleFromString(asm_sr, mlir_context()); - if (!module_ref) { - throw RaiseValueError( - diag_capture.ConsumeDiagnosticsAsString("Error parsing ASM").c_str()); - } - return CompilerModuleBundle(shared_from_this(), module_ref.release()); -} - -std::string CompilerModuleBundle::ToAsm(bool enableDebugInfo, bool prettyForm, - int64_t largeElementLimit) { - // Print to asm. - std::string asm_output; - raw_string_ostream sout(asm_output); - OpPrintingFlags print_flags; - if (enableDebugInfo) { - print_flags.enableDebugInfo(prettyForm); - } - if (largeElementLimit >= 0) { - print_flags.elideLargeElementsAttrs(largeElementLimit); - } - module_op().print(sout, print_flags); - return sout.str(); -} - -std::shared_ptr<OpaqueBlob> CompilerModuleBundle::Compile( - BytecodeTargetOptions options, std::vector<std::string> target_backends) { - mlir::PassManager pass_manager(context_->mlir_context()); - mlir::applyPassManagerCLOptions(pass_manager); - auto crash_reproducer_path = context_->crash_reproducer_path(); - if (crash_reproducer_path) { - pass_manager.enableCrashReproducerGeneration(*crash_reproducer_path, false); - } - - mlir::iree_compiler::IREE::HAL::TargetOptions hal_target_options; - if (target_backends.empty()) { - hal_target_options.targets = - mlir::iree_compiler::IREE::HAL::getRegisteredTargetBackends(); - } else { - hal_target_options.targets = std::move(target_backends); - } - - auto vm_target_options = - mlir::iree_compiler::IREE::VM::getTargetOptionsFromFlags(); - - mlir::iree_compiler::IREE::Flow::buildFlowTransformPassPipeline(pass_manager); - mlir::iree_compiler::IREE::HAL::buildHALTransformPassPipeline( - pass_manager, hal_target_options); - mlir::iree_compiler::IREE::VM::buildVMTransformPassPipeline( - pass_manager, vm_target_options); - - // Run primary passes. - auto diag_capture = context_->CaptureDiagnostics(); - if (failed(pass_manager.run(module_op_))) { - throw RaisePyError( - PyExc_RuntimeError, - diag_capture.ConsumeDiagnosticsAsString("Error compiling IREE module:") - .c_str()); - } - - // Run serialization. - std::string contents; - raw_string_ostream out(contents); - if (failed(mlir::iree_compiler::IREE::VM::translateModuleToBytecode( - module_op_, options, out))) { - throw RaisePyError( - PyExc_RuntimeError, - diag_capture - .ConsumeDiagnosticsAsString("Error serializing to flatbuffer:") - .c_str()); - } - - out.flush(); - return std::make_shared<OpaqueStringBlob>(std::move(out.str())); -} - -void CompilerModuleBundle::RunPassPipeline( - const std::vector<std::string>& pipelines) { - mlir::PassManager pm(context_->mlir_context(), - mlir::OpPassManager::Nesting::Implicit); - mlir::applyPassManagerCLOptions(pm); - auto crash_reproducer_path = context_->crash_reproducer_path(); - if (crash_reproducer_path) { - pm.enableCrashReproducerGeneration(*crash_reproducer_path); - } - - // Parse the pass pipelines. - std::string error; - raw_string_ostream error_stream(error); - for (const auto& pipeline : pipelines) { - if (failed(mlir::parsePassPipeline(pipeline, pm, error_stream))) { - throw RaiseValueError(error_stream.str().c_str()); - } - } - - // Run them. - auto diag_capture = context_->CaptureDiagnostics(); - if (failed(pm.run(module_op_))) { - throw RaisePyError( - PyExc_RuntimeError, - diag_capture.ConsumeDiagnosticsAsString("Error running pass pipelines:") - .c_str()); - } -} - -void SetupCommonCompilerBindings(pybind11::module m) { - // Guard the once init to happen once per process (vs module, which in - // mondo builds can happen multiple times). - static bool llvm_init_baton = ([]() { return LLVMOnceInit(); })(); - (void)(llvm_init_baton); - - // llvm module - auto llvm_m = m.def_submodule("llvm", "Global LLVM configuration"); - SetupLLVMModule(llvm_m); - - // OpaqueBlob class - py::class_<OpaqueBlob, std::shared_ptr<OpaqueBlob>>(m, "OpaqueBlob", - py::buffer_protocol()) - .def_buffer([](OpaqueBlob* self) -> py::buffer_info { - return py::buffer_info( - self->data(), // Pointer to buffer - sizeof(uint8_t), // Size of one scalar - py::format_descriptor<uint8_t>::value, // Python struct-style - // format - 1, // Number of dimensions - {self->size()}, // Buffer dimensions - {self->size()} // Strides - ); - }) - .def_property_readonly("bytes", - [](OpaqueBlob* self) -> py::bytes { - return py::bytes( - static_cast<const char*>(self->data()), - self->size()); - }) - .def_property_readonly("text", [](OpaqueBlob* self) -> py::str { - return py::str(static_cast<const char*>(self->data()), self->size()); - }); - - // CompilerContext class - py::class_<CompilerContextBundle, std::shared_ptr<CompilerContextBundle>>( - m, "CompilerContext") - .def(py::init<>([]() { - // Need explicit make_shared to avoid UB with enable_shared_from_this. - return std::make_shared<CompilerContextBundle>(); - })) - .def("parse_asm", &CompilerContextBundle::ParseAsm) - .def("get_diagnostics", - &CompilerContextBundle::ConsumeDiagnosticsAsString) - .def("clear_diagnostics", &CompilerContextBundle::ClearDiagnostics) - .def_property_static( - "default_crash_reproducer_path", - [](py::object /* cls */) { - return CompilerContextBundle::default_crash_reproducer_path(); - }, - [](py::object /* cls */, absl::optional<std::string> p) { - CompilerContextBundle::set_default_crash_reproducer_path( - std::move(p)); - }) - .def_property("crash_reproducer_path", - &CompilerContextBundle::crash_reproducer_path, - &CompilerContextBundle::set_crash_reproducer_path); - - // OutputFormat enum - py::enum_<BytecodeOutputFormat>(m, "OutputFormat") - .value("FLATBUFFER_BINARY", BytecodeOutputFormat::kFlatBufferBinary) - .value("FLATBUFFER_TEXT", BytecodeOutputFormat::kFlatBufferText) - .value("MLIR_TEXT", BytecodeOutputFormat::kMlirText) - .export_values(); - - // CompileOptions class - py::class_<BytecodeTargetOptions>(m, "CompileOptions") - .def(py::init<>()) - .def_readwrite("output_format", &BytecodeTargetOptions::outputFormat) - .def_readwrite("optimize", &BytecodeTargetOptions::optimize) - .def_readwrite("strip_debug_ops", &BytecodeTargetOptions::stripDebugOps) - .def_readwrite("strip_source_map", &BytecodeTargetOptions::stripSourceMap) - .def_readwrite("strip_symbols", &BytecodeTargetOptions::stripSymbols); - - // CompilerModule class - py::class_<CompilerModuleBundle>(m, "CompilerModule") - .def("to_asm", &CompilerModuleBundle::ToAsm, - py::arg("debug_info") = false, py::arg("pretty") = false, - py::arg("large_element_limit") = -1) - .def("compile", &CompilerModuleBundle::Compile, - py::arg("options") = BytecodeTargetOptions{}, - py::arg("target_backends") = std::vector<std::string>()) - .def("run_pass_pipeline", &CompilerModuleBundle::RunPassPipeline, - py::arg("pipelines") = std::vector<std::string>()); -} - -} // namespace python -} // namespace iree
diff --git a/bindings/python/pyiree/compiler/compiler.h b/bindings/python/pyiree/compiler/compiler.h deleted file mode 100644 index d384170..0000000 --- a/bindings/python/pyiree/compiler/compiler.h +++ /dev/null
@@ -1,219 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef IREE_BINDINGS_PYTHON_PYIREE_COMPILER_H_ -#define IREE_BINDINGS_PYTHON_PYIREE_COMPILER_H_ - -#include <mutex> // NOLINT -#include <string> - -#include "bindings/python/pyiree/common/binding.h" -#include "iree/compiler/Dialect/VM/Target/Bytecode/BytecodeModuleTarget.h" -#include "mlir/IR/BuiltinOps.h" -#include "mlir/IR/Diagnostics.h" -#include "mlir/IR/MLIRContext.h" - -namespace iree { -namespace python { - -// Wrapper around a blob of memory. -// Used to transport blobs back and forth between C++ and Python. -class OpaqueBlob { - public: - OpaqueBlob() : data_(nullptr), size_(0) {} - OpaqueBlob(void* data, size_t size) : data_(data), size_(size) {} - virtual ~OpaqueBlob() = default; - - void* data() { return data_; } - const void* data() const { return data_; } - size_t size() const { return size_; } - - // Create a free function from the OpaqueBlob shared pointer. - using BufferFreeFn = void (*)(void* self, iree_byte_span_t); - static std::pair<BufferFreeFn, void*> CreateFreeFn( - std::shared_ptr<OpaqueBlob> blob) { - // Note that there are more efficient ways to write this which - // don't bounce through an extra heap alloc, but this is not - // intended to be a high impact code path. - struct Holder { - std::shared_ptr<OpaqueBlob> blob; - }; - Holder* holder = new Holder{std::move(blob)}; - auto free_fn = +([](void* self, iree_byte_span_t) { - Holder* self_holder = static_cast<Holder*>(self); - delete self_holder; - }); - return {free_fn, holder}; - } - - static iree_allocator_t CreateDeallocator(std::shared_ptr<OpaqueBlob> blob) { - // Note that there are more efficient ways to write this which - // don't bounce through an extra heap alloc, but this is not - // intended to be a high impact code path. - struct Holder { - std::shared_ptr<OpaqueBlob> blob; - }; - Holder* holder = new Holder{std::move(blob)}; - auto free_fn = +([](void* self, void*) { - Holder* self_holder = static_cast<Holder*>(self); - delete self_holder; - }); - return {holder /* self */, nullptr /* alloc */, free_fn /* free */}; - } - - protected: - void* data_; - size_t size_; -}; - -// Opaque blob that owns a vector. -class OpaqueByteVectorBlob : public OpaqueBlob { - public: - OpaqueByteVectorBlob(std::vector<uint8_t> v) - : OpaqueBlob(), v_(std::move(v)) { - data_ = v_.data(); - size_ = v_.size(); - } - - private: - std::vector<uint8_t> v_; -}; - -class OpaqueStringBlob : public OpaqueBlob { - public: - OpaqueStringBlob(std::string s) : OpaqueBlob(), s_(std::move(s)) { - data_ = &s_[0]; - size_ = s_.size(); - } - - private: - std::string s_; -}; - -class CompilerContextBundle; -class CompilerModuleBundle; - -// Wraps an MLIR module and its producing context. -class CompilerModuleBundle { - public: - CompilerModuleBundle(std::shared_ptr<CompilerContextBundle> context, - mlir::ModuleOp module_op) - : context_(std::move(context)), module_op_(std::move(module_op)) {} - - mlir::ModuleOp& module_op() { return module_op_; } - std::string ToAsm(bool enableDebugInfo, bool prettyForm, - int64_t largeElementLimit); - - // Runs one or more pass pipelines (as is mlir::parsePassPipeline). - void RunPassPipeline(const std::vector<std::string>& pipelines); - - // Compile to a VM module. - std::shared_ptr<OpaqueBlob> Compile( - mlir::iree_compiler::IREE::VM::BytecodeTargetOptions options, - std::vector<std::string> target_backends); - - private: - std::shared_ptr<CompilerContextBundle> context_; - mlir::ModuleOp module_op_; -}; - -// Registers to receive diagnostics for a scope. -// When this goes out of scope, any remaining diagnostics will be added to -// the parent. -class DiagnosticCapture { - public: - DiagnosticCapture(mlir::MLIRContext* mlir_context, DiagnosticCapture* parent); - ~DiagnosticCapture(); - DiagnosticCapture(DiagnosticCapture&& other); - - std::vector<mlir::Diagnostic>& diagnostics() { return diagnostics_; } - - // Consumes/clears diagnostics. - std::string ConsumeDiagnosticsAsString(const char* error_message); - void ClearDiagnostics(); - - private: - mlir::MLIRContext* mlir_context_; - DiagnosticCapture* parent_; - std::vector<mlir::Diagnostic> diagnostics_; - mlir::DiagnosticEngine::HandlerID handler_id_; -}; - -// Bundle of MLIRContext related things that facilitates interop with -// Python. -class CompilerContextBundle - : public std::enable_shared_from_this<CompilerContextBundle> { - public: - CompilerContextBundle(); - ~CompilerContextBundle(); - - mlir::MLIRContext* mlir_context() { return &mlir_context_; } - - CompilerModuleBundle ParseAsm(const std::string& asm_text); - - // Gets the default diagnostic capture. - DiagnosticCapture& DefaultDiagnosticCapture() { return default_capture_; } - - // Creates a new diagnostic region. - // Note that this only supports one deep at present. - DiagnosticCapture CaptureDiagnostics() { - return DiagnosticCapture(&mlir_context_, &default_capture_); - } - - // Consumes/clears diagnostics. - std::string ConsumeDiagnosticsAsString() { - return default_capture_.ConsumeDiagnosticsAsString(nullptr); - } - void ClearDiagnostics() { default_capture_.ClearDiagnostics(); } - - // Default crash reproducer path. - static absl::optional<std::string> default_crash_reproducer_path() { - std::lock_guard<std::mutex> lock(static_config_lock_); - return default_crash_reproducer_path_; - } - static void set_default_crash_reproducer_path( - absl::optional<std::string> default_crash_reproducer_path) { - std::lock_guard<std::mutex> lock(static_config_lock_); - default_crash_reproducer_path_ = std::move(default_crash_reproducer_path); - } - - // Crash reproducer (if not set, uses the static default). - // If neither are set or are the empty string, then the crash reproducer - // will not be used. - absl::optional<std::string> crash_reproducer_path() const { - if (crash_reproducer_path_) { - return crash_reproducer_path_; - } - return default_crash_reproducer_path(); - } - void set_crash_reproducer_path( - absl::optional<std::string> crash_reproducer_path) { - crash_reproducer_path_ = std::move(crash_reproducer_path); - } - - private: - static std::mutex static_config_lock_; - static absl::optional<std::string> default_crash_reproducer_path_; - - mlir::MLIRContext mlir_context_; - DiagnosticCapture default_capture_; - absl::optional<std::string> crash_reproducer_path_; -}; - -void SetupCommonCompilerBindings(pybind11::module m); - -} // namespace python -} // namespace iree - -#endif // IREE_BINDINGS_PYTHON_PYIREE_COMPILER_H_
diff --git a/bindings/python/pyiree/compiler/compiler_test.py b/bindings/python/pyiree/compiler/compiler_test.py deleted file mode 100644 index d3fd1f2..0000000 --- a/bindings/python/pyiree/compiler/compiler_test.py +++ /dev/null
@@ -1,63 +0,0 @@ -# Lint as: python3 -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from absl.testing import absltest -from pyiree import compiler - -SIMPLE_MUL_ASM = """ -func @simple_mul(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) -> tensor<4xf32> - attributes { iree.module.export } { - %0 = "mhlo.multiply"(%arg0, %arg1) {name = "mul.1"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32> - return %0 : tensor<4xf32> -} -""" - - -class CompilerTest(absltest.TestCase): - - def testParseError(self): - ctx = compiler.Context() - with self.assertRaisesRegex(ValueError, "custom op 'FOOBAR' is unknown"): - ctx.parse_asm("""FOOBAR: I SHOULD NOT PARSE""") - - def testParseAndCompileToFlatbuffer(self): - ctx = compiler.Context() - input_module = ctx.parse_asm(SIMPLE_MUL_ASM) - binary = input_module.compile() - b = binary.bytes - print("Flatbuffer size =", len(b)) - self.assertTrue(binary.bytes) - - def testParseAndCompileToFlatbufferText(self): - ctx = compiler.Context() - input_module = ctx.parse_asm(SIMPLE_MUL_ASM) - options = compiler.CompileOptions() - options.output_format = compiler.OutputFormat.FLATBUFFER_TEXT - blob = input_module.compile(options=options) - text = blob.text - self.assertTrue(text) - - def testParseAndCompileToMlirText(self): - ctx = compiler.Context() - input_module = ctx.parse_asm(SIMPLE_MUL_ASM) - options = compiler.CompileOptions() - options.output_format = compiler.OutputFormat.MLIR_TEXT - blob = input_module.compile(options=options) - text = blob.text - self.assertTrue(text) - - -if __name__ == "__main__": - absltest.main()
diff --git a/bindings/python/pyiree/compiler/export.def b/bindings/python/pyiree/compiler/export.def deleted file mode 100644 index 1f2a8c1..0000000 --- a/bindings/python/pyiree/compiler/export.def +++ /dev/null
@@ -1,17 +0,0 @@ -;; Copyright 2020 Google LLC -;; -;; Licensed under the Apache License, Version 2.0 (the "License"); -;; you may not use this file except in compliance with the License. -;; You may obtain a copy of the License at -;; -;; https://www.apache.org/licenses/LICENSE-2.0 -;; -;; Unless required by applicable law or agreed to in writing, software -;; distributed under the License is distributed on an "AS IS" BASIS, -;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -;; See the License for the specific language governing permissions and -;; limitations under the License. - -LIBRARY BINDING -EXPORTS - PyInit_binding @1
diff --git a/bindings/python/pyiree/compiler/initialize_module.cc b/bindings/python/pyiree/compiler/initialize_module.cc deleted file mode 100644 index 786179d..0000000 --- a/bindings/python/pyiree/compiler/initialize_module.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include <mutex> // NOLINT - -#include "bindings/python/pyiree/common/binding.h" -#include "bindings/python/pyiree/compiler/compiler.h" - -namespace iree { -namespace python { - -PYBIND11_MODULE(binding, m) { - m.doc() = "IREE Compiler Interface"; - SetupCommonCompilerBindings(m); -} - -} // namespace python -} // namespace iree
diff --git a/bindings/python/pyiree/compiler/unix_version.lds b/bindings/python/pyiree/compiler/unix_version.lds deleted file mode 100644 index 68ef766..0000000 --- a/bindings/python/pyiree/compiler/unix_version.lds +++ /dev/null
@@ -1,19 +0,0 @@ -/* Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -{ - global: PyInit_binding; - local: *; -};
diff --git a/bindings/python/pyiree/compiler2/core.py b/bindings/python/pyiree/compiler2/core.py index cdc7900..7ea85d5 100644 --- a/bindings/python/pyiree/compiler2/core.py +++ b/bindings/python/pyiree/compiler2/core.py
@@ -173,11 +173,11 @@ return result -def compile_str(input_str: str, **kwargs): +def compile_str(input_str: Union[str, bytes], **kwargs): """Invokes the IREE compiler with an input string. Args: - input_str: MLIR assembly to parse/compile. + input_str: MLIR assembly to parse/compile (str or bytes). **kwargs: Keyword arguments corresponding to CompilerOptions. Returns: Either a byte buffer of the compiled content or None if output_file @@ -185,7 +185,9 @@ """ options = CompilerOptions(**kwargs) cl = build_compile_command_line("-", options) - result = invoke_immediate(cl, immediate_input=input_str.encode("utf-8")) + input_bytes = input_str.encode("utf-8") if isinstance(input_str, + str) else input_str + result = invoke_immediate(cl, immediate_input=input_bytes) if options.output_file: return None return result
diff --git a/bindings/python/pyiree/compiler2/tf.py b/bindings/python/pyiree/compiler2/tf.py index c9608af..90423c5 100644 --- a/bindings/python/pyiree/compiler2/tf.py +++ b/bindings/python/pyiree/compiler2/tf.py
@@ -85,6 +85,8 @@ import_type: Union[ImportType, str] = ImportType.OBJECT_GRAPH, saved_model_tags: Set[str] = set(), import_extra_args: Sequence[str] = (), + save_temp_tf_input: Optional[str] = None, + save_temp_iree_input: Optional[str] = None, **kwargs): """Initialize options from keywords. @@ -101,6 +103,10 @@ saved_model_tags: Set of tags to export (signature def/v1 saved models only). import_extra_args: Extra arguments to pass to the iree-tf-import tool. + save_temp_tf_input: Optionally save the IR that is input to the + TensorFlow pipeline. + save_temp_iree_input: Optionally save the IR that is the result of the + import (ready to be passed to IREE). """ super().__init__(**kwargs) self.exported_names = exported_names @@ -108,6 +114,8 @@ self.import_type = ImportType.parse(import_type) self.saved_model_tags = saved_model_tags self.import_extra_args = import_extra_args + self.save_temp_tf_input = save_temp_tf_input + self.save_temp_iree_input = save_temp_iree_input def build_import_command_line(input_path: str, @@ -132,6 +140,17 @@ # Import stage directly outputs. if options.output_file: cl.append(f"-o={options.output_file}") + # Save temps flags. + if options.save_temp_tf_input: + cl.append(f"--save-temp-tf-input={options.save_temp_tf_input}") + if options.save_temp_iree_input: + cl.append(f"--save-temp-iree-input={options.save_temp_iree_input}") + # Crash reproducer (locally qualified). + if options.crash_reproducer_path: + cl.append( + f"--pass-pipeline-crash-reproducer={options.crash_reproducer_path}" + f".import-tf") + # Extra args. cl.extend(options.import_extra_args) return cl
diff --git a/bindings/python/pyiree/compiler2/tools.py b/bindings/python/pyiree/compiler2/tools.py index 480600b..6083840 100644 --- a/bindings/python/pyiree/compiler2/tools.py +++ b/bindings/python/pyiree/compiler2/tools.py
@@ -23,7 +23,7 @@ import textwrap import threading -from typing import List, Optional +from typing import List, Optional, Union __all__ = [ "find_tool", @@ -124,7 +124,7 @@ def invoke_immediate(command_line: List[str], *, - input_file: Optional[str] = None, + input_file: Optional[bytes] = None, immediate_input=None): """Invokes an immediate command.
diff --git a/bindings/python/pyiree/rt/BUILD b/bindings/python/pyiree/rt/BUILD deleted file mode 100644 index 6e64af5..0000000 --- a/bindings/python/pyiree/rt/BUILD +++ /dev/null
@@ -1,149 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "NUMPY_DEPS", - "PYBIND_COPTS", - "PYBIND_EXTENSION_COPTS", - "PYBIND_FEATURES", - "iree_py_extension", - "iree_py_library", - "iree_py_test", - "pybind_cc_library", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -iree_py_library( - name = "rt", - srcs = [ - "__init__.py", - "system_api.py", - ], - srcs_version = "PY3", - deps = [ - ":binding", - "//bindings/python:pathsetup", # build_cleaner: keep - ], -) - -iree_py_extension( - name = "binding", - srcs = [ - "initialize_module.cc", - ], - copts = PYBIND_COPTS + PYBIND_EXTENSION_COPTS, - features = PYBIND_FEATURES, - linkstatic = 1, - win_def_file = "export.def", - deps = [ - ":rt_library", - "//bindings/python/pyiree/common", - "//iree/hal/drivers", - ], -) - -pybind_cc_library( - name = "rt_library", - srcs = [ - "function_abi.cc", - "hal.cc", - "host_types.cc", - "vm.cc", - ], - hdrs = [ - "function_abi.h", - "hal.h", - "host_types.h", - "vm.h", - ], - deps = [ - "//bindings/python/pyiree/common", - "//iree/base:api", - "//iree/base:signature_mangle", - "//iree/hal:api", - "//iree/modules/hal", - "//iree/modules/strings:strings_module", - "//iree/modules/tensorlist:native_module", - "//iree/vm", - "//iree/vm:bytecode_module", - "@com_google_absl//absl/container:inlined_vector", - "@com_google_absl//absl/memory", - "@com_google_absl//absl/strings", - "@com_google_absl//absl/types:optional", - "@com_google_absl//absl/types:span", - ], -) - -iree_py_library( - name = "system_api", - srcs = ["system_api.py"], - srcs_version = "PY3", - deps = [ - ":binding", - "//bindings/python:pathsetup", # build_cleaner: keep - ], -) - -iree_py_test( - name = "function_abi_test", - srcs = ["function_abi_test.py"], - python_version = "PY3", - deps = NUMPY_DEPS + [ - "//bindings/python:pathsetup", # build_cleaner: keep - "@absl_py//absl/testing:absltest", - "//bindings/python/pyiree/rt", - ], -) - -iree_py_test( - name = "hal_test", - srcs = ["hal_test.py"], - python_version = "PY3", - deps = NUMPY_DEPS + [ - "//bindings/python:pathsetup", # build_cleaner: keep - "@absl_py//absl/testing:absltest", - "//bindings/python/pyiree/rt", - ], -) - -iree_py_test( - name = "system_api_test", - srcs = ["system_api_test.py"], - python_version = "PY3", - deps = NUMPY_DEPS + [ - ":system_api", - "//bindings/python:pathsetup", # build_cleaner: keep - "@absl_py//absl/testing:absltest", - "//bindings/python/pyiree/compiler", - "//bindings/python/pyiree/rt", - ], -) - -iree_py_test( - name = "vm_test", - srcs = ["vm_test.py"], - python_version = "PY3", - deps = NUMPY_DEPS + [ - "//bindings/python:pathsetup", # build_cleaner: keep - "@absl_py//absl/testing:absltest", - "//bindings/python/pyiree/compiler", - "//bindings/python/pyiree/rt", - ], -)
diff --git a/bindings/python/pyiree/rt/system_api_test.py b/bindings/python/pyiree/rt/system_api_test.py index a27f3b0..185b496 100644 --- a/bindings/python/pyiree/rt/system_api_test.py +++ b/bindings/python/pyiree/rt/system_api_test.py
@@ -20,13 +20,13 @@ from absl import logging from absl.testing import absltest import numpy as np -from pyiree import compiler +from pyiree import compiler2 as compiler from pyiree import rt def create_simple_mul_module(): - ctx = compiler.Context() - input_module = ctx.parse_asm(""" + binary = compiler.compile_str( + """ module @arithmetic { func @simple_mul(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) -> tensor<4xf32> attributes { iree.module.export } { @@ -34,8 +34,8 @@ return %0 : tensor<4xf32> } } - """) - binary = input_module.compile() + """, + target_backends=["vulkan-spirv"]) m = rt.VmModule.from_flatbuffer(binary) return m
diff --git a/bindings/python/setup_tools_tf.py.in b/bindings/python/setup_tools_tf.py.in index a1b292e..b25e7c5 100644 --- a/bindings/python/setup_tools_tf.py.in +++ b/bindings/python/setup_tools_tf.py.in
@@ -68,9 +68,10 @@ ], python_requires=">=3.6", package_dir={"": this_dir}, - packages=find_namespace_packages(where=this_dir, - include=["pyiree.tools.tf"], - exclude=["*.CMakeFiles"]), + packages=find_namespace_packages( + where=this_dir, + include=["pyiree.tools.tf", "pyiree.tf.support"], + exclude=["*.CMakeFiles"]), # Matching the native extension as a data file keeps setuptools from # "building" it (i.e. turning it into a static binary). package_data={
diff --git a/colab/BUILD.bazel b/colab/BUILD.bazel deleted file mode 100644 index 01c88f9..0000000 --- a/colab/BUILD.bazel +++ /dev/null
@@ -1,38 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -package( - features = ["layering_check"], - licenses = ["notice"], -) - -py_binary( - name = "everything_for_colab", - srcs = ["dummy.py"], - legacy_create_init = False, - main = "dummy.py", - python_version = "PY3", - deps = [ - "//bindings/python:pathsetup", # build_cleaner: keep - "//bindings/python/pyiree/compiler", # build_cleaner: keep - "//bindings/python/pyiree/rt", # build_cleaner: keep - ] + select({ - "//iree:enable_tensorflow": [ - "//integrations/tensorflow/bindings/python/pyiree/tf/compiler", # build_cleaner: keep - "//integrations/tensorflow/bindings/python/pyiree/tf/support", # build_cleaner: keep - ], - "//conditions:default": [ - ], - }), -)
diff --git a/integrations/tensorflow/bindings/python/CMakeLists.txt b/integrations/tensorflow/bindings/python/CMakeLists.txt index 31b61a2..bafd98b 100644 --- a/integrations/tensorflow/bindings/python/CMakeLists.txt +++ b/integrations/tensorflow/bindings/python/CMakeLists.txt
@@ -20,3 +20,5 @@ endfunction() _add_overlay_subdirectory(pyiree/tools/tf) +# TODO: Find another place for the TF support library. +_add_overlay_subdirectory(pyiree/tf/support)
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/BUILD b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/BUILD deleted file mode 100644 index c2682f6..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/BUILD +++ /dev/null
@@ -1,161 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "PYBIND_COPTS", - "PYBIND_EXTENSION_COPTS", - "PYBIND_FEATURES", - "iree_py_extension", - "iree_py_library", - "iree_py_test", - "pybind_cc_library", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -config_setting( - name = "disable_kernels", - define_values = {"PYIREE_TF_DISABLE_KERNELS": "1"}, -) - -# Runtime deps needed to compile the tensorflow compiler. -# As of 2020-04-13, robust constant folding is dependent on the legacy -# TensorFlow executor, which requires kernels to operate on/simplify -# the graph. This should become less necessary as more robust support -# is implemented as part of the MLIR-based tf2xla bridge. This adds -# about ~350 files to the system, many of which are quite heavy to -# compile. Excluding them disables TensorFlow constant propagation, -# which can cause non-optimized binaries (and tickle bugs and unimplemented -# features). However, it is allowed, especially for development because it -# is such a burden to build them. Disable kernels with this command line -# options: -# --define=PYIREE_TF_DISABLE_KERNELS=1 -# See: https://github.com/google/iree/issues/1506 -SAVED_MODEL_TF_RUNTIME_DEPS = [ - "@org_tensorflow//tensorflow/core:ops", -] + select({ - ":disable_kernels": [], - "//conditions:default": [ - "@org_tensorflow//tensorflow/core/kernels:array", - "@org_tensorflow//tensorflow/core/kernels:math", - ], -}) - -# TODO: Isolate SignatureDef SavedModel support into its own library to decrease buildtime cost. -# While it would be nice to simply depend on TensorFlow, manually paring -# down the dependencies significantly reduces the build time that this adds. -# -# Baseline: 449s -# SignatureDef SavedModels: 546s – 22% increase in build time. -# SignatureDef SavedModels + Deps for MobileBert: 572s – 27% increase in build time. -# TF OpenSource: 664s – 49% increase in build time. -SIGNATURE_DEF_SAVED_MODEL_TF_RUNTIME_DEPS = [ - # Deps for SignatureDef SavedModels: - "@org_tensorflow//tensorflow/core:direct_session", - "@org_tensorflow//tensorflow/core/kernels:resource_variable_ops", # VarHandleOp - "@org_tensorflow//tensorflow/core/kernels:regex_full_match_op", # StaticRegexFullMatch - "@org_tensorflow//tensorflow/core/kernels:string_join_op", # StringJoin - "@org_tensorflow//tensorflow/core/kernels:save_op", # SharedFilename - "@org_tensorflow//tensorflow/core/kernels:save_restore_v2_ops", # SaveV2 - - # Deps for MobileBert: - "@org_tensorflow//tensorflow/core/kernels:parameterized_truncated_normal_op", # TruncatedNormal - "@org_tensorflow//tensorflow/core/kernels:state", # Assign. - "@org_tensorflow//tensorflow/core/kernels:logging_ops", # Assert - "@org_tensorflow//tensorflow/core/kernels:bias_op", # BiasAdd - "@org_tensorflow//tensorflow/core/kernels:softmax_op", # Softmax - "@org_tensorflow//tensorflow/core/kernels:relu_op", # Relu -] - -TF_XLA_PASS_DEPS = [ - "//integrations/tensorflow/compiler:tensorflow", - "@org_tensorflow//tensorflow/compiler/mlir/xla:xla_legalize_tf", -] - -iree_py_library( - name = "compiler", - srcs = [ - "__init__.py", - ], - srcs_version = "PY3", - deps = [ - ":binding", - "//bindings/python:pathsetup", # build_cleaner: keep - "//integrations/tensorflow/bindings/python:pathsetup", # build_cleaner: keep - ], -) - -iree_py_extension( - name = "binding", - srcs = [ - "initialize_module.cc", - ], - copts = PYBIND_COPTS + PYBIND_EXTENSION_COPTS, - features = PYBIND_FEATURES, - linkstatic = 1, - win_def_file = "export.def", - deps = [ - ":compiler_library", - "//bindings/python/pyiree/common", - "//bindings/python/pyiree/compiler:compiler_library", - "//integrations/tensorflow/compiler:tensorflow", - ], -) - -pybind_cc_library( - name = "compiler_library", - srcs = [ - "register_tensorflow.cc", - ], - hdrs = [ - "register_tensorflow.h", - ], - deps = SAVED_MODEL_TF_RUNTIME_DEPS + TF_XLA_PASS_DEPS + SIGNATURE_DEF_SAVED_MODEL_TF_RUNTIME_DEPS + [ - "//bindings/python/pyiree/common", - "//bindings/python/pyiree/compiler:compiler_library", - "@llvm-project//llvm:Support", - "@llvm-project//mlir:IR", - "@org_tensorflow//tensorflow/cc/saved_model:loader_lite", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:convert_graphdef", - "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tf_saved_model_passes", - "@org_tensorflow//tensorflow/core:core_cpu", - ], -) - -iree_py_test( - name = "saved_model_test", - srcs = ["saved_model_test.py"], - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "@absl_py//absl/testing:absltest", - "//integrations/tensorflow/bindings/python/pyiree/tf/compiler", - ], -) - -iree_py_test( - name = "signature_def_saved_model_test", - srcs = ["signature_def_saved_model_test.py"], - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "@absl_py//absl/testing:absltest", - "//integrations/tensorflow/bindings/python/pyiree/tf/compiler", - ], -)
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/__init__.py b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/__init__.py deleted file mode 100644 index 26285f9..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/__init__.py +++ /dev/null
@@ -1,243 +0,0 @@ -# Lint-as: python3 -"""Module init for the python bindings.""" - -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# pylint: disable=g-multiple-import -# pylint: disable=g-bad-import-order -# pylint: disable=g-import-not-at-top -# pylint: disable=wildcard-import - -__all__ = [ - # Common - "Context", - "Module", - "CompileOptions", - "OutputFormat", - # TensorFlow - "TF_IMPORT_PASS_PIPELINE", - "tf_saved_model_to_compiler_module", - "tf_signature_def_saved_model_to_compiler_module", - "tf_module_to_compiler_module", - "compile_tf_saved_model", - "compile_tf_signature_def_saved_model", - "compile_tf_module", -] - -import tempfile -from typing import Collection, Optional, Sequence, Set - -from . import binding as binding -import tensorflow as tf - -# Native aliases (matches those in the generic compiler). -llvm = binding.llvm -Context = binding.CompilerContext -Module = binding.CompilerModule -CompileOptions = binding.CompileOptions -OutputFormat = binding.OutputFormat - -# Pass pipeline that should run to lower a TF saved_model to a form suitable -# for input to the IREE compiler. -TF_IMPORT_PASS_PIPELINE = ( - # IREE-specific passes to prepare TF code for IREE compilation. - # In particular, this eliminates tf_saved_model. - "iree-tf-import-pipeline", -) - - -def tf_saved_model_to_compiler_module( - saved_model_dir: str, - exported_names: Sequence[str] = (), - pass_pipeline: Sequence[str] = TF_IMPORT_PASS_PIPELINE, - compiler_context: Optional[Context] = None) -> Module: - """Converts a TensorFlow SavedModel into a MLIR module. - - See also compile_tf_saved_model() for a one-shot API to load and compile. - - Args: - saved_model_dir: Directory of the saved model. - exported_names: Optional sequence representing the exported names to keep. - pass_pipeline: Passes to run on the imported module prior to returning. - Defaults to TF_IMPORT_PASS_PIPELINE. - compiler_context: The pyiree.compiler.Context() backing the module. - - Returns: - An MLIR Module suitable for compilation by the IREE compiler. - This can be further compiled to an IREE blob by calling - .compile_to_sequencer_blob. - """ - if not compiler_context: - compiler_context = Context() - compiler_module = binding.load_saved_model(compiler_context, - saved_model_dir, - exported_names=exported_names) - if pass_pipeline: - compiler_module.run_pass_pipeline(pass_pipeline) - return compiler_module - - -def compile_tf_saved_model( - saved_model_dir: str, - exported_names: Sequence[str] = (), - target_backends: Sequence[str] = (), - pass_pipeline: Sequence[str] = TF_IMPORT_PASS_PIPELINE, - compiler_context: Optional[Context] = None) -> binding.OpaqueBlob: - """Compiles a TensorFlow SavedModel to IREE in one shot. - - Args: - saved_model_dir: Directory of the saved model. - exported_names: Optional sequence representing the exported names to keep. - target_backends: Optional sequence of specific target backends to compile - for (defaults to all compiled in targets). - pass_pipeline: Passes to run on the imported module prior to returning. - Defaults to TF_IMPORT_PASS_PIPELINE. - compiler_context: The pyiree.compiler.Context() backing the module. - - Returns: - An OpaqueBlob representing the compiled module. - """ - compiler_module = tf_saved_model_to_compiler_module(saved_model_dir, - exported_names, - pass_pipeline, - compiler_context) - return compiler_module.compile(target_backends=target_backends) - - -def tf_signature_def_saved_model_to_compiler_module( - saved_model_dir: str, - saved_model_tags: Set[str] = set(), - exported_names: Sequence[str] = (), - pass_pipeline: Sequence[str] = TF_IMPORT_PASS_PIPELINE, - compiler_context: Optional[Context] = None) -> Module: - """Converts a TensorFlow SignatureDef SavedModel into a MLIR module. - - Args: - saved_model_dir: Directory of the saved model. - saved_model_tags: Optional set of tags to use when loading the model. - exported_names: Optional sequence representing the exported names to keep. - pass_pipeline: Passes to run on the imported module prior to returning. - Defaults to TF_IMPORT_PASS_PIPELINE. - compiler_context: The pyiree.compiler.Context() backing the module. - - Returns: - An MLIR Module suitable for compilation by the IREE compiler. - This can be further compiled to an IREE blob by calling - .compile_to_sequencer_blob. - """ - if not compiler_context: - compiler_context = Context() - compiler_module = binding.load_signature_def_saved_model( - compiler_context, - saved_model_dir, - saved_model_tags, - exported_names=exported_names) - if pass_pipeline: - compiler_module.run_pass_pipeline(pass_pipeline) - return compiler_module - - -def compile_tf_signature_def_saved_model( - saved_model_dir: str, - saved_model_tags: Set[str] = set(), - exported_names: Sequence[str] = (), - target_backends: Sequence[str] = (), - pass_pipeline: Sequence[str] = TF_IMPORT_PASS_PIPELINE, - compiler_context: Optional[Context] = None) -> binding.OpaqueBlob: - """Compiles a TensorFlow SignatureDef SavedModel to IREE in one shot. - - Args: - saved_model_dir: Directory of the saved model. - saved_model_tags: Optional set of tags to use when loading the model. - exported_names: Optional sequence representing the exported names to keep. - target_backends: Optional sequence of specific target backends to compile - for (defaults to all compiled in targets). - pass_pipeline: Passes to run on the imported module prior to returning. - Defaults to TF_IMPORT_PASS_PIPELINE. - compiler_context: The pyiree.compiler.Context() backing the module. - - Returns: - An OpaqueBlob representing the compiled module. - """ - compiler_module = tf_signature_def_saved_model_to_compiler_module( - saved_model_dir, saved_model_tags, exported_names, pass_pipeline, - compiler_context) - return compiler_module.compile(target_backends=target_backends) - - -def tf_module_to_compiler_module( - module: tf.Module, - exported_names: Sequence[str] = (), - pass_pipeline: Sequence[str] = TF_IMPORT_PASS_PIPELINE, - compiler_context: Optional[Context] = None, - saved_model_dir: str = None) -> Module: - """Converts a tf.Module instance into a MLIR module. - - Args: - module: The tf.Module instance to convert to MLIR - exported_names: Optional sequence representing the exported names to keep. - pass_pipeline: Passes to run on the imported module prior to returning. - Defaults to TF_IMPORT_PASS_PIPELINE. - compiler_context: The pyiree.compiler.Context() backing the module. - saved_model_dir: Optional path to save the tf.Module to. The module will not - be saved on disk if this is not provided. - - Returns: - An MLIR Module suitable for compilation by the IREE compiler. - This can be further compiled to an IREE blob by calling - .compile_to_sequencer_blob. - """ - - def _convert(saved_model_dir): - options = tf.saved_model.SaveOptions(save_debug_info=True) - tf.saved_model.save(module, saved_model_dir, options=options) - return tf_saved_model_to_compiler_module(saved_model_dir, exported_names, - pass_pipeline, compiler_context) - - if saved_model_dir is None: - with tempfile.TemporaryDirectory() as saved_model_dir: - compiler_module = _convert(saved_model_dir) - else: - compiler_module = _convert(saved_model_dir) - return compiler_module - - -def compile_tf_module(module: tf.Module, - exported_names: Sequence[str] = (), - target_backends: Sequence[str] = (), - pass_pipeline: Sequence[str] = TF_IMPORT_PASS_PIPELINE, - compiler_context: Optional[Context] = None, - saved_model_dir: str = None): - """Compiles a tf.Module to IREE in one shot. - - Args: - module: The tf.Module instance to convert to MLIR - exported_names: Optional sequence representing the exported names to keep. - target_backends: Optional sequence of specific target backends to compile - for (defaults to all compiled in targets). - pass_pipeline: Passes to run on the imported module prior to returning. - Defaults to TF_IMPORT_PASS_PIPELINE. - compiler_context: The pyiree.compiler.Context() backing the module. - saved_model_dir: Optional path to save the tf.Module to. The module will not - be saved on disk if this is not provided. - - Returns: - An OpaqueBlob representing the compiled module. - """ - compiler_module = tf_module_to_compiler_module(module, exported_names, - pass_pipeline, - compiler_context, - saved_model_dir) - return compiler_module.compile(target_backends=target_backends)
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/export.def b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/export.def deleted file mode 100644 index 1f2a8c1..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/export.def +++ /dev/null
@@ -1,17 +0,0 @@ -;; Copyright 2020 Google LLC -;; -;; Licensed under the Apache License, Version 2.0 (the "License"); -;; you may not use this file except in compliance with the License. -;; You may obtain a copy of the License at -;; -;; https://www.apache.org/licenses/LICENSE-2.0 -;; -;; Unless required by applicable law or agreed to in writing, software -;; distributed under the License is distributed on an "AS IS" BASIS, -;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -;; See the License for the specific language governing permissions and -;; limitations under the License. - -LIBRARY BINDING -EXPORTS - PyInit_binding @1
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/initialize_module.cc b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/initialize_module.cc deleted file mode 100644 index 1eb7549..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/initialize_module.cc +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2020 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include <mutex> // NOLINT - -#include "bindings/python/pyiree/common/binding.h" -#include "bindings/python/pyiree/compiler/compiler.h" -#include "integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.h" - -namespace iree { -namespace python { - -PYBIND11_MODULE(binding, m) { - m.doc() = "IREE TensorFlow Compiler Interface"; - SetupCommonCompilerBindings(m); - SetupTensorFlowBindings(m); -} - -} // namespace python -} // namespace iree
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.cc b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.cc deleted file mode 100644 index 990371a..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.cc +++ /dev/null
@@ -1,131 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.h" - -#include <mutex> -#include <string> -#include <vector> - -#include "bindings/python/pyiree/common/status_utils.h" -#include "bindings/python/pyiree/compiler/compiler.h" -#include "integrations/tensorflow/compiler/Passes.h" -#include "llvm/Support/raw_ostream.h" -#include "mlir/IR/BuiltinOps.h" -#include "mlir/IR/MLIRContext.h" -#include "tensorflow/cc/saved_model/loader.h" -#include "tensorflow/compiler/mlir/tensorflow/translate/import_model.h" -#include "tensorflow/core/public/session_options.h" - -using namespace mlir; // NOLINT - -using tensorflow::ConvertSavedModelToMlir; -using tensorflow::ConvertSavedModelV1ToMlir; -using tensorflow::LoadSavedModel; -using tensorflow::RunOptions; -using tensorflow::SavedModelBundle; -using tensorflow::SavedModelV2Bundle; -using tensorflow::SessionOptions; - -namespace iree { -namespace python { - -namespace { - -static void initializeContextForTFImport(MLIRContext* context) { - static std::once_flag flag; - std::call_once(flag, [&]() { - mlir::iree_compiler::TF::registerAllPasses(); - mlir::iree_compiler::TF::registerAllDialects(context->getDialectRegistry()); - }); -} - -CompilerModuleBundle LoadSavedModel( - std::shared_ptr<CompilerContextBundle> context_bundle, - const std::string& saved_model_dir, - const std::vector<std::string>& exported_names) { - initializeContextForTFImport(context_bundle->mlir_context()); - - SavedModelV2Bundle bundle; - auto load_status = SavedModelV2Bundle::Load( - std::string(saved_model_dir.data(), saved_model_dir.length()), &bundle); - if (!load_status.ok()) { - std::stringstream msg; - msg << "Failed to load saved model '" << saved_model_dir - << "': " << load_status; - throw RaisePyError(PyExc_RuntimeError, msg.str().c_str()); - } - - // TODO(laurenzo): Fix the upstream ConvertSavedModelToMlir() to take a const - // span of external names. - std::vector<std::string> mutable_exported_names = exported_names; - auto module_or = - ConvertSavedModelToMlir(&bundle, context_bundle->mlir_context(), - absl::MakeSpan(mutable_exported_names)); - if (!module_or.status().ok()) { - std::stringstream msg; - msg << "Failed to convert saved model to MLIR '" << saved_model_dir - << "': " << module_or.status(); - throw RaisePyError(PyExc_RuntimeError, msg.str().c_str()); - } - return CompilerModuleBundle(context_bundle, - module_or.ConsumeValueOrDie().release()); -} - -CompilerModuleBundle LoadSignatureDefSavedModel( - std::shared_ptr<CompilerContextBundle> context_bundle, - const std::string& saved_model_dir, - const std::unordered_set<std::string>& tags, - const std::vector<std::string>& exported_names) { - initializeContextForTFImport(context_bundle->mlir_context()); - - SavedModelBundle bundle; - auto load_status = LoadSavedModel( - SessionOptions(), RunOptions(), - std::string(saved_model_dir.data(), saved_model_dir.length()), tags, - &bundle); - if (!load_status.ok()) { - std::stringstream msg; - msg << "Failed to load saved model '" << saved_model_dir - << "': " << load_status; - throw RaisePyError(PyExc_RuntimeError, msg.str().c_str()); - } - std::vector<std::string> mutable_exported_names = exported_names; - auto module_or = - ConvertSavedModelV1ToMlir(bundle, absl::MakeSpan(mutable_exported_names), - context_bundle->mlir_context()); - if (!module_or.status().ok()) { - std::stringstream msg; - msg << "Failed to convert saved model to MLIR '" << saved_model_dir - << "': " << module_or.status(); - throw RaisePyError(PyExc_RuntimeError, msg.str().c_str()); - } - return CompilerModuleBundle(context_bundle, - module_or.ConsumeValueOrDie().release()); -} - -} // namespace - -void SetupTensorFlowBindings(pybind11::module m) { - m.def("load_saved_model", &LoadSavedModel, py::arg("compiler_context"), - py::arg("saved_model_dir"), - py::arg("exported_names") = std::vector<std::string>()); - m.def("load_signature_def_saved_model", &LoadSignatureDefSavedModel, - py::arg("compiler_context"), py::arg("saved_model_dir"), - py::arg("tags") = std::unordered_set<std::string>(), - py::arg("exported_names") = std::vector<std::string>()); -} - -} // namespace python -} // namespace iree
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.h b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.h deleted file mode 100644 index 6df0a8c..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/register_tensorflow.h +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef IREE_BINDINGS_PYTHON_PYIREE_TF_INTEROP_REGISTER_TENSORFLOW_H_ -#define IREE_BINDINGS_PYTHON_PYIREE_TF_INTEROP_REGISTER_TENSORFLOW_H_ - -#include <string> - -#include "bindings/python/pyiree/common/binding.h" - -namespace iree { -namespace python { - -void SetupTensorFlowBindings(pybind11::module m); - -} // namespace python -} // namespace iree - -#endif // IREE_BINDINGS_PYTHON_PYIREE_TF_INTEROP_REGISTER_TENSORFLOW_H_
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/saved_model_test.py b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/saved_model_test.py deleted file mode 100644 index 10e55c3..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/saved_model_test.py +++ /dev/null
@@ -1,72 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import importlib -import os -import sys -import tempfile - -from pyiree.tf import compiler - -# Dynamically import tensorflow. -try: - # Use a dynamic import so as to avoid hermetic dependency analysis - # (i.e. we only want the tensorflow from the environment). - tf = importlib.import_module("tensorflow") - # Just in case if linked against a pre-V2 defaulted version. - if hasattr(tf, "enable_v2_behavior"): - tf.enable_v2_behavior() - tf = tf.compat.v2 -except ImportError: - print("Not running tests because tensorflow is not available") - sys.exit(0) - - -class StatelessModule(tf.Module): - - def __init__(self): - pass - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def add(self, a, b): - return tf.tanh(a + b) - - -class RuntimeTest(tf.test.TestCase): - - def testLoadSavedModelToXlaPipeline(self): - """Tests that a basic saved model to XLA workflow grossly functions. - - This is largely here to verify that everything is linked in that needs to be - and that there are not no-ops, etc. - """ - with tempfile.TemporaryDirectory() as temp_dir: - sm_dir = os.path.join(temp_dir, "simple.sm") - print("Saving to:", sm_dir) - my_module = StatelessModule() - options = tf.saved_model.SaveOptions(save_debug_info=True) - tf.saved_model.save(my_module, sm_dir, options=options) - - # Load it up. - input_module = compiler.tf_saved_model_to_compiler_module(sm_dir) - xla_asm = input_module.to_asm() - print("XLA ASM:", xla_asm) - self.assertRegex(xla_asm, "mhlo.tanh") - - -if __name__ == "__main__": - tf.test.main()
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/signature_def_saved_model_test.py b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/signature_def_saved_model_test.py deleted file mode 100644 index e8d1e53..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/signature_def_saved_model_test.py +++ /dev/null
@@ -1,66 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import importlib -import os -import sys -import tempfile - -from pyiree.tf import compiler - -# Dynamically import tensorflow. -try: - # Use a dynamic import so as to avoid hermetic dependency analysis - # (i.e. we only want the tensorflow from the environment). - tf = importlib.import_module("tensorflow") - # Just in case if linked against a pre-V2 defaulted version. - if hasattr(tf, "enable_v2_behavior"): - tf.enable_v2_behavior() - tf = tf.compat.v2 -except ImportError: - print("Not running tests because tensorflow is not available") - sys.exit(0) - - -class RuntimeTest(tf.test.TestCase): - - def testLoadSignatureDefSavedModel(self): - """Tests loading a SignatureDef saved model with a single variable.""" - - with tempfile.TemporaryDirectory() as temp_dir: - sm_dir = os.path.join(temp_dir, "simple.sm") - print("Saving to:", sm_dir) - - with tf.Graph().as_default() as graph: - v = tf.Variable(10) - result = v.read_value() - tensor_info = tf.compat.v1.saved_model.utils.build_tensor_info(result) - sig = tf.compat.v1.saved_model.signature_def_utils.build_signature_def( - inputs={}, outputs={"result": tensor_info}, method_name="foo") - builder = tf.compat.v1.saved_model.Builder(sm_dir) - with tf.compat.v1.Session(graph=graph) as sess: - sess.run(v.initializer) - builder.add_meta_graph_and_variables(sess, ["bar"], {"baz": sig}, - strip_default_attrs=True) - builder.save() - - module = compiler.tf_signature_def_saved_model_to_compiler_module( - sm_dir, saved_model_tags=set(["bar"]), exported_names=["baz"]) - - module_asm = module.to_asm(large_element_limit=100) - self.assertRegexpMatches(module_asm, "flow.variable @[^ ]* dense<10>") - - -if __name__ == "__main__": - tf.test.main()
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/test/BUILD b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/test/BUILD deleted file mode 100644 index 8a2a4f0..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/test/BUILD +++ /dev/null
@@ -1,46 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//iree:build_defs.oss.bzl", - "INTREE_FILECHECK_TARGET", -) -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "iree_py_test", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -iree_py_test( - name = "saved_model_adopt_exports", - srcs = [ - "saved_model_adopt_exports.py", - ], - args = [ - "--filecheck_binary=$(rootpath %s)" % INTREE_FILECHECK_TARGET, - ], - data = [ - INTREE_FILECHECK_TARGET, - ], - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -)
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/test/saved_model_adopt_exports.py b/integrations/tensorflow/bindings/python/pyiree/tf/compiler/test/saved_model_adopt_exports.py deleted file mode 100644 index 0eca3f4..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/compiler/test/saved_model_adopt_exports.py +++ /dev/null
@@ -1,340 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tests supported features of saved models.""" - -# pylint: disable=invalid-name -# pylint: disable=missing-docstring -# pylint: disable=line-too-long - -from pyiree.tf.support import tf_test_driver -import tensorflow.compat.v2 as tf - -SAVED_MODEL_IMPORT_PASSES = [ - "iree-tf-import-pipeline", - "canonicalize", -] - - -# Tests that a simple example with flat args and a single result and no -# captures imports properly. -# CHECK-LABEL: RUN_TEST: T0001_FlatArgsResultsNoBoundGlobals -# CHECK: module -# CHECK-NOT: tf_saved_model.semantics -# CHECK: @simple_mul_no_capture -# CHECK: iree.module.export -# CHECK: FINISH_TEST -class T0001_FlatArgsResultsNoBoundGlobals(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul_no_capture(self, a, b): - return a * b - - -tf_test_driver.add_test(test_name="T0001_FlatArgsResultsNoBoundGlobals", - tf_module_builder=T0001_FlatArgsResultsNoBoundGlobals, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - -# T0002: Tests that bound global vars import properly. - -# CHECK-LABEL: RUN_TEST: T0002a_SimpleVarRead -# CHECK: flow.variable @v mutable dense<0.000000e+00> : tensor<f32> -# CHECK: func @f() -> tensor<f32> -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I1!R3!_0"} -# CHECK: flow.variable.load @v : tensor<f32> -# CHECK: FINISH_TEST -class T0002a_SimpleVarRead(tf.Module): - - def __init__(self): - self.v = tf.Variable(0.) - - @tf.function(input_signature=[]) - def f(self): - return self.v - - -# CHECK-LABEL: RUN_TEST: T0002b_SimpleVarWrite -# CHECK: flow.variable @v mutable dense<0.000000e+00> : tensor<f32> -# CHECK: func @f(%arg0: tensor<f32> {tf._user_specified_name = "a"}) -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I8!S5!k0_0R1!"} -# CHECK: flow.variable.store %arg0, @v : tensor<f32> -# CHECK: FINISH_TEST -class T0002b_SimpleVarWrite(tf.Module): - - def __init__(self): - self.v = tf.Variable(0.) - - @tf.function(input_signature=[tf.TensorSpec([], tf.float32)]) - def f(self, a): - self.v.assign(a) - - -# CHECK-LABEL: RUN_TEST: T0002c_SimpleConst -# CHECK: flow.variable [[CONST:@.+]] dense<0.000000e+00> : tensor<f32> -# CHECK: func @f() -> tensor<f32> -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I1!R3!_0"} -# NOTE: the constant variable gets inlined: -# CHECK: = constant dense<0.000000e+00> : tensor<f32> -# CHECK: FINISH_TEST -class T0002c_SimpleConst(tf.Module): - - def __init__(self): - self.c = tf.constant(0.) - - @tf.function(input_signature=[]) - def f(self): - return self.c - - -# CHECK-LABEL: RUN_TEST: T0002d_VarCompatibleShapeChange -# CHECK: flow.variable @v mutable dense<0.000000e+00> : tensor<1xf32> -# CHECK: func @f() -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I1!R1!"} -# CHECK-DAG: [[CONST_2xf32:%.+]] = mhlo.constant dense<[0.000000e+00, 1.000000e+00]> -# CHECK-DAG: [[CONST_3xf32:%.+]] = mhlo.constant dense<[0.000000e+00, 1.000000e+00, 2.000000e+00]> -# CHECK-DAG: flow.variable.store [[CONST_2xf32]], @v : tensor<2xf32> -# CHECK-DAG: flow.variable.store [[CONST_3xf32]], @v : tensor<3xf32> -# CHECK: FINISH_TEST -class T0002d_VarCompatibleShapeChange(tf.Module): - - def __init__(self): - self.v = tf.Variable([0.], shape=[None]) - - @tf.function(input_signature=[]) - def f(self): - self.v.assign(tf.constant([0., 1.])) - self.v.assign(tf.constant([0., 1., 2.])) - - -# CHECK-LABEL: RUN_TEST: T0002e_Error_VarMultipleExportedNames -# CHECK: [ERROR]: Multiple exported names for global tensor not supported yet -# CHECK: FINISH_TEST -class T0002e_Error_VarMultipleExportedNames(tf.Module): - - def __init__(self): - self.v = tf.Variable(0.) - self.v2 = self.v - - -tf_test_driver.add_test(test_name="T0002a_SimpleVarRead", - tf_module_builder=T0002a_SimpleVarRead, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) -tf_test_driver.add_test(test_name="T0002b_SimpleVarWrite", - tf_module_builder=T0002b_SimpleVarWrite, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) -tf_test_driver.add_test(test_name="T0002c_SimpleConst", - tf_module_builder=T0002c_SimpleConst, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) -tf_test_driver.add_test(test_name="T0002d_VarCompatibleShapeChange", - tf_module_builder=T0002d_VarCompatibleShapeChange, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) -tf_test_driver.add_test(test_name="T0002e_Error_VarMultipleExportedNames", - tf_module_builder=T0002e_Error_VarMultipleExportedNames, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True, - expect_pass_failure=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0003a_StructuredArgs -# CHECK: func @simple_mul -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I23!S19!k0D13!K2!x_0K2!y_1R3!_0"} -# CHECK: FINISH_TEST -class T0003a_StructuredArgs(tf.Module): - - @tf.function(input_signature=[{ - "x": tf.TensorSpec([4], tf.float32), - "y": tf.TensorSpec([4], tf.float32) - }]) - def simple_mul(self, d): - return d["x"] * d["y"] - - -tf_test_driver.add_test(test_name="T0003a_StructuredArgs", - tf_module_builder=T0003a_StructuredArgs, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0003b_StructuredMultipleDictResult -# CHECK: func @simple_mul -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I12!S9!k0_0k1_1R26!D22!K2!x_0K10!x_squared_1"} -# CHECK: FINISH_TEST -class T0003b_StructuredMultipleDictResult(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul(self, a, b): - product = a * b - return {"x": product, "x_squared": product * product} - - -tf_test_driver.add_test(test_name="T0003b_StructuredMultipleDictResult", - tf_module_builder=T0003b_StructuredMultipleDictResult, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0003c_StructuredSingleDictResult -# CHECK: func @simple_mul -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I12!S9!k0_0k1_1R10!D7!K2!x_0"} -# CHECK: FINISH_TEST -class T0003c_StructuredSingleDictResult(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul(self, a, b): - product = a * b - return {"x": product} - - -tf_test_driver.add_test(test_name="T0003c_StructuredSingleDictResult", - tf_module_builder=T0003c_StructuredSingleDictResult, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0003d_StructuredSingleResult -# CHECK: func @simple_mul -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I12!S9!k0_0k1_1R3!_0"} -# CHECK: FINISH_TEST -class T0003d_StructuredSingleResult(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul(self, a, b): - product = a * b - return product - - -tf_test_driver.add_test(test_name="T0003d_StructuredSingleResult", - tf_module_builder=T0003d_StructuredSingleResult, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0003e_StructuredSequenceResult -# CHECK: func @simple_mul -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I12!S9!k0_0k1_1R17!S13!k0_0k1_1k2_2"} -# CHECK: FINISH_TEST -class T0003e_StructuredSequenceResult(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul(self, a, b): - product = a * b - return product, a, b - - -tf_test_driver.add_test(test_name="T0003e_StructuredSequenceResult", - tf_module_builder=T0003e_StructuredSequenceResult, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0003f_StructuredNestedResult -# CHECK: func @simple_mul -# CHECK: attributes -# CHECK-SAME: iree.module.export -# CHECK-SAME: iree.reflection = {abi = "sip", abiv = 1 : i32, sip = "I12!S9!k0_0k1_1R27!S23!k0_0k1D13!K2!a_1K2!b_2"} -# CHECK: FINISH_TEST -class T0003f_StructuredNestedResult(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul(self, a, b): - product = a * b - return product, {"a": a, "b": b} - - -tf_test_driver.add_test(test_name="T0003f_StructuredNestedResult", - tf_module_builder=T0003f_StructuredNestedResult, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True) - - -# Tests that a structured argument is handled properly. -# NOTE: This is currently an error and needs to be implemented -# CHECK-LABEL: RUN_TEST: T0005_MultipleExportedFuncNames -# CHECK: [ERROR]: Multiple exported names not supported yet -# CHECK: FINISH_TEST_WITH_EXCEPTION -class T0005_MultipleExportedFuncNames(tf.Module): - - @tf.function(input_signature=[ - tf.TensorSpec([4], tf.float32), - tf.TensorSpec([4], tf.float32) - ]) - def simple_mul(self, a, b): - product = a * b - return {"x": product} - - -# Force a function alias. -T0005_MultipleExportedFuncNames.another_copy = ( - T0005_MultipleExportedFuncNames.simple_mul) - -tf_test_driver.add_test(test_name="T0005_MultipleExportedFuncNames", - tf_module_builder=T0005_MultipleExportedFuncNames, - passes=SAVED_MODEL_IMPORT_PASSES, - print_input_module=True, - expect_pass_failure=True) - -if __name__ == "__main__": - tf_test_driver.run_tests(__file__, with_filecheck=True)
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/support/BUILD b/integrations/tensorflow/bindings/python/pyiree/tf/support/BUILD deleted file mode 100644 index 09fe138..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/tf/support/BUILD +++ /dev/null
@@ -1,98 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "iree_py_library", - "iree_py_test", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -iree_py_library( - name = "support", - srcs = [ - "__init__.py", - "module_utils.py", - "tf_test_driver.py", - "tf_test_utils.py", - "tf_utils.py", - "trace_utils.py", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + [ - "//integrations/tensorflow/bindings/python:pathsetup", # build_cleaner: keep - "//integrations/tensorflow/bindings/python/pyiree/tf/compiler", - "//bindings/python/pyiree/rt", - ], -) - -iree_py_test( - name = "module_utils_test", - srcs = [ - "module_utils.py", - "module_utils_test.py", - ], - python_version = "PY3", - tags = [ - "driver=llvm", - "driver=vmla", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -iree_py_test( - name = "tf_test_utils_test", - srcs = [ - "tf_test_utils.py", - "tf_test_utils_test.py", - ], - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -iree_py_test( - name = "tf_utils_test", - srcs = [ - "tf_utils.py", - "tf_utils_test.py", - ], - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -iree_py_test( - name = "trace_utils_test", - srcs = [ - "trace_utils.py", - "trace_utils_test.py", - ], - python_version = "PY3", - tags = [ - "driver=vmla", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -)
diff --git a/bindings/python/pyiree/BUILD b/integrations/tensorflow/bindings/python/pyiree/tf/support/CMakeLists.txt similarity index 71% rename from bindings/python/pyiree/BUILD rename to integrations/tensorflow/bindings/python/pyiree/tf/support/CMakeLists.txt index 01d988d..627c40c 100644 --- a/bindings/python/pyiree/BUILD +++ b/integrations/tensorflow/bindings/python/pyiree/tf/support/CMakeLists.txt
@@ -1,4 +1,4 @@ -# Copyright 2019 Google LLC +# Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,8 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 +iree_py_library( + NAME + support + SRCS + "__init__.py" + "module_utils.py" + "tf_test_driver.py" + "tf_test_utils.py" + "tf_utils.py" + "trace_utils.py" ) + +# TODO: Add tests.
diff --git a/integrations/tensorflow/bindings/python/pyiree/tf/support/module_utils.py b/integrations/tensorflow/bindings/python/pyiree/tf/support/module_utils.py index fb55501..5a799c6 100644 --- a/integrations/tensorflow/bindings/python/pyiree/tf/support/module_utils.py +++ b/integrations/tensorflow/bindings/python/pyiree/tf/support/module_utils.py
@@ -17,13 +17,13 @@ import collections import os import tempfile -from typing import Any, Callable, Dict, Sequence, Set, Tuple, Type, Union +from typing import Any, Callable, Dict, Optional, Sequence, Set, Tuple, Type, Union from absl import flags from absl import logging import numpy as np from pyiree import rt -from pyiree.tf import compiler +from pyiree.compiler2 import tf as tf_compiler from pyiree.tf.support import tf_utils import tensorflow.compat.v2 as tf @@ -40,108 +40,64 @@ return "TEST_TMPDIR" in os.environ -def _setup_mlir_crash_reproducer( - function: Any, # pytype doesn't support arbitrary Callable[*args, **kwargs] - artifacts_dir: str, - backend_id: str, -) -> Any: # Callable[Any, Any] - """Wraps `function` so that it a MLIR crash reproducer is saved if it crashes. +def _get_tf_import_output_kwargs(artifacts_dir: str, + backend_id: str, + *, + needs_temp_saved_model_dir: bool = False): + """Gets output kwargs dict to pass to tf.compile() for output generation. - Writes to `artifacts_dir/reproducer__{backend}.mlir` in the case of a crash. - - Args: - function: The callable to decorate. - artifacts_dir: The directory to write the reproducer to. - backend_id: The unique backend name to use when writting the reproducer. - - Returns: - A function with the same API as the passed function. - """ - - def decorator(*args, **kwargs): - # Set up a crash reproducer for debugging. - if artifacts_dir is not None: - compiler.Context.default_crash_reproducer_path = os.path.join( - artifacts_dir, f"reproducer__{backend_id}.mlir") - try: - results = function(*args, **kwargs) - except Exception: # pylint: disable=broad-except - # Disable the crash reproducer (to avoid inadvertently overwriting it). - if artifacts_dir is not None: - compiler.Context.default_crash_reproducer_path = None - raise - return results - - return decorator - - -def _incrementally_lower_compiler_module( - compiler_module: compiler.Module, - backend_info: "BackendInfo", - artifacts_dir: str, -) -> Tuple[compiler.binding.OpaqueBlob, Union[str, None]]: - """Lowers a MLIR compiler module incrementally and saves its outputs. - - If artifacts_dir is provided then the following artifacts will be saved: + When artifacts_dir is set, writes: tf_input.mlir: MLIR for the module in TF's input dialect. iree_input.mlir: The MLIR above translated to IREE via compiler.TF_IMPORT_PASS_PIPELINE. backend_id/compiled.vmfb: A VM FlatBuffer compiled to the target backend from the IREE MLIR above. + `artifacts_dir/reproducer__{backend}.mlir` in the case of a crash. Args: - compiler_module: A compiler.Module to lower. - backend_info: BackendInfo with the details for lowering compiler_module to - IREE. - artifacts_dir: An optional string pointing to where compilation artifacts - should be saved. No compilation artifacts will be saved if this is not - provided. + artifacts_dir: The artifacts directory. + backend_id: The backend id (for artifacts that are backend dependent). + needs_temp_saved_model_dir: Whether a temporary 'saved_model_dir' directory + needs to be set. + + Returns: + A dict of output kwargs. """ - if artifacts_dir is not None: - os.makedirs(artifacts_dir, exist_ok=True) - tf_mlir_path = os.path.join(artifacts_dir, "tf_input.mlir") - logging.info("Saving raw TF input MLIR to: %s", tf_mlir_path) - with open(tf_mlir_path, "w") as f: - f.write(compiler_module.to_asm()) + kwargs = {} + backend_dir = os.path.join(artifacts_dir, backend_id) + os.makedirs(backend_dir, exist_ok=True) + kwargs["output_file"] = os.path.join(backend_dir, "compiled.vmfb") + if needs_temp_saved_model_dir: + kwargs["saved_model_dir"] = os.path.join(artifacts_dir, + "tfmodule.saved_model") + kwargs["save_temp_tf_input"] = os.path.join(artifacts_dir, "tf_input.mlir") + kwargs["save_temp_iree_input"] = os.path.join(artifacts_dir, + "iree_input.mlir") - # Manually run the passes that tf_module_to_compiler_module usually would. - compiler_module.run_pass_pipeline(compiler.TF_IMPORT_PASS_PIPELINE) - - if artifacts_dir is not None: - iree_mlir_path = os.path.join(artifacts_dir, "iree_input.mlir") - logging.info("Saving IREE input MLIR to: %s", iree_mlir_path) - with open(iree_mlir_path, "w") as f: - f.write(compiler_module.to_asm()) - - compiled_module = compiler_module.compile( - target_backends=backend_info.compiler_targets) - - compiled_path = None - if artifacts_dir is not None: - backend_dir = os.path.join(artifacts_dir, backend_info.backend_id) - os.makedirs(backend_dir, exist_ok=True) - compiled_path = os.path.join(backend_dir, "compiled.vmfb") - logging.info("Saving compiled IREE module to: %s", compiled_path) - with open(compiled_path, "wb") as f: - f.write(compiled_module) - return compiled_module, compiled_path + # Avoid the crash reproducer under tests or if the flag is false. + if (FLAGS.capture_crash_reproducer): + kwargs["crash_reproducer_path"] = os.path.join( + artifacts_dir, f"reproducer__{backend_id}.mlir") + else: + logging.info("Crash reproducer suppressed") + logging.info( + "Outputting intermediate artifacts (--artifacts_dir is set):\n%s", + "\n".join(f" {k}: {v}" for k, v in kwargs.items())) + return kwargs def _incrementally_compile_tf_module( module: Type[tf.Module], backend_info: "BackendInfo", exported_names: Sequence[str] = (), - artifacts_dir: str = None, -) -> Tuple[compiler.binding.OpaqueBlob, Union[str, None]]: + artifacts_dir: Optional[str] = None, +) -> Tuple[bytes, Optional[str]]: """Compile a TensorFlow tf.Module and optionally save compilation artifacts. The module blob this creates is not callable. See IreeCompiledModule for an API that returns a module that can be called without any further steps. - See _incrementally_lower_compiler_module's docstring for details about which - artifacts will be saved. - Args: module: A tf.Module. backend_info: BackendInfo with the details for compiling this module. @@ -154,22 +110,23 @@ A compiled IREE module blob and the path to the compiled VM FlatBuffer if artifacts_dir is provided. """ + output_kwargs = ( + _get_tf_import_output_kwargs( + artifacts_dir, + backend_info.backend_id, + needs_temp_saved_model_dir=True, + ) if artifacts_dir else {}) + immediate_result = tf_compiler.compile_module( + module, + target_backends=backend_info.compiler_targets, + exported_names=exported_names, + **output_kwargs) - def _compile_module(module, backend_info, exported_names, artifacts_dir): - compiler_module = compiler.tf_module_to_compiler_module(module, - exported_names, - pass_pipeline=()) - return _incrementally_lower_compiler_module(compiler_module, backend_info, - artifacts_dir) - - # Avoid the crash reproducer under tests or if the flag is false. - # Developers can run tests outside of the test runner (e.g. `bazel run`) to - # use the crash reproducer. - if (FLAGS.capture_crash_reproducer and not _running_bazel_test()): - _compile_module = _setup_mlir_crash_reproducer(_compile_module, - artifacts_dir, - backend_info.backend_id) - return _compile_module(module, backend_info, exported_names, artifacts_dir) + output_file = output_kwargs.get("output_file") + if output_file: + with open(output_file, "rb") as f: + immediate_result = f.read() + return immediate_result, output_file def _incrementally_compile_tf_signature_def_saved_model( @@ -180,9 +137,6 @@ The module blob this creates is not callable. See IreeCompiledModule for an API that returns a module that can be called without any further steps. - See _incrementally_lower_compiler_module's docstring for details about which - artifacts will be saved. - Args: saved_model_dir: Directory of the saved model. saved_model_tags: Optional set of tags to use when loading the model. @@ -197,24 +151,22 @@ A compiled IREE module blob and the path to the compiled VM FlatBuffer if artifacts_dir is provided. """ + output_kwargs = ( + _get_tf_import_output_kwargs(artifacts_dir, backend_info.backend_id) + if artifacts_dir else {}) + immediate_result = tf_compiler.compile_saved_model( + saved_model_dir, + import_type="SIGNATURE_DEF", + target_backends=backend_info.compiler_targets, + exported_names=[exported_name], + saved_model_tags=saved_model_tags, + **output_kwargs) - def _compile_module(saved_model_dir, saved_model_tags, backend_info, - exported_name, artifacts_dir): - # Convert the tf_module into raw TF input MLIR. - compiler_module = compiler.tf_signature_def_saved_model_to_compiler_module( - saved_model_dir, saved_model_tags, [exported_name], pass_pipeline=()) - return _incrementally_lower_compiler_module(compiler_module, backend_info, - artifacts_dir) - - # Avoid the crash reproducer under tests or if the flag is false. - # Developers can run tests outside of the test runner (e.g. `bazel run`) to - # use the crash reproducer. - if (FLAGS.capture_crash_reproducer and not _running_bazel_test()): - _compile_module = _setup_mlir_crash_reproducer(_compile_module, - artifacts_dir, - backend_info.backend_id) - return _compile_module(saved_model_dir, saved_model_tags, backend_info, - exported_name, artifacts_dir) + output_file = output_kwargs.get("output_file") + if output_file: + with open(output_file, "rb") as f: + immediate_result = f.read() + return immediate_result, output_file class _FunctionWrapper(object):
diff --git a/integrations/tensorflow/bindings/python/pyiree/xla/compiler/BUILD b/integrations/tensorflow/bindings/python/pyiree/xla/compiler/BUILD deleted file mode 100644 index 9c9e486..0000000 --- a/integrations/tensorflow/bindings/python/pyiree/xla/compiler/BUILD +++ /dev/null
@@ -1,103 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "PYBIND_COPTS", - "PYBIND_EXTENSION_COPTS", - "PYBIND_FEATURES", - "iree_py_extension", - "iree_py_library", - "iree_py_test", - "pybind_cc_library", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -iree_py_library( - name = "compiler", - srcs = [ - "__init__.py", - ], - srcs_version = "PY3", - tags = [ - "nokokoro", - ], - deps = [ - ":binding", - "//bindings/python:pathsetup", # build_cleaner: keep - "//integrations/tensorflow/bindings/python:pathsetup", # build_cleaner: keep - ], -) - -iree_py_extension( - name = "binding", - srcs = [ - "initialize_module.cc", - ], - copts = PYBIND_COPTS + PYBIND_EXTENSION_COPTS, - features = PYBIND_FEATURES, - linkstatic = 1, - tags = [ - "nokokoro", - ], - win_def_file = "export.def", - deps = [ - ":compiler_library", - "//bindings/python/pyiree/common", - "//bindings/python/pyiree/compiler:compiler_library", - ], -) - -pybind_cc_library( - name = "compiler_library", - srcs = [ - "register_xla.cc", - ], - hdrs = [ - "register_xla.h", - ], - tags = [ - "nokokoro", - ], - deps = [ - "//bindings/python/pyiree/common", - "//bindings/python/pyiree/compiler:compiler_library", - "@llvm-project//llvm:Support", - "@llvm-project//mlir:IR", - "@org_tensorflow//tensorflow/compiler/mlir/xla:hlo_module_importer", - "@org_tensorflow//tensorflow/compiler/xla/client:xla_computation", - ], -) - -iree_py_test( - name = "xla_module_proto_test", - srcs = ["xla_module_proto_test.py"], - python_version = "PY3", - tags = [ - "manual", - "nokokoro", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "@absl_py//absl/testing:absltest", - "//integrations/tensorflow/bindings/python/pyiree/xla/compiler", - "@org_tensorflow//tensorflow/compiler/xla/python:xla_client", - ], -)
diff --git a/integrations/tensorflow/compiler/BUILD b/integrations/tensorflow/compiler/BUILD index ce92df0..b5c8552 100644 --- a/integrations/tensorflow/compiler/BUILD +++ b/integrations/tensorflow/compiler/BUILD
@@ -104,6 +104,7 @@ "@org_tensorflow//tensorflow/compiler/mlir:init_mlir", "@org_tensorflow//tensorflow/compiler/mlir/tensorflow", "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:convert_graphdef", + "@org_tensorflow//tensorflow/compiler/mlir/tensorflow:tf_dialect_passes", # Note: always_links in random foo that makes constant folding work "@org_tensorflow//tensorflow/core/platform:errors", ], )
diff --git a/integrations/tensorflow/compiler/iree-tf-import-main.cc b/integrations/tensorflow/compiler/iree-tf-import-main.cc index edeb093..62631b8 100644 --- a/integrations/tensorflow/compiler/iree-tf-import-main.cc +++ b/integrations/tensorflow/compiler/iree-tf-import-main.cc
@@ -37,7 +37,6 @@ #include "tensorflow/compiler/mlir/tensorflow/dialect_registration.h" #include "tensorflow/compiler/mlir/tensorflow/translate/import_model.h" #include "tensorflow/core/platform/errors.h" - using namespace llvm; using namespace mlir; @@ -56,13 +55,14 @@ tensorflow::SavedModelV2Bundle bundle; auto loadStatus = tensorflow::SavedModelV2Bundle::Load(inputPath, &bundle); if (!loadStatus.ok()) { - std::cerr << "TensorFlow reported error loading saved model:\n " - << loadStatus << "\n\n"; + llvm::errs() << "TensorFlow reported error loading saved model:\n " + << loadStatus.ToString() << "\n\n"; if (!tensorflow::errors::IsNotFound(loadStatus)) { - std::cerr << "Note: Attempted to load V2 SavedModel. Double check that " - "this is correct " - << "and adjust via the flag " - "--tf-import-type=savedmodel_v1|savedmodel_v2\n"; + llvm::errs() + << "Note: Attempted to load V2 SavedModel. Double check that " + "this is correct " + << "and adjust via the flag " + "--tf-import-type=savedmodel_v1|savedmodel_v2\n"; } return nullptr; } @@ -72,9 +72,9 @@ auto loadedModule = tensorflow::ConvertSavedModelToMlir( &bundle, &context, absl::MakeSpan(exportedNamesVector)); if (!loadedModule.ok()) { - std::cerr << "Error performing initial import from SavedModel to MLIR. " - << "Reported error below (and see diagnostics):\n" - << " " << loadedModule.status() << "\n"; + llvm::errs() << "Error performing initial import from SavedModel to MLIR. " + << "Reported error below (and see diagnostics):\n" + << " " << loadedModule.status().ToString() << "\n"; return nullptr; } @@ -96,13 +96,14 @@ tensorflow::LoadSavedModel(session_options, /*run_options=*/{}, inputPath, tags, &bundle); if (!loadStatus.ok()) { - std::cerr << "TensorFlow reported error loading saved model:\n " - << loadStatus << "\n\n"; + llvm::errs() << "TensorFlow reported error loading saved model:\n " + << loadStatus.ToString() << "\n\n"; if (!tensorflow::errors::IsNotFound(loadStatus)) { - std::cerr << "Note: Attempted to load V1 SavedModel. Double check that " - "this is correct " - << "and adjust via the flag " - "--tf-import-type=savedmodel_v1|savedmodel_v2\n"; + llvm::errs() + << "Note: Attempted to load V1 SavedModel. Double check that " + "this is correct " + << "and adjust via the flag " + "--tf-import-type=savedmodel_v1|savedmodel_v2\n"; } return nullptr; } @@ -115,9 +116,9 @@ /*upgrade_legacy=*/false); if (!loadedModule.ok()) { - std::cerr << "Error performing initial import from SavedModel to MLIR. " - << "Reported error below (and see diagnostics):\n" - << " " << loadedModule.status() << "\n"; + llvm::errs() << "Error performing initial import from SavedModel to MLIR. " + << "Reported error below (and see diagnostics):\n" + << " " << loadedModule.status().ToString() << "\n"; return nullptr; } @@ -150,6 +151,15 @@ llvm::cl::desc("Tags used to indicate which MetaGraphDef to import, " "separated by ','"), llvm::cl::init("serve")); + static llvm::cl::opt<std::string> saveTempTfInput( + "save-temp-tf-input", + llvm::cl::desc("Save the TF pipeline input to this file"), + llvm::cl::init("")); + static llvm::cl::opt<std::string> saveTempIreeImport( + "save-temp-iree-input", + llvm::cl::desc("Save the resultant IR to this file (useful for saving an " + "intermediate in a pipeline)"), + llvm::cl::init("")); // Register any command line options. registerAsmPrinterCLOptions(); @@ -164,6 +174,20 @@ OwningModuleRef module; registry.loadAll(&context); + auto saveToFile = [&](llvm::StringRef savePath) -> LogicalResult { + auto outputFile = openOutputFile(savePath); + if (!outputFile) { + llvm::errs() << "Could not open output file: " << savePath << "\n"; + return failure(); + } + OpPrintingFlags printFlags; + printFlags.enableDebugInfo(); + module->print(outputFile->os(), printFlags); + outputFile->os() << "\n"; + outputFile->keep(); + return success(); + }; + // First stage import. switch (importType) { case savedmodel_v2: @@ -178,25 +202,28 @@ } if (!module) return 1; + // Save temp output. + if (!saveTempTfInput.empty()) { + if (failed(saveToFile(saveTempTfInput))) return 10; + } + // Run passes. PassManager pm(&context, PassManager::Nesting::Implicit); + applyPassManagerCLOptions(pm); + iree_compiler::TF::buildTFImportPassPipeline(pm); if (failed(pm.run(*module))) { - std::cerr + llvm::errs() << "Running iree-tf-import pass pipeline failed (see diagnostics)\n"; return 2; } - // Output. - auto outputFile = openOutputFile(outputFilename); - if (!outputFile) { - return 3; + // Save temp output. + if (!saveTempIreeImport.empty()) { + if (failed(saveToFile(saveTempIreeImport))) return 10; } - OpPrintingFlags printFlags; - printFlags.enableDebugInfo(); - module->print(outputFile->os(), printFlags); - outputFile->os() << "\n"; - outputFile->keep(); + // Save output. + if (failed(saveToFile(outputFilename))) return 3; return 0; }
diff --git a/integrations/tensorflow/e2e/BUILD b/integrations/tensorflow/e2e/BUILD index 28f69d1..2f61a33 100644 --- a/integrations/tensorflow/e2e/BUILD +++ b/integrations/tensorflow/e2e/BUILD
@@ -43,7 +43,7 @@ main = src, python_version = "PY3", deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", + "//third_party/py/pyiree:pylib_tf_support", ], ) for src in glob(["*_test.py"]) @@ -87,6 +87,7 @@ "mandelbrot_test.py", # TODO(silvasean): Get this working on IREE. "ring_buffer_test.py", # TODO(b/148747011) "strings_test.py", + "tensorlist_test.py", # TODO(suderman): Re-enable once dependencies resolved ] # keep sorted @@ -109,6 +110,7 @@ "ring_buffer_test.py", # TODO(b/148747011) "scatter_update_test.py", "strings_test.py", + "tensorlist_test.py", # TODO(suderman): Re-enable once dependencies resolved ] # keep sorted @@ -131,6 +133,7 @@ "ring_buffer_test.py", # TODO(b/148747011) "scatter_update_test.py", "strings_test.py", + "tensorlist_test.py", # TODO(suderman): Re-enable once dependencies resolved ] TF_PASSING = glob( @@ -169,7 +172,7 @@ }, reference_backend = "tf", deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", + "//third_party/py/pyiree:pylib_tf_support", ], ) @@ -189,7 +192,7 @@ "notap", ], deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", + "//third_party/py/pyiree:pylib_tf_support", ], ) @@ -213,6 +216,6 @@ "notap", ], deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", + "//third_party/py/pyiree:pylib_tf_support", ], )
diff --git a/integrations/tensorflow/e2e/keras/BUILD b/integrations/tensorflow/e2e/keras/BUILD deleted file mode 100644 index 9a8b540..0000000 --- a/integrations/tensorflow/e2e/keras/BUILD +++ /dev/null
@@ -1,216 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Test coverage across backends for e2e tests is defined directly in the BUILD -# files. Coverage tables generated from this file can be viewed here: -# https://google.github.io/iree/tensorflow-coverage -# Updates made to test suite names should also be reflected here: -# https://github.com/google/iree/blob/main/scripts/update_e2e_coverage.py - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "iree_py_binary", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl", - "iree_e2e_cartesian_product_test_suite", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -[ - iree_py_binary( - name = src.replace(".py", "_manual"), - srcs = [src], - main = src, - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for src in glob( - ["*_test.py"], - exclude = ["keyword_spotting_streaming_test.py"], - ) -] - -# Keyword Spotting Tests: -KEYWORD_SPOTTING_MODELS = [ - "svdf", - "svdf_resnet", - "ds_cnn", - "gru", - "lstm", - "cnn_stride", - "cnn", - "tc_resnet", - "crnn", - "dnn", - "att_rnn", - "att_mh_rnn", - "mobilenet", - "mobilenet_v2", - "xception", - "inception", - "inception_resnet", - "ds_tc_resnet", -] - -NON_STREAMING_KEYWORD_SPOTTING_MODELS = [ - "att_mh_rnn", - "att_rnn", - "ds_cnn", - "inception", - "inception_resnet", - "mobilenet", - "mobilenet_v2", - "svdf_resnet", - "tc_resnet", - "xception", -] - -iree_e2e_cartesian_product_test_suite( - name = "keyword_spotting_tests", - srcs = ["keyword_spotting_streaming_test.py"], - failing_configurations = [ - { - # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure. - "model": [ - "att_mh_rnn", - "att_rnn", - "crnn", - "gru", - "lstm", - ], - "target_backends": "iree_vmla", - }, - { - # Timing out on SwiftShader - "model": [ - "att_mh_rnn", - "att_rnn", - ], - "target_backends": "iree_vulkan", - }, - ], - flags_to_values = { - "reference_backend": "tf", - "mode": "non_streaming", - "model": KEYWORD_SPOTTING_MODELS, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "keyword_spotting_streaming_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - "@kws_streaming//:models_lib", - "@kws_streaming//:train_lib", - ], -) - -iree_e2e_cartesian_product_test_suite( - name = "keyword_spotting_internal_streaming_tests", - srcs = ["keyword_spotting_streaming_test.py"], - failing_configurations = [ - { - # TFLite cannot compile variables. - "target_backends": "tflite", - }, - { - # These models do not currently support streaming. - "model": NON_STREAMING_KEYWORD_SPOTTING_MODELS, - }, - ], - flags_to_values = { - "reference_backend": "tf", - "mode": "internal_streaming", - "model": KEYWORD_SPOTTING_MODELS, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "keyword_spotting_streaming_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - "@kws_streaming//:models_lib", - "@kws_streaming//:train_lib", - ], -) - -iree_e2e_cartesian_product_test_suite( - name = "keyword_spotting_external_streaming_tests", - srcs = ["keyword_spotting_streaming_test.py"], - failing_configurations = [ - { - # A bug in keras causes the external steraming conversion to fail - # when TensorFlow 2.x is used. - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - { - # These models do not currently support streaming. - "model": NON_STREAMING_KEYWORD_SPOTTING_MODELS, - }, - ], - flags_to_values = { - "reference_backend": "tf", - "mode": "external_streaming", - "model": KEYWORD_SPOTTING_MODELS, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "keyword_spotting_streaming_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - "@kws_streaming//:models_lib", - "@kws_streaming//:train_lib", - ], -) - -iree_py_binary( - name = "keyword_spotting_streaming_test_manual", - srcs = ["keyword_spotting_streaming_test.py"], - main = "keyword_spotting_streaming_test.py", - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - "@kws_streaming//:models_lib", - "@kws_streaming//:train_lib", - ], -)
diff --git a/integrations/tensorflow/e2e/keras/applications/BUILD b/integrations/tensorflow/e2e/keras/applications/BUILD deleted file mode 100644 index a9df330..0000000 --- a/integrations/tensorflow/e2e/keras/applications/BUILD +++ /dev/null
@@ -1,318 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Test coverage across backends for e2e tests is defined directly in the BUILD -# files. Coverage tables generated from this file can be viewed here: -# https://google.github.io/iree/tensorflow-coverage/vision-coverage -# Updates made to test suite names should also be reflected here: -# https://github.com/google/iree/blob/main/scripts/update_e2e_coverage.py - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "iree_py_binary", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl", - "iree_e2e_cartesian_product_test_suite", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -# @unused -DOC = """ -applications_test_manual is for manual testing of all keras vision models. -Test will run only manually with all parameters specified manually, for example: -bazel run -c opt integrations/tensorflow/e2e/keras/applications:applications_test_manual -- \ ---target_backends=tf,iree_vmla \ ---data=imagenet \ ---url=https://storage.googleapis.com/iree_models/ \ ---model=ResNet50 - -Command arguments description: ---target_backends: can be combination of these: tf,iree_vmla ---data: can be 'imagenet' or 'cifar10'. - imagenet - input image size (1, 224, 224, 3) - cifar10 - input image size (1, 32, 32, 3) - it is used for quick tests - and needs pretrained weights, we pretrained models: ResNet50, MobileNet, MobileNetV2 ---include_top: Whether or not to include the final (top) layers of the model. ---url: we need it only for cifar10 models to load weights from https://storage.googleapis.com/iree_models/ - imagenet pretrained weights url is specified by keras ---model: supports ResNet50, MobileNet, MobileNetV2, ResNet101, ResNet152, - ResNet50V2, ResNet101V2, ResNet152V2, VGG16, VGG19, Xception, - InceptionV3, InceptionResNetV2, DenseNet121, DenseNet169, - DenseNet201, NASNetMobile, NASNetLarge - All above models works with 'imagenet' data sets. - ResNet50, MobileNet, MobileNetV2 work with both 'imagenet' and 'cifar10' data sets. -""" - -[ - iree_py_binary( - name = src.replace(".py", "_manual"), - srcs = [src], - main = src, - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for src in glob( - ["*_test.py"], - ) -] - -KERAS_APPLICATIONS_MODELS = [ - "DenseNet121", - "DenseNet169", - "DenseNet201", - "EfficientNetB0", - "EfficientNetB1", - "EfficientNetB2", - "EfficientNetB3", - "EfficientNetB4", - "EfficientNetB5", - "EfficientNetB6", - "EfficientNetB7", - "InceptionResNetV2", - "InceptionV3", - "MobileNet", - "MobileNetV2", - "MobileNetV3Large", - "MobileNetV3Small", - "NASNetLarge", - "NASNetMobile", - "ResNet101", - "ResNet101V2", - "ResNet152", - "ResNet152V2", - "ResNet50", - "ResNet50V2", - "VGG16", - "VGG19", -] - -iree_e2e_cartesian_product_test_suite( - name = "large_cifar10_tests", - size = "large", - srcs = ["applications_test.py"], - flags_to_values = { - "reference_backend": "tf", - "data": "cifar10", - "model": [ - # All models with runtime shorter than ResNet50. - "MobileNet", # Max: Vulkan 61.0s - "MobileNetV2", # Max: LLVM 96.3s - "ResNet50", # Max: LLVM 145.6s - "VGG16", # Max: LLVM 89.5s - "VGG19", # Max: LLVM 94.7s - ], - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "applications_test.py", - tags = ["manual"], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -iree_e2e_cartesian_product_test_suite( - name = "enormous_cifar10_tests", - size = "enormous", - srcs = ["applications_test.py"], - failing_configurations = [ - { - # Failing on vmla with negative inputs. - "model": [ - "NASNetLarge", - "NASNetMobile", - ], - "target_backends": "iree_vmla", - }, - { - # Failing on llvm and vulkan: - "model": [ - "NASNetLarge", - "NASNetMobile", - "ResNet50V2", - "ResNet101V2", - "ResNet152V2", - ], - "target_backends": [ - "iree_llvmjit", - "iree_vulkan", - ], - }, - ], - flags_to_values = { - "reference_backend": "tf", - "data": "cifar10", - "model": [ - "DenseNet121", - "DenseNet169", - "DenseNet201", - "NASNetLarge", - "NASNetMobile", - "ResNet50V2", - "ResNet101", - "ResNet101V2", - "ResNet152", - "ResNet152V2", - ], - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "applications_test.py", - tags = [ - "guitar", - "manual", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# 'non_hermetic' tests use real model weights to test numerical correctness. -iree_e2e_cartesian_product_test_suite( - name = "cifar10_non_hermetic_tests", - size = "large", - srcs = ["applications_test.py"], - flags_to_values = { - "reference_backend": "tf", - "data": "cifar10", - "url": "https://storage.googleapis.com/iree_models/", - "use_external_weights": True, - "model": [ - "MobileNet", - "MobileNetV2", - "ResNet50", - ], - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "applications_test.py", - tags = [ - "external", - "guitar", - "manual", - "no-remote", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# 'non_hermetic' tests use real model weights to test numerical correctness. -iree_e2e_cartesian_product_test_suite( - name = "imagenet_non_hermetic_tests", - size = "enormous", - srcs = ["applications_test.py"], - failing_configurations = [ - { - # Failing on vmla with negative inputs. - "model": [ - "NASNetLarge", - "NASNetMobile", - ], - "target_backends": "iree_vmla", - }, - { - # Failing vulkan: - "model": [ - "InceptionResNetV2", - "InceptionV3", - ], - "target_backends": [ - "iree_vulkan", - ], - }, - { - # Failing llvm and vulkan: - "model": [ - "NASNetLarge", - "NASNetMobile", - "ResNet50V2", - "ResNet101V2", - "ResNet152V2", - "Xception", - ], - "target_backends": [ - "iree_llvmjit", - "iree_vulkan", - ], - }, - ], - flags_to_values = { - "reference_backend": "tf", - "data": "imagenet", - "use_external_weights": True, - "model": KERAS_APPLICATIONS_MODELS, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "applications_test.py", - tags = [ - "external", - "guitar", - "manual", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# It is used to produce weights for keras vision models with input image size -# 32x32. These models are not optimized for accuracy or latency (they are for -# debugging only). They have the same neural net topology with keras vision -# models trained on imagenet data sets -iree_py_binary( - name = "train_vision_models_on_cifar", - srcs = ["train_vision_models_on_cifar.py"], - python_version = "PY3", - srcs_version = "PY2AND3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -)
diff --git a/integrations/tensorflow/e2e/keras/layers/BUILD b/integrations/tensorflow/e2e/keras/layers/BUILD deleted file mode 100644 index b3e74e5..0000000 --- a/integrations/tensorflow/e2e/keras/layers/BUILD +++ /dev/null
@@ -1,549 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Test coverage across backends for e2e tests is defined directly in the BUILD -# files. Coverage tables generated from this file can be viewed here: -# https://google.github.io/iree/tensorflow-coverage/tf-keras-coverage -# Updates made to test suite names should also be reflected here: -# https://github.com/google/iree/blob/main/scripts/update_e2e_coverage.py - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "iree_py_binary", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl", - "iree_e2e_cartesian_product_test_suite", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -[ - iree_py_binary( - name = src.replace(".py", "_manual"), - srcs = [src], - main = src, - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for src in glob( - ["*_test.py"], - exclude = ["keyword_spotting_streaming_test.py"], - ) -] - -# These layers were selected by: -# 1. Getting all subclasses of `tf.keras.layers.Layer` -# 2. Removing deperacated layers based on the tf.keras docs -# 3. Removing irrelevant layers -# 4. Removing layers that don't fit in the testing framework (Wrappers, DenseFeatures, ...) -LAYERS = [ - "Activation", - "ActivityRegularization", - "Add", - "AdditiveAttention", - "AlphaDropout", - "Attention", - "Average", - "AveragePooling1D", - "AveragePooling2D", - "AveragePooling3D", - "BatchNormalization", - "Concatenate", - "Conv1D", - "Conv1DTranspose", - "Conv2D", - "Conv2DTranspose", - "Conv3D", - "Conv3DTranspose", - # "ConvLSTM2D", # TODO(meadowlark): Debug flakiness. - "Cropping1D", - "Cropping2D", - "Cropping3D", - "Dense", - "DepthwiseConv2D", - "Dot", - "Dropout", - "ELU", - "Embedding", - "Flatten", - "GRU", - "GaussianDropout", - "GaussianNoise", - "GlobalAveragePooling1D", - "GlobalAveragePooling2D", - "GlobalAveragePooling3D", - "GlobalMaxPool1D", - "GlobalMaxPool2D", - "GlobalMaxPool3D", - "InputLayer", - "LSTM", - "Lambda", - "LayerNormalization", - "LeakyReLU", - "LocallyConnected1D", - "LocallyConnected2D", - "Masking", - "MaxPool1D", - "MaxPool2D", - "MaxPool3D", - "Maximum", - "Minimum", - "MultiHeadAttention", - "Multiply", - "PReLU", - "Permute", - "ReLU", - "RepeatVector", - "Reshape", - "SeparableConv1D", - "SeparableConv2D", - # "SimpleRNN", # TODO(meadowlark): Debug flakiness. - "Softmax", - "SpatialDropout1D", - "SpatialDropout2D", - "SpatialDropout3D", - "Subtract", - "ThresholdedReLU", - "UpSampling1D", - "UpSampling2D", - "UpSampling3D", - "ZeroPadding1D", - "ZeroPadding2D", - "ZeroPadding3D", -] - -FAILING_STATIC = [ - { - # Failing on TFLite - "layer": [ - "AveragePooling3D", - "Conv3DTranspose", - "Conv3D", - "ConvLSTM2D", - "LayerNormalization", - "Softmax", - "MaxPool3D", - "ZeroPadding3D", - ], - "target_backends": "tflite", - }, - { - # Failing on IREE - "layer": [ - "ConvLSTM2D", - "GRU", - "LSTM", # Failing unless 'return_sequences = True' - "LayerNormalization", - "LeakyReLU", - "LocallyConnected2D", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure. - "MultiHeadAttention", - "UpSampling2D", - ], - "target_backends": [ - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - { - # Failing on VMLA - "layer": [ - "Conv3DTranspose", - "Conv3D", - ], - "target_backends": "iree_vmla", - }, - { - # Failing on LLVM and Vulkan - "layer": [ - "Lambda", - "Masking", - "MaxPool1D", - "MaxPool2D", - "MaxPool3D", - ], - "target_backends": [ - "iree_llvmjit", - "iree_vulkan", - ], - }, - { - # Failing on Vulkan - "layer": [ - "Attention", - "AdditiveAttention", - "AveragePooling1D", - "AveragePooling2D", - "AveragePooling3D", - "ThresholdedReLU", - ], - "target_backends": "iree_vulkan", - }, -] - -iree_e2e_cartesian_product_test_suite( - name = "layers_tests", - srcs = ["layers_test.py"], - failing_configurations = FAILING_STATIC, - flags_to_values = { - "reference_backend": "tf", - "layer": LAYERS, - "dynamic_dims": False, - "training": False, - "test_default_kwargs_only": True, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "layers_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# A list of all layers with non-default api tests can be generated by running: -# bazel run integrations/tensorflow/e2e/keras/layers:layers_test_manual -- \ -# --list_layers_with_full_api_tests -LAYERS_WITH_FULL_API_TESTS = [ - "ActivityRegularization", - "AdditiveAttention", - "Attention", - "AveragePooling1D", - "AveragePooling2D", - "AveragePooling3D", - "BatchNormalization", - "Concatenate", - "Conv1D", - "Conv1DTranspose", - "Conv2D", - "Conv2DTranspose", - "Conv3D", - "Conv3DTranspose", - # "ConvLSTM2D", # TODO(meadowlark): Debug flakiness. - "Cropping1D", - "Cropping2D", - "Cropping3D", - "DepthwiseConv2D", - "GRU", - "LSTM", - "LocallyConnected1D", - "LocallyConnected2D", - "MaxPool1D", - "MaxPool2D", - "MaxPool3D", - "SeparableConv1D", - "SeparableConv2D", - "SimpleRNN", - # "SimpleRNN", # TODO(meadowlark): Debug flakiness. -] - -FAILING_FULL_API = [ - { - # Failing on TFLite - "layer": [ - "AveragePooling3D", - "Conv2DTranspose", - "Conv3D", - "Conv3DTranspose", - "ConvLSTM2D", - "DepthwiseConv2D", - "GRU", - "LocallyConnected1D", - "LocallyConnected2D", - "LSTM", - "MaxPool1D", - "MaxPool3D", - "SeparableConv1D", # Failing on Kokoro. - "SeparableConv2D", - "SimpleRNN", - ], - "target_backends": "tflite", - }, - { - # Failing on IREE - "layer": [ - "Conv2DTranspose", - "Conv3DTranspose", - "ConvLSTM2D", - "GRU", - "LocallyConnected1D", - "LocallyConnected2D", - "LSTM", - "SimpleRNN", - ], - "target_backends": [ - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - { - "layer": "Conv3D", - "target_backends": "iree_vmla", - }, - { - # Failing on LLVM and Vulakn - "layer": [ - "AdditiveAttention", - "Attention", - "AveragePooling1D", - "AveragePooling2D", - "AveragePooling3D", - "Conv1DTranspose", - "MaxPool1D", - "MaxPool2D", - "MaxPool3D", - ], - "target_backends": [ - "iree_llvmjit", - "iree_vulkan", - ], - }, -] - -iree_e2e_cartesian_product_test_suite( - name = "layers_full_api_tests", - srcs = ["layers_test.py"], - failing_configurations = FAILING_FULL_API, - flags_to_values = { - "reference_backend": "tf", - "layer": LAYERS_WITH_FULL_API_TESTS, - "dynamic_dims": False, - "training": False, - "test_default_kwargs_only": False, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "layers_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -FAILING_DYNAMIC = [ - { - # TFLite does not support dynamic shapes. - "target_backends": "tflite", - }, - { - # Failing on IREE - "layer": [ - "AdditiveAttention", - "AveragePooling1D", - "AveragePooling2D", - "AveragePooling3D", - "BatchNormalization", - "Concatenate", - "Conv1D", - "Conv1DTranspose", - "Conv2D", - "Conv2DTranspose", - "Conv3D", - "Conv3DTranspose", - "ConvLSTM2D", - "Cropping1D", - "Cropping2D", - "Cropping3D", - "Dense", - "DepthwiseConv2D", - "Dot", - "ELU", - "Flatten", - "GRU", - "LayerNormalization", - "LeakyReLU", - "LocallyConnected1D", - "LocallyConnected2D", - "LSTM", # TODO(silvasean): Get this test working on IREE. - "Masking", - "MaxPool1D", - "MaxPool2D", - "MaxPool3D", - "MultiHeadAttention", - "RepeatVector", - "Reshape", - "SeparableConv1D", - "SeparableConv2D", - "SimpleRNN", - "ThresholdedReLU", - "UpSampling1D", - "UpSampling2D", - "UpSampling3D", - "ZeroPadding1D", - "ZeroPadding2D", - "ZeroPadding3D", - ], - "target_backends": [ - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - { - # Failing on LLVM and Vulkan - "layer": [ - "Activation", - "Add", - "Attention", - "Average", - "GlobalAveragePooling1D", - "GlobalAveragePooling2D", - "GlobalAveragePooling3D", - "Lambda", - "Maximum", - "Minimum", - "Multiply", - "PReLU", - "ReLU", - "Softmax", - "Subtract", - ], - "target_backends": [ - "iree_llvmjit", - "iree_vulkan", - ], - }, - { - # Failing on Vulkan - "layer": "Embedding", - "target_backends": "iree_vulkan", - }, -] - -iree_e2e_cartesian_product_test_suite( - name = "layers_dynamic_dims_tests", - srcs = ["layers_test.py"], - failing_configurations = FAILING_DYNAMIC, - flags_to_values = { - "reference_backend": "tf", - "layer": LAYERS, - "dynamic_dims": True, - "training": False, - "test_default_kwargs_only": True, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "layers_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# Layers that mention a training kwarg in their doc. -LAYERS_WITH_TRAINING_BEHAVIOR = [ - "AdditiveAttention", - "AlphaDropout", - "Attention", - "BatchNormalization", - # "ConvLSTM2D", # TODO(meadowlark): Debug flakiness. - "Dropout", - "GRU", - "GaussianDropout", - "GaussianNoise", - "LSTM", - "MultiHeadAttention", - # "SimpleRNN", # TODO(meadowlark): Debug flakiness. - "SpatialDropout1D", - "SpatialDropout2D", - "SpatialDropout3D", -] - -FAILING_TRAINING = [ - { - # Failing on TFLite: - "layer": [ - "AlphaDropout", - "BatchNormalization", - "ConvLSTM2D", - "GaussianDropout", - "GaussianNoise", - "GRU", - "LSTM", - "SimpleRNN", - ], - "target_backends": "tflite", - }, - { - # Failing on IREE - "layer": [ - "AdditiveAttention", - "AlphaDropout", - "Attention", - "BatchNormalization", - "ConvLSTM2D", - "Dropout", - "GaussianDropout", - "GaussianNoise", - "GRU", - "LSTM", - "MultiHeadAttention", - "SimpleRNN", - "SpatialDropout1D", - "SpatialDropout2D", - "SpatialDropout3D", - ], - "target_backends": [ - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, -] - -iree_e2e_cartesian_product_test_suite( - name = "layers_training_tests", - srcs = ["layers_test.py"], - failing_configurations = FAILING_TRAINING, - flags_to_values = { - "reference_backend": "tf", - "layer": LAYERS_WITH_TRAINING_BEHAVIOR, - "dynamic_dims": False, - "training": True, - "test_default_kwargs_only": True, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "layers_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -)
diff --git a/integrations/tensorflow/e2e/keras/train/BUILD b/integrations/tensorflow/e2e/keras/train/BUILD deleted file mode 100644 index 7dc0bd6..0000000 --- a/integrations/tensorflow/e2e/keras/train/BUILD +++ /dev/null
@@ -1,128 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "iree_py_binary", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl", - "iree_e2e_cartesian_product_test_suite", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -[ - iree_py_binary( - name = src.replace(".py", "_manual"), - srcs = [src], - main = src, - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for src in glob(["*_test.py"]) -] - -iree_e2e_cartesian_product_test_suite( - name = "classification_training_tests", - srcs = ["classification_training_test.py"], - failing_configurations = [ - { - # TFLite doesn't support training. - "target_backends": "tflite", - }, - { - "target_backends": [ - "tflite", - "iree_vmla", # TODO(b/157581521) - "iree_llvmjit", - "iree_vulkan", - ], - }, - ], - flags_to_values = { - "reference_backend": "tf", - "optimizer": [ - "adadelta", - "adagrad", - "adam", - "adamax", - "ftrl", - "nadam", - "rmsprop", - "sgd", - ], - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "classification_training_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -iree_e2e_cartesian_product_test_suite( - name = "regression_training_tests", - srcs = ["regression_training_test.py"], - failing_configurations = [ - { - # TFLite doesn't support training. - "target_backends": "tflite", - }, - { - "target_backends": [ - "iree_vmla", # TODO(b/157581521) - "iree_llvmjit", - "iree_vulkan", - ], - }, - ], - flags_to_values = { - "reference_backend": "tf", - "optimizer": [ - "adadelta", - "adagrad", - "adam", - "adamax", - "ftrl", - "nadam", - "rmsprop", - "sgd", - ], - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "regression_training_test.py", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -)
diff --git a/integrations/tensorflow/e2e/math/BUILD b/integrations/tensorflow/e2e/math/BUILD deleted file mode 100644 index 4440b70..0000000 --- a/integrations/tensorflow/e2e/math/BUILD +++ /dev/null
@@ -1,995 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Test coverage across backends for e2e tests is defined directly in the BUILD -# files. Coverage tables generated from this file can be viewed here: -# https://google.github.io/iree/tensorflow-coverage/tf-base-coverage -# Updates made to test suite names should also be reflected here: -# https://github.com/google/iree/blob/main/scripts/update_e2e_coverage.py - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "NUMPY_DEPS", - "iree_py_binary", - "iree_py_test", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_test_suite.bzl", - "set_difference", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl", - "iree_e2e_cartesian_product_test_suite", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -[ - iree_py_binary( - name = src.replace(".py", "_manual"), - srcs = [src], - main = src, - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for src in glob( - ["*_test.py"], - exclude = ["keyword_spotting_streaming_test.py"], - ) -] - -# These functions were selected using all of the funcions in the tf.math docs: -# https://www.tensorflow.org/api_docs/python/tf/math -TF_MATH_FUNCTIONS = [ - "abs", - "accumulate_n", - "acos", - "acosh", - "add", - "add_n", - "angle", - "argmax", - "argmin", - "asin", - "asinh", - "atan", - "atan2", - "atanh", - "bessel_i0", - "bessel_i0e", - "bessel_i1", - "bessel_i1e", - "betainc", - "bincount", - "ceil", - "confusion_matrix", - "cos", - "cosh", - "count_nonzero", - "cumprod", - "cumsum", - "cumulative_logsumexp", - "digamma", - "divide", - "divide_no_nan", - "equal", - "erf", - "erfc", - "erfinv", - "exp", - "expm1", - "floor", - "floordiv", - "floormod", - "greater", - "greater_equal", - "igamma", - "igammac", - "imag", - "in_top_k", - "invert_permutation", - "is_finite", - "is_inf", - "is_nan", - "is_non_decreasing", - "is_strictly_increasing", - "lbeta", - "less", - "less_equal", - "lgamma", - "log", - "log1p", - "log_sigmoid", - "log_softmax", - "logical_and", - "logical_not", - "logical_or", - "logical_xor", - "maximum", - "minimum", - "mod", - "multiply", - "multiply_no_nan", - "ndtri", - "negative", - "nextafter", - "not_equal", - "polygamma", - "polyval", - "pow", - "real", - "reciprocal", - "reciprocal_no_nan", - "reduce_all", - "reduce_any", - "reduce_euclidean_norm", - "reduce_logsumexp", - "reduce_max", - "reduce_mean", - "reduce_min", - "reduce_prod", - "reduce_std", - "reduce_sum", - "reduce_variance", - "rint", - "round", - "rsqrt", - "scalar_mul", - "segment_max", - "segment_mean", - "segment_min", - "segment_prod", - "segment_sum", - "sigmoid", - "sign", - "sin", - "sinh", - "sobol_sample", - "softmax", - "softplus", - "softsign", - "sqrt", - "square", - "squared_difference", - "subtract", - "tan", - "tanh", - # "top_k", # TODO(meadowlark): Enable once list outputs are supported. - "truediv", - "unsorted_segment_max", - "unsorted_segment_mean", - "unsorted_segment_min", - "unsorted_segment_prod", - "unsorted_segment_sqrt_n", - "unsorted_segment_sum", - "xdivy", - "xlog1py", - "xlogy", - "zero_fraction", - "zeta", -] - -# keep sorted -TFLITE_FAILING = [ - "abs", # Failing for integer inputs. - "acos", - "acosh", - "asin", - "asinh", - "atan", - "atan2", - "atanh", - "bessel_i0", - "bessel_i0e", - "bessel_i1", - "bessel_i1e", - "betainc", - "bincount", - "confusion_matrix", - "conj", - "cosh", - "cumprod", - "cumulative_logsumexp", - "digamma", - "divide", # Failing for integer inputs. - "erf", - "erfc", - "erfinv", - "expm1", - "igamma", - "igammac", - "in_top_k", - "invert_permutation", - "is_finite", - "is_non_decreasing", - "is_strictly_increasing", - "l2_normalize", - "lbeta", - "lgamma", - "log1p", - "log_sigmoid", - "ndtri", - "nextafter", - "polygamma", - "polyval", - "pow", # Failing for integer inputs. - "reduce_all", - "reduce_euclidean_norm", - "reduce_logsumexp", - "reduce_mean", - "reduce_std", - "reduce_variance", - "rint", - "segment_max", - "segment_mean", - "segment_min", - "segment_prod", - "sign", - "sinh", - "sobol_sample", - "softmax", - "softplus", - "softsign", - "tan", - "unsorted_segment_max", - "unsorted_segment_mean", - "unsorted_segment_min", - "unsorted_segment_prod", - "unsorted_segment_sqrt_n", - "unsorted_segment_sum", - "xdivy", - "xlog1py", - "xlogy", - "zeta", -] - -# Note: The VMLA_FAILING_DYNAMIC specification extends this list. Newly-passing -# functions removed from this list may need to be added to VMLA_FAILING_DYNAMIC. -# keep sorted -VMLA_FAILING = [ - "acosh", - "argmax", - "argmin", - "asin", - "asinh", - "atan2", - "atanh", - "bessel_i0", - "bessel_i0e", - "bessel_i1", - "bessel_i1e", - "betainc", - "bincount", - "confusion_matrix", - "cosh", - "count_nonzero", - "cumprod", - "cumulative_logsumexp", - "digamma", - "divide", # Failing for integer inputs because iree doesn't output 'f64'. - "erf", - "erfc", - "erfinv", - "expm1", - "igamma", - "igammac", - "in_top_k", - "invert_permutation", - "is_nan", # TODO(#4061): tf.math.is_nan miscompiles with static shapes. - "is_non_decreasing", - "is_strictly_increasing", - "ndtri", - "nextafter", - "polygamma", - "pow", # Failing for integer inputs. - "reduce_euclidean_norm", - "reduce_prod", - "rint", - "segment_max", - "segment_mean", - "segment_min", - "segment_prod", - "segment_sum", - "sign", - "sobol_sample", - "softsign", - "unsorted_segment_max", - "unsorted_segment_mean", - "unsorted_segment_min", - "unsorted_segment_prod", - "unsorted_segment_sqrt_n", - "unsorted_segment_sum", - "xdivy", - "xlog1py", - "xlogy", - "zeta", -] - -# Note: The LLVM_FAILING_DYNAMIC specification extends this list. Newly-passing -# functions removed from this list may need to be added to LLVM_FAILING_DYNAMIC. -# keep sorted -LLVM_FAILING = [ - "acos", - "acosh", - "argmax", - "argmin", - "asin", - "asinh", - "atan", - "atan2", - "atanh", - "bessel_i0", - "bessel_i0e", - "bessel_i1", - "bessel_i1e", - "betainc", - "bincount", - "confusion_matrix", - "cosh", - "count_nonzero", - "cumprod", - "cumulative_logsumexp", - "digamma", - "divide", # Failing for integer inputs because iree doesn't output 'f64'. - "erf", - "erfc", - "erfinv", - "expm1", - "igamma", - "igammac", - "in_top_k", - "invert_permutation", - "is_nan", - "is_non_decreasing", - "is_strictly_increasing", - "l2_normalize", - "logical_or", - "logical_xor", - "ndtri", - "nextafter", - "polygamma", - "pow", - "reduce_all", - "reduce_any", - "reduce_euclidean_norm", - "reduce_logsumexp", - "reduce_max", - "reduce_mean", - "reduce_min", - "reduce_prod", - "reduce_std", - "reduce_sum", - "reduce_variance", - "rint", - "segment_max", - "segment_mean", - "segment_min", - "segment_prod", - "segment_sum", - "sign", - "sobol_sample", - "softsign", - "unsorted_segment_max", - "unsorted_segment_mean", - "unsorted_segment_min", - "unsorted_segment_prod", - "unsorted_segment_sqrt_n", - "unsorted_segment_sum", - "xdivy", - "xlog1py", - "xlogy", - "zeta", -] - -# Note: The VULKAN_FAILING_DYNAMIC specification extends this list. -# Newly-passing functions removed from this list may need to be added to -# VULKAN_FAILING_DYNAMIC. -# keep sorted -VULKAN_FAILING = [ - "acos", - "acosh", - "argmax", - "argmin", - "asin", - "asinh", - "atan", - "atan2", - "atanh", - "bessel_i0", - "bessel_i0e", - "bessel_i1", - "bessel_i1e", - "betainc", - "bincount", - "confusion_matrix", - "cosh", - "count_nonzero", - "cumprod", - "cumsum", - "cumulative_logsumexp", - "digamma", - "divide", # Failing for integer inputs because iree doesn't output 'f64'. - "erf", - "erfc", - "erfinv", - "expm1", - "igamma", - "igammac", - "in_top_k", - "invert_permutation", - "is_nan", - "is_non_decreasing", - "is_strictly_increasing", - "l2_normalize", - "logical_and", - "logical_not", - "logical_or", - "logical_xor", - "mod", # Passes with swiftshader, but fails on Turing GPU - "ndtri", - "nextafter", - "polygamma", - "pow", - "reduce_all", - "reduce_any", - "reduce_euclidean_norm", - "reduce_logsumexp", - "reduce_max", - "reduce_mean", - "reduce_min", - "reduce_prod", - "reduce_std", - "reduce_sum", - "reduce_variance", - "rint", - "segment_max", - "segment_mean", - "segment_min", - "segment_prod", - "segment_sum", - "sign", - "sobol_sample", - "softsign", - "unsorted_segment_max", - "unsorted_segment_mean", - "unsorted_segment_min", - "unsorted_segment_prod", - "unsorted_segment_sqrt_n", - "unsorted_segment_sum", - "xdivy", - "xlog1py", - "xlogy", - "zeta", -] - -# ---- INDIVIDUAL STATIC TESTS ----------------------------------------------- # - -# These tests allow us to generate coverage tables and give a finer-grained view -# of the coverage, but are very slow due to bazel overhead, so they are not -# run on the internal or OSS CI. -iree_e2e_cartesian_product_test_suite( - name = "math_tests", - srcs = ["math_test.py"], - failing_configurations = [ - { - # Failing on TFLite. - "functions": TFLITE_FAILING, - "target_backends": "tflite", - }, - { - # Failing on vmla. - "functions": VMLA_FAILING, - "target_backends": "iree_vmla", - }, - { - # Failing on llvm. - "functions": LLVM_FAILING, - "target_backends": "iree_llvmjit", - }, - { - # Failing on vulkan. - "functions": VULKAN_FAILING, - "target_backends": "iree_vulkan", - }, - ], - flags_to_values = { - "reference_backend": "tf", - "functions": TF_MATH_FUNCTIONS, - "dynamic_dims": False, - "test_complex": False, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "math_test.py", - tags = [ - "manual", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# ---- MULTIPLE STATIC TESTS ------------------------------------------------ # - -# These tests compile all functions in tf.math at once for testing so that -# we can run them on the CI with 5 additional targets instead of 640. The tests -# are run sharded such that about 5 functions run per shard. This is a -# reasonable tradeoff between shard startup overhead and critical path test -# latency. - -# TODO(#3810) 'multiply' outputs all zeros when compiled with other functions. -VMLA_FAILING_MULTIPLE = VMLA_FAILING + ["multiply"] - -# TODO(#3810) Including 'square' causes error: Recieved signal 11. -# @unused -LLVM_FAILING_MULTIPLE = LLVM_FAILING + ["square"] - -# TODO(#3810) Including 'square' causes error: Recieved signal 11. -VULKAN_FAILING_MULTIPLE = VULKAN_FAILING + ["square"] - -[ - iree_py_test( - name = "math_tests_multiple__{}".format(target_backend), - srcs = ["math_test.py"], - args = [ - "--reference_backend=tf", - "--target_backends={}".format(target_backend), - "--functions={}".format(",".join(functions)), - "--dynamic_dims=False", - "--test_complex=False", - ], - main = "math_test.py", - python_version = "PY3", - shard_count = len(functions) // 5, - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for target_backend, functions in dict( - # TODO(#2673): enable LLVM AOT for these tests. JIT is deprecated. - # iree_llvmjit = set_difference(TF_MATH_FUNCTIONS, LLVM_FAILING_MULTIPLE), - iree_vmla = set_difference(TF_MATH_FUNCTIONS, VMLA_FAILING_MULTIPLE), - iree_vulkan = set_difference(TF_MATH_FUNCTIONS, VULKAN_FAILING_MULTIPLE), - tf = TF_MATH_FUNCTIONS, - tflite = set_difference(TF_MATH_FUNCTIONS, TFLITE_FAILING), - ).items() -] - -# ---- INDIVIDUAL DYNAMIC TESTS ---------------------------------------------- # - -# keep sorted -VMLA_FAILING_DYNAMIC = VMLA_FAILING + [ - "angle", - "cumsum", - "divide_no_nan", - "floordiv", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure. - "floormod", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure. - "lbeta", - "lgamma", - "log_sigmoid", - "log1p", - "logical_and", - "logical_not", - "logical_or", - "logical_xor", - "mod", # TODO(#4065): VMLA raises INVALID_ARGUMENT errors after DeviceQueue failure. - "multiply_no_nan", - "round", - "reciprocal_no_nan", - "reduce_all", - "reduce_any", - "reduce_logsumexp", - "reduce_max", - "reduce_min", - "reduce_sum", - "reduce_mean", - "reduce_std", - "reduce_variance", - "softplus", - "zero_fraction", -] - -# TODO(#4061): tf.math.is_nan miscompiles with static shapes. -VMLA_FAILING_DYNAMIC.remove("is_nan") - -# keep sorted -LLVM_FAILING_DYNAMIC = LLVM_FAILING + [ - "accumulate_n", - "add", - "add_n", - "angle", - "cumsum", - "divide", - "divide_no_nan", - "equal", - "floordiv", - "floormod", - "greater", - "greater_equal", - "is_finite", - "is_inf", - "lbeta", - "less", - "less_equal", - "lgamma", - "log_sigmoid", - "log_softmax", - "log1p", - "logical_and", - "logical_not", - "maximum", - "minimum", - "mod", - "multiply", - "multiply_no_nan", - "not_equal", - "polyval", - "reciprocal", - "reciprocal_no_nan", - "reduce_mean", - "scalar_mul", - "sigmoid", - "sinh", - "softmax", - "softplus", - "square", - "squared_difference", - "subtract", - "round", - "tan", - "truediv", - "zero_fraction", -] - -# keep sorted -VULKAN_FAILING_DYNAMIC = VULKAN_FAILING + [ - "abs", - "accumulate_n", - "add", - "add_n", - "angle", - "ceil", - "cos", - "divide", - "divide_no_nan", - "equal", - "exp", - "floor", - "floordiv", - "floormod", - "greater", - "greater_equal", - "imag", - "is_finite", - "is_inf", - "lbeta", - "less", - "round", - "less_equal", - "lgamma", - "log", - "log_sigmoid", - "log_softmax", - "log1p", - "maximum", - "minimum", - "mod", - "multiply", - "multiply_no_nan", - "negative", - "not_equal", - "polyval", - "reciprocal", - "reciprocal_no_nan", - "reduce_max", - "reduce_mean", - "reduce_min", - "reduce_sum", - "rsqrt", - "scalar_mul", - "sigmoid", - "sin", - "sinh", - "softmax", - "softplus", - "sqrt", - "square", - "squared_difference", - "subtract", - "tan", - "tanh", - "truediv", - "zero_fraction", -] - -# These tests allow us to generate coverage tables and give a finer-grained view -# of the coverage, but are very slow due to bazel overhead, so they are not -# run on the internal or OSS CI. -iree_e2e_cartesian_product_test_suite( - name = "math_dynamic_dims_tests", - srcs = ["math_test.py"], - failing_configurations = [ - { - # TFLite does not support dynamic shapes. - "target_backends": "tflite", - }, - { - # Failing on vmla. - "functions": VMLA_FAILING_DYNAMIC, - "target_backends": "iree_vmla", - }, - { - # Failing on llvm. - "functions": LLVM_FAILING_DYNAMIC, - "target_backends": "iree_llvmjit", - }, - { - # Failing on vulkan. - "functions": VULKAN_FAILING_DYNAMIC, - "target_backends": "iree_vulkan", - }, - ], - flags_to_values = { - "reference_backend": "tf", - "functions": TF_MATH_FUNCTIONS, - "dynamic_dims": True, - "test_complex": False, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "math_test.py", - tags = [ - "manual", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# ---- MULTIPLE DYNAMIC TESTS ----------------------------------------------- # - -# These tests compile all functions in tf.math at once for testing so that -# we can run them on the CI with 4 additional targets instead of 512. The tests -# are run sharded such that about 5 functions run per shard. This is a -# reasonable tradeoff between shard startup overhead and critical path test -# latency. - -# TODO(#3810) 'multiply' outputs all zeros when compiled with other functions. -VMLA_FAILING_DYNAMIC_MULTIPLE = VMLA_FAILING_DYNAMIC + ["multiply"] - -[ - iree_py_test( - name = "math_dynamic_dims_tests_multiple__{}".format(target_backend), - srcs = ["math_test.py"], - args = [ - "--reference_backend=tf", - "--target_backends={}".format(target_backend), - "--functions={}".format(",".join(functions)), - "--dynamic_dims=True", - "--test_complex=False", - ], - main = "math_test.py", - python_version = "PY3", - shard_count = len(functions) // 5, - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for target_backend, functions in dict( - # TODO(#2673): enable LLVM AOT for these tests. JIT is deprecated. - # iree_llvmjit = set_difference(TF_MATH_FUNCTIONS, LLVM_FAILING_DYNAMIC), - iree_vmla = set_difference(TF_MATH_FUNCTIONS, VMLA_FAILING_DYNAMIC_MULTIPLE), - iree_vulkan = set_difference(TF_MATH_FUNCTIONS, VULKAN_FAILING_DYNAMIC), - tf = TF_MATH_FUNCTIONS, - ).items() -] - -# ---- INDIVIDUAL COMPLEX TESTS ---------------------------------------------- # - -# This list was generated by running: -# bazel run integrations/tensorflow/e2e/math:math_test_manual -- --list_functions_with_complex_tests -COMPLEX_FUNCTIONS = [ - "abs", - "add", - "angle", - "asinh", - "atanh", - "conj", - "cos", - "cosh", - "count_nonzero", - "cumprod", - "cumsum", - "divide", - "divide_no_nan", - "exp", - "expm1", - "imag", - "l2_normalize", - "log", - "log1p", - "multiply", - "multiply_no_nan", - "negative", - "pow", - "real", - "reciprocal", - "reciprocal_no_nan", - "reduce_euclidean_norm", - "reduce_std", - "reduce_variance", - "rsqrt", - "sigmoid", - "sign", - "sin", - "sinh", - "sqrt", - "square", - "squared_difference", - "subtract", - "tan", - "tanh", - "truediv", - "xdivy", - "xlog1py", - "xlogy", - "zero_fraction", -] - -# keep sorted -FAILING_COMPLEX = [ - "angle", - "cos", - "cumsum", - "divide_no_nan", - "log", - "log1p", - "multiply_no_nan", - "negative", - "reciprocal", - "reciprocal_no_nan", - "reduce_std", - "reduce_variance", - "rsqrt", - "sigmoid", - "sin", - "sinh", - "sqrt", - "tan", - "tanh", - "zero_fraction", -] - -VMLA_FAILING_COMPLEX = VMLA_FAILING + FAILING_COMPLEX - -LLVM_FAILING_COMPLEX = LLVM_FAILING + FAILING_COMPLEX - -VULKAN_FAILING_COMPLEX = VULKAN_FAILING + FAILING_COMPLEX - -# These tests allow us to generate coverage tables and give a finer-grained view -# of the coverage, but are very slow due to bazel overhead, so they are not -# run on the internal or OSS CI. -iree_e2e_cartesian_product_test_suite( - name = "math_complex_tests", - srcs = ["math_test.py"], - failing_configurations = [ - { - # TFLite does not support complex numbers. - "target_backends": "tflite", - }, - { - # Failing on vmla. - "functions": VMLA_FAILING_COMPLEX, - "target_backends": "iree_vmla", - }, - { - # Failing on llvm. - "functions": LLVM_FAILING_COMPLEX, - "target_backends": "iree_llvmjit", - }, - { - # Failing on vulkan. - "functions": VULKAN_FAILING_COMPLEX, - "target_backends": "iree_vulkan", - }, - ], - flags_to_values = { - "reference_backend": "tf", - "functions": COMPLEX_FUNCTIONS, - "dynamic_dims": False, - "test_complex": True, - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_llvmjit", - "iree_vulkan", - ], - }, - main = "math_test.py", - tags = [ - "manual", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -# ---- MULTIPLE COMPLEX TESTS ----------------------------------------------- # - -# These tests compile all functions in tf.math at once for testing so that -# we can run them on the CI with 4 additional targets instead of 512. The tests -# are run sharded such that about 5 functions run per shard. This is a -# reasonable tradeoff between shard startup overhead and critical path test -# latency. - -# TODO(#3810) 'multiply' outputs all zeros when compiled with other functions. -VMLA_FAILING_COMPLEX_MULTIPLE = VMLA_FAILING_COMPLEX + ["multiply"] - -# TODO(#3810) Including 'square' causes error: Recieved signal 11. -# @unused -LLVM_FAILING_COMPLEX_MULTIPLE = LLVM_FAILING_COMPLEX + ["square"] - -# TODO(#3810) Including 'square' causes error: Recieved signal 11. -VULKAN_FAILING_COMPLEX_MULTIPLE = VULKAN_FAILING_COMPLEX + ["square"] - -[ - iree_py_test( - name = "math_complex_tests_multiple__{}".format(target_backend), - srcs = ["math_test.py"], - args = [ - "--reference_backend=tf", - "--target_backends={}".format(target_backend), - "--functions={}".format(",".join(functions)), - "--dynamic_dims=False", - "--test_complex=True", - ], - main = "math_test.py", - python_version = "PY3", - shard_count = len(functions) // 5, - deps = INTREE_TENSORFLOW_PY_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], - ) - for target_backend, functions in dict( - # TODO(#2673): enable LLVM AOT for these tests. JIT is deprecated. - # iree_llvmjit = set_difference(TF_MATH_FUNCTIONS, LLVM_FAILING_COMPLEX_MULTIPLE), - iree_vmla = set_difference(TF_MATH_FUNCTIONS, VMLA_FAILING_COMPLEX_MULTIPLE), - iree_vulkan = set_difference(TF_MATH_FUNCTIONS, VULKAN_FAILING_COMPLEX_MULTIPLE), - tf = TF_MATH_FUNCTIONS, - ).items() -]
diff --git a/integrations/tensorflow/e2e/mobile_bert_squad_test.py b/integrations/tensorflow/e2e/mobile_bert_squad_test.py index 67278ae..d0d8726 100644 --- a/integrations/tensorflow/e2e/mobile_bert_squad_test.py +++ b/integrations/tensorflow/e2e/mobile_bert_squad_test.py
@@ -25,7 +25,6 @@ from absl import flags import numpy as np from pyiree.tf.support import tf_test_utils -from pyiree.tf import compiler import tensorflow.compat.v2 as tf FLAGS = flags.FLAGS
diff --git a/integrations/tensorflow/e2e/slim_vision_models/BUILD b/integrations/tensorflow/e2e/slim_vision_models/BUILD deleted file mode 100644 index f871fe2..0000000 --- a/integrations/tensorflow/e2e/slim_vision_models/BUILD +++ /dev/null
@@ -1,176 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Test coverage across backends for e2e tests is defined directly in the BUILD -# files. Coverage tables generated from this file can be viewed here: -# https://google.github.io/iree/tensorflow-coverage/vision-coverage -# Updates made to test suite names should also be reflected here: -# https://github.com/google/iree/blob/main/scripts/update_e2e_coverage.py - -load( - "//bindings/python:build_defs.oss.bzl", - "INTREE_TENSORFLOW_PY_DEPS", - "INTREE_TF_HUB_DEPS", - "NUMPY_DEPS", - "iree_py_binary", -) -load( - "//integrations/tensorflow/e2e:iree_e2e_cartesian_product_test_suite.bzl", - "iree_e2e_cartesian_product_test_suite", -) - -package( - default_visibility = ["//visibility:public"], - features = ["layering_check"], - licenses = ["notice"], # Apache 2.0 -) - -# Create binaries for all test srcs to allow them to be run manually. -iree_py_binary( - name = "slim_vision_model_test_manual", - srcs = ["slim_vision_model_test.py"], - args = ["--tf_hub_url=https://tfhub.dev/google/imagenet/"], - main = "slim_vision_model_test.py", - python_version = "PY3", - deps = INTREE_TENSORFLOW_PY_DEPS + INTREE_TF_HUB_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -) - -iree_e2e_cartesian_product_test_suite( - name = "slim_vision_tests", - size = "enormous", - srcs = ["slim_vision_model_test.py"], - failing_configurations = [ - { - # SavedModelV2 (classification/4) not available. - "model": "amoebanet_a_n18_f448", - }, - { - # Failing on vmla with negative inputs. - "model": [ - "nasnet_large", - "nasnet_mobile", - ], - "target_backends": "iree_vmla", - }, - { - # Failing llvmjit and vulkan: - "model": [ - "nasnet_mobile", - "nasnet_large", - "pnasnet_large", - "resnet_v2_50", - "resnet_v2_101", - "resnet_v2_152", - ], - "target_backends": [ - "iree_vulkan", - ], - }, - { - # Failing vulkan: - "model": [ - # [ERROR]: cannot separate Linalg/Parallel ops into multiple kernels - "inception_v1", - "inception_v2", - "inception_v3", - "inception_resnet_v2", - ], - "target_backends": [ - "iree_vulkan", - ], - }, - ], - flags_to_values = { - "reference_backend": "tf", - "tf_hub_url": ["https://tfhub.dev/google/imagenet/"], - "model": [ - "amoebanet_a_n18_f448", - "inception_resnet_v2", - "inception_v1", - "inception_v2", - "inception_v3", - # MobileNetV1 - "mobilenet_v1_025_128", - "mobilenet_v1_025_160", - "mobilenet_v1_025_192", - "mobilenet_v1_025_224", - "mobilenet_v1_050_128", - "mobilenet_v1_050_160", - "mobilenet_v1_050_192", - "mobilenet_v1_050_224", - "mobilenet_v1_075_128", - "mobilenet_v1_075_160", - "mobilenet_v1_075_192", - "mobilenet_v1_075_224", - "mobilenet_v1_100_128", - "mobilenet_v1_100_160", - "mobilenet_v1_100_192", - "mobilenet_v1_100_224", - # MobileNetV2: - "mobilenet_v2_035_96", - "mobilenet_v2_035_128", - "mobilenet_v2_035_160", - "mobilenet_v2_035_192", - "mobilenet_v2_035_224", - "mobilenet_v2_050_96", - "mobilenet_v2_050_128", - "mobilenet_v2_050_160", - "mobilenet_v2_050_192", - "mobilenet_v2_050_224", - "mobilenet_v2_075_96", - "mobilenet_v2_075_128", - "mobilenet_v2_075_160", - "mobilenet_v2_075_192", - "mobilenet_v2_075_224", - "mobilenet_v2_100_96", - "mobilenet_v2_100_128", - "mobilenet_v2_100_160", - "mobilenet_v2_100_192", - "mobilenet_v2_100_224", - "mobilenet_v2_130_224", - "mobilenet_v2_140_224", - "nasnet_mobile", - "nasnet_large", - "pnasnet_large", - # ResNetV1 - "resnet_v1_50", - "resnet_v1_101", - "resnet_v1_152", - # ResNetV2 - "resnet_v2_50", - "resnet_v2_101", - "resnet_v2_152", - ], - "target_backends": [ - "tf", - "tflite", - "iree_vmla", - "iree_vulkan", - ], - }, - main = "slim_vision_model_test.py", - tags = [ - "external", - "guitar", - "manual", - "no-remote", - "nokokoro", - "notap", - ], - deps = INTREE_TENSORFLOW_PY_DEPS + INTREE_TF_HUB_DEPS + NUMPY_DEPS + [ - "//integrations/tensorflow/bindings/python/pyiree/tf/support", - ], -)