使用指南PaddlePaddle安装编译问题汇总和基本使用概念
Posted 飞桨PaddlePaddle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用指南PaddlePaddle安装编译问题汇总和基本使用概念相关的知识,希望对你有一定的参考价值。
导语
本周将汇总整理PaddlePaddle的安装编译方法,发布系列推文。推文目录如下:
周一:用pip安装PaddlePaddle
周二:用Docker安装运行PaddlePaddle
周三:用Docker编译和测试PaddlePaddle
周四:从源码编译PaddlePaddle
周五:PaddlePaddle安装编译问题汇总和基本使用概念
欢迎大家在留言区分享您在相应环节中遇到的问题,我们会 一 一为您解答,同时也会选择一部分展示在周五汇总贴中;欢迎大家在留言区提出您的反馈,表达您的见解;本周每篇推文点赞数最多的一条留言会被置顶(当日推文统计时间截止次日中午12点)并赠送小礼品一份(PaddlePaddle定制帽衫)
编写|PaddlePaddle
排版|wangp
Part1
安装编译问题汇总
用户在使用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
这是目前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>
如果运行 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即可
出现这个问题的主要原因是,没有找到和当前系统匹配的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 再安装
先查看一下是否曾经安装过paddle v1版本,有的话需要先卸载:pip uninstall py_paddle paddle
然后安装paddle的python环境, 在build目录下执行
pip install python/dist/paddle*.whl && pip install ../paddle/dist/py_paddle*.whl
PaddlePaddle使用avx SIMD指令提高cpu执行效率,因此错误的使用二进制发行版可能会导致这种错误,请选择正确的版本
如果出现以下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包
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: 是一条时间序列,且序列的每一个元素还是一个时间序列
不同的数据类型和序列模式返回的格式不同,列表如下
其中,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)
*原创贴,版权所有,未经许可,禁止转载
*值班小Paddle:wangp
*欢迎在留言区分享您的观点
以上是关于使用指南PaddlePaddle安装编译问题汇总和基本使用概念的主要内容,如果未能解决你的问题,请参考以下文章