首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【进阶篇】命令行参数使用案例

【进阶篇】命令行参数使用案例

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

编写|PaddlePaddle

排版|wangp

1

本地训练

本地训练的实验,诸如图像分类,自然语言处理等,通常都会使用下面这些命令行参数

paddle train \

--use_gpu=1/0 \

#1:GPU,0:CPU(默认为1)

--config=network_config \

--save_dir=output \

--trainer_count=COUNT \

#(默认为1)

--test_period=M \

#(默认为0)

--num_passes=N \

#(默认为100)

--log_period=K \

#(默认为100)

--dot_period=1000 \

#(默认为1)

#[--show_parameter_stats_period=100] \

#(默认为0)

#[--saving_period_by_batches=200] \

#(默认为0)

根据你的任务,可以选择是否使用参数show_parameter_stats_period 和saving_period_by_batches

1) 将命令参数传给网络配置

config_args是一个很有用的参数,用于将参数传递给网络配置:

--config_args=generating=1,beam_size=5,

layer_num=10 \

get_config_arg可用于在网络配置中解析这些参数,如下所示:

generating = get_config_arg('generating', bool, False)

beam_size = get_config_arg('beam_size',int, 3)

layer_num = get_config_arg('layer_num', int, 8)

get_config_arg:

get_config_arg(name, type, default_value)

---name: --config_args中指定的名字

---type: 值类型,包括bool, int, str, float等

---default_value: 默认值

2) 使用模型初始化网络

增加如下参数:

--init_model_path=model_path

--load_missing_parameter_strategy=rand

2

本地测试

方法一:

paddle train --job=test \

--use_gpu=1/0 \

--config=network_config \

--trainer_count=COUNT \

--init_model_path=model_path \

---使用init_model_path指定测试的模型

---只能测试单个模型

方法二:

paddle train --job=test \

--use_gpu=1/0 \

--config=network_config \

--trainer_count=COUNT \

--model_list=model.list \

---使用model_list指定测试的模型列表

---可以测试多个模型,文件model.list如下所示:

./alexnet_pass1

./alexnet_pass2

方法三:

paddle train --job=test \

--use_gpu=1/0 \

--config=network_config \

--trainer_count=COUNT \

--save_dir=model \

--test_pass=M \

--num_passes=N \

这种方式必须使用Paddle存储的模型路径格式,如:model/pass-%5d。测试的模型包括从第M轮到第N-1轮存储的所有模型。例如,M=12,N=14这种写法将会测试模型model/pass-00012 和 model/pass-00013

3

稀疏训练

当输入是维度很高的稀疏数据时,通常使用稀疏训练来加速计算过程。例如,输入数据的字典维数是1百万,但是每个样本仅包含几个词。在Paddle中,稀疏矩阵的乘积应用于前向传播过程,而稀疏更新在反向传播之后的权重更新时进行

1) 本地训练

用户需要在网络配置中指定sparse_update=True。请参照网络配置的文档了解更详细的信息

2) 集群训练

在集群上训练一个稀疏模型需要加上下面的参数。同时用户需要在网络配置中指定sparse_remote_update

=True。请参照网络配置的文档了解更详细的信息

--ports_num_for_sparse=1

#(默认为0)

4

parallel_nn

用户可以设置parallel_nn来混合使用GPU和CPU计算网络层的参数。也就是说,你可以将网络配置成某些层使用GPU计算,而其他层使用CPU计算。另一种方式是将网络层划分到不同的GPU上去计算,这样可以减小GPU内存,或者采用并行计算来加速某些层的更新

如果你想使用这些特性,你需要在网络配置中指定设备的ID号(表示为deviceId),并且加上下面的命令行参数:

--parallel_nn=true

案例一:GPU和CPU混合使用

请看下面的例子:

#command line:

paddle train --use_gpu=true --parallel_nn=true trainer_count=COUNT

default_device(0)

fc1=fc_layer(...)

fc2=fc_layer(...)

fc3=fc_layer(...,layer_attr=ExtraAttr(device=-1))

default_device(0): 设置默认设备号为0。这意味着除了指定device=-1的层之外,其他所有层都会使用GPU计算,每层使用的GPU号依赖于参数trainer_count和gpu_id(默认为0)。在此,fc1和fc2层在GPU上计算

device=-1: fc3层使用CPU计算

trainer_count:

---trainer_count=1: 如果未设置gpu_id,那么fc1和fc2层将会使用第1个GPU来计算。否则使用gpu_id指定的GPU

---trainer_count>1: 在trainer_count个GPU上使用数据并行来计算某一层。例如,trainer_count=2意味着0号和1号GPU将会使用数据并行来计算fc1和fc2层

案例二:在不同设备上指定层

#command line:

paddle train --use_gpu=true --parallel_nn=true --trainer_count=COUNT

#network:

fc2=fc_layer(input=l1, layer_attr=ExtraAttr(device=0), ...)

fc3=fc_layer(input=l1, layer_attr=ExtraAttr(device=1), ...)

fc4=fc_layer(input=fc2, layer_attr=ExtraAttr(device=-1), ...)

在本例中,我们假设一台机器上有4个GPU

trainer_count=1:

---使用0号GPU计算fc2层

---使用1号GPU计算fc3层

---使用CPU计算fc4层

trainer_count=2:

---使用0号和1号GPU计算fc2层。

---使用2号和3号GPU计算fc3层。

---使用CPU两线程计算fc4层。

trainer_count=4:

---运行失败(注意到我们已经假设机器上有4个GPU),因为参数allow_only_one_model_on_one_gpu默认设置为真

当device!=-1时设备ID号的分配:

(deviceId + gpu_id + threadId * numLogicalDevices_) % numDevices_

deviceId: 在层中指定

gpu_id: 默认为0

threadId: 线程ID号,范围: 0,1,..., trainer_count-1

numDevices_: 机器的设备(GPU)数目

numLogicalDevices_: min(max(deviceId + 1), numDevices_)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档