compile_paddle_lib_cn.html 18.8 KB
Newer Older
1 2


3 4


5 6 7 8 9 10 11 12
<!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">
  
13
  <title>安装与编译C-API预测库 &mdash; PaddlePaddle  文档</title>
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  

  
  

  

  
  
    

  

  
  
29
    <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
30 31 32
  

  
33

34 35
  
        <link rel="index" title="索引"
36 37 38 39
              href="../../genindex.html"/>
        <link rel="search" title="搜索" href="../../search.html"/>
    <link rel="top" title="PaddlePaddle  文档" href="../../index.html"/>
        <link rel="up" title="C-API预测库" href="index_cn.html"/>
40
        <link rel="next" title="输入/输出数据组织" href="organization_of_the_inputs_cn.html"/>
41
        <link rel="prev" title="C-API预测库" href="index_cn.html"/> 
42 43 44 45 46 47 48 49 50 51
<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>

52 53

  
54
  <script src="../../_static/js/modernizr.min.js"></script>
55 56 57 58 59

</head>

<body class="wy-body-for-nav" role="document">

60 61 62 63 64 65 66 67 68 69 70 71 72
  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search">
          

          
            <a href="../../index_cn.html" class="icon icon-home"> PaddlePaddle
          

          
73 74
          </a>

75 76 77 78 79 80
          
            
            
          

          
81
<div role="search">
82
  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
83 84 85 86
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
87
</div>
88 89

          
90 91 92 93
        </div>

        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
94 95 96 97 98 99 100 101 102 103 104 105 106 107
<nav class="doc-menu-vertical" role="navigation">

<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../getstarted/index_cn.html">新手入门</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../getstarted/quickstart_cn.html">快速开始</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getstarted/concepts/use_concepts_cn.html">基本使用概念</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../build_and_install/index_cn.html">安装与编译</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../build_and_install/pip_install_cn.html">使用pip安装</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../build_and_install/docker_install_cn.html">使用Docker安装运行</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../build_and_install/build_from_source_cn.html">从源码编译</a></li>
</ul>
</li>
108
<li class="toctree-l1 current"><a class="reference internal" href="../index_cn.html">进阶使用</a><ul class="current">
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
<li class="toctree-l2"><a class="reference internal" href="../cmd_parameter/index_cn.html">命令行参数设置</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../cmd_parameter/use_case_cn.html">使用案例</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cmd_parameter/arguments_cn.html">参数概述</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cmd_parameter/detail_introduction_cn.html">细节描述</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../cluster/index_cn.html">分布式训练</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../cluster/preparations_cn.html">环境准备</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cluster/cmd_argument_cn.html">启动参数说明</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cluster/multi_cluster/index_cn.html">在不同集群中运行</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../cluster/multi_cluster/k8s_cn.html">Kubernetes单机训练</a></li>
<li class="toctree-l4"><a class="reference internal" href="../cluster/multi_cluster/k8s_distributed_cn.html">Kubernetes分布式训练</a></li>
<li class="toctree-l4"><a class="reference internal" href="../cluster/multi_cluster/openmpi_cn.html">在OpenMPI集群中启动训练</a></li>
<li class="toctree-l4"><a class="reference internal" href="../cluster/multi_cluster/fabric_cn.html">使用fabric启动集群训练</a></li>
<li class="toctree-l4"><a class="reference internal" href="../cluster/multi_cluster/k8s_aws_cn.html">Kubernetes on AWS</a></li>
124 125
</ul>
</li>
126 127 128 129
</ul>
</li>
<li class="toctree-l2 current"><a class="reference internal" href="index_cn.html">C-API预测库</a><ul class="current">
<li class="toctree-l3 current"><a class="current reference internal" href="#">安装与编译C-API预测库</a></li>
130
<li class="toctree-l3"><a class="reference internal" href="organization_of_the_inputs_cn.html">输入/输出数据组织</a></li>
131
<li class="toctree-l3"><a class="reference internal" href="workflow_of_capi_cn.html">C-API使用流程</a></li>
132 133
</ul>
</li>
134 135 136 137 138 139 140
<li class="toctree-l2"><a class="reference internal" href="../rnn/index_cn.html">RNN模型</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../rnn/rnn_config_cn.html">RNN配置</a></li>
<li class="toctree-l3"><a class="reference internal" href="../rnn/recurrent_group_cn.html">Recurrent Group教程</a></li>
<li class="toctree-l3"><a class="reference internal" href="../rnn/hierarchical_layer_cn.html">支持双层序列作为输入的Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="../rnn/hrnn_rnn_api_compare_cn.html">单双层RNN API对比介绍</a></li>
</ul>
</li>
141 142 143
<li class="toctree-l2"><a class="reference internal" href="../optimization/gpu_profiling_cn.html">GPU性能调优</a></li>
</ul>
</li>
144 145 146
<li class="toctree-l1"><a class="reference internal" href="../../dev/index_cn.html">开发标准</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../dev/contribute_to_paddle_cn.html">如何贡献代码</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/write_docs_cn.html">如何贡献文档</a></li>
147
<li class="toctree-l2"><a class="reference internal" href="../../dev/new_layer_cn.html">如何实现新的网络层</a></li>
148 149 150 151 152 153 154 155 156 157
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index_cn.html">FAQ</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../faq/build_and_install/index_cn.html">编译安装与单元测试</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../faq/model/index_cn.html">模型配置</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../faq/parameter/index_cn.html">参数设置</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../faq/local/index_cn.html">本地训练与预测</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../faq/cluster/index_cn.html">集群训练与预测</a></li>
</ul>
</li>
158 159
</ul>

160 161
</nav>

162 163
        </div>
      </div>
164 165
    </nav>

166
    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
167

168 169 170 171 172
      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../../index_cn.html">PaddlePaddle</a>
      </nav>
173 174


175 176 177 178
      
      <div class="wy-nav-content">
        <div class="rst-content">
          
179

180
 
181 182 183 184 185



<div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
186
    <li><a href="../../index_cn.html">Docs</a> &raquo;</li>
187
      
188
          <li><a href="../index_cn.html">进阶使用</a> &raquo;</li>
189
      
190
          <li><a href="index_cn.html">C-API预测库</a> &raquo;</li>
191
      
192
    <li>安装与编译C-API预测库</li>
193 194 195 196 197 198 199
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="../../_sources/howto/capi/compile_paddle_lib_cn.md.txt" rel="nofollow"> View page source</a>
          
        
      </li>
200
  </ul>
201
  <hr/>
202 203 204 205
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
206 207
  <div class="section" id="c-api">
<span id="c-api"></span><h1>安装与编译C-API预测库<a class="headerlink" href="#c-api" title="永久链接至标题"></a></h1>
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
<div class="section" id="">
<span id="id1"></span><h2>概述<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>使用 C-API 进行预测依赖于将 PaddlePaddle 核心代码编译成链接库,只需在编译时需配制下面这些编译选项:</p>
<p>必须配置选项:</p>
<ul class="simple">
<li><code class="docutils literal"><span class="pre">WITH_C_API</span></code>,必须配置为<code class="docutils literal"><span class="pre">ON</span></code></li>
</ul>
<p>推荐配置选项:</p>
<ul class="simple">
<li><code class="docutils literal"><span class="pre">WITH_PYTHON</span></code>,推荐配置为<code class="docutils literal"><span class="pre">OFF</span></code></li>
<li><code class="docutils literal"><span class="pre">WITH_SWIG_PY</span></code>,推荐配置为<code class="docutils literal"><span class="pre">OFF</span></code></li>
<li><code class="docutils literal"><span class="pre">WITH_GOLANG</span></code>,推荐设置为<code class="docutils literal"><span class="pre">OFF</span></code></li>
</ul>
<p>可选配置选项:</p>
<ul class="simple">
<li><code class="docutils literal"><span class="pre">WITH_GPU</span></code>,可配置为<code class="docutils literal"><span class="pre">ON/OFF</span></code></li>
<li><code class="docutils literal"><span class="pre">WITH_MKL</span></code>,可配置为<code class="docutils literal"><span class="pre">ON/OFF</span></code></li>
</ul>
<p>对推荐配置中的选项建议按照设置,以避免链接不必要的库。其它可选编译选项按需进行设定。</p>
<p>下面的代码片段从github拉取最新代码,配制编译选项(需要将PADDLE_ROOT替换为PaddlePaddle预测库的安装路径):</p>
<div class="highlight-shell"><div class="highlight"><pre><span></span><span class="nv">PADDLE_ROOT</span><span class="o">=</span>/path/of/capi
git clone https://github.com/PaddlePaddle/Paddle.git
<span class="nb">cd</span> Paddle
mkdir build
<span class="nb">cd</span> build
cmake -DCMAKE_INSTALL_PREFIX<span class="o">=</span><span class="nv">$PADDLE_ROOT</span> <span class="se">\</span>
      -DCMAKE_BUILD_TYPE<span class="o">=</span>Release <span class="se">\</span>
      -DWITH_C_API<span class="o">=</span>ON <span class="se">\</span>
      -DWITH_SWIG_PY<span class="o">=</span>OFF <span class="se">\</span>
      -DWITH_GOLANG<span class="o">=</span>OFF <span class="se">\</span>
      -DWITH_PYTHON<span class="o">=</span>OFF <span class="se">\</span>
      -DWITH_MKL<span class="o">=</span>OFF <span class="se">\</span>
      -DWITH_GPU<span class="o">=</span>OFF  <span class="se">\</span>
      ..
</pre></div>
</div>
<p>执行上述代码生成Makefile文件后,执行:<code class="docutils literal"><span class="pre">make</span> <span class="pre">&amp;&amp;</span> <span class="pre">make</span> <span class="pre">install</span></code>。成功编译后,使用C-API所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件)均会存放于<code class="docutils literal"><span class="pre">PADDLE_ROOT</span></code>目录中。</p>
<p>编译成功后在 <code class="docutils literal"><span class="pre">PADDLE_ROOT</span></code> 下会看到如下目录结构(包括了编译出的PaddlePaddle头文件和链接库,以及第三方依赖链接库和头文件(如果需要,由链接方式决定)):</p>
<div class="highlight-text"><div class="highlight"><pre><span></span>├── include
│   └── paddle
│       ├── arguments.h
│       ├── capi.h
│       ├── capi_private.h
│       ├── config.h
│       ├── error.h
│       ├── gradient_machine.h
│       ├── main.h
│       ├── matrix.h
│       ├── paddle_capi.map
│       └── vector.h
├── lib
│   ├── libpaddle_capi_engine.a
│   ├── libpaddle_capi_layers.a
│   ├── libpaddle_capi_shared.so
│   └── libpaddle_capi_whole.a
└── third_party
    ├── gflags
    │   ├── include
    │   │   └── gflags
    │   │       ├── gflags_completions.h
    │   │       ├── gflags_declare.h
    │   │       ...
    │   └── lib
    │       └── libgflags.a
    ├── glog
    │   ├── include
    │   │   └── glog
    │   │       ├── config.h
    │   │       ...
    │   └── lib
    │       └── libglog.a
    ├── openblas
    │   ├── include
    │   │   ├── cblas.h
    │   │   ...
    │   └── lib
    │       ...
    ├── protobuf
    │   ├── include
    │   │   └── google
    │   │       └── protobuf
    │   │           ...
    │   └── lib
    │       └── libprotobuf-lite.a
    └── zlib
        ├── include
        │   ...
        └── lib
            ...
</pre></div>
</div>
</div>
<div class="section" id="">
<span id="id2"></span><h2>链接说明<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>目前提供三种链接方式:</p>
<ol class="simple">
<li>链接<code class="docutils literal"><span class="pre">libpaddle_capi_shared.so</span></code> 动态库<ul>
<li>使用 PaddlePaddle C-API 开发预测程序链接<code class="docutils literal"><span class="pre">libpaddle_capi_shared.so</span></code>时,需注意:<ol>
<li>如果编译时指定编译CPU版本,且使用<code class="docutils literal"><span class="pre">OpenBLAS</span></code>数学库,在使用C-API开发预测程序时,只需要链接<code class="docutils literal"><span class="pre">libpaddle_capi_shared.so</span></code>这一个库。</li>
<li>如果是用编译时指定CPU版本,且使用<code class="docutils literal"><span class="pre">MKL</span></code>数学库,由于<code class="docutils literal"><span class="pre">MKL</span></code>库有自己独立的动态库文件,在使用PaddlePaddle C-API开发预测程序时,需要自己链接MKL链接库。</li>
<li>如果编译时指定编译GPU版本,CUDA相关库会在预测程序运行时动态装载,需要将CUDA相关的库设置到<code class="docutils literal"><span class="pre">LD_LIBRARY_PATH</span></code>环境变量中。</li>
</ol>
</li>
<li>这种方式最为简便,链接相对容易,<strong>在无特殊需求情况下,推荐使用此方式</strong></li>
</ul>
</li>
<li>链接静态库 <code class="docutils literal"><span class="pre">libpaddle_capi_whole.a</span></code><ul>
<li>使用PaddlePaddle C-API 开发预测程序链接<code class="docutils literal"><span class="pre">libpaddle_capi_whole.a</span></code>时,需注意:<ol>
<li>需要指定<code class="docutils literal"><span class="pre">-Wl,--whole-archive</span></code>链接选项。</li>
<li>需要显式地链接 <code class="docutils literal"><span class="pre">gflags</span></code><code class="docutils literal"><span class="pre">glog</span></code><code class="docutils literal"><span class="pre">libz</span></code><code class="docutils literal"><span class="pre">protobuf</span></code> 等第三方库,可在<code class="docutils literal"><span class="pre">PADDLE_ROOT/third_party</span></code>下找到。</li>
<li>如果在编译 C-API 时使用OpenBLAS数学库,需要显示地链接<code class="docutils literal"><span class="pre">libopenblas.a</span></code></li>
<li>如果在编译 C-API 是使用MKL数学库,需要显示地链接MKL的动态库。</li>
</ol>
</li>
</ul>
</li>
<li>链接静态库 <code class="docutils literal"><span class="pre">libpaddle_capi_layers.a</span></code><code class="docutils literal"><span class="pre">libpaddle_capi_engine.a</span></code><ul>
<li>使用PaddlePaddle C-API 开发预测程序链接<code class="docutils literal"><span class="pre">libpaddle_capi_whole.a</span></code>时,需注意:<ol>
<li>这种链接方式主要用于移动端预测。</li>
<li>为了减少生成链接库的大小把<code class="docutils literal"><span class="pre">libpaddle_capi_whole.a</span></code>拆成以上两个静态链接库。</li>
<li>需指定<code class="docutils literal"><span class="pre">-Wl,--whole-archive</span> <span class="pre">-lpaddle_capi_layers</span></code>&nbsp;<code class="docutils literal"><span class="pre">-Wl,--no-whole-archive</span> <span class="pre">-lpaddle_capi_engine</span></code> 进行链接。</li>
<li>第三方依赖库需要按照与方式2同样方法显示地进行链接。</li>
</ol>
</li>
</ul>
</li>
</ol>
</div>
</div>


           </div>
          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="organization_of_the_inputs_cn.html" class="btn btn-neutral float-right" title="输入/输出数据组织" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
348
        <a href="index_cn.html" class="btn btn-neutral" title="C-API预测库" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; 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 = {
378
            URL_ROOT:'../../',
379 380 381
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
382
            HAS_SOURCE:  true
383 384
        };
    </script>
385 386 387 388
      <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="../../_static/translations.js"></script>
389
      <script type="text/javascript" src="https://cdn.bootcss.com/mathjax/2.7.0/MathJax.js"></script>
390

391 392 393 394
  

  
  
395
    <script type="text/javascript" src="../../_static/js/theme.js"></script>
396
  
397

398
  
399 400 401 402 403 404 405
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   
406 407 408

</body>
</html>