From 76e879d1c18c74ee5cbc5a1162ff254a0cfb221b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" <gardener@tensorflow.org> Date: Fri, 22 Mar 2019 00:25:36 -0700 Subject: [PATCH] Adds new podspecs for the TensorFlow Lite iOS libraries. PiperOrigin-RevId: 239748653 --- .gitignore | 7 +- configure.py | 44 ++-- tensorflow/lite/experimental/c/BUILD | 2 +- .../lite/experimental/c/TensorFlowLiteC.bazel | 25 +++ .../experimental/c/TensorFlowLiteC.podspec | 24 +++ tensorflow/lite/experimental/objc/BUILD.apple | 1 + tensorflow/lite/experimental/objc/README.md | 47 +++- .../objc/TensorFlowLiteObjC.podspec | 39 ++++ .../objc/apis/TFLTensorFlowLite.h | 18 ++ .../objc/apis/framework.modulemap | 10 + .../experimental/objc/apis/module.modulemap | 10 + .../lite/experimental/swift/BUILD.apple | 2 - tensorflow/lite/experimental/swift/LICENSE | 202 ------------------ tensorflow/lite/experimental/swift/README.md | 40 +++- .../swift/Sources/Interpreter.swift | 2 +- .../experimental/swift/Sources/Model.swift | 2 +- .../experimental/swift/Sources/Tensor.swift | 2 +- .../swift/TensorFlowLiteSwift.podspec | 31 +++ 18 files changed, 259 insertions(+), 249 deletions(-) create mode 100644 tensorflow/lite/experimental/c/TensorFlowLiteC.bazel create mode 100644 tensorflow/lite/experimental/c/TensorFlowLiteC.podspec create mode 100644 tensorflow/lite/experimental/objc/TensorFlowLiteObjC.podspec create mode 100644 tensorflow/lite/experimental/objc/apis/TFLTensorFlowLite.h create mode 100644 tensorflow/lite/experimental/objc/apis/framework.modulemap create mode 100644 tensorflow/lite/experimental/objc/apis/module.modulemap delete mode 100644 tensorflow/lite/experimental/swift/LICENSE create mode 100644 tensorflow/lite/experimental/swift/TensorFlowLiteSwift.podspec diff --git a/.gitignore b/.gitignore index e1d352c238a..edf3b59f805 100644 --- a/.gitignore +++ b/.gitignore @@ -24,10 +24,13 @@ Pods Podfile.lock *.pbxproj *.xcworkspacedata -/tensorflow/lite/tools/make/downloads/** -/tensorflow/lite/gen/** +/*.podspec +/tensorflow/lite/experimental/objc/BUILD +/tensorflow/lite/experimental/swift/BUILD /tensorflow/lite/examples/ios/simple/data/*.txt /tensorflow/lite/examples/ios/simple/data/*.tflite +/tensorflow/lite/gen/** +/tensorflow/lite/tools/make/downloads/** xcuserdata/** /api_init_files_list.txt /estimator_api_init_files_list.txt diff --git a/configure.py b/configure.py index 499714d54cf..5ca6df713bd 100644 --- a/configure.py +++ b/configure.py @@ -56,12 +56,18 @@ NCCL_LIB_PATHS = [ 'lib64/', 'lib/powerpc64le-linux-gnu/', 'lib/x86_64-linux-gnu/', '' ] -# List of files to be configured for using Bazel on Apple platforms. +# List of files to configure when building Bazel on Apple platforms. APPLE_BAZEL_FILES = [ 'tensorflow/lite/experimental/objc/BUILD', 'tensorflow/lite/experimental/swift/BUILD' ] +# List of files to move when building for iOS. +IOS_FILES = [ + 'tensorflow/lite/experimental/objc/TensorFlowLiteObjC.podspec', + 'tensorflow/lite/experimental/swift/TensorFlowLiteSwift.podspec', +] + if platform.machine() == 'ppc64le': _DEFAULT_TENSORRT_PATH_LINUX = '/usr/lib/powerpc64le-linux-gnu/' else: @@ -1585,24 +1591,24 @@ def config_info_line(name, help_text): print('\t--config=%-12s\t# %s' % (name, help_text)) -def configure_apple_bazel_rules(): - """Configures Bazel rules for building on Apple platforms. +def configure_ios(): + """Configures TensorFlow for iOS builds. - Enables analyzing and building Apple Bazel rules on Apple platforms. This - function will only be executed if `is_macos()` is true. + This function will only be executed if `is_macos()` is true. """ if not is_macos(): return - for filepath in APPLE_BAZEL_FILES: - print( - 'Configuring %s file to analyze and build Bazel rules on Apple platforms.' - % filepath) - existing_filepath = os.path.join(_TF_WORKSPACE_ROOT, filepath + '.apple') - renamed_filepath = os.path.join(_TF_WORKSPACE_ROOT, filepath) - os.rename(existing_filepath, renamed_filepath) if _TF_CURRENT_BAZEL_VERSION is None or _TF_CURRENT_BAZEL_VERSION < 23000: print( 'Building Bazel rules on Apple platforms requires Bazel 0.23 or later.') + for filepath in APPLE_BAZEL_FILES: + existing_filepath = os.path.join(_TF_WORKSPACE_ROOT, filepath + '.apple') + renamed_filepath = os.path.join(_TF_WORKSPACE_ROOT, filepath) + symlink_force(existing_filepath, renamed_filepath) + for filepath in IOS_FILES: + filename = os.path.basename(filepath) + new_filepath = os.path.join(_TF_WORKSPACE_ROOT, filename) + symlink_force(filepath, new_filepath) def main(): @@ -1648,7 +1654,7 @@ def main(): if is_macos(): environ_cp['TF_NEED_TENSORRT'] = '0' else: - environ_cp['TF_CONFIGURE_APPLE_BAZEL_RULES'] = '0' + environ_cp['TF_CONFIGURE_IOS'] = '0' # The numpy package on ppc64le uses OpenBLAS which has multi-threading # issues that lead to incorrect answers. Set OMP_NUM_THREADS=1 at @@ -1753,13 +1759,11 @@ def main(): system_specific_config(os.environ) - if get_var( - environ_cp, 'TF_CONFIGURE_APPLE_BAZEL_RULES', - 'Configure Bazel rules for Apple platforms', False, - ('Would you like to configure Bazel rules for building on Apple platforms?' - ), 'Configuring Bazel rules for Apple platforms.', - 'Not configuring Bazel rules for Apple platforms.'): - configure_apple_bazel_rules() + if get_var(environ_cp, 'TF_CONFIGURE_IOS', 'Configure TensorFlow for iOS', + False, ('Would you like to configure TensorFlow for iOS builds?'), + 'Configuring TensorFlow for iOS builds.', + 'Not configuring TensorFlow for iOS builds.'): + configure_ios() print('Preconfigured Bazel build configs. You can use any of the below by ' 'adding "--config=<>" to your build command. See .bazelrc for more ' diff --git a/tensorflow/lite/experimental/c/BUILD b/tensorflow/lite/experimental/c/BUILD index f9608034f7b..16d01aede4f 100644 --- a/tensorflow/lite/experimental/c/BUILD +++ b/tensorflow/lite/experimental/c/BUILD @@ -56,7 +56,7 @@ cc_library( srcs = ["c_api.cc"], hdrs = ["c_api.h"], copts = tflite_copts(), - tags = ["swift_module=TensorFlowLiteCAPI"], + tags = ["swift_module=TensorFlowLiteC"], visibility = [ ":experimental", ], diff --git a/tensorflow/lite/experimental/c/TensorFlowLiteC.bazel b/tensorflow/lite/experimental/c/TensorFlowLiteC.bazel new file mode 100644 index 00000000000..1766e8f38ca --- /dev/null +++ b/tensorflow/lite/experimental/c/TensorFlowLiteC.bazel @@ -0,0 +1,25 @@ +# Bazel rules for building the TensorFlowLiteC iOS static framework. +# +# Add the build rules below to `//tensorflow/lite/experimental/c/BUILD`. +# Build the framework: +# bazel build tensorflow/lite/experimental/c:TensorFlowLiteC_framework -c opt --ios_multi_cpus=x86_64,armv7,arm64 +# Unzip the generated framework: +# unzip bazel-bin/tensorflow/lite/experimental/c/TensorFlowLiteC_framework.zip -d /Users/path/to/TensorFlowLiteC.framework + +load("@build_bazel_rules_apple//apple:ios.bzl", "ios_static_framework") +load("@build_bazel_rules_apple//apple:versioning.bzl", "apple_bundle_version") + +apple_bundle_version( + name = "TensorFlowLiteC_version", + build_version = "0.1.0", + short_version_string = "0.1", +) + +ios_static_framework( + name = "TensorFlowLiteC_framework", + hdrs = ["c_api.h"], + bundle_name = "TensorFlowLiteC", + minimum_os_version = "9.0", + version = ":TensorFlowLiteC_version", + deps = [":c_api"], +) diff --git a/tensorflow/lite/experimental/c/TensorFlowLiteC.podspec b/tensorflow/lite/experimental/c/TensorFlowLiteC.podspec new file mode 100644 index 00000000000..e9859e76c51 --- /dev/null +++ b/tensorflow/lite/experimental/c/TensorFlowLiteC.podspec @@ -0,0 +1,24 @@ +# Run `pod lib lint TensorFlowLiteC.podspec` to ensure this is a valid spec. + +Pod::Spec.new do |s| + s.name = 'TensorFlowLiteC' + s.version = '0.1.0' + s.authors = 'Google Inc.' + s.license = { :type => 'Apache' } + s.homepage = 'https://github.com/tensorflow/tensorflow' + s.source = { :http => 'https://dl.google.com/dl/tensorflow/lite/frameworks/TensorFlowLiteC/0.1.0/TensorFlowLiteC-0.1.0.tar.gz' } + s.summary = 'TensorFlow Lite' + s.description = <<-DESC + + TensorFlow Lite is TensorFlow's lightweight solution for mobile developers. It + enables low-latency inference of on-device machine learning models with a + small binary size and fast performance supporting hardware acceleration. + DESC + + s.ios.deployment_target = '9.0' + + s.module_name = 'TensorFlowLiteC' + s.library = 'c++' + s.static_framework = true + s.vendored_frameworks = 'Frameworks/TensorFlowLiteC.framework' +end diff --git a/tensorflow/lite/experimental/objc/BUILD.apple b/tensorflow/lite/experimental/objc/BUILD.apple index eef9e322311..5d3d6205128 100644 --- a/tensorflow/lite/experimental/objc/BUILD.apple +++ b/tensorflow/lite/experimental/objc/BUILD.apple @@ -64,6 +64,7 @@ objc_library( srcs = SOURCES, hdrs = API_HEADERS, copts = RELEASE_COPTS, + module_map = "apis/module.modulemap", tags = DEFAULT_TAGS, deps = [ "//tensorflow/lite/experimental/c:c_api", diff --git a/tensorflow/lite/experimental/objc/README.md b/tensorflow/lite/experimental/objc/README.md index 9dd5aa69739..b6ac3e96c82 100644 --- a/tensorflow/lite/experimental/objc/README.md +++ b/tensorflow/lite/experimental/objc/README.md @@ -7,6 +7,19 @@ supporting hardware acceleration. ## Getting Started +To build the Objective-C TensorFlow Lite library on Apple platforms, +[install from source](https://www.tensorflow.org/install/source#setup_for_linux_and_macos) +or [clone the GitHub repo](https://github.com/tensorflow/tensorflow). +Then, configure TensorFlow by navigating to the root directory and executing the +`configure.py` script: + +```shell +python configure.py +``` + +Follow the prompts and when asked to configure TensorFlow for iOS builds, +enter `y`. + ### Bazel In your `BUILD` file, add the `TensorFlowLite` dependency: @@ -19,17 +32,12 @@ objc_library( ) ``` -If you would like to build the Objective-C TensorFlow Lite library using Bazel on Apple -platforms, clone or download the [TensorFlow GitHub repo](https://github.com/tensorflow/tensorflow), -then navigate to the root `tensorflow` directory and execute the `configure.py` script: +In your Objective-C files, import the umbrella header: -```shell -python configure.py +```objectivec +#import "TFLTensorFlowLite.h" ``` -Follow the prompts and when asked to configure the Bazel rules for Apple -platforms, enter `y`. - Build the `TensorFlowLite` Objective-C library target: ```shell @@ -52,3 +60,26 @@ script from the root `tensorflow` directory: ```shell generate_xcodeproj.sh --genconfig tensorflow/lite/experimental/objc/TensorFlowLite.tulsiproj:TensorFlowLite --outputfolder ~/path/to/generated/TensorFlowLite.xcodeproj ``` + +### CocoaPods + +Add the following to your `Podfile`: + +```ruby +pod 'TensorFlowLiteObjC' +``` + +Then, run `pod install`. + +In your Objective-C files, import the umbrella header: + +```objectivec +#import "TFLTensorFlowLite.h" +``` + +Or, the module if `CLANG_ENABLE_MODULES = YES` and `use_frameworks!` is +specified in your `Podfile`: + +```objectivec +@import TFLTensorFlowLite; +``` diff --git a/tensorflow/lite/experimental/objc/TensorFlowLiteObjC.podspec b/tensorflow/lite/experimental/objc/TensorFlowLiteObjC.podspec new file mode 100644 index 00000000000..1e4bd2cc94f --- /dev/null +++ b/tensorflow/lite/experimental/objc/TensorFlowLiteObjC.podspec @@ -0,0 +1,39 @@ +# Run `pod lib lint TensorFlowLiteObjC.podspec` to ensure this is a valid spec. + +Pod::Spec.new do |s| + s.name = 'TensorFlowLiteObjC' + s.version = '0.1.0' + s.authors = 'Google Inc.' + s.license = { :type => 'Apache' } + s.homepage = 'https://github.com/tensorflow/tensorflow' + s.source = { :git => 'https://github.com/tensorflow/tensorflow.git', :tag => 'v2.0.0-alpha0' } + s.summary = 'TensorFlow Lite for Objective-C' + s.description = <<-DESC + + TensorFlow Lite is TensorFlow's lightweight solution for Objective-C + developers. It enables low-latency inference of on-device machine learning + models with a small binary size and fast performance supporting hardware + acceleration. + DESC + + s.ios.deployment_target = '9.0' + + s.module_name = 'TFLTensorFlowLite' + s.static_framework = true + s.prefix_header_file = false + + base_dir = 'tensorflow/lite/experimental/objc/' + s.public_header_files = base_dir + 'apis/*.h' + s.source_files = base_dir + '{apis,sources}/*.{h,m,mm}' + s.module_map = base_dir + 'apis/framework.modulemap' + s.dependency 'TensorFlowLiteC', "#{s.version}" + s.pod_target_xcconfig = { + 'HEADER_SEARCH_PATHS' => + '"${PODS_TARGET_SRCROOT}" ' + + '"${PODS_TARGET_SRCROOT}/"' + base_dir + '"apis"', + } + + s.test_spec 'Tests' do |ts| + ts.source_files = base_dir + 'tests/*.m' + end +end diff --git a/tensorflow/lite/experimental/objc/apis/TFLTensorFlowLite.h b/tensorflow/lite/experimental/objc/apis/TFLTensorFlowLite.h new file mode 100644 index 00000000000..ad1ffe6845f --- /dev/null +++ b/tensorflow/lite/experimental/objc/apis/TFLTensorFlowLite.h @@ -0,0 +1,18 @@ +// Copyright 2019 Google Inc. All rights reserved. +// +// 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: +// +// http://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 "TFLInterpreter.h" +#import "TFLInterpreterOptions.h" +#import "TFLQuantizationParameters.h" +#import "TFLTensor.h" diff --git a/tensorflow/lite/experimental/objc/apis/framework.modulemap b/tensorflow/lite/experimental/objc/apis/framework.modulemap new file mode 100644 index 00000000000..57113ffab1f --- /dev/null +++ b/tensorflow/lite/experimental/objc/apis/framework.modulemap @@ -0,0 +1,10 @@ +framework module TFLTensorFlowLite { + umbrella header "TFLTensorFlowLite.h" + + header "TFLInterpreter.h" + header "TFLInterpreterOptions.h" + header "TFLQuantizationParameters.h" + header "TFLTensor.h" + + export * +} diff --git a/tensorflow/lite/experimental/objc/apis/module.modulemap b/tensorflow/lite/experimental/objc/apis/module.modulemap new file mode 100644 index 00000000000..37b98478f60 --- /dev/null +++ b/tensorflow/lite/experimental/objc/apis/module.modulemap @@ -0,0 +1,10 @@ +module TFLTensorFlowLite { + umbrella header "TFLTensorFlowLite.h" + + header "TFLInterpreter.h" + header "TFLInterpreterOptions.h" + header "TFLQuantizationParameters.h" + header "TFLTensor.h" + + export * +} diff --git a/tensorflow/lite/experimental/swift/BUILD.apple b/tensorflow/lite/experimental/swift/BUILD.apple index 8f44546a4b8..0322056b32b 100644 --- a/tensorflow/lite/experimental/swift/BUILD.apple +++ b/tensorflow/lite/experimental/swift/BUILD.apple @@ -4,8 +4,6 @@ package(default_visibility = ["//visibility:private"]) licenses(["notice"]) # Apache 2.0 -exports_files(["LICENSE"]) - load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application", "ios_unit_test") load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") diff --git a/tensorflow/lite/experimental/swift/LICENSE b/tensorflow/lite/experimental/swift/LICENSE deleted file mode 100644 index d6456956733..00000000000 --- a/tensorflow/lite/experimental/swift/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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 - - http://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. diff --git a/tensorflow/lite/experimental/swift/README.md b/tensorflow/lite/experimental/swift/README.md index 716ab33f8d6..48360e733f4 100644 --- a/tensorflow/lite/experimental/swift/README.md +++ b/tensorflow/lite/experimental/swift/README.md @@ -7,6 +7,19 @@ hardware acceleration. ## Getting Started +To build the Swift TensorFlow Lite library on Apple platforms, +[install from source](https://www.tensorflow.org/install/source#setup_for_linux_and_macos) +or [clone the GitHub repo](https://github.com/tensorflow/tensorflow). +Then, configure TensorFlow by navigating to the root directory and executing the +`configure.py` script: + +```shell +python configure.py +``` + +Follow the prompts and when asked to configure TensorFlow for iOS builds, +enter `y`. + ### Bazel In your `BUILD` file, add the `TensorFlowLite` dependency: @@ -25,17 +38,6 @@ In your Swift files, import the module: import TensorFlowLite ``` -If you would like to build the Swift TensorFlow Lite library using Bazel on Apple -platforms, clone or download the [TensorFlow GitHub repo](https://github.com/tensorflow/tensorflow), -then navigate to the root `tensorflow` directory and execute the `configure.py` script: - -```shell -python configure.py -``` - -Follow the prompts and when asked to configure the Bazel rules for Apple -platforms, enter `y`. - Build the `TensorFlowLite` Swift library target: ```shell @@ -61,3 +63,19 @@ script from the root `tensorflow` directory: ```shell generate_xcodeproj.sh --genconfig tensorflow/lite/experimental/swift/TensorFlowLite.tulsiproj:TensorFlowLite --outputfolder ~/path/to/generated/TensorFlowLite.xcodeproj ``` + +### CocoaPods + +Add the following to your `Podfile`: + +```ruby +pod 'TensorFlowLiteSwift' +``` + +Then, run `pod install`. + +In your Swift files, import the module: + +```swift +import TensorFlowLite +``` diff --git a/tensorflow/lite/experimental/swift/Sources/Interpreter.swift b/tensorflow/lite/experimental/swift/Sources/Interpreter.swift index a14b5966b1a..1a11a46f8c8 100644 --- a/tensorflow/lite/experimental/swift/Sources/Interpreter.swift +++ b/tensorflow/lite/experimental/swift/Sources/Interpreter.swift @@ -13,7 +13,7 @@ // limitations under the License. import Foundation -import TensorFlowLiteCAPI +import TensorFlowLiteC /// A TensorFlow Lite interpreter that performs inference from a given model. public final class Interpreter { diff --git a/tensorflow/lite/experimental/swift/Sources/Model.swift b/tensorflow/lite/experimental/swift/Sources/Model.swift index e8c49ff1ae1..f74e5d8a494 100644 --- a/tensorflow/lite/experimental/swift/Sources/Model.swift +++ b/tensorflow/lite/experimental/swift/Sources/Model.swift @@ -13,7 +13,7 @@ // limitations under the License. import Foundation -import TensorFlowLiteCAPI +import TensorFlowLiteC /// A TensorFlow Lite model used by the 'Interpreter` to perform inference. final class Model { diff --git a/tensorflow/lite/experimental/swift/Sources/Tensor.swift b/tensorflow/lite/experimental/swift/Sources/Tensor.swift index b738d875491..161c42be7eb 100644 --- a/tensorflow/lite/experimental/swift/Sources/Tensor.swift +++ b/tensorflow/lite/experimental/swift/Sources/Tensor.swift @@ -13,7 +13,7 @@ // limitations under the License. import Foundation -import TensorFlowLiteCAPI +import TensorFlowLiteC /// An input or output tensor in a TensorFlow Lite graph. public struct Tensor { diff --git a/tensorflow/lite/experimental/swift/TensorFlowLiteSwift.podspec b/tensorflow/lite/experimental/swift/TensorFlowLiteSwift.podspec new file mode 100644 index 00000000000..2d5b2537db1 --- /dev/null +++ b/tensorflow/lite/experimental/swift/TensorFlowLiteSwift.podspec @@ -0,0 +1,31 @@ +# Run `pod lib lint TensorFlowLiteSwift.podspec` to ensure this is a valid spec. + +Pod::Spec.new do |s| + s.name = 'TensorFlowLiteSwift' + s.version = '0.1.0' + s.authors = 'Google Inc.' + s.license = { :type => 'Apache' } + s.homepage = 'https://github.com/tensorflow/tensorflow' + s.source = { :git => 'https://github.com/tensorflow/tensorflow.git', :tag => 'v2.0.0-alpha0' } + s.summary = 'TensorFlow Lite for Swift' + s.description = <<-DESC + + TensorFlow Lite is TensorFlow's lightweight solution for Swift developers. It + enables low-latency inference of on-device machine learning models with a + small binary size and fast performance supporting hardware acceleration. + DESC + + s.ios.deployment_target = '9.0' + s.swift_version = '4.2' + + s.module_name = 'TensorFlowLite' + s.static_framework = true + + base_dir = 'tensorflow/lite/experimental/swift/' + s.source_files = base_dir + 'Sources/*.swift' + s.dependency 'TensorFlowLiteC', "#{s.version}" + + s.test_spec 'Tests' do |ts| + ts.source_files = base_dir + 'Tests/*.swift' + end +end