Skip to content

Commit 96e9b65

Browse files
authored
Merge pull request #13941 from panyx0718/fix2
handle var type inference
2 parents 5d6783f + c138374 commit 96e9b65

File tree

11 files changed

+288
-251
lines changed

11 files changed

+288
-251
lines changed

paddle/fluid/framework/op_desc.cc

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -515,20 +515,14 @@ void OpDesc::InferShape(const BlockDesc &block) const {
515515
}
516516

517517
void OpDesc::InferVarType(BlockDesc *block) const {
518+
// There are a few places that var type can be set.
519+
// When VarDesc is created, default set to LOD_TENSOR.
520+
// When output variable is created, default is defaut set to LOD_TENSOR.
521+
// We limit here to be the only place that operator defines its customized
522+
// var type inference. Hence, we don't do any "default" setting here.
518523
auto &info = OpInfoMap::Instance().Get(this->Type());
519524
if (info.infer_var_type_) {
520525
info.infer_var_type_(*this, block);
521-
} else {
522-
// all output type is LoDTensor by default
523-
VLOG(10) << this->Type()
524-
<< " has not registered InferVarType. Set output variables to "
525-
"LOD_TENSOR";
526-
for (auto &out_pair : this->outputs_) {
527-
for (auto &out_var_name : out_pair.second) {
528-
block->FindRecursiveOrCreateVar(out_var_name)
529-
.SetType(proto::VarType::LOD_TENSOR);
530-
}
531-
}
532526
}
533527
}
534528

python/paddle/fluid/layer_helper.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,10 +324,19 @@ def get_parameter(self, name):
324324
raise ValueError("no Parameter name %s found" % name)
325325
return param
326326

327-
def create_tmp_variable(self, dtype, stop_gradient=False):
327+
def create_variable_for_type_inference(self, dtype, stop_gradient=False):
328+
"""Create a temporary variable that should be type inferred layer.
329+
330+
Note:
331+
The default type will be set to LOD_TENSOR. However, when
332+
the var is used as operator output, its type will be updated
333+
based on operator's `VarTypeInference` implementation in
334+
infer_var_type.
335+
"""
328336
return self.main_program.current_block().create_var(
329337
name=unique_name.generate(".".join([self.name, 'tmp'])),
330338
dtype=dtype,
339+
type=core.VarDesc.VarType.LOD_TENSOR,
331340
persistable=False,
332341
stop_gradient=stop_gradient)
333342

@@ -388,7 +397,7 @@ def append_bias_op(self, input_var, dim_start=1, dim_end=None):
388397

389398
b = self.create_parameter(
390399
attr=bias_attr, shape=size, dtype=input_var.dtype, is_bias=True)
391-
tmp = self.create_tmp_variable(dtype=input_var.dtype)
400+
tmp = self.create_variable_for_type_inference(dtype=input_var.dtype)
392401
self.append_op(
393402
type='elementwise_add',
394403
inputs={'X': [input_var],
@@ -414,7 +423,7 @@ def append_activation(self, input_var):
414423
tmp = input_var
415424
# NOTE(dzhwinter): some activation support inplace compution.
416425
if not core.IsInplace(act_type):
417-
tmp = self.create_tmp_variable(dtype=input_var.dtype)
426+
tmp = self.create_variable_for_type_inference(dtype=input_var.dtype)
418427
self.append_op(
419428
type=act_type,
420429
inputs={"X": [input_var]},

python/paddle/fluid/layers/control_flow.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ def split_lod_tensor(input, mask, level=0):
8080
8181
"""
8282
helper = LayerHelper('split_lod_tensor', **locals())
83-
out_true = helper.create_tmp_variable(dtype=input.dtype)
84-
out_false = helper.create_tmp_variable(dtype=input.dtype)
83+
out_true = helper.create_variable_for_type_inference(dtype=input.dtype)
84+
out_false = helper.create_variable_for_type_inference(dtype=input.dtype)
8585
helper.append_op(
8686
type='split_lod_tensor',
8787
inputs={
@@ -131,7 +131,7 @@ def merge_lod_tensor(in_true, in_false, x, mask, level=0):
131131
in_true=out_true, in_false=out_false, mask=y, x=x, level=level)
132132
"""
133133
helper = LayerHelper('merge_lod_tensor', **locals())
134-
out = helper.create_tmp_variable(dtype=in_true.dtype)
134+
out = helper.create_variable_for_type_inference(dtype=in_true.dtype)
135135
helper.append_op(
136136
type='merge_lod_tensor',
137137
inputs={'X': x,
@@ -524,7 +524,7 @@ def step_output(self, o):
524524
if not isinstance(o, Variable):
525525
raise TypeError("step output takes a Variable")
526526

527-
tmp_o = self.helper.create_tmp_variable(dtype=o.dtype)
527+
tmp_o = self.helper.create_variable_for_type_inference(dtype=o.dtype)
528528
self.helper.append_op(
529529
type='rnn_memory_helper',
530530
inputs={'X': [o]},
@@ -606,7 +606,8 @@ def _complete_op(self):
606606
pre_memories.append(mem.pre_mem.name)
607607
mem_var = rnn_block.var(mem.mem.name)
608608
assert isinstance(mem_var, Variable)
609-
new_mem = self.helper.create_tmp_variable(dtype=mem_var.dtype)
609+
new_mem = self.helper.create_variable_for_type_inference(
610+
dtype=mem_var.dtype)
610611

611612
rnn_block.append_op(
612613
type='rnn_memory_helper',
@@ -813,7 +814,7 @@ def max_sequence_len(rank_table):
813814
${out_comment}.
814815
"""
815816
helper = LayerHelper("max_seqence_len", **locals())
816-
res = helper.create_tmp_variable(dtype="int64")
817+
res = helper.create_variable_for_type_inference(dtype="int64")
817818
helper.append_op(
818819
type="max_sequence_len",
819820
inputs={"RankTable": rank_table},
@@ -884,7 +885,7 @@ def array_to_lod_tensor(x, table):
884885
lod_tensor = fluid.layers.array_to_lod_tensor(array, table)
885886
"""
886887
helper = LayerHelper("array_to_lod_tensor", **locals())
887-
tmp = helper.create_tmp_variable(dtype=x.dtype)
888+
tmp = helper.create_variable_for_type_inference(dtype=x.dtype)
888889
helper.append_op(
889890
type="array_to_lod_tensor",
890891
inputs={'X': x,
@@ -915,7 +916,7 @@ def increment(x, value=1.0, in_place=True):
915916
"""
916917
helper = LayerHelper("increment", **locals())
917918
if not in_place:
918-
out = helper.create_tmp_variable(dtype=x.dtype)
919+
out = helper.create_variable_for_type_inference(dtype=x.dtype)
919920
else:
920921
out = x
921922
helper.append_op(
@@ -1012,7 +1013,7 @@ def less_than(x, y, force_cpu=None, cond=None, **ignored):
10121013
"""
10131014
helper = LayerHelper("less_than", **locals())
10141015
if cond is None:
1015-
cond = helper.create_tmp_variable(dtype='bool')
1016+
cond = helper.create_variable_for_type_inference(dtype='bool')
10161017
cond.stop_gradient = True
10171018

10181019
attrs = dict()
@@ -1051,7 +1052,7 @@ def equal(x, y, cond=None, **ignored):
10511052
"""
10521053
helper = LayerHelper("equal", **locals())
10531054
if cond is None:
1054-
cond = helper.create_tmp_variable(dtype='bool')
1055+
cond = helper.create_variable_for_type_inference(dtype='bool')
10551056
cond.stop_gradient = True
10561057

10571058
helper.append_op(
@@ -1098,7 +1099,7 @@ def array_read(array, i):
10981099
array,
10991100
Variable) or array.type != core.VarDesc.VarType.LOD_TENSOR_ARRAY:
11001101
raise TypeError("array should be tensor array vairable")
1101-
out = helper.create_tmp_variable(dtype=array.dtype)
1102+
out = helper.create_variable_for_type_inference(dtype=array.dtype)
11021103
helper.append_op(
11031104
type='read_from_array',
11041105
inputs={'X': [array],
@@ -1133,7 +1134,7 @@ def shrink_memory(x, i, table):
11331134
usage.
11341135
"""
11351136
helper = LayerHelper('shrink_memory', **locals())
1136-
out = helper.create_tmp_variable(dtype=x.dtype)
1137+
out = helper.create_variable_for_type_inference(dtype=x.dtype)
11371138
helper.append_op(
11381139
type='shrink_rnn_memory',
11391140
inputs={'X': [x],
@@ -1170,7 +1171,7 @@ def array_length(array):
11701171
11711172
"""
11721173
helper = LayerHelper('array_length', **locals())
1173-
tmp = helper.create_tmp_variable(dtype='int64')
1174+
tmp = helper.create_variable_for_type_inference(dtype='int64')
11741175
tmp.stop_gradient = True
11751176
helper.append_op(
11761177
type='lod_array_length', inputs={'X': [array]}, outputs={'Out': [tmp]})
@@ -1590,7 +1591,7 @@ def __init__(self, name=None):
15901591
self.mem_dict = dict()
15911592
self.output_array = []
15921593
self.outputs = []
1593-
self.cond = self.helper.create_tmp_variable(dtype='bool')
1594+
self.cond = self.helper.create_variable_for_type_inference(dtype='bool')
15941595
self.cond.stop_gradient = False
15951596
self.while_op = While(self.cond)
15961597
self.input_array = []
@@ -1924,7 +1925,7 @@ def reorder_lod_tensor_by_rank(x, rank_table):
19241925
helper.is_instance('x', Variable)
19251926
helper.is_instance('rank_table', Variable)
19261927

1927-
out = helper.create_tmp_variable(dtype=x.dtype)
1928+
out = helper.create_variable_for_type_inference(dtype=x.dtype)
19281929
helper.append_op(
19291930
type='reorder_lod_tensor_by_rank',
19301931
inputs={'X': [x],
@@ -1958,7 +1959,7 @@ def is_empty(x, cond=None, **ignored):
19581959
"""
19591960
helper = LayerHelper("is_empty", **locals())
19601961
if cond is None:
1961-
cond = helper.create_tmp_variable(dtype='bool')
1962+
cond = helper.create_variable_for_type_inference(dtype='bool')
19621963
cond.stop_gradient = True
19631964
elif not isinstance(cond, Variable):
19641965
raise TypeError("cond takes a variable")

python/paddle/fluid/layers/detection.py

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,11 @@ def rpn_target_assign(bbox_pred,
147147

148148
helper = LayerHelper('rpn_target_assign', **locals())
149149
# Assign target label to anchors
150-
loc_index = helper.create_tmp_variable(dtype='int32')
151-
score_index = helper.create_tmp_variable(dtype='int32')
152-
target_label = helper.create_tmp_variable(dtype='int32')
153-
target_bbox = helper.create_tmp_variable(dtype=anchor_box.dtype)
150+
loc_index = helper.create_variable_for_type_inference(dtype='int32')
151+
score_index = helper.create_variable_for_type_inference(dtype='int32')
152+
target_label = helper.create_variable_for_type_inference(dtype='int32')
153+
target_bbox = helper.create_variable_for_type_inference(
154+
dtype=anchor_box.dtype)
154155
helper.append_op(
155156
type="rpn_target_assign",
156157
inputs={
@@ -282,7 +283,8 @@ class number, M is number of bounding boxes. For each category
282283
scores = nn.reshape(x=scores, shape=compile_shape, actual_shape=run_shape)
283284
scores = nn.transpose(scores, perm=[0, 2, 1])
284285
scores.stop_gradient = True
285-
nmsed_outs = helper.create_tmp_variable(dtype=decoded_box.dtype)
286+
nmsed_outs = helper.create_variable_for_type_inference(
287+
dtype=decoded_box.dtype)
286288
helper.append_op(
287289
type="multiclass_nms",
288290
inputs={'Scores': scores,
@@ -314,7 +316,7 @@ def iou_similarity(x, y, name=None):
314316
"""
315317
helper = LayerHelper("iou_similarity", **locals())
316318
if name is None:
317-
out = helper.create_tmp_variable(dtype=x.dtype)
319+
out = helper.create_variable_for_type_inference(dtype=x.dtype)
318320
else:
319321
out = helper.create_variable(
320322
name=name, dtype=x.dtype, persistable=False)
@@ -351,7 +353,8 @@ def box_coder(prior_box,
351353
helper = LayerHelper("box_coder", **locals())
352354

353355
if name is None:
354-
output_box = helper.create_tmp_variable(dtype=prior_box.dtype)
356+
output_box = helper.create_variable_for_type_inference(
357+
dtype=prior_box.dtype)
355358
else:
356359
output_box = helper.create_variable(
357360
name=name, dtype=prior_box.dtype, persistable=False)
@@ -382,7 +385,7 @@ def polygon_box_transform(input, name=None):
382385
"""
383386
helper = LayerHelper("polygon_box_transform", **locals())
384387
if name is None:
385-
output = helper.create_tmp_variable(dtype=input.dtype)
388+
output = helper.create_variable_for_type_inference(dtype=input.dtype)
386389
else:
387390
output = helper.create_variable(
388391
name=name, dtype=prior_box.input, persistable=False)
@@ -450,7 +453,7 @@ def detection_map(detect_res,
450453
helper = LayerHelper("detection_map", **locals())
451454

452455
def __create_var(type):
453-
return helper.create_tmp_variable(dtype=type)
456+
return helper.create_variable_for_type_inference(dtype=type)
454457

455458
map_out = __create_var('float32')
456459
accum_pos_count_out = out_states[0] if out_states else __create_var('int32')
@@ -557,8 +560,9 @@ def bipartite_match(dist_matrix,
557560
>>> matched_indices, matched_dist = fluid.layers.bipartite_match(iou)
558561
"""
559562
helper = LayerHelper('bipartite_match', **locals())
560-
match_indices = helper.create_tmp_variable(dtype='int32')
561-
match_distance = helper.create_tmp_variable(dtype=dist_matrix.dtype)
563+
match_indices = helper.create_variable_for_type_inference(dtype='int32')
564+
match_distance = helper.create_variable_for_type_inference(
565+
dtype=dist_matrix.dtype)
562566
helper.append_op(
563567
type='bipartite_match',
564568
inputs={'DistMat': dist_matrix},
@@ -644,8 +648,8 @@ def target_assign(input,
644648
gt, matched_indices, mismatch_value=0)
645649
"""
646650
helper = LayerHelper('target_assign', **locals())
647-
out = helper.create_tmp_variable(dtype=input.dtype)
648-
out_weight = helper.create_tmp_variable(dtype='float32')
651+
out = helper.create_variable_for_type_inference(dtype=input.dtype)
652+
out_weight = helper.create_variable_for_type_inference(dtype='float32')
649653
helper.append_op(
650654
type='target_assign',
651655
inputs={
@@ -816,9 +820,10 @@ def __reshape_to_2d(var):
816820
conf_loss = nn.reshape(
817821
x=conf_loss, shape=(num, num_prior), actual_shape=actual_shape)
818822
conf_loss.stop_gradient = True
819-
neg_indices = helper.create_tmp_variable(dtype='int32')
823+
neg_indices = helper.create_variable_for_type_inference(dtype='int32')
820824
dtype = matched_indices.dtype
821-
updated_matched_indices = helper.create_tmp_variable(dtype=dtype)
825+
updated_matched_indices = helper.create_variable_for_type_inference(
826+
dtype=dtype)
822827
helper.append_op(
823828
type='mine_hard_examples',
824829
inputs={
@@ -998,8 +1003,8 @@ def _is_list_or_tuple_(data):
9981003
max_sizes = [max_sizes]
9991004
attrs['max_sizes'] = max_sizes
10001005

1001-
box = helper.create_tmp_variable(dtype)
1002-
var = helper.create_tmp_variable(dtype)
1006+
box = helper.create_variable_for_type_inference(dtype)
1007+
var = helper.create_variable_for_type_inference(dtype)
10031008
helper.append_op(
10041009
type="prior_box",
10051010
inputs={"Input": input,
@@ -1337,8 +1342,8 @@ def _is_list_or_tuple_(data):
13371342
'offset': offset
13381343
}
13391344

1340-
anchor = helper.create_tmp_variable(dtype)
1341-
var = helper.create_tmp_variable(dtype)
1345+
anchor = helper.create_variable_for_type_inference(dtype)
1346+
var = helper.create_variable_for_type_inference(dtype)
13421347
helper.append_op(
13431348
type="anchor_generator",
13441349
inputs={"Input": input},
@@ -1384,7 +1389,7 @@ def roi_perspective_transform(input,
13841389
"""
13851390
helper = LayerHelper('roi_perspective_transform', **locals())
13861391
dtype = helper.input_dtype()
1387-
out = helper.create_tmp_variable(dtype)
1392+
out = helper.create_variable_for_type_inference(dtype)
13881393
helper.append_op(
13891394
type="roi_perspective_transform",
13901395
inputs={"X": input,
@@ -1418,11 +1423,15 @@ def generate_proposal_labels(rpn_rois,
14181423

14191424
helper = LayerHelper('generate_proposal_labels', **locals())
14201425

1421-
rois = helper.create_tmp_variable(dtype=rpn_rois.dtype)
1422-
labels_int32 = helper.create_tmp_variable(dtype=gt_classes.dtype)
1423-
bbox_targets = helper.create_tmp_variable(dtype=rpn_rois.dtype)
1424-
bbox_inside_weights = helper.create_tmp_variable(dtype=rpn_rois.dtype)
1425-
bbox_outside_weights = helper.create_tmp_variable(dtype=rpn_rois.dtype)
1426+
rois = helper.create_variable_for_type_inference(dtype=rpn_rois.dtype)
1427+
labels_int32 = helper.create_variable_for_type_inference(
1428+
dtype=gt_classes.dtype)
1429+
bbox_targets = helper.create_variable_for_type_inference(
1430+
dtype=rpn_rois.dtype)
1431+
bbox_inside_weights = helper.create_variable_for_type_inference(
1432+
dtype=rpn_rois.dtype)
1433+
bbox_outside_weights = helper.create_variable_for_type_inference(
1434+
dtype=rpn_rois.dtype)
14261435

14271436
helper.append_op(
14281437
type="generate_proposal_labels",
@@ -1504,8 +1513,10 @@ def generate_proposals(scores,
15041513
"""
15051514
helper = LayerHelper('generate_proposals', **locals())
15061515

1507-
rpn_rois = helper.create_tmp_variable(dtype=bbox_deltas.dtype)
1508-
rpn_roi_probs = helper.create_tmp_variable(dtype=scores.dtype)
1516+
rpn_rois = helper.create_variable_for_type_inference(
1517+
dtype=bbox_deltas.dtype)
1518+
rpn_roi_probs = helper.create_variable_for_type_inference(
1519+
dtype=scores.dtype)
15091520
helper.append_op(
15101521
type="generate_proposals",
15111522
inputs={

python/paddle/fluid/layers/io.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ def read_file(reader):
954954
"""
955955
helper = LayerHelper('read_file')
956956
out = [
957-
helper.create_tmp_variable(
957+
helper.create_variable_for_type_inference(
958958
stop_gradient=True, dtype='float32')
959959
for _ in range(len(reader.desc.shapes()))
960960
]

python/paddle/fluid/layers/layer_function_generator.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,12 @@ def func(*args, **kwargs):
202202
out_var = out[0] if (isinstance(out, list) or
203203
isinstance(out, tuple)) else out
204204
else:
205-
out_var = helper.create_tmp_variable(dtype=dtype)
205+
out_var = helper.create_variable_for_type_inference(dtype=dtype)
206206
outputs[o_name] = [out_var]
207207
for name in intermediate_output_names:
208-
outputs[name] = [helper.create_tmp_variable(dtype=dtype)]
208+
outputs[name] = [
209+
helper.create_variable_for_type_inference(dtype=dtype)
210+
]
209211
helper.append_op(
210212
type=op_type, inputs=inputs, outputs=outputs, attrs=kwargs)
211213
return helper.append_activation(out_var)
@@ -229,7 +231,7 @@ def generate_layer_fn_noattr(op_type):
229231

230232
def func(x, name=None):
231233
helper = LayerHelper(op_type, **locals())
232-
output = helper.create_tmp_variable(dtype=x.dtype)
234+
output = helper.create_variable_for_type_inference(dtype=x.dtype)
233235
helper.append_op(type=op_type, inputs={"X": x}, outputs={"Out": output})
234236
return output
235237

0 commit comments

Comments
 (0)