【使用指南】PaddlePaddle安装编译问题汇总和基本使用概念

原创
2018/02/02 18:19
阅读数 233

导语

本周将汇总整理PaddlePaddle的安装编译方法,发布系列推文。推文目录如下:


周一:用pip安装PaddlePaddle

周二:用Docker安装运行PaddlePaddle

周三:用Docker编译和测试PaddlePaddle

周四:从源码编译PaddlePaddle

周五:PaddlePaddle安装编译问题汇总和基本使用概念


欢迎大家在留言区分享您在相应环节中遇到的问题,我们会 一 一为您解答,同时也会选择一部分展示在周五汇总贴中;欢迎大家在留言区提出您的反馈,表达您的见解;本周每篇推文点赞数最多的一条留言会被置顶(当日推文统计时间截止次日中午12点)并赠送小礼品一份(PaddlePaddle定制帽衫)


编写PaddlePaddle

排版|wangp



Part1

安装编译问题汇总


640?wx_fmt=png 640?wx_fmt=png

用户在使用PaddlePaddle GPU的Docker镜像的时候,常常出现 Cuda Error: CUDA driver version is insufficient for CUDA runtime version, 原因在于没有把机器上CUDA相关的驱动和库映射到容器内部。 具体的解决方法是:

$ export CUDA_SO="$(\ls usr/lib64/libcuda* | xargs -I{} echo '-v {}:{}') $(\ls /usr/lib64/libnvidia* | xargs -I{} echo '-v {}:{}')"


$ export DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}')


$ docker run ${ CUDA_SO} ${ DEVICES} -it paddlepaddle/paddle:latest-gpu


640?wx_fmt=png 640?wx_fmt=png

这是目前CMake寻找Python的逻辑存在缺陷,如果系统安装了多个Python版本,CMake找到的Python库和Python解释器版本可能有不一致现象,导致编译PaddlePaddle失败。正确的解决方法是, 用户强制指定特定的Python版本,具体操作如下:

cmake .. -DPYTHON_EXECUTABLE=<exc_path> -DPYTHON_LIBRARY=<lib_path>  -DPYTHON_INCLUDE_DIR=<inc_path>

用户需要指定本机上Python的路径:<exc_path>, <lib_path>, <inc_path>


640?wx_fmt=png 640?wx_fmt=png

如果运行 paddle version, 出现 PaddlePaddle 0.0.0;或者运行 cmake ..,出现

CMake Warning at cmake/version.cmake:20 (message):


  Cannot add paddle version from git tag

那么用户需要拉取所有的远程分支到本机,命令为 git fetch upstream,然后重新cmake即可


640?wx_fmt=png 640?wx_fmt=png

出现这个问题的主要原因是,没有找到和当前系统匹配的paddlepaddle安装包。最新的paddlepaddle python安装包支持Linux x86_64和MacOS 10.12操作系统,并安装了python 2.7和pip 9.0.1


更新 pip 包的方法是:

pip install --upgrade pip

如果还不行,可以执行 python -c "import pip; print(pip.pep425tags.get_supported())" 获取当前系统支持的python包的后缀, 并对比是否和正在安装的后缀一致


如果系统支持的是 linux_x86_64 而安装包是 manylinux1_x86_64 ,需要升级pip版本到最新; 如果系统支持 manylinux1_x86_64 而安装包(本地)是 linux_x86_64 ,可以重命名这个whl包为 manylinux1_x86_64 再安装


640?wx_fmt=png 640?wx_fmt=png

先查看一下是否曾经安装过paddle v1版本,有的话需要先卸载:pip uninstall py_paddle paddle

然后安装paddle的python环境, 在build目录下执行

pip install python/dist/paddle*.whl && pip install ../paddle/dist/py_paddle*.whl


640?wx_fmt=png 640?wx_fmt=png

PaddlePaddle使用avx SIMD指令提高cpu执行效率,因此错误的使用二进制发行版可能会导致这种错误,请选择正确的版本



640?wx_fmt=png 640?wx_fmt=png

如果出现以下python相关的单元测试都过不了的情况:

24 - test_PyDataProvider (Failed)

26 - test_RecurrentGradientMachine (Failed)

27 - test_NetworkCompare (Failed)

28 - test_PyDataProvider2 (Failed)

32 - test_Prediction (Failed)

33 - test_Compare (Failed)

34 - test_Trainer (Failed)

35 - test_TrainerOnePass (Failed)

36 - test_CompareTwoNets (Failed)

37 - test_CompareTwoOpts (Failed)

38 - test_CompareSparse (Failed)

39 - test_recurrent_machine_generation (Failed)

40 - test_PyDataProviderWrapper (Failed)

41 - test_config_parser (Failed)

42 - test_swig_api (Failed)

43 - layers_test (Failed)

并且查询PaddlePaddle单元测试的日志,提示:

paddle package is already in your PYTHONPATH. But unittest need a clean environment.


Please uninstall paddle package before start unittest. Try to 'pip uninstall paddle'.

解决办法是:

卸载PaddlePaddle包 pip uninstall paddle, 清理掉老旧的PaddlePaddle安装包,使得单元测试有一个干净的环境。如果PaddlePaddle包已经在python的site-packages里面,单元测试会引用site-packages里面的python包,而不是源码目录里 /python 目录下的python包。同时,即便设置 PYTHONPATH/python 也没用,因为python的搜索路径是优先已经安装的python包


640?wx_fmt=png 640?wx_fmt=png

make[2]: *** [third_party/mklml/src/extern_mklml-stamp/extern_mklml-download] 错误 4


make[1]: *** [CMakeFiles/extern_mklml.dir/all] 错误 2


make[1]: *** 正在等待未完成的任务....

原因:网速或SSL链接原因,导致MKLML库下载不成功。解决办法是:手动下载并安装,具体步骤如下:

// 1. 进入对应的目录

cd build/third_party/mklml/src/extern_mklml


// 2. 查看包的大小, 正常情况下是75M,如果小于75M,即下载失败:

du -sh mklml_lnx_2018.0.1.20171007.tgz


// 3. 手动下载且解压缩,并手动生成download成功标签:

wget --no-check-certificate https://github.com/01org/mkl-dnn/releases/download/v0.11/mklml_lnx_2018.0.1.20171007.tgz -c -O mklml_lnx_2018.0.1.20171007.tgz

tar zxf mklml_lnx_2018.0.1.20171007.tgz

touch ../extern_mklml-stamp/extern_mklml-download


// 4. 接着编译即可



Part2

基本使用概念


PaddlePaddle是源于百度的一个深度学习平台。PaddlePaddle为深度学习研究人员提供了丰富的API,可以轻松地完成神经网络配置,模型训练等任务。 这里将介绍PaddlePaddle的基本使用概念, 在使用该文档之前,请参考周一至周四的文章完成PaddlePaddle的安装


 1 

配置网络

加载PaddlePaddle

在进行网络配置之前,首先需要加载相应的Python库,并进行初始化操作

import paddle.v2 as paddle

import numpy as np

paddle.init(use_gpu=False)

搭建神经网络

搭建神经网络就像使用积木搭建宝塔一样。在PaddlePaddle中,layer是我们的积木,而神经网络是我们要搭建的宝塔。我们使用不同的layer进行组合,来搭建神经网络。 宝塔的底端需要坚实的基座来支撑,同样,神经网络也需要一些特定的layer作为输入接口,来完成网络的训练


例如,我们可以定义如下layer来描述神经网络的输入:

x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(2))


y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1))

其中x表示输入数据是一个维度为2的稠密向量,y表示输入数据是一个维度为1的稠密向量


PaddlePaddle支持不同类型的输入数据,主要包括四种类型,和三种序列模式


四种数据类型:


dense_vector:稠密的浮点数向量

sparse_binary_vector:稀疏的01向量,即大部分值为0,但有值的地方必须为1

sparse_float_vector:稀疏的向量,即大部分值为0,但有值的部分可以是任何浮点数

integer:整数标签


三种序列模式:


SequenceType.NO_SEQUENCE:不是一条序列

SequenceType.SEQUENCE:是一条时间序列

SequenceType.SUB_SEQUENCE: 是一条时间序列,且序列的每一个元素还是一个时间序列


不同的数据类型和序列模式返回的格式不同,列表如下

640?wx_fmt=png 640?wx_fmt=png

其中,f代表一个浮点数,i代表一个整数


注意:对sparse_binary_vector和sparse_float_vector,PaddlePaddle存的是有值位置的索引。例如:


对一个5维非序列的稀疏01向量 [0, 1, 1, 0, 0] ,类型是sparse_binary_vector,返回的是 [1, 2] 

对一个5维非序列的稀疏浮点向量 [0, 0.5, 0.7, 0, 0] ,类型是sparse_float_vector,返回的是 [(1, 0.5), (2, 0.7)] 


在定义输入layer之后,我们可以使用其他layer进行组合。在组合时,需要指定layer的输入来源


例如,我们可以定义如下的layer组合:

y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear())


cost = paddle.layer.square_error_cost

(input=y_predict, label=y)

其中,x与y为之前描述的输入层;而y_predict是接收x作为输入,接上一个全连接层;cost接收y_predict与y作为输入,接上平方误差层


最后一层cost中记录了神经网络的所有拓扑结构,通过组合不同的layer,我们即可完成神经网络的搭建


 2 

训练模型

在完成神经网络的搭建之后,我们首先需要根据神经网络结构来创建所需要优化的parameters,并创建optimizer。 之后,我们可以创建trainer来对网络进行训练

parameters = paddle.parameters.create(cost)

optimizer = paddle.optimizer.Momentum

(momentum=0)

trainer = paddle.trainer.SGD(cost=cost,

                             parameters=parameters,

                             update_equation=optimizer)

其中,trainer接收三个参数,包括神经网络拓扑结构、神经网络参数以及迭代方程


在搭建神经网络的过程中,我们仅仅对神经网络的输入进行了描述。而trainer需要读取训练数据进行训练,PaddlePaddle中通过reader来加载数据

# define training dataset reader

def train_reader():

    train_x = np.array([[1, 1], [1, 2], [3, 4], [5, 2]])

    train_y = np.array([[-2], [-3], [-7], [-7]])

    def reader():

        for i in xrange(train_y.shape[0]):

            yield train_x[i], train_y[i]

    return reader


最终我们可以调用trainer的train方法启动训练:

# define feeding map

feeding = { 'x': 0, 'y': 1}


# event_handler to print training info

def event_handler(event):

    if isinstance(event, paddle.event.EndIteration):

        if event.batch_id % 1 == 0:

            print "Pass %d, Batch %d, Cost %f" % (

                event.pass_id, event.batch_id, event.cost)

# training

trainer.train(

    reader=paddle.batch(train_reader(), batch_size=1),

    feeding=feeding,

    event_handler=event_handler,

    num_passes=100)


640?wx_fmt=png


*原创贴,版权所有,未经许可,禁止转载

*值班小Paddle:wangp

*欢迎在留言区分享您的观点

640?wx_fmt=png 640?wx_fmt=gif

本文分享 CSDN - 飞桨PaddlePaddle。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部