首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【使用指南】PaddlePaddle安装编译问题汇总和基本使用概念

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

作者头像
用户1386409
发布2018-03-15 14:38:35
1.5K0
发布2018-03-15 14:38:35
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle

编写|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)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档