- fluid
- AsyncExecutor
- BuildStrategy
- CompiledProgram
- cpu_places
- CPUPlace
- create_lod_tensor
- create_random_int_lodtensor
- cuda_pinned_places
- cuda_places
- CUDAPinnedPlace
- CUDAPlace
- DataFeedDesc
- DataFeeder
- default_main_program
- default_startup_program
- DistributeTranspiler
- DistributeTranspilerConfig
- ExecutionStrategy
- Executor
- global_scope
- in_dygraph_mode
- LoDTensor
- LoDTensorArray
- memory_optimize
- name_scope
- ParallelExecutor
- ParamAttr
- Program
- program_guard
- release_memory
- scope_guard
- Tensor
- WeightNormParamAttr
fluid
AsyncExecutor
- class
paddle.fluid.
AsyncExecutor
(place=None, run_mode='') - AsyncExecutor正在积极开发,API可能在短期内进行调整。
Python中的异步执行器。AsyncExecutor利用多核处理器和数据排队的强大功能,使数据读取和融合解耦,每个线程并行运行。
AsyncExecutor不是在python端读取数据,而是接受一个训练文件列表,该列表将在c++中检索,然后训练输入将被读取、解析并在c++代码中提供给训练网络。
- 参数:
- place (fluid.CPUPlace|None) - 指示 executor 将在哪个设备上运行。目前仅支持CPU代码示例:
- data_feed = fluid.DataFeedDesc('data.proto')
- startup_program = fluid.default_startup_program()
- main_program = fluid.default_main_program()
- filelist = ["train_data/part-%d" % i for i in range(100)]
- thread_num = len(filelist) / 4
- place = fluid.CPUPlace()
- async_executor = fluid.AsyncExecutor(place)
- async_executor.run_startup_program(startup_program)
- epoch = 10
- for i in range(epoch):
- async_executor.run(main_program,
- data_feed,
- filelist,
- thread_num,
- [acc],
- debug=False)
注解
对于并行gpu调试复杂网络,您可以在executor上测试。他们有完全相同的参数,并可以得到相同的结果。
目前仅支持CPU
run
(program, data_feed, filelist, thread_num, fetch, mode='', debug=False)- 使用此
AsyncExecutor
来运行program
。
filelist
中包含训练数据集。用户也可以通过在参数 fetch
中提出变量来检查特定的变量, 正如 fluid.Executor
。
但不像 fluid.Executor
, AsyncExecutor
不返回获取到的变量,而是将每个获取到的变量作为标准输出展示给用户。
数据集上的运算在多个线程上执行,每个线程中都会独立出一个线程本地作用域,并在此域中建立运算。所有运算同时更新参数值。
- 参数:
- program (Program) – 需要执行的program。如果没有提供该参数,默认使用
default_main_program
- data_feed (DataFeedDesc) –
DataFeedDesc
对象 - filelist (str) – 一个包含训练数据集文件的文件列表
- thread_num (int) – 并发训练线程数。参照 注解 部分获取合适的设置方法
- fetch (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名
- mode (str) – 该接口的运行模式
- debug (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来
- program (Program) – 需要执行的program。如果没有提供该参数,默认使用
注解
1.该执行器会运行program中的所有运算,不只是那些依赖于fetchlist的运算
2.该类执行器在多线程上运行,每个线程占用一个CPU核。为了实现效率最大化,建议将 thread_num
等于或稍微小于CPU核心数
downloaddata
(_afs_path, local_path, fs_default_name, ugi, file_cnt, hadoop_home='$HADOOP_HOME', process_num=12)- download_data是用于分布式训练的默认下载方法,用户可不使用该方法下载数据。
示例
- exe = fluid.AsyncExecutor()
- exe.download_data("/xxx/xxx/xx/",
- "./data", "afs://
- xxx.xxx.xxx.xxx:9901", "xxx,yyy")
- 参数:
- afs_path (str) - 用户定义的afs_path
- local_path (str) - 下载数据路径
- fs_default_name (str) - 文件系统服务器地址
- ugi (str) - hadoop ugi
- file_cnt (int) - 用户可以指定用于调试的文件号
- hadoop_home (str) - hadoop home path
- process_num (int) - 下载进程号
get_instance
()获取当前节点的实例,以便用户可以在分布式背景下中执行操作。
config_distributed_nodes
()如果用户需要运行分布式AsyncExecutor,则需要进行全局配置,以便获取当前进程的信息。
stop
()在流程结束时,用户应该停止服务器并阻止所有workers。
initserver
(_dist_desc)如果当前进程是server,则初始化当前节点的服务器。
参数:
- dist_desc (str)- 描述如何初始化worker和server的protobuf字符串
initworker
(_dist_desc, startup_program)如果当前进程是worker,则初始化当前节点的worker
参数:
- dist_desc (str)- 描述如何初始化worker和server的protobuf字符串
- startup_program (fluid.Program)- 当前进程的startup program
init_model
()可以从其中一个worker中调用的init_model命令。随之,在server中初始化模型参数。
savemodel
(_save_path)可以从其中一个worker调用的save_model命令。随之,模型参数会保存在server中并上传到文件系统的save_path指定的位置。
参数:
- save_path (str)- 文件系统的保存路径
BuildStrategy
- class
paddle.fluid.
BuildStrategy
BuildStrategy
使用户更精准地控制ParallelExecutor
中SSA图的建造方法。可通过设置ParallelExecutor
中的BuildStrategy
成员来实现此功能。
代码示例
- build_strategy = fluid.BuildStrategy()
- build_strategy.reduce_strategy = fluid.BuildStrategy.ReduceStrategy.Reduce
- train_exe = fluid.ParallelExecutor(use_cuda=True,
- loss_name=loss.name,
- build_strategy=build_strategy)
- train_loss, = train_exe.run([loss.name], feed=feed_dict)
debug_graphviz_path
str类型。它表明了以graphviz格式向文件中写入SSA图的路径,有利于调试。 默认值为”“。
enable_sequential_execution
类型是BOOL。 如果设置为True,则ops的执行顺序将与program中的执行顺序相同。 默认为False。
fuse_elewise_add_act_ops
bool类型。它表明了是否融合(fuse)elementwise_add_op和activation_op。这会使整体执行过程更快一些。默认为False。
fuse_relu_depthwise_conv
BOOL类型,fuse_relu_depthwise_conv指示是否融合relu和depthwise_conv2d,它会节省GPU内存并可能加速执行过程。 此选项仅适用于GPU设备。 默认为False。
gradient_scale_strategy
str类型。在
ParallelExecutor
中,存在三种定义 loss@grad 的方式,分别为CoeffNumDevice
,One
与Customized
。默认情况下,ParallelExecutor
根据设备数目来设置 loss@grad 。如果你想自定义 loss@grad ,你可以选择Customized
方法。默认为CoeffNumDevice
。reduce_strategy
str类型。在
ParallelExecutor
中,存在两种减少策略(reduce strategy),即AllReduce
和Reduce
。如果你需要在所有执行场所上独立地进行参数优化,可以使用AllReduce
。反之,如果使用Reduce
策略,所有参数的优化将均匀地分配给不同的执行场所,随之将优化后的参数广播给其他执行场所。在一些模型中,Reduce
策略执行速度更快一些。默认值为AllReduce
。remove_unnecessary_lock
BOOL类型。如果设置为True, GPU操作中的一些锁将被释放,ParallelExecutor将运行得更快,默认为 True。
sync_batch_norm
- 类型为bool,sync_batch_norm表示是否使用同步的批正则化,即在训练阶段通过多个设备同步均值和方差。
当前的实现不支持FP16培训和CPU。仅在一台机器上进行同步式批正则,不适用于多台机器。
默认为 False。
CompiledProgram
- class
paddle.fluid.
CompiledProgram
(program_or_graph) 编译成一个用来执行的Graph。
首先使用layers(网络层)创建程序。
- (可选)可使用CompiledProgram来在运行之前优化程序。
定义的程序或CompiledProgram由Executor运行。CompiledProgram用于转换程序以进行各种优化。例如,
预先计算一些逻辑,以便每次运行更快。
- 转换Program,使其可以在多个设备中运行。
- 转换Program以进行优化预测或分布式训练。代码示例
- place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
- exe = fluid.Executor(place)
- exe.run(startup)
- compiled_prog = compiler.CompiledProgram(main).with_data_parallel(
- loss_name=loss.name)
- for i in range(5):
- test_loss, = exe.run(compiled_prog,
- feed=feed_dict,
- fetch_list=[loss.name])
- 参数:
- program_or_graph (Graph|Program): 如果它是Program,那么它将首先被降成一个graph,以便进一步优化。如果它是一个graph(以前可能优化过),它将直接用于进一步的优化。注意:只有使用 with_data_parallel 选项编译时才支持graph。
withdata_parallel
(_loss_name=None, build_strategy=None, exec_strategy=None, share_vars_from=None, places=None)配置Program使其以数据并行方式运行。
参数:
- loss_name (str) - 损失函数名称必须在训练过程中设置。 默认None。
- build_strategy (BuildStrategy) - build_strategy用于构建图,因此它可以在具有优化拓扑的多个设备/核上运行。 有关更多信息,请参阅
fluid.BuildStrategy
。 默认None。 - exec_strategy (ExecutionStrategy) - exec_strategy用于选择执行图的方式,例如使用多少线程,每次清理临时变量之前进行的迭代次数。 有关更多信息,请参阅
fluid.ExecutionStrategy
。 默认None。 - share_vars_from (CompiledProgram) - 如果有,此CompiledProgram将共享来自share_vars_from的变量。 share_vars_from指定的Program必须由此CompiledProgram之前的Executor运行,以便vars准备就绪。
- places (list(CUDAPlace)|list(CPUPlace)|None) - 如果提供,则仅在给定位置编译程序。否则,编译时使用的位置由Executor确定,使用的位置由环境变量控制:如果使用GPU,则标记FLAGS_selected_gpus或CUDA_VISIBLE_DEVICES设备;如果使用CPU,则标记CPU_NUM。例如,如果要在GPU 0和GPU 1上运行,请设置places=[fluid.CUDAPlace(0), fluid.CUDAPlace(1)]。如果要在2个CPU核心上运行,请设置places=[fluid.CPUPlace()]*2。返回: self
withinference_optimize
(_config)添加预测优化。
参数:
- config - 用于创建预测器的NativeConfig或AnalysisConfig的实例返回: self
cpu_places
paddle.fluid.
cpuplaces
(_device_count=None)- 创建
fluid.CPUPlace
对象列表。
如果 device_count
为None,则设备数目将由环境变量 CPU_NUM
确定。如果未设置 CPU_NUM
,则设备数目将由 multiprocessing.cpu_count()
确定。
- 参数:
- device_count (None|int) - 设备数目返回: CPUPlace列表
返回类型:out (list(fluid.CPUPlace))
CPUPlace
- class
paddle.fluid.
CPUPlace
- CPUPlace是设备的描述符。它代表一个CPU,可以访问CPUPlace对应的内存。
create_lod_tensor
paddle.fluid.
createlod_tensor
(_data, recursive_seq_lens, place)- 该函数从一个numpy数组,列表或者已经存在的lod tensor中创建一个lod tensor。
通过一下几步实现:
- 检查length-based level of detail (LoD,长度为基准的细节层次),或称recursive_sequence_lengths(递归序列长度)的正确性
- 将recursive_sequence_lengths转化为offset-based LoD(偏移量为基准的LoD)
- 把提供的numpy数组,列表或者已经存在的lod tensor复制到CPU或GPU中(依据执行场所确定)
- 利用offset-based LoD来设置LoD
- 例如:
- 假如我们想用LoD Tensor来承载一词序列的数据,其中每个词由一个整数来表示。现在,我们意图创建一个LoD Tensor来代表两个句子,其中一个句子有两个词,另外一个句子有三个。那么数
data
可以是一个numpy数组,形状为(5,1)。同时,recursive_seq_lens
为 [[2, 3]],表明各个句子的长度。这个长度为基准的recursive_seq_lens
将在函数中会被转化为以偏移量为基准的 LoD [[0, 2, 5]]。 - 参数:
- data (numpy.ndarray|list|LoDTensor) – 容纳着待复制数据的一个numpy数组、列表或LoD Tensor
- recursive_seq_lens (list) – 一组列表的列表, 表明了由用户指明的length-based level of detail信息
- place (Place) – CPU或GPU。 指明返回的新LoD Tensor存储地点返回: 一个fluid LoDTensor对象,包含数据和
recursive_seq_lens
信息
create_random_int_lodtensor
paddle.fluid.
createrandom_int_lodtensor
(_recursive_seq_lens, base_shape, place, low, high)- 该函数创建一个存储多个随机整数的LoD Tensor。
该函数是经常在书中出现的案例,所以我们根据新的API: create_lod_tensor
更改它然后放在LoD Tensor板块里来简化代码。
该函数实现以下功能:
- 根据用户输入的length-based
recursive_seq_lens
(基于长度的递归序列长)和在basic_shape
中的基本元素形状计算LoDTensor的整体形状 - 由此形状,建立numpy数组
使用API:
create_lod_tensor
建立LoDTensor假如我们想用LoD Tensor来承载一词序列,其中每个词由一个整数来表示。现在,我们意图创建一个LoD Tensor来代表两个句子,其中一个句子有两个词,另外一个句子有三个。那么base_shape
为[1], 输入的length-basedrecursive_seq_lens
是 [[2, 3]]。那么LoDTensor的整体形状应为[5, 1],并且为两个句子存储5个词。参数:
- recursive_seq_lens (list) – 一组列表的列表, 表明了由用户指明的length-based level of detail信息
- base_shape (list) – LoDTensor所容纳的基本元素的形状
- place (Place) – CPU或GPU。 指明返回的新LoD Tensor存储地点
- low (int) – 随机数下限
- high (int) – 随机数上限返回: 一个fluid LoDTensor对象,包含数据和
recursive_seq_lens
信息
cuda_pinned_places
paddle.fluid.
cudapinned_places
(_device_count=None)- 创建
fluid.CUDAPinnedPlace
对象列表。
如果 device_count
为None,则设备数目将由环境变量 CPU_NUM
确定。如果未设置 CPU_NUM
,则设备数目将由 multiprocessing.cpu_count()
确定。
- 参数:
- device_count (None|int) - 设备数目返回: CUDAPinnedPlace对象列表
返回类型:out(list(fluid.CUDAPinnedPlace))
cuda_places
paddle.fluid.
cudaplaces
(_device_ids=None)- 创建
fluid.CUDAPlace
对象列表。
如果 device_ids
为None,则首先检查 FLAGS_selected_gpus
的环境变量。如果 FLAGS_selected_gpus=0,1,2
,则返回的列表将为[fluid.CUDAPlace(0), fluid.CUDAPlace(1), fluid.CUDAPlace(2)]。如果未设置标志 FLAGS_selected_gpus
,则将返回所有可见的GPU places。
如果 device_ids
不是None,它应该是GPU的设备ID。例如,如果 device_id=[0,1,2]
,返回的列表将是[fluid.CUDAPlace(0), fluid.CUDAPlace(1), fluid.CUDAPlace(2)]。
- 参数:
- device_ids (None|list(int)|tuple(int)) - GPU的设备ID列表返回: CUDAPlace列表
返回类型:out (list(fluid.CUDAPlace))
CUDAPinnedPlace
- class
paddle.fluid.
CUDAPinnedPlace
- CUDAPinnedPlace是一个设备描述符,它所指代的存储空间可以被GPU和CPU访问。
CUDAPlace
- class
paddle.fluid.
CUDAPlace
- CUDAPlace是一个设备描述符,它代表一个GPU,并且每个CUDAPlace有一个dev_id(设备id)来表明当前CUDAPlace代表的卡数。dev_id不同的CUDAPlace所对应的内存不可相互访问。
DataFeedDesc
- class
paddle.fluid.
DataFeedDesc
(proto_file) - 数据描述符,描述输入训练数据格式。
这个类目前只用于AsyncExecutor(有关类AsyncExecutor的简要介绍,请参阅注释)
DataFeedDesc应由来自磁盘的有效protobuf消息初始化:
- data_feed = fluid.DataFeedDesc('data.proto')
可以参考 paddle/fluid/framework/data_feed.proto
查看我们如何定义message
一段典型的message可能是这样的:
- name: "MultiSlotDataFeed"
- batch_size: 2
- multi_slot_desc {
- slots {
- name: "words"
- type: "uint64"
- is_dense: false
- is_used: true
- }
- slots {
- name: "label"
- type: "uint64"
- is_dense: false
- is_used: true
- }
- }
但是,用户通常不应该关心消息格式;相反,我们鼓励他们在将原始日志文件转换为AsyncExecutor可以接受的训练文件的过程中,使用 Data Generator
生成有效数据描述。
DataFeedDesc也可以在运行时更改。一旦你熟悉了每个字段的含义,您可以修改它以更好地满足您的需要。例如:
- data_feed.set_batch_size(128)
- data_feed.set_dense_slots('wd') # The slot named 'wd' will be dense
- data_feed.set_use_slots('wd') # The slot named 'wd' will be used
- #Finally, the content can be dumped out for debugging purpose:
- print(data_feed.desc())
- 参数:
- proto_file (string) - 包含数据feed中描述的磁盘文件
setbatch_size
(_batch_size)设置batch size,训练期间有效
参数:
- batch_size:batch size代码示例:
- data_feed = fluid.DataFeedDesc('data.proto')
- data_feed.set_batch_size(128)
setdense_slots
(_dense_slots_name)- 指定slot经过设置后将变成密集的slot,仅在训练期间有效。
密集slot的特征将被输入一个Tensor,而稀疏slot的特征将被输入一个lodTensor
- 参数:
- dense_slots_name : slot名称的列表,这些slot将被设置为密集的代码示例:
- data_feed = fluid.DataFeedDesc('data.proto')
- data_feed.set_dense_slots(['words'])
注解
默认情况下,所有slot都是稀疏的
setuse_slots
(_use_slots_name)设置一个特定的slot是否用于训练。一个数据集包含了很多特征,通过这个函数可以选择哪些特征将用于指定的模型。
参数:
- use_slots_name :将在训练中使用的slot名列表代码示例:
- data_feed = fluid.DataFeedDesc('data.proto')
- data_feed.set_use_slots(['words'])
注解
默认值不用于所有slot
desc
()- 返回此DataFeedDesc的protobuf信息
返回:一个message字符串
代码示例:
- data_feed = fluid.DataFeedDesc('data.proto')
- print(data_feed.desc())
DataFeeder
- class
paddle.fluid.
DataFeeder
(feed_list, place, program=None) DataFeeder
负责将reader(读取器)返回的数据转成一种特殊的数据结构,使它们可以输入到Executor
和ParallelExecutor
中。reader通常返回一个minibatch条目列表。在列表中每一条目都是一个样本(sample),它是由具有一至多个特征的列表或元组组成的。
以下是简单用法:
- place = fluid.CPUPlace()
- img = fluid.layers.data(name='image', shape=[1, 28, 28])
- label = fluid.layers.data(name='label', shape=[1], dtype='int64')
- feeder = fluid.DataFeeder([img, label], fluid.CPUPlace())
- result = feeder.feed([([0] * 784, [9]), ([1] * 784, [1])])
在多GPU模型训练时,如果需要提前分别向各GPU输入数据,可以使用 decorate_reader
函数。
- place=fluid.CUDAPlace(0)
- feeder = fluid.DataFeeder(place=place, feed_list=[data, label])
- reader = feeder.decorate_reader(
- paddle.batch(flowers.train(), batch_size=16))
- 参数:
- feed_list (list) – 向模型输入的变量表或者变量表名
- place (Place) – place表明是向GPU还是CPU中输入数据。如果想向GPU中输入数据, 请使用
fluid.CUDAPlace(i)
(i 代表 the GPU id);如果向CPU中输入数据, 请使用fluid.CPUPlace()
- program (Program) – 需要向其中输入数据的Program。如果为None, 会默认使用
default_main_program()
。 缺省值为None
- 抛出异常:
ValueError
– 如果一些变量不在此 Program 中代码示例
- # ...
- place = fluid.CPUPlace()
- feed_list = [
- main_program.global_block().var(var_name) for var_name in feed_vars_name
- ] # feed_vars_name 是一个由变量名组成的列表
- feeder = fluid.DataFeeder(feed_list, place)
- for data in reader():
- outs = exe.run(program=main_program,
- feed=feeder.feed(data))
feed
(iterable)根据feed_list(数据输入表)和iterable(可遍历的数据)提供的信息,将输入数据转成一种特殊的数据结构,使它们可以输入到
Executor
和ParallelExecutor
中。参数:
- iterable (list|tuple) – 要输入的数据返回: 转换结果
返回类型: dict
feedparallel
(_iterable, num_places=None)该方法获取的多个minibatch,并把每个minibatch提前输入进各个设备中。
参数:
- iterable (list|tuple) – 要输入的数据
- num_places (int) – 设备数目。默认为None。返回: 转换结果
返回类型: dict
注解
设备(CPU或GPU)的数目必须等于minibatch的数目
decoratereader
(_reader, multi_devices, num_places=None, drop_last=True)将reader返回的输入数据batch转换为多个mini-batch,之后每个mini-batch都会被输入进各个设备(CPU或GPU)中。
参数:
- reader (fun) – 该参数是一个可以生成数据的函数
- multi_devices (bool) – bool型,指明是否使用多个设备
- num_places (int) – 如果
multi_devices
为True
, 可以使用此参数来设置GPU数目。如果multi_devices
为None
,该函数默认使用当前训练机所有GPU设备。默认为None。 - drop_last (bool) – 如果最后一个batch的大小比
batch_size
要小,则可使用该参数来指明是否选择丢弃最后一个batch数据。 默认为True
返回:转换结果
返回类型: dict
抛出异常: ValueError
– 如果 drop_last
值为False并且data batch与设备不匹配时,产生此异常
default_main_program
paddle.fluid.
default_main_program
()- 此函数用于获取默认或全局main program(主程序)。该主程序用于训练和测试模型。
fluid.layers
中的所有layer函数可以向 default_main_program
中添加operators(算子)和variables(变量)。
default_main_program
是fluid的许多编程接口(API)的Program参数的缺省值。例如,当用户program没有传入的时候,Executor.run()
会默认执行 default_main_program
。
返回: main program
返回类型: Program
default_startup_program
paddle.fluid.
default_startup_program
()- 该函数可以获取默认/全局 startup program (启动程序)。
fluid.layers
中的layer函数会新建参数、readers(读取器)、NCCL句柄作为全局变量。
startup_program会使用内在的operators(算子)去初始化他们,并由layer函数将这些operators追加到startup program中。
该函数将返回默认的或当前的startup_program。用户可以使用 fluid.program_guard
去切换program。
返回: startup program
返回类型: Program
DistributeTranspiler
- class
paddle.fluid.
DistributeTranspiler
(config=None) - 该类可以把fluid program转变为分布式数据并行计算程序(distributed data-parallelism programs),可以有Pserver和NCCL2两种模式。当program在Pserver(全称:parameter server)模式下,
main_program
(主程序)转为使用一架远程parameter server(即pserver,参数服务器)来进行参数优化,并且优化图会被输入到一个pserver program中。在NCCL2模式下,transpiler会在startup_program
中附加一个NCCL_ID
广播算子(broadcasting operators)来实现在该集群中所有工作结点共享NCCL_ID
。调用transpile_nccl2
后, 你 必须 将trainer_id
,num_trainers
参数提供给ParallelExecutor
来启动NCCL2分布式模式。
代码示例
- #pserver模式下
- pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
- trainer_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
- current_endpoint = "192.168.0.1:6174"
- trainer_id = 0
- trainers = 4
- role = os.getenv("PADDLE_TRAINING_ROLE")
- t = fluid.DistributeTranspiler()
- t.transpile(
- trainer_id, pservers=pserver_endpoints, trainers=trainers)
- if role == "PSERVER":
- pserver_program = t.get_pserver_program(current_endpoint)
- pserver_startup_program = t.get_startup_program(current_endpoint,
- pserver_program)
- elif role == "TRAINER":
- trainer_program = t.get_trainer_program()
- # nccl2模式下
- config = fluid.DistributeTranspilerConfig()
- config.mode = "nccl2"
- t = fluid.DistributeTranspiler(config=config)
- t.transpile(trainer_id, workers=workers, current_endpoint=curr_ep)
- exe = fluid.ParallelExecutor(
- use_cuda,
- loss_name=loss_var.name,
- num_trainers=len(trainers.split(",)),
- trainer_id=trainer_id
- )
transpile
(trainer_id, program=None, pservers='127.0.0.1:6174', trainers=1, sync_mode=True, startup_program=None, current_endpoint='127.0.0.1:6174')该方法可以运行该transpiler(转译器)。
参数:
- trainer_id (int) – 当前Trainer worker的id, 如果有n个Trainer worker, id 取值范围为0 ~ n-1
- program (Program|None) – 待transpile(转译)的program, 缺省为
fluid.default_main_program()
- startup_program (Program|None) - 要转译的
startup_program
,默认为fluid.default_startup_program()
- pservers (str) – 内容为Pserver列表的字符串,格式为:按逗号区分不同的Pserver,每个Pserver的格式为 ip地址:端口号
- trainers (int|str) – 在Pserver模式下,该参数指Trainer机的个数;在nccl2模式下,它是一个内容为Trainer终端列表的字符串
- sync_mode (bool) – 是否做同步训练(synchronous training), 默认为True
- startup_program (Program|None) – 待transpile(转译)的startup_program,默认为
fluid.default_main_program()
- current_endpoint (str) – 当需要把program转译(transpile)至NCCL2模式下时,需要将当前endpoint(终端)传入该参数。Pserver模式不使用该参数
gettrainer_program
(_wait_port=True)- 该方法可以得到Trainer侧的program。
返回: Trainer侧的program
返回类型: Program
getpserver_program
(_endpoint)该方法可以得到Pserver(参数服务器)侧的程序
参数:
- endpoint (str) – 当前Pserver终端返回: 当前Pserver需要执行的program
返回类型: Program
getpserver_programs
(_endpoint)该方法可以得到Pserver侧用于分布式训练的
main_program
和startup_program
。参数:
- endpoint (str) – 当前Pserver终端返回: (main_program, startup_program), “Program”类型的元组
返回类型: tuple
getstartup_program
(_endpoint, pserver_program=None, startup_program=None)该函数已停止使用获取当前Pserver的startup_program,如果有多个被分散到不同blocks的变量,则修改operator的输入变量。
参数:
- endpoint (str) – 当前Pserver终端
- pserver_program (Program) – 已停止使用。 先调用get_pserver_program
- startup_program (Program) – 已停止使用。应在初始化时传入startup_program返回: Pserver侧的startup_program
返回类型: Program
DistributeTranspilerConfig
- class
paddle.fluid.
DistributeTranspilerConfig
slicevar_up
(_bool)为多个Pserver(parameter server)将tensor切片, 默认为True。
splitmethod
(_PSDispatcher)- 可使用 RoundRobin 或者 HashName。
注意: 尝试选择最佳方法来达到Pserver间负载均衡。
minblock_size
(_int)- block中分割(split)出的元素个数的最小值。
注意: 根据:issuecomment-369912156 , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看 slice_variable
函数。
ExecutionStrategy
- class
paddle.fluid.
ExecutionStrategy
ExecutionStrategy
允许用户更加精准地控制program在ParallelExecutor
中的运行方式。可以通过在ParallelExecutor
中设置本成员来实现。
代码示例
- exec_strategy = fluid.ExecutionStrategy()
- exec_strategy.num_threads = 4
- train_exe = fluid.ParallelExecutor(use_cuda=True,
- loss_name=loss.name,
- exec_strategy=exec_strategy)
- train_loss, = train_exe.run([loss.name], feed=feed_dict)
allow_op_delay
这是一个bool类型成员,表示是否推迟communication operators(交流运算)的执行,这样做会使整体执行过程更快一些。但是在一些模型中,allow_op_delay会导致程序中断。默认为False。
num_iteration_per_drop_scope
- int型成员。它表明了清空执行时产生的临时变量需要的程序执行重复次数。因为临时变量的形状可能在两次重复过程中保持一致,所以它会使整体执行过程更快。默认值为100。
注解
- 如果在调用
run
方法时获取结果数据,ParallelExecutor
会在当前程序重复执行尾部清空临时变量 在一些NLP模型里,该成员会致使GPU内存不足。此时,你应减少
num_iteration_per_drop_scope
的值num_threads
- int型成员。它代表了线程池(thread pool)的大小。这些线程会被用来执行当前
ParallelExecutor
的program中的operator(算子,运算)。如果
,则所有的operator将一个接一个地执行,但在不同的程序重复周期(iterations)中执行顺序可能不同。如果该成员没有被设置,则在 ParallelExecutor
中,它会依据设备类型(device type)、设备数目(device count)而设置为相应值。对GPU, ;对CPU, 。在 ParallelExecutor
中有关于 的详细解释。如果没有设置 , ParallelExecutor
可以通过调用 multiprocessing.cpu_count()
获取CPU数目(cpu count)。默认值为0。
Executor
- class
paddle.fluid.
Executor
(place) - 执行引擎(Executor)使用python脚本驱动,支持在单/多GPU、单/多CPU环境下运行。Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表)向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。
应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。
Executor将全局变量存储到全局作用域中,并为临时变量创建局部作用域。当每一mini-batch上的前向/反向运算完成后,局部作用域的内容将被废弃,但全局作用域中的变量将在Executor的不同执行过程中一直存在。
示例代码
- # 新建一个执行引擎Executor名为exe。
- place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
- exe = fluid.Executor(place)
- # 仅运行一次startup program.
- # 不需要优化/编译这个startup program.
- exe.run(fluid.default_startup_program())
- # 无需编译,直接运行main program
- loss, = exe.run(fluid.default_main_program(),
- feed=feed_dict,
- fetch_list=[loss.name])
- # 另一种方法是,编译这个main program然后运行. 参考CompiledProgram
- compiled_prog = compiler.CompiledProgram(
- fluid.default_main_program()).with_data_parallel(
- loss_name=loss.name)
- loss, = exe.run(compiled_prog,
- feed=feed_dict,
- fetch_list=[loss.name])
- 参数:
- place (core.CPUPlace|core.CUDAPlace(n)) – 指明了
Executor
的执行场所
- place (core.CPUPlace|core.CUDAPlace(n)) – 指明了
close
()- 关闭这个执行器(Executor)。
调用这个方法后不可以再使用这个执行器。 对于分布式训练, 该函数会释放在PServers上和目前Trainer有关联的资源。
示例代码
- cpu = core.CPUPlace()
- exe = Executor(cpu)
- ...
- exe.close()
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。通过feed map提供待学习数据,以及借助fetch_list得到相应的结果。Python执行器(Executor)可以接收传入的program,并根据输入映射表(feed map)和结果获取表(fetch_list)向program中添加数据输入算子(feed operators)和结果获取算子(fetch operators)。feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。
应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。
- 参数:
- program (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的)
- feed (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData}
- fetch_list (list) – 用户想得到的变量或者命名的列表, 该方法会根据这个列表给出结果
- feed_var_name (str) – 前向算子(feed operator)变量的名称
- fetch_var_name (str) – 结果获取算子(fetch operator)的输出变量名称
- scope (Scope) – 执行这个program的域,用户可以指定不同的域。缺省为全局域
- return_numpy (bool) – 如果为True,则将结果张量(fetched tensor)转化为numpy
- use_program_cache (bool) – 是否跨批使用缓存程序设置。设置为True时,只有当(1)程序没有用数据并行编译,并且(2)program、 feed变量名和fetch_list变量名与上一步相比没有更改时,运行速度才会更快。返回: 根据fetch_list来获取结果
返回类型: list(numpy.array)
示例代码
- data = fluid.layers.data(name='X', shape=[1], dtype='float32')
- hidden = fluid.layers.fc(input=data, size=10)
- layers.assign(hidden, out)
- loss = fluid.layers.mean(out)
- adam = fluid.optimizer.Adam()
- adam.minimize(loss)
- cpu = core.CPUPlace()
- exe = Executor(cpu)
- exe.run(default_startup_program())
- x = numpy.random.random(size=(10, 1)).astype('float32')
- outs = exe.run(
- feed={'X': x},
- fetch_list=[loss.name])
global_scope
paddle.fluid.
global_scope
()- 获取全局/默认作用域实例。很多api使用默认
global_scope
,例如Executor.run
。
返回:全局/默认作用域实例
返回类型:Scope
in_dygraph_mode
paddle.fluid.
in_dygraph_mode
()- 返回:bool,如果Program是在动态图模式下运行的则为True。
LoDTensor
- class
paddle.fluid.
LoDTensor
- LoDTensor是一个具有LoD信息的张量(Tensor)
np.array(lod_tensor)
可以将LoDTensor转换为numpy array。
lod_tensor.lod()
可以获得LoD信息。
LoD是多层序列(Level of Details)的缩写,通常用于不同长度的序列。如果您不需要了解LoD信息,可以跳过下面的注解。
举例:
X 为 LoDTensor,它包含两个序列。第一个长度是2,第二个长度是3。
从Lod中可以计算出X的第一维度为5, 因为5=2+3, 说明X中有5个序列。在X中的每个序列中的每个元素有2列,因此X的shape为[5,2]。
- x.lod = [[2, 3]]
- x.data = [[1, 2], [3, 4], // seq 1
- [5, 6], [7, 8], [9, 10]] // seq 2
- x.shape = [5, 2]
LoD可以有多个level(例如,一个段落可以有多个句子,一个句子可以有多个单词)。下面的例子中,Y为LoDTensor ,lod_level为2。表示有2个序列,第一个序列的长度是2(有2个子序列),第二个序列的长度是1。第一序列的两个子序列长度分别为2和2。第二个序列的子序列的长度是3。
- y.lod = [[2 1], [2 2 3]] y.shape = [2+2+3, ...]
注解
在上面的描述中,LoD是基于长度的。在paddle内部实现中,lod是基于偏移的。因此,在内部,y.lod表示为[0,2,3],[0,2,4,7]。
可以将LoD理解为recursive_sequence_length(递归序列长度)。此时,LoD必须是基于长度的。由于历史原因。当LoD在API中被称为lod时,它可能是基于偏移的。用户应该注意。
has_valid_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → bool
- 检查LoDTensor的lod值的正确性。
返回: 是否带有正确的lod值
返回类型: out (bool)
lod(self: paddle.fluid.core.LoDTensor) → List[List[int]]
- 得到LoD Tensor的LoD。
返回:LoD Tensor的LoD。
返回类型:out(List [List [int]])
recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → List[List[int]]
- 得到与LoD对应的LoDTensor的序列长度。
返回:LoD对应的一至多个序列长度。
返回类型:out(List [List [int])
set_lod(self: paddle.fluid.core.LoDTensor, lod: List[List[int]]) → None
- 设置LoDTensor的LoD。
参数:- lod (List [List [int]]) - 要设置的lod。
set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, recursive_sequence_lengths: List[List[int]]) → None
- 根据递归序列长度recursive_sequence_lengths设置LoDTensor的LoD。
- 例如,如果recursive_sequence_lengths = [[2,3]],
- 意味着有两个长度分别为2和3的序列,相应的lod将是[[0,2,2 + 3]],即[[0, 2,5]]。
参数:- recursive_sequence_lengths (List [List [int]]) - 序列长度。
LoDTensorArray
- class
paddle.fluid.
LoDTensorArray
append(self: paddle.fluid.core.LoDTensorArray, tensor: paddle.fluid.core.LoDTensor) → None
- 将LoDTensor追加到LoDTensorArray后。
memory_optimize
paddle.fluid.
memoryoptimize
(_input_program, skip_opt_set=None, print_log=False, level=0, skip_grads=False)- 通过重用var内存来优化内存。
注解
它不支持block中嵌套子block。
- 参数:
- input_program (str) – 输入Program。
- skip_opt_set (set) – set中的vars将不被内存优化。
- print_log (bool) – 是否打印debug日志。
- level (int) 如果 level=0 并且shape是完全相等,则重用。返回: None
name_scope
paddle.fluid.
namescope
(_prefix=None)- 为operators生成层次名称前缀
注意: 这个函数只能用于调试和可视化。不要将其用于分析,比如graph/program转换。
- 参数:
- prefix (str) - 前缀示例代码
- with name_scope("encoder"):
- ...
- with name_scope("decoder"):
- ...
- with name_scope("attention"):
- ...
ParallelExecutor
- class
paddle.fluid.
ParallelExecutor
(use_cuda, loss_name=None, main_program=None, share_vars_from=None, exec_strategy=None, build_strategy=None, num_trainers=1, trainer_id=0, scope=None) ParallelExecutor
专门设计用来实现数据并行计算,着力于向不同结点(node)分配数据,并行地在不同结点中对数据进行操作。如果在GPU上使用该类运行程序,node则用来指代GPU,ParallelExecutor
也将自动获取在当前机器上可用的GPU资源。如果在CPU上进行操作,node则指代CPU,同时你也可以通过添加环境变量CPU_NUM
来设置CPU设备的个数。例如,CPU_NUM=4
。但是如果没有设置该环境变量,该类会调用multiprocessing.cpu_count
来获取当前系统中CPU的个数。参数:
- use_cuda (bool) – 是否使用CUDA
- loss_name (str) – 在训练阶段,必须提供loss function名称。默认为None
- main_program (Program) – 需要执行的program。如果未提供, 那么将使用
default_main_program
。 默认为None - share_vars_from (ParallelExecutor) – 如果提供了该参数, 则该
ParallelExecutor
与指定的ParallelExecutor
共享变量。默 认为空 - exec_strategy (ExecutionStrategy) –
exec_strategy
用于调控program在ParallelExecutor
中的执行方式,例如,执行该program需要的线程数, 释放在执行过程中产生的临时变量需要的重复(iterations)次数。 请参考fluid.ExecutionStrategy
获取详细介绍。该参数默认为 None - build_strategy (BuildStrategy) – 设置成员
build_strategy
可以控制在ParallelExecutor
中搭建SSA Graph的方式,例如,reduce_strategy
,gradient_scale_strategy
。 请参考fluid.BuildStrategy
获取详细介绍。 该参数默认为None - num_trainers (int) – 如果该值大于1, NCCL将会通过多层级node的方式来初始化。每个node应有相同的GPU数目。 随之会启用分布式训练。该参数默认为1
- trainer_id (int) – 必须与
num_trainers
参数同时使用。trainer_id
是当前所在node的 “rank”(层级),从0开始计数。该参数默认为0 - scope (Scope) – 指定执行program所在的作用域, 默认使用
fluid.global_scope()
返回:初始化后的ParallelExecutor
对象
返回类型: ParallelExecutor
抛出异常:TypeError
- 如果提供的参数 share_vars_from
不是 ParallelExecutor
类型的,将会弹出此异常
代码示例
- train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name)
- test_exe = fluid.ParallelExecutor(use_cuda=True,
- main_program=test_program,
- share_vars_from=train_exe)
- train_loss, = train_exe.run([loss.name], feed=feed_dict)
- test_loss, = test_exe.run([loss.name], feed=feed_dict)
run
(fetch_list, feed=None, feed_dict=None, return_numpy=True)- 使用
fetch_list
执行一个ParallelExecutor
对象。
参数 feed
可以是 dict
或者 list
类型变量。如果该参数是 dict
类型,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU)。反之,如果它是 list
,则列表中的各个元素都会直接分别被拷贝到各设备中。
例如,如果 feed
是个 dict
类型变量,则有
- exe = ParallelExecutor()
- # 图像会被split到设备中。假设有两个设备,那么每个设备将会处理形为 (24, 1, 28, 28)的图像
- exe.run(feed={'image': numpy.random.random(size=(48, 1, 28, 28))})
如果 feed
是个 list
类型变量,则有
- exe = ParallelExecutor()
- # 各设备挨个处理列表中的每个元素
- # 第一个设备处理形为 (48, 1, 28, 28) 的图像
- # 第二个设备处理形为 (32, 1, 28, 28) 的图像
- #
- # 使用 exe.device_count 得到设备数目
- exe.run(feed=[{"image": numpy.random.random(size=(48, 1, 28, 28))},
- {"image": numpy.random.random(size=(32, 1, 28, 28))},
- ])
- 参数:
- fetch_list (list) – 获取的变量名列表
- feed (list|dict|None) – feed变量。 如果该参数是
dict
类型,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU)。反之,如果它是list
,则列表中的各个元素都直接分别被拷贝到各设备中。默认为None - feed_dict – 该参数已经停止使用。feed参数的别名, 为向后兼容而立。默认为None
- return_numpy (bool) – 是否将fetched tensor转换为numpy。默认为True返回: 获取的结果列表
返回类型:List
- 抛出异常:
ValueError
- 如果feed参数是list类型,但是它的长度不等于可用设备(执行场所)的数目,再或者给定的feed不是dict类型,抛出此异常TypeError
- 如果feed参数是list类型,但是它里面的元素不是dict类型时,弹出此异常
注解
- 如果feed参数为dict类型,那么传入
ParallelExecutor
的数据量 必须 大于可用的CPU核数或GPU卡数。否则,C++端将会抛出异常。应额外注意核对数据集的最后一个batch是否比可用的CPU核数或GPU卡数大。 - 如果可用的CPU核数或GPU卡数大于一个,则为每个变量最后获取的结果都是list类型,且这个list中的每个元素都是各CPU核或GPU卡上的变量
代码示例
- pe = fluid.ParallelExecutor(use_cuda=use_cuda,
- loss_name=avg_cost.name,
- main_program=fluid.default_main_program())
- loss = pe.run(feed=feeder.feed(cur_batch),
- fetch_list=[avg_cost.name]))
ParamAttr
- class
paddle.fluid.
ParamAttr
(name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False) 该类代表了参数的各种属性。 为了使神经网络训练过程更加流畅,用户可以根据需要调整参数属性。比如learning rate(学习率), regularization(正则化), trainable(可训练性), do_model_average(平均化模型)和参数初始化方法.
参数:
- name (str) – 参数名。默认为None。
- initializer (Initializer) – 初始化该参数的方法。 默认为None
- learning_rate (float) – 参数的学习率。计算方法为。 默认为1.0
- regularizer (WeightDecayRegularizer) – 正则因子. 默认为None
- trainable (bool) – 该参数是否可训练。默认为True
- gradient_clip (BaseGradientClipAttr) – 减少参数梯度的方法。默认为None
- do_model_average (bool) – 该参数是否服从模型平均值。默认为False代码示例
- w_param_attrs = fluid.ParamAttr(name="fc_weight",
- learning_rate=0.5,
- regularizer=fluid.L2Decay(1.0),
- trainable=True)
- y_predict = fluid.layers.fc(input=x, size=10, param_attr=w_param_attrs)
Program
- class
paddle.fluid.
Program
- 创建python program, 在paddleFluid内部会被转换为ProgramDesc描述语言,用来创建一段 c++ 程序。Program像容器一样,是一种自包含的程序语言。Program中包括至少一个块(Block),当 block 中存在条件选择的控制流op(例如 while_op)时,该Program将会含有嵌套块(nested block)。详情请参阅framework.proto。
注意:默认情况下,paddleFluid内部默认含有 default_startup_program
和 default_main_program
,它们将共享参数。 default_startup_program
只运行一次来初始化参数, default_main_program
在每个mini batch中运行并调整权重。
返回: empty program
代码示例
- main_program = fluid.Program()
- startup_program = fluid.Program()
- with fluid.program_guard(main_program=main_program, startup_program=startup_program):
- fluid.layers.data(name="x", shape=[-1, 784], dtype='float32')
- fluid.layers.data(name="y", shape=[-1, 1], dtype='int32')
- fluid.layers.fc(name="fc", shape=[10], dtype='float32', act="relu")
op_role
- operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。
注意:这是一个底层API。它仅用于 ParallelExecutor
复制或调度operator到设备。
例如,Forward operator应该在每个设备上执行。Backward operator在每个设备上执行,并将后向传播的参数梯度(使用 op_role_var
获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数,
set_op_role
- operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。
注意:这是一个底层API。它仅用于 ParallelExecutor
复制或调度operator到设备上执行。
例如,Forward operator应该在每个设备上执行。Backward operato应该在每个设备上执行,并将后向传播的参数梯度(使用op_role_var获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数
op_role_var
op_role
的辅助变量。
参考: Program.op_role
文档。
注意:这是一个底层API,用户不应该直接使用它。
set_op_role_var
op_role
的辅助变量。
参考: Program.op_role
文档。
注意:这是一个底层API。用户不应该直接使用它。
tostring
(_throw_on_error, with_details=False)用于debug
参数:
- throw_on_error (bool): 没有设置任何必需的字段时,抛出值错误。
- with_details (bool): 值为true时,打印更多关于变量和参数的信息,如trainable, optimize_attr等返回:(str): debug 字符串
返回类型: str
- 抛出异常:
ValueError
- 当throw_on_error == true
,但没有设置任何必需的字段时,抛出ValueError
。
clone
(for_test=False)- 创建一个新的、相同的Program。
有些operator,在训练和测试之间的行为是不同的,比如batch_norm。它们有一个属性is_test来控制行为。当for_test=True时,此方法将把它们的is_test属性更改为True。
- 克隆Program,该Program用于训练时,将
for_test
设置为False。 - 克隆Program,该Program用于测试时,将
for_test
设置为True。注意:此API不会删除任何操作符。请在backward和optimization之前使用clone(for_test=True)。
代码示例
- test_program = fluid.default_main_program().clone(for_test=True)
- optimizer = fluid.optimizer.Momentum(learning_rate=0.01, momentum=0.9)
- optimizer.minimize()
- 参数:
- for_test (bool) – 取值为True时,clone方法内部会把operator的属性
is_test
设置为 True返回:一个新的、相同的Program
- for_test (bool) – 取值为True时,clone方法内部会把operator的属性
返回类型:Program
代码示例
1.克隆一个Program,示例代码如下:
- train_program = fluid.Program()
- startup_program = fluid.Program()
- with fluid.program_guard(train_program, startup_program):
- img = fluid.layers.data(name='image', shape=[784])
- hidden = fluid.layers.fc(input=img, size=200, act='relu')
- hidden = fluid.layers.dropout(hidden, dropout_prob=0.5)
- loss = fluid.layers.cross_entropy(
- input=fluid.layers.fc(hidden, size=10, act='softmax'),
- label=fluid.layers.data(name='label', shape=[1], dtype='int64'))
- test_program = train_program.clone(for_test=True)
- sgd = fluid.optimizer.SGD(learning_rate=1e-3)
- with fluid.program_guard(train_program, startup_program):
- sgd.minimize(loss)
2.如果分别运行 train Program 和 test Program,则可以不使用clone。
- import paddle.fluid as fluid
- def network(is_test):
- img = fluid.layers.data(name='image', shape=[784])
- hidden = fluid.layers.fc(input=img, size=200, act='relu')
- hidden = fluid.layers.dropout(hidden, dropout_prob=0.5, is_test=is_test)
- loss = fluid.layers.cross_entropy(
- input=fluid.layers.fc(hidden, size=10, act='softmax'),
- label=fluid.layers.data(name='label', shape=[1], dtype='int64'))
- return loss
- train_program = fluid.Program()
- startup_program = fluid.Program()
- test_program = fluid.Program()
- with fluid.program_guard(train_program, startup_program):
- with fluid.unique_name.guard():
- loss = network(is_test=False)
- sgd = fluid.optimizer.SGD(learning_rate=1e-3)
- sgd.minimize(loss)
- # 不使用测试阶段的startup program
- with fluid.program_guard(test_program, fluid.Program()):
- with fluid.unique_name.guard():
- loss = network(is_test=True)
上边两个代码片段生成的Program是一样的。
- static
parsefrom_string
(_binary_str) - 反序列化protobuf,转换成program
注意:在序列化和反序列化之后,所有关于参数的信息都会丢失。
- 参数:
- binary_str_type (str) – prootbuf二进制字符串返回: 反序列化后的ProgramDesc
返回类型:Program
num_blocks
该program中的block的个数
random_seed
- 程序中随机运算符的默认随机种子。0意味着从随机设备中获取随机种子。
注意:必须在operator被添加之前设置。
global_block
()获取该program的第一个block。
block
(index)- 返回该program中 ,
index
指定的block。index
类型为int
返回:index对应的block
返回类型:Block
current_block
()获取当前block。当前block是用来添加operators。
list_vars
()- 获取当前program中所有变量。返回值是一个可迭代对象(iterable object)。
返回:generator 会yield每个Program中的变量
返回类型:iterable
program_guard
paddle.fluid.
programguard
(_main_program, startup_program=None)- 该函数应配合使用python的“with”语句来改变全局主程序(main program)和启动程序(startup program)。
“with”语句块中的layer函数将在新的main program(主程序)中添加operators(算子)和variables(变量)。
代码示例
- import paddle.fluid as fluid
- main_program = fluid.Program()
- startup_program = fluid.Program()
- with fluid.program_guard(main_program, startup_program):
- data = fluid.layers.data(...)
- hidden = fluid.layers.fc(...)
需要注意的是,如果用户不需要构建自己的启动程序或者主程序,一个临时的program将会发挥作用。
代码示例
- import paddle.fluid as fluid
- main_program = fluid.Program()
- # 如果您不需要关心startup program,传入一个临时值即可
- with fluid.program_guard(main_program, fluid.Program()):
- data = ...
- 参数:
- main_program (Program) – “with”语句中将使用的新的main program。
- startup_program (Program) – “with”语句中将使用的新的startup program。若传入
None
则不改变当前的启动程序。
release_memory
paddle.fluid.
releasememory
(_input_program, skip_opt_set=None)- 该函数可以调整输入program,插入
delete_op
删除算子,提前删除不需要的变量。改动是在变量本身上进行的。
提醒: 该API还在试验阶段,会在后期版本中删除。不建议用户使用。
- 参数:
- input_program (Program) – 在此program中插入
delete_op
- skip_opt_set (set) – 在内存优化时跳过的变量的集合返回: None
- input_program (Program) – 在此program中插入
scope_guard
paddle.fluid.
scopeguard
(_scope)修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。
参数:
- scope - 新的全局/默认 scope。代码示例
- import paddle.fluid as fluid
- new_scope = fluid.Scope()
- with fluid.scope_guard(new_scope):
- ...
Tensor
paddle.fluid.
Tensor
()LoDTensor
的别名
WeightNormParamAttr
- class
paddle.fluid.
WeightNormParamAttr
(dim=None, name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False) 权重归一化。权重归一化是将权重向量的长度与其方向解耦。Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks 这篇paper中讨论了权重归一化的实现
参数:
- dim (list) - 参数的名称。默认None。
- name (str) - 参数的名称。默认None。
- initializer (initializer) - 初始化参数的方法。默认None。
- learning_rate (float) - 学习率。优化时学习速率。默认1.0。
- regularizer (WeightDecayRegularizer) - 正则化因子。默认None。
- trainable (bool) - 参数是否可训练。默认True。
- gradient_clip (BaseGradientClipAttr) - 梯度下降裁剪(Gradient Clipping)的方法。默认None。
- do_model_average (bool) - 参数是否应该model average。默认False。返回: empty program
代码示例
- data = fluid.layers.data(name="data", shape=[3, 32, 32], dtype="float32")
- fc = fluid.layers.fc(input=data,
- size=1000,
- param_attr=WeightNormParamAttr(
- dim=None,
- name='weight_norm_param'))