<!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>用Docker编译和测试PaddlePaddle &mdash; PaddlePaddle  文档</title>
  

  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
  

  
  
        <link rel="index" title="索引"
              href="../../genindex.html"/>
        <link rel="search" title="搜索" href="../../search.html"/>
    <link rel="top" title="PaddlePaddle  文档" href="../../index.html"/>
        <link rel="up" title="安装与编译" href="../../getstarted/build_and_install/index_cn.html"/>
        <link rel="next" title="从源码编译" href="../../getstarted/build_and_install/build_from_source_cn.html"/>
        <link rel="prev" title="使用Docker安装运行" href="../../getstarted/build_and_install/docker_install_cn.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 current"><a class="reference internal" href="../../getstarted/index_cn.html">新手入门</a></li>
<li class="toctree-l1"><a class="reference internal" href="../index_cn.html">进阶指南</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/index_cn.html">API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index_cn.html">FAQ</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 current"><a class="reference internal" href="../../getstarted/index_cn.html">新手入门</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="../../getstarted/build_and_install/index_cn.html">安装与编译</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../../getstarted/build_and_install/pip_install_cn.html">使用pip安装</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getstarted/build_and_install/docker_install_cn.html">使用Docker安装运行</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">用Docker编译和测试PaddlePaddle</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getstarted/build_and_install/build_from_source_cn.html">从源码编译</a></li>
</ul>
</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="../index_cn.html">进阶指南</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../usage/cmd_parameter/index_cn.html">设置命令行参数</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../usage/cmd_parameter/use_case_cn.html">使用案例</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/cmd_parameter/arguments_cn.html">参数概述</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/cmd_parameter/detail_introduction_cn.html">细节描述</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../usage/cluster/cluster_train_cn.html">分布式训练</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../usage/cluster/fabric_cn.html">fabric集群</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/cluster/openmpi_cn.html">openmpi集群</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/cluster/k8s_cn.html">kubernetes单机</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/cluster/k8s_distributed_cn.html">kubernetes distributed分布式</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/cluster/k8s_aws_cn.html">AWS上运行kubernetes集群训练</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../usage/capi/index_cn.html">PaddlePaddle C-API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../usage/capi/compile_paddle_lib_cn.html">编译 PaddlePaddle 预测库</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/capi/organization_of_the_inputs_cn.html">输入/输出数据组织</a></li>
<li class="toctree-l3"><a class="reference internal" href="../usage/capi/workflow_of_capi_cn.html">C-API 使用流程</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="contribute_to_paddle_cn.html">如何贡献代码</a></li>
<li class="toctree-l2"><a class="reference internal" href="write_docs_cn.html">如何贡献/修改文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deep_model/rnn/index_cn.html">RNN相关模型</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../deep_model/rnn/rnn_config_cn.html">RNN配置</a></li>
<li class="toctree-l3"><a class="reference internal" href="../deep_model/rnn/recurrent_group_cn.html">Recurrent Group教程</a></li>
<li class="toctree-l3"><a class="reference internal" href="../deep_model/rnn/hierarchical_layer_cn.html">支持双层序列作为输入的Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="../deep_model/rnn/hrnn_rnn_api_compare_cn.html">单双层RNN API对比介绍</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../optimization/gpu_profiling_cn.html">GPU性能分析与调优</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../api/index_cn.html">API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/v2/model_configs.html">模型配置</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">数据访问</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">训练与应用</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">data_feeder</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">param_attr</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>
<li class="toctree-l3"><a class="reference internal" href="../../api/v2/fluid/io.html">io</a></li>
</ul>
</li>
</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>
</ul>

        
    </nav>
    
    <section class="doc-content-wrap">

      

 







<div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      
        <li><a href="../../getstarted/index_cn.html">新手入门</a> > </li>
      
        <li><a href="../../getstarted/build_and_install/index_cn.html">安装与编译</a> > </li>
      
    <li>用Docker编译和测试PaddlePaddle</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="dockerpaddlepaddle">
<span id="dockerpaddlepaddle"></span><h1>用Docker编译和测试PaddlePaddle<a class="headerlink" href="#dockerpaddlepaddle" title="永久链接至标题">¶</a></h1>
<div class="section" id="">
<span id="id1"></span><h2>需要的软硬件<a class="headerlink" href="#" title="永久链接至标题">¶</a></h2>
<p>为了开发PaddlePaddle,我们需要</p>
<ol class="simple">
<li>一台电脑,可以装的是 Linux, BSD, Windows 或者 MacOS 操作系统,以及</li>
<li>Docker。</li>
</ol>
<p>不需要依赖其他任何软件了。即便是 Python 和 GCC 都不需要,因为我们会把所有编译工具都安装进一个 Docker image 里。</p>
</div>
<div class="section" id="">
<span id="id2"></span><h2>总体流程<a class="headerlink" href="#" title="永久链接至标题">¶</a></h2>
<ol>
<li><p class="first">获取源码</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>git clone https://github.com/paddlepaddle/paddle
</pre></div>
</div>
</li>
<li><p class="first">安装开发工具到 Docker image 里</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="nb">cd</span> paddle<span class="p">;</span> docker build -t paddle:dev .
</pre></div>
</div>
<p>请注意这个命令结尾处的 <code class="docutils literal"><span class="pre">.</span></code>;它表示 <code class="docutils literal"><span class="pre">docker</span> <span class="pre">build</span></code> 应该读取当前目录下的 <a class="reference external" href="https://github.com/PaddlePaddle/Paddle/blob/develop/Dockerfile"><code class="docutils literal"><span class="pre">Dockerfile</span></code>文件</a>,按照其内容创建一个名为 <code class="docutils literal"><span class="pre">paddle:dev</span></code> 的 Docker image,并且把各种开发工具安装进去。</p>
</li>
<li><p class="first">编译</p>
<p>以下命令启动一个 Docker container 来执行 <code class="docutils literal"><span class="pre">paddle:dev</span></code> 这个 Docker image,同时把当前目录(源码树根目录)映射为 container 里的 <code class="docutils literal"><span class="pre">/paddle</span></code> 目录,并且运行 <code class="docutils literal"><span class="pre">Dockerfile</span></code> 描述的默认入口程序 <a class="reference external" href="https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build.sh"><code class="docutils literal"><span class="pre">build.sh</span></code></a>。这个脚本调用 <code class="docutils literal"><span class="pre">cmake</span></code> 和 <code class="docutils literal"><span class="pre">make</span></code> 来编译 <code class="docutils literal"><span class="pre">/paddle</span></code> 里的源码,结果输出到 <code class="docutils literal"><span class="pre">/paddle/build</span></code>,也就是本地的源码树根目录里的 <code class="docutils literal"><span class="pre">build</span></code> 子目录。</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>docker run --rm -v <span class="nv">$PWD</span>:/paddle paddle:dev
</pre></div>
</div>
<p>上述命令编译出一个 CUDA-enabled 版本。如果我们只需要编译一个只支持 CPU 的版本,可以用</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>docker run --rm -e <span class="nv">WITH_GPU</span><span class="o">=</span>OFF -v <span class="nv">$PWD</span>:/paddle paddle:dev
</pre></div>
</div>
</li>
<li><p class="first">运行单元测试</p>
<p>用本机的第一个 GPU 来运行包括 GPU 单元测试在内的所有单元测试:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="nv">NV_GPU</span><span class="o">=</span><span class="m">0</span> nvidia-docker run --rm -v <span class="nv">$PWD</span>:/paddle paddle:dev bash -c <span class="s2">&quot;cd /paddle/build; ctest&quot;</span>
</pre></div>
</div>
<p>如果编译的时候我们用了 <code class="docutils literal"><span class="pre">WITH_GPU=OFF</span></code> 选项,那么编译过程只会产生 CPU-based 单元测试,那么我们也就不需要 nvidia-docker 来运行单元测试了。我们只需要:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>docker run --rm -v <span class="nv">$PWD</span>:/paddle paddle:dev bash -c <span class="s2">&quot;cd /paddle/build; ctest&quot;</span>
</pre></div>
</div>
<p>有时候我们只想运行一个特定的单元测试,比如 <code class="docutils literal"><span class="pre">memory_test</span></code>,我们可以</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>nvidia-docker run --rm -v <span class="nv">$PWD</span>:/paddle paddle:dev bash -c <span class="s2">&quot;cd /paddle/build; ctest -V -R memory_test&quot;</span>
</pre></div>
</div>
</li>
<li><p class="first">清理</p>
<p>有时候我们会希望清理掉已经下载的第三方依赖以及已经编译的二进制文件。此时只需要:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>rm -rf build
</pre></div>
</div>
</li>
</ol>
</div>
<div class="section" id="docker">
<span id="docker"></span><h2>为什么要 Docker 呀?<a class="headerlink" href="#docker" title="永久链接至标题">¶</a></h2>
<ul>
<li><p class="first">什么是 Docker?</p>
<p>如果您没有听说 Docker,可以把它想象为一个类似 virtualenv 的系统,但是虚拟的不仅仅是 Python 的运行环境。</p>
</li>
<li><p class="first">Docker 还是虚拟机?</p>
<p>有人用虚拟机来类比 Docker。需要强调的是:Docker 不会虚拟任何硬件,Docker container 里运行的编译工具实际上都是在本机的 CPU 和操作系统上直接运行的,性能和把编译工具安装在本机运行一样。</p>
</li>
<li><p class="first">为什么用 Docker?</p>
<p>把工具和配置都安装在一个 Docker image 里可以标准化编译环境。这样如果遇到问题,其他人可以复现问题以便帮助。</p>
<p>另外,对于习惯使用Windows和MacOS的开发者来说,使用Docker就不用配置交叉编译环境了。</p>
</li>
<li><p class="first">我可以选择不用Docker吗?</p>
<p>当然可以。大家可以用把开发工具安装进入 Docker image 一样的方式,把这些工具安装到本机。这篇文档介绍基于 Docker 的开发流程,是因为这个流程比其他方法都更简便。</p>
</li>
<li><p class="first">学习 Docker 有多难?</p>
<p>理解 Docker 并不难,大概花十分钟看一下<a class="reference external" href="https://zhuanlan.zhihu.com/p/19902938">这篇文章</a>。这可以帮您省掉花一小时安装和配置各种开发工具,以及切换机器时需要新安装的辛苦。别忘了 PaddlePaddle 更新可能导致需要新的开发工具。更别提简化问题复现带来的好处了。</p>
</li>
<li><p class="first">我可以用 IDE 吗?</p>
<p>当然可以,因为源码就在本机上。IDE 默认调用 make 之类的程序来编译源码,我们只需要配置 IDE 来调用 Docker 命令编译源码即可。</p>
<p>很多 PaddlePaddle 开发者使用 Emacs。他们在自己的 <code class="docutils literal"><span class="pre">~/.emacs</span></code> 配置文件里加两行</p>
<div class="highlight-emacs"><div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">global-set-key</span> <span class="s">&quot;\C-cc&quot;</span> <span class="ss">&#39;compile</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">compile-command</span>
 <span class="s">&quot;docker run --rm -it -v $(git rev-parse --show-toplevel):/paddle paddle:dev&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>就可以按 <code class="docutils literal"><span class="pre">Ctrl-C</span></code> 和 <code class="docutils literal"><span class="pre">c</span></code> 键来启动编译了。</p>
</li>
<li><p class="first">可以并行编译吗?</p>
<p>是的。我们的 Docker image 运行一个 <a class="reference external" href="https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/docker/build.sh">Bash 脚本</a>。这个脚本调用 <code class="docutils literal"><span class="pre">make</span> <span class="pre">-j$(nproc)</span></code> 来启动和 CPU 核一样多的进程来并行编译。</p>
</li>
</ul>
</div>
<div class="section" id="">
<span id="id3"></span><h2>可能碰到的问题<a class="headerlink" href="#" title="永久链接至标题">¶</a></h2>
<ul>
<li><p class="first">Docker 需要 sudo</p>
<p>如果用自己的电脑开发,自然也就有管理员权限(sudo)了。如果用公用的电脑开发,需要请管理员安装和配置好 Docker。此外,PaddlePaddle 项目在努力开始支持其他不需要 sudo 的集装箱技术,比如 rkt。</p>
</li>
<li><p class="first">在 Windows/MacOS 上编译很慢</p>
<p>Docker 在 Windows 和 MacOS 都可以运行。不过实际上是运行在一个 Linux 虚拟机上。可能需要注意给这个虚拟机多分配一些 CPU 和内存,以保证编译高效。具体做法请参考<a class="reference external" href="https://github.com/PaddlePaddle/Paddle/issues/627">这个issue</a>。</p>
</li>
<li><p class="first">磁盘不够</p>
<p>本文中的例子里,<code class="docutils literal"><span class="pre">docker</span> <span class="pre">run</span></code> 命令里都用了 <code class="docutils literal"><span class="pre">--rm</span></code> 参数,这样保证运行结束之后的 containers 不会保留在磁盘上。可以用 <code class="docutils literal"><span class="pre">docker</span> <span class="pre">ps</span> <span class="pre">-a</span></code> 命令看到停止后但是没有删除的 containers。<code class="docutils literal"><span class="pre">docker</span> <span class="pre">build</span></code> 命令有时候会产生一些中间结果,是没有名字的 images,也会占用磁盘。可以参考<a class="reference external" href="https://zaiste.net/posts/removing_docker_containers/">这篇文章</a>来清理这些内容。</p>
</li>
</ul>
</div>
</div>


           </div>
          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="../../getstarted/build_and_install/build_from_source_cn.html" class="btn btn-neutral float-right" title="从源码编译" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="../../getstarted/build_and_install/docker_install_cn.html" class="btn btn-neutral" title="使用Docker安装运行" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </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 = {
            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="../../_static/translations.js"></script>
      <script type="text/javascript" src="https://cdn.bootcss.com/mathjax/2.7.0/MathJax.js"></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>