<!DOCTYPE html> <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PaddlePaddle Compiling Guide for iOS — PaddlePaddle documentation</title> <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" /> <link rel="index" title="Index" href="../genindex.html"/> <link rel="search" title="Search" href="../search.html"/> <link rel="top" title="PaddlePaddle documentation" href="../index.html"/> <link rel="up" title="MOBILE" href="index_en.html"/> <link rel="next" title="Build PaddlePaddle for Raspberry Pi" href="cross_compiling_for_raspberry_en.html"/> <link rel="prev" title="Build PaddlePaddle for Android" href="cross_compiling_for_android_en.html"/> <link rel="stylesheet" href="https://cdn.jsdelivr.net/perfect-scrollbar/0.6.14/css/perfect-scrollbar.min.css" type="text/css" /> <link rel="stylesheet" href="../_static/css/override.css" type="text/css" /> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?b9a314ab40d04d805655aab1deee08ba"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script src="../_static/js/modernizr.min.js"></script> </head> <body class="wy-body-for-nav" role="document"> <header class="site-header"> <div class="site-logo"> <a href="/"><img src="../_static/images/PP_w.png"></a> </div> <div class="site-nav-links"> <div class="site-menu"> <a class="fork-on-github" href="https://github.com/PaddlePaddle/Paddle" target="_blank"><i class="fa fa-github"></i>Fork me on Github</a> <div class="language-switcher dropdown"> <a type="button" data-toggle="dropdown"> <span>English</span> <i class="fa fa-angle-up"></i> <i class="fa fa-angle-down"></i> </a> <ul class="dropdown-menu"> <li><a href="/doc_cn">中文</a></li> <li><a href="/doc">English</a></li> </ul> </div> <ul class="site-page-links"> <li><a href="/">Home</a></li> </ul> </div> <div class="doc-module"> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="../getstarted/index_en.html">GET STARTED</a></li> <li class="toctree-l1"><a class="reference internal" href="../howto/index_en.html">HOW TO</a></li> <li class="toctree-l1"><a class="reference internal" href="../api/index_en.html">API</a></li> <li class="toctree-l1 current"><a class="reference internal" href="index_en.html">MOBILE</a></li> </ul> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> </div> </header> <div class="main-content-wrap"> <nav class="doc-menu-vertical" role="navigation"> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="../getstarted/index_en.html">GET STARTED</a><ul> <li class="toctree-l2"><a class="reference internal" href="../getstarted/build_and_install/index_en.html">Install and Build</a><ul> <li class="toctree-l3"><a class="reference internal" href="../getstarted/build_and_install/pip_install_en.html">Install Using pip</a></li> <li class="toctree-l3"><a class="reference internal" href="../getstarted/build_and_install/docker_install_en.html">Run in Docker Containers</a></li> <li class="toctree-l3"><a class="reference internal" href="../howto/dev/build_en.html">Build using Docker</a></li> <li class="toctree-l3"><a class="reference internal" href="../getstarted/build_and_install/build_from_source_en.html">Build from Sources</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="../howto/index_en.html">HOW TO</a><ul> <li class="toctree-l2"><a class="reference internal" href="../howto/usage/cmd_parameter/index_en.html">Set Command-line Parameters</a><ul> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cmd_parameter/use_case_en.html">Use Case</a></li> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cmd_parameter/arguments_en.html">Argument Outline</a></li> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cmd_parameter/detail_introduction_en.html">Detail Description</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../howto/usage/cluster/cluster_train_en.html">Distributed Training</a><ul> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cluster/fabric_en.html">fabric</a></li> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cluster/openmpi_en.html">openmpi</a></li> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cluster/k8s_en.html">kubernetes</a></li> <li class="toctree-l3"><a class="reference internal" href="../howto/usage/cluster/k8s_aws_en.html">kubernetes on AWS</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../howto/dev/new_layer_en.html">Write New Layers</a></li> <li class="toctree-l2"><a class="reference internal" href="../howto/dev/contribute_to_paddle_en.html">Contribute Code</a></li> <li class="toctree-l2"><a class="reference internal" href="../howto/dev/write_docs_en.html">Contribute Documentation</a></li> <li class="toctree-l2"><a class="reference internal" href="../howto/deep_model/rnn/index_en.html">RNN Models</a><ul> <li class="toctree-l3"><a class="reference internal" href="../howto/deep_model/rnn/rnn_config_en.html">RNN Configuration</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../howto/optimization/gpu_profiling_en.html">Tune GPU Performance</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="../api/index_en.html">API</a><ul> <li class="toctree-l2"><a class="reference internal" href="../api/v2/model_configs.html">Model Configuration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/activation.html">Activation</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/layer.html">Layers</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/evaluators.html">Evaluators</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/optimizer.html">Optimizer</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/pooling.html">Pooling</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/networks.html">Networks</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/config/attr.html">Parameter Attribute</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../api/v2/data.html">Data Reader Interface and DataSets</a><ul> <li class="toctree-l3"><a class="reference internal" href="../api/v2/data/data_reader.html">Data Reader Interface</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/data/image.html">Image Interface</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/data/dataset.html">Dataset</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../api/v2/run_logic.html">Training and Inference</a></li> <li class="toctree-l2"><a class="reference internal" href="../api/v2/fluid.html">Fluid</a><ul> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/layers.html">Layers</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/data_feeder.html">DataFeeder</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/executor.html">Executor</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/initializer.html">Initializer</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/evaluator.html">Evaluator</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/nets.html">Nets</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/optimizer.html">Optimizer</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/param_attr.html">ParamAttr</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/profiler.html">Profiler</a></li> <li class="toctree-l3"><a class="reference internal" href="../api/v2/fluid/regularizer.html">Regularizer</a></li> </ul> </li> </ul> </li> <li class="toctree-l1 current"><a class="reference internal" href="index_en.html">MOBILE</a><ul class="current"> <li class="toctree-l2"><a class="reference internal" href="cross_compiling_for_android_en.html">Build PaddlePaddle for Android</a></li> <li class="toctree-l2 current"><a class="current reference internal" href="#">PaddlePaddle Compiling Guide for iOS</a></li> <li class="toctree-l2"><a class="reference internal" href="cross_compiling_for_raspberry_en.html">Build PaddlePaddle for Raspberry Pi</a></li> </ul> </li> </ul> </nav> <section class="doc-content-wrap"> <div role="navigation" aria-label="breadcrumbs navigation"> <ul class="wy-breadcrumbs"> <li><a href="index_en.html">MOBILE</a> > </li> <li>PaddlePaddle Compiling Guide for iOS</li> </ul> </div> <div class="wy-nav-content" id="doc-content"> <div class="rst-content"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="paddlepaddle-compiling-guide-for-ios"> <span id="paddlepaddle-compiling-guide-for-ios"></span><h1>PaddlePaddle Compiling Guide for iOS<a class="headerlink" href="#paddlepaddle-compiling-guide-for-ios" title="Permalink to this headline">¶</a></h1> <p>This tutorial will walk you through cross compiling the PaddlePaddle library for iOS from the source in MacOS.</p> <div class="section" id="preparation"> <span id="preparation"></span><h2>Preparation<a class="headerlink" href="#preparation" title="Permalink to this headline">¶</a></h2> <p>Apple provides Xcode for cross-compiling and IDE for iOS development. Download from App store or <a class="reference external" href="https://developer.apple.com/cn/xcode/">here</a>. To verify your installation, run command as follows</p> <div class="highlight-bash"><div class="highlight"><pre><span></span>$ xcodebuild -version Xcode <span class="m">9</span>.0 Build version 9A235 </pre></div> </div> </div> <div class="section" id="cross-compiling-configurations"> <span id="cross-compiling-configurations"></span><h2>Cross-compiling configurations<a class="headerlink" href="#cross-compiling-configurations" title="Permalink to this headline">¶</a></h2> <p>PaddlePaddle provides cross-compiling toolchain configuration documentation <a class="reference external" href="https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/cross_compiling/ios.cmake">cmake/cross_compiling/ios.cmake</a>, which has some default settings for frequently used compilers.</p> <p>There are some mandatory environment variables need to be set before cross compiling PaddlePaddle for iOS:</p> <ul class="simple"> <li><code class="docutils literal"><span class="pre">CMAKE_SYSTEM_NAME</span></code>, CMake compiling target platform name, has to be <code class="docutils literal"><span class="pre">iOS</span></code>. PaddlePaddle CMake will compile all the third party dependencies and enforce some parameters (<code class="docutils literal"><span class="pre">WITH_C_API=ON</span></code>, <code class="docutils literal"><span class="pre">WITH_GPU=OFF</span></code>, <code class="docutils literal"><span class="pre">WITH_AVX=OFF</span></code>, <code class="docutils literal"><span class="pre">WITH_PYTHON=OFF</span></code>,<code class="docutils literal"><span class="pre">WITH_RDMA=OFF</span></code>) when this variable is set with value <code class="docutils literal"><span class="pre">iOS</span></code>.</li> <li><code class="docutils literal"><span class="pre">WITH_C_API</span></code>, Whether to compile inference C-API library, has to be <code class="docutils literal"><span class="pre">ON</span></code>, since C-API is the only supported interface for inferencing in iOS.</li> <li><code class="docutils literal"><span class="pre">WITH_SWIG_PY</span></code>, has to be <code class="docutils literal"><span class="pre">OFF</span></code>. It’s not supported to inference or train via swig in iOS.</li> </ul> <p>Optional environment variables for iOS are:</p> <ul> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_PLATFORM</span></code>, either <code class="docutils literal"><span class="pre">OS</span></code> (default) or <code class="docutils literal"><span class="pre">SIMULATOR</span></code>.</p> <ul class="simple"> <li><code class="docutils literal"><span class="pre">OS</span></code>, build targets ARM-based physical devices like iPhone or iPad.</li> <li><code class="docutils literal"><span class="pre">SIMULATOR</span></code>, build targets x86 architecture simulators.</li> </ul> </li> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_ARCH</span></code>, target architecture. By default, all architecture types will be compiled. If you need to specify the architecture to compile for, please find valid values for different <code class="docutils literal"><span class="pre">IOS_PLATFORM</span></code> settings from the table below:</p> <table class="docutils"> <colgroup> <col width="35%" /> <col width="65%" /> </colgroup> <thead valign="bottom"> <tr class="row-odd"> <th class="head">IOS_PLATFORM</th> <th class="head">IOS_ARCH</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"> <td>OS</td> <td>armv7, armv7s, arm64 </td> </tr> <tr class="row-odd"> <td>SIMULATOR</td> <td>i386, x86_64 </td> </tr> </tbody> </table></li> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_DEPLOYMENT_TARGET</span></code>, minimum iOS version to deployment, <code class="docutils literal"><span class="pre">7.0</span></code> by default.</p> </li> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_ENABLE_BITCODE</span></code>, whether to enable <a class="reference external" href="https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html#//apple_ref/doc/uid/TP40012582-CH35-SW3">Bitcode</a>, values can be <code class="docutils literal"><span class="pre">ON/OFF</span></code>, <code class="docutils literal"><span class="pre">ON</span></code> by default.</p> </li> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_USE_VECLIB_FOR_BLAS</span></code>, whether to use <a class="reference external" href="https://developer.apple.com/documentation/accelerate/veclib">vecLib</a> framework for BLAS computing. values can be <code class="docutils literal"><span class="pre">ON/OFF</span></code>, <code class="docutils literal"><span class="pre">OFF</span></code> by default.</p> </li> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_DEVELOPMENT_ROOT</span></code>, the path to <code class="docutils literal"><span class="pre">Developer</span></code> directory, can be explicitly set with your <code class="docutils literal"><span class="pre">/path/to/platform/Developer</span></code>. If left blank, PaddlePaddle will automatically pick the Xcode corresponding <code class="docutils literal"><span class="pre">platform</span></code>‘s <code class="docutils literal"><span class="pre">Developer</span></code> directory based on your <code class="docutils literal"><span class="pre">IOS_PLATFORM</span></code> value.</p> </li> <li><p class="first"><code class="docutils literal"><span class="pre">IOS_SDK_ROOT</span></code>, the path to <code class="docutils literal"><span class="pre">SDK</span></code> root, can be explicitly set with your <code class="docutils literal"><span class="pre">/path/to/platform/Developer/SDKs/SDK</span></code>. if left black, PaddlePaddle will pick the latest SDK in the directory of <code class="docutils literal"><span class="pre">IOS_DEVELOPMENT_ROOT</span></code>.</p> </li> </ul> <p>other settings:</p> <ul class="simple"> <li><code class="docutils literal"><span class="pre">USE_EIGEN_FOR_BLAS</span></code>, whether to use Eigen for matrix computing. effective when <code class="docutils literal"><span class="pre">IOS_USE_VECLIB_FOR_BLAS=OFF</span></code>. Values can be <code class="docutils literal"><span class="pre">ON/OFF</span></code>, <code class="docutils literal"><span class="pre">OFF</span></code> by default.</li> <li><code class="docutils literal"><span class="pre">HOST_C/CXX_COMPILER</span></code>, host C/C++ compiler. Uses value from environment variable <code class="docutils literal"><span class="pre">CC/CXX</span></code> by default or <code class="docutils literal"><span class="pre">cc/c++</span></code> if <code class="docutils literal"><span class="pre">CC/CXX</span></code> doesn’t exist.</li> </ul> <p>some typical cmake configurations:</p> <div class="highlight-bash"><div class="highlight"><pre><span></span>cmake -DCMAKE_SYSTEM_NAME<span class="o">=</span>iOS <span class="se">\</span> -DIOS_PLATFORM<span class="o">=</span>OS <span class="se">\</span> -DIOS_ARCH<span class="o">=</span><span class="s2">"armv7;arm64"</span> <span class="se">\</span> -DIOS_ENABLE_BITCODE<span class="o">=</span>ON <span class="se">\</span> -DIOS_USE_VECLIB_FOR_BLAS<span class="o">=</span>ON <span class="se">\</span> -DCMAKE_INSTALL_PREFIX<span class="o">=</span>your/path/to/install <span class="se">\</span> -DWITH_C_API<span class="o">=</span>ON <span class="se">\</span> -DWITH_TESTING<span class="o">=</span>OFF <span class="se">\</span> -DWITH_SWIG_PY<span class="o">=</span>OFF <span class="se">\</span> .. </pre></div> </div> <div class="highlight-bash"><div class="highlight"><pre><span></span>cmake -DCMAKE_SYSTEM_NAME<span class="o">=</span>iOS <span class="se">\</span> -DIOS_PLATFORM<span class="o">=</span>SIMULATOR <span class="se">\</span> -DIOS_ARCH<span class="o">=</span><span class="s2">"x86_64"</span> <span class="se">\</span> -DIOS_USE_VECLIB_FOR_BLAS<span class="o">=</span>ON <span class="se">\</span> -DCMAKE_INSTALL_PREFIX<span class="o">=</span>your/path/to/install <span class="se">\</span> -DWITH_C_API<span class="o">=</span>ON <span class="se">\</span> -DWITH_TESTING<span class="o">=</span>OFF <span class="se">\</span> -DWITH_SWIG_PY<span class="o">=</span>OFF <span class="se">\</span> .. </pre></div> </div> <p>You can set other compiling parameters for your own need. I.E. if you are trying to minimize the library size, set <code class="docutils literal"><span class="pre">CMAKE_BUILD_TYPE</span></code> with <code class="docutils literal"><span class="pre">MinSizeRel</span></code>; or if the performance is your concern, set <code class="docutils literal"><span class="pre">CMAKE_BUILD_TYPE</span></code> with <code class="docutils literal"><span class="pre">Release</span></code>. You can even manipulate the PaddlePaddle compiling procedure by manually set <code class="docutils literal"><span class="pre">CMAKE_C/CXX_FLAGS</span></code> values.</p> <p><strong>TIPS for a better performance</strong>:</p> <ul class="simple"> <li>set <code class="docutils literal"><span class="pre">CMAKE_BUILD_TYPE</span></code> with <code class="docutils literal"><span class="pre">Release</span></code></li> <li>set <code class="docutils literal"><span class="pre">IOS_USE_VECLIB_FOR_BLAS</span></code> with <code class="docutils literal"><span class="pre">ON</span></code></li> </ul> </div> <div class="section" id="compile-and-install"> <span id="compile-and-install"></span><h2>Compile and install<a class="headerlink" href="#compile-and-install" title="Permalink to this headline">¶</a></h2> <p>After CMake, run following commands, PaddlePaddle will download the compile 3rd party dependencies, compile and install PaddlePaddle inference library.</p> <div class="highlight-default"><div class="highlight"><pre><span></span>$ make $ make install </pre></div> </div> <p>Please Note: if you compiled PaddlePaddle in the source directory for other platforms, do remove <code class="docutils literal"><span class="pre">third_party</span></code> and <code class="docutils literal"><span class="pre">build</span></code> directory within the source with <code class="docutils literal"><span class="pre">rm</span> <span class="pre">-rf</span></code> to ensure that all the 3rd party libraries dependencies and PaddlePaddle is newly compiled with current CMake configuration.</p> <p><code class="docutils literal"><span class="pre">your/path/to/install</span></code> directory will have following directories after <code class="docutils literal"><span class="pre">compile</span></code> and <code class="docutils literal"><span class="pre">install</span></code>:</p> <ul class="simple"> <li><code class="docutils literal"><span class="pre">include</span></code>, contains all the C-API header files.</li> <li><code class="docutils literal"><span class="pre">lib</span></code>, contains PaddlePaddle C-API static library.</li> <li><code class="docutils literal"><span class="pre">third_party</span></code> contains all the 3rd party libraries.</li> </ul> <p>Please note: if PaddlePaddle library need to support both physical devices and simulators, you will need to compile correspondingly, then merge fat library with <code class="docutils literal"><span class="pre">lipo</span></code>.</p> <p>Now you will have PaddlePaddle library compiled and installed, the fat library can be used in deep learning related iOS APPs. Please refer to C-API documentation for usage guides.</p> </div> </div> </div> </div> <footer> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <a href="cross_compiling_for_raspberry_en.html" class="btn btn-neutral float-right" title="Build PaddlePaddle for Raspberry Pi" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a> <a href="cross_compiling_for_android_en.html" class="btn btn-neutral" title="Build PaddlePaddle for Android" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> <hr/> <div role="contentinfo"> <p> © Copyright 2016, PaddlePaddle developers. </p> </div> Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT:'../', VERSION:'', COLLAPSE_INDEX:false, FILE_SUFFIX:'.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: ".txt", }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script type="text/javascript" src="../_static/js/theme.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/perfect-scrollbar/0.6.14/js/perfect-scrollbar.jquery.min.js"></script> <script src="../_static/js/paddle_doc_init.js"></script> </body> </html>