Skip to content

Commit f69a0b5

Browse files
authored
Add an argument to enable the use of experimental feature, fusion_group. (#4252)
test=develop
1 parent 1fbb087 commit f69a0b5

File tree

3 files changed

+50
-60
lines changed

3 files changed

+50
-60
lines changed

PaddleNLP/language_model/args.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ def parse_args():
5959
type=str2bool,
6060
default=False,
6161
help='Whether profiling the trainning [True|False]')
62+
parser.add_argument(
63+
'--enable_auto_fusion',
64+
type=str2bool,
65+
default=False,
66+
help='Whether enable fusion_group [True|False]. It is a experimental feature.'
67+
)
6268
parser.add_argument(
6369
'--use_dataloader',
6470
type=str2bool,
@@ -80,8 +86,12 @@ def parse_args():
8086
parser.add_argument('--enable_ce', action='store_true')
8187
parser.add_argument('--batch_size', type=int, default=0, help='batch size')
8288
parser.add_argument('--max_epoch', type=int, default=0, help='max epoch')
83-
89+
8490
# NOTE: args for profiler, used for benchmark
85-
parser.add_argument('--profiler_path', type=str, default='/tmp/paddingrnn.profile', help='the profiler output file path. used for benchmark')
91+
parser.add_argument(
92+
'--profiler_path',
93+
type=str,
94+
default='/tmp/paddingrnn.profile',
95+
help='the profiler output file path. used for benchmark')
8696
args = parser.parse_args()
8797
return args

PaddleNLP/language_model/train.py

+35-26
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ def main():
191191

192192
build_strategy = fluid.BuildStrategy()
193193
build_strategy.fuse_all_optimizer_ops = True
194+
try:
195+
fluid.require_version(min_version='1.7.0')
196+
build_strategy.enable_auto_fusion = args.enable_auto_fusion
197+
except Exception as e:
198+
logger.info("PaddlePaddle version 1.7.0 or higher is "
199+
"required when you want to enable fusion_group.")
194200

195201
if args.parallel:
196202
train_program = fluid.compiler.CompiledProgram(
@@ -438,32 +444,35 @@ def data_gen():
438444
print("ptblm\tlstm_language_model_%s_loss_card%d\t%s" %
439445
(args.rnn_model, device_count, train_ppl[0]))
440446

441-
# NOTE(zjl): sometimes we have not enough data for eval if batch_size is large, i.e., 2100
442-
# Just skip to avoid error
443-
def is_valid_data(data, batch_size, num_steps):
444-
data_len = len(data)
445-
batch_len = data_len // batch_size
446-
epoch_size = (batch_len - 1) // num_steps
447-
return epoch_size >= 1
448-
449-
valid_data_valid = is_valid_data(valid_data, config.batch_size,
450-
config.num_steps)
451-
if valid_data_valid:
452-
valid_ppl = eval(valid_data)
453-
print("Valid ppl: %.5f" % valid_ppl[0])
454-
else:
455-
print(
456-
'WARNING: length of valid_data is {}, which is not enough for batch_size {} and num_steps {}'.
457-
format(
458-
len(valid_data), config.batch_size, config.num_steps))
459-
460-
save_model_dir = os.path.join(args.save_model_dir, str(epoch_id))
461-
if not os.path.exists(save_model_dir):
462-
mkpath(save_model_dir)
463-
save_model_dir = os.path.join(save_model_dir, 'params')
464-
465-
fluid.save(main_program, save_model_dir)
466-
print("Saved model to: %s.\n" % save_model_dir)
447+
if not args.profile:
448+
# NOTE(zjl): sometimes we have not enough data for eval if batch_size is large, i.e., 2100
449+
# Just skip to avoid error
450+
def is_valid_data(data, batch_size, num_steps):
451+
data_len = len(data)
452+
batch_len = data_len // batch_size
453+
epoch_size = (batch_len - 1) // num_steps
454+
return epoch_size >= 1
455+
456+
valid_data_valid = is_valid_data(valid_data, config.batch_size,
457+
config.num_steps)
458+
if valid_data_valid:
459+
valid_ppl = eval(valid_data)
460+
print("Valid ppl: %.5f" % valid_ppl[0])
461+
else:
462+
print(
463+
'WARNING: length of valid_data is {}, which is not enough for batch_size {} and num_steps {}'.
464+
format(
465+
len(valid_data), config.batch_size,
466+
config.num_steps))
467+
468+
save_model_dir = os.path.join(args.save_model_dir,
469+
str(epoch_id))
470+
if not os.path.exists(save_model_dir):
471+
mkpath(save_model_dir)
472+
save_model_dir = os.path.join(save_model_dir, 'params')
473+
474+
fluid.save(main_program, save_model_dir)
475+
print("Saved model to: %s.\n" % save_model_dir)
467476

468477
with profile_context(args.profile, args.profiler_path):
469478
train()

PaddleNLP/models/language_model/lm_model.py

+3-32
Original file line numberDiff line numberDiff line change
@@ -190,38 +190,9 @@ def encoder_static(input_embedding, len=3, init_hidden=None,
190190
gate_input = layers.elementwise_add(gate_input, bias)
191191
i, j, f, o = layers.split(gate_input, num_or_sections=4, dim=-1)
192192

193-
try:
194-
from paddle.fluid.contrib.layers import fused_elemwise_activation
195-
# fluid.contrib.layers.fused_elemwise_activation can do a fused
196-
# operation, like:
197-
# 1) x + sigmoid(y); x + tanh(y)
198-
# 2) tanh(x + y)
199-
# Now the unary operation supported in this fused op is limit, and
200-
# we will extent this operation to support more unary operations and
201-
# do this kind of fusion automitically in future version of paddle.fluid.
202-
# layers.sigmoid(i) * layers.tanh(j)
203-
tmp0 = fused_elemwise_activation(
204-
x=layers.tanh(j),
205-
y=i,
206-
functor_list=['elementwise_mul', 'sigmoid'],
207-
save_intermediate_out=False)
208-
# pre_cell * layers.sigmoid(f)
209-
tmp1 = fused_elemwise_activation(
210-
x=pre_cell,
211-
y=f,
212-
functor_list=['elementwise_mul', 'sigmoid'],
213-
save_intermediate_out=False)
214-
c = tmp0 + tmp1
215-
# layers.tanh(c) * layers.sigmoid(o)
216-
m = fused_elemwise_activation(
217-
x=layers.tanh(c),
218-
y=o,
219-
functor_list=['elementwise_mul', 'sigmoid'],
220-
save_intermediate_out=False)
221-
except ImportError:
222-
c = pre_cell * layers.sigmoid(f) + layers.sigmoid(
223-
i) * layers.tanh(j)
224-
m = layers.tanh(c) * layers.sigmoid(o)
193+
c = pre_cell * layers.sigmoid(f) + layers.sigmoid(
194+
i) * layers.tanh(j)
195+
m = layers.tanh(c) * layers.sigmoid(o)
225196

226197
hidden_array[k] = m
227198
cell_array[k] = c

0 commit comments

Comments
 (0)