走进国产深度学习框架——百度飞桨(paddlepaddle)

什么是飞桨

飞桨 (PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集深度学习核心框架、基础模型库、端到端开发套件、工具组件和服务平台于一体,2016 年正式开源,是全面开源开放、技术领先、功能完备的产业级深度学习平台。飞桨源于产业实践,始终致力于与产业深入融合。
飞桨logo
在这里插入图片描述

飞桨初体验

体验飞桨的过程在Educoder实训平台进行,我自己还没安装,至于如何安装飞桨,会在文末简单介绍,这篇博客只是做个简单介绍,算是表达自己对国产深度学习框架的支持吧。
飞桨的基础数据类型也是Tensor,对TensorFlow有点了解的同学应该不陌生。Tensor可以简单理解成一个多维数组,一般而言可以有任意多的维度。 不同的Tensor可以具有自己的数据类型和形状,同一Tensor中每个元素的数据类型是一样的, Tensor的形状就是Tensor的维度。

创建数据变量/常量

1.在Paddle中使用paddle.fluid.Tensor()来创建数据变量,可以通过set(array, place, zero_copy=False)接口来设置Tensor的数据。
参数设置:

array (numpy.ndarray) - 要设置的numpy array,支持的数据类型为bool, float32, float64, int8, int32, int64, uint8, uint16。
place (CPUPlace|CUDAPlace|CUDAPinnedPlace) - 要设置的Tensor所在的设备。
zero_copy (bool,可选) - 是否与输入的numpy数组共享内存。此参数仅适用于CPUPlace。默认值为False

示例代码:

# 导入基本的库
import paddle.fluid as fluid
import numpy as np
# 创建Tensor变量
t = fluid.Tensor()
# 设置Tensor的数据,np.ndarray([1, 3])初始化为一行三列的随机浮点数值
t.set(np.ndarray([1, 3]), fluid.CPUPlace())
print(t)

输出:

lod: {
    
    }
dim: 1, 3
layout: NCHW
dtype: double
data: [6.95168e-310 0 4.06211e-317]

可以通过np.array(tensor) 方法转换为numpy.ndarray,这个在实训代码里会用到的:

t_array = np.array(t)
print(t_array)

输出:

[[6.95167802e-310 0.00000000e+000 4.06211189e-317]]

2.还可以通过paddle.fluid.data和paddle.fluid.layers.data来创建数据变量,但仅适用于静态图编程方式中。官方文档提示不推荐使用 paddle.fluid.layers.data ,因其在之后的版本中会被删除。请使用 paddle.fluid.data 。使用时需要指定Tensor的形状信息和数据类型,当遇到无法确定的维度时,可以将相应维度指定为None,如下面的代码片段所示:

import paddle.fluid as fluid
# 定义一个数据类型为int64的二维数据变量x,x第一维的维度为3,第二个维度未知,要在程序执行过程中才能确定,因此x的形状可以指定为[3, None]
data = fluid.data(name="x", shape=[3, None], dtype="int64")

3.可以使用 fluid.layers.fill_constant 来创建常量, 如下代码将创建一个维度为[3, 4], 数据类型为int64的Tensor,其中所有元素均为16(value参数所指定的值)。

 import paddle.fluid as fluid
 data = fluid.layers.fill_constant(shape=[3, 4], value=16, dtype='int64')

需要注意的是,在静态图编程方式中,上述2和3定义的Tensor并不具有值(即使创建常量的时候指定了value),它们仅表示将要执行的操作,在网络执行时(训练或者预测)才会进行真正的赋值操作,您不能直接打印上面的data,需创建一个打印算子(Operator),或在网络执行时通过Fetch_list参数指定需要获取的变量结果后再打印。

网络搭建

数据操作

在Paddle的Fluid中,数据计算类API统一称为Operator(算子),简称OP,所有对数据的操作都由OP表示,神经网络的创建就是使用这些内置指令来描述的。在Python端,Fluid中的OP被一步封装入paddle.fluid.layers,paddle.fluid.nets 等模块。其中大部分被封装在paddle.fluid.layers,例如:
在这里插入图片描述

搭建网络与执行器

1)paddle里需要用执行器(fluid.Executor)来执行各种操作,另外定义Executor时需要指定在哪个设备上运行,这里用CPUPlace()来让代码则CPU上运行。
2)与Tensorflow不同,paddle没有session,但是有程序(Program)的概念,定义的操作是默认添加到默认程序(fluid.default_main_program())。
3)执行器执行(Executor.run)时要指定运行哪个程序,还需要传入feed、fetch_list和return_numpy等参数。其中fetch_list控制输出的结果,可以加入想要获取的变量用于后期输出;return_numpy告诉Executor返回numpy数组而不是paddle的tensor,这便于我们打印结果。
例:使用Fluid创建5个元素的一维数组,其中每个元素都为 1

# 定义数组维度及数据类型
data = fluid.layers.ones(shape=[5], dtype='int64')
# 准备运行网络
place = fluid.CPUPlace()# 在CPU上执行运算
exe = fluid.Executor(place)# 创建执行器
exe.run(fluid.default_startup_program())# 网络参数初始化
# 运行网络
ones_result = exe.run(
    fluid.default_main_program(), # 默认执行程序
    fetch_list=[data], # 获取数据data
    return_numpy=True)
# 输出结果
print(ones_result[0])
上面代码的结果为:
[1 1 1 1 1 ]

网络运行

1、paddle.fluid.executor.Executor(place)
Executor支持单GPU、多GPU以及CPU运行。在Executor构造时,需要传入设备。注意:该API仅支持【静态图】模式
参数:

place (fluid.CPUPlace()|fluid.CUDAPlace(N)) – 该参数表示Executor执行所在的设备,这里的N为GPU对应的ID。
返回:初始化后的 Executor 对象
返回类型:Executor
close()-关闭执行器。该接口主要用于对于分布式训练,调用该接口后不可以再使用该执行器。该接口会释放在PServers上和目前Trainer有关联的资源。
    返回:无

示例代码:

import paddle.fluid as fluid
cpu = fluid.CPUPlace()
exe = fluid.Executor(cpu)
# 执行训练或测试过程
exe.close()

2、run(program=None, feed=None, fetch_list=None, feed_var_name='feed', fetch_var_name='fetch', scope=None, return_numpy=True, use_program_cache=False)
执行指定的Program或者CompiledProgram。需要注意的是,执行器会执行Program或CompiledProgram中的所有算子,而不会根据fetch_list对Program或CompiledProgram中的算子进行裁剪。同时,需要传入运行该模型用到的scope,如果没有指定scope,执行器将使用全局scope,即fluid.global_scope()。
参数:

program (Program|CompiledProgram) – 该参数为被执行的Program或CompiledProgram,如果未提供该参数,即该参数为None,在该接口内,main_program将被设置为fluid.default_main_program()。默认为:None。
feed (list|dict) – 该参数表示模型的输入变量。如果是单卡训练,feed 为 dict 类型,如果是多卡训练,参数 feed 可以是 dict 或者 list 类型变量,如果该参数类型为 dict ,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU),即输入数据被均匀分配到不同设备上;如果该参数类型为 list ,则列表中的各个元素都会直接分别被拷贝到各设备中。默认为:None。
fetch_list (list) – 该参数表示模型运行之后需要返回的变量。默认为:None。
feed_var_name (str) – 该参数表示数据输入算子(feed operator)的输入变量名称。默认为:"feed"。
fetch_var_name (str) – 该参数表示结果获取算子(fetch operator)的输出变量名称。默认为:"fetch"。
scope (Scope) – 该参数表示执行当前program所使用的作用域,用户可以为不同     的program指定不同的作用域。默认值:fluid.global_scope()。
return_numpy (bool) – 该参数表示是否将返回返回的计算结果(fetch list中指定的变量)转化为numpy;如果为False,则每个变量返回的类型为LoDTensor,否则返回变量的类型为numpy.ndarray。默认为:True。
use_program_cache (bool) – 该参数表示是否对输入的Program进行缓存。如果该参数为True,在以下情况时,模型运行速度可能会更快:输入的program为 fluid.Program ,并且模型运行过程中,调用该接口的参数(program、 feed变量名和fetch_list变量)名始终不变。默认为:False。
返回:返回fetch_list中指定的变量值
返回类型:List

示例代码:

# 导入基本的库
import paddle.fluid as fluid
import numpy as np
# 定义数组维度及数据类型,可以修改shape参数定义任意大小的数组
t1 = fluid.data(name="x", shape=[3], dtype='float32')
t2 = fluid.data(name="y", shape=[3], dtype='float32')
# 组建网络(此处网络仅由一个操作构成,即elementwise_add)
result = fluid.layers.elementwise_max(t1,t2)
# 准备运行网络
cpu = fluid.CPUPlace() # 定义运算设备,这里选择在CPU下训练
exe = fluid.Executor(cpu) # 创建执行器
exe.run(fluid.default_startup_program()) # 网络参数初始化
# 运行网络
outs = exe.run(
    # 给变量t1,t2赋值
   feed={
    
    "t1": np.array([2, 3, 4]),"t2": np.array([1, 5, 2])},
    # 获取的变量结果
    fetch_list=[t1, t2, result]
    )
# 打印计算结果
print(t1, t2, outs)

输出:

[array([2, 3, 4])), array([1, 5, 2], array([2, 5, 4])]

安装飞桨

这里介绍常用的安装(根据飞桨官网提供的信息):

windows环境下使用pip安装CPU版本

1、需要确认您的 Windows 7/8/10 是 64 位操作系统*
2、确认您需要安装PaddlePaddle 的 python版本是3.5.1+/3.6+/3.7+,因为您计算机可能有多个python

python --version

3、如果python版本不是3.5.1+/3.6+/3.7+,请您确认python的路径是否是您预期的位置

where python

4、其中python3.5.1+/3.6+/3.7+的安装目录应位于第一行,如果不是,您可以通过以下任意方法调整:
将所有命令行中的 python替换为 python3的安装路径(例如C:\Python36\python.exe)
在环境变量中,将 python3的安装路径设置在第一顺序位(请在控制面板->系统属性->环境变量->PATH中修改)
5、如果python版本是3.5.1+/3.6+/3.7+,请确认 Python 有对应的 pip,检查 Python 对应的 pip 的版本,确认是 9.0.1+:

python -m ensurepip
python -m pip --version

6、确认 Python 和 pip 是 64 bit,并且处理器架构是x86_64(或称作 x64、Intel 64、AMD64)架构,目前PaddlePaddle不支持arm64架构
下面的第一行输出的是 “64bit”,第二行输出的是 “x86_64”、“x64” 或 “AMD64” 即可:

python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"

7、执行以下命令安装(推荐使用百度源):

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

python -m pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple

windows环境下使用pip安装CUDA10版本

1、需要确认您的 Windows 7/8/10 是 64 位操作系统*
2、需要您具有支持 CUDA 的 nVidia 显卡,且正确安装 CUDA 10
注意:Windows 仅支持 CUDA 9.0/10.0 的单卡模式;不支持 CUDA 9.1/9.2/10.1
3、需要使用 cuDNN 7.6+
4、Windows 暂不支持 NCCL
5、确认您需要安装PaddlePaddle 的 python版本是3.5.1+/3.6+/3.7+,因为您计算机可能有多个python

python --version

6、如果python版本不是3.5.1+/3.6+/3.7+,请您确认python的路径是否是您预期的位置

where python

7、其中python 3.5.1+/3.6+/3.7+的安装目录应位于第一行,如果不是,您可以通过以下任意方法调整:
将所有命令行中的 python替换为 python3的安装路径(例如C:\Python36\python.exe)
在环境变量中,将 python3的安装路径设置在第一顺序位(请在控制面板->系统属性->环境变量->PATH中修改)
8、如果python版本是3.5.1+/3.6+/3.7+,请确认 Python 有对应的 pip,检查 Python 对应的 pip 的版本,确认是 9.0.1+:

python -m ensurepip
python -m pip --version

9、确认 Python 和 pip 是 64 bit,并且处理器架构是x86_64(或称作 x64、Intel 64、AMD64)架构,目前PaddlePaddle不支持arm64架构
下面的第一行输出的是 “64bit”,第二行输出的是 “x86_64”、“x64” 或 “AMD64” 即可:

python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"

10、执行以下命令安装(推荐使用百度源):

python -m pip install paddlepaddle-gpu==1.8.5.post107 -i https://mirror.baidu.com/pypi/simple

python -m pip install paddlepaddle-gpu==1.8.5.post107 -i https://pypi.tuna.tsinghua.edu.cn/simple

检查是否安装成功

使用 python 进入python解释器,输入import paddle.fluid ,再输入paddle.fluid.install_check.run_check()
如果出现Your Paddle Fluid is installed successfully! ,说明您已成功安装。

文章参考Educoder实训平台 郭明月老师的带你玩转国产人工智能框架实训课程。

猜你喜欢

转载自blog.csdn.net/qq_44725872/article/details/109143956