Skip to content

Commit 77f12e0

Browse files
committed
Merge branch 'develop' of https://github.com/PaddlePaddle/Paddle into port_pybind11
2 parents 1f86c88 + 0a641ba commit 77f12e0

File tree

16 files changed

+442
-75
lines changed

16 files changed

+442
-75
lines changed

paddle/fluid/API.spec

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ paddle.fluid.Program.create_block ArgSpec(args=['self', 'parent_idx'], varargs=N
66
paddle.fluid.Program.current_block ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
77
paddle.fluid.Program.get_desc ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
88
paddle.fluid.Program.global_block ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
9-
paddle.fluid.Program.inference_optimize ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
9+
paddle.fluid.Program.inference_optimize ArgSpec(args=['self', 'export_for_deployment'], varargs=None, keywords=None, defaults=(True,))
1010
paddle.fluid.Program.list_vars ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
1111
paddle.fluid.Program.optimized_guard ArgSpec(args=[], varargs='args', keywords='kwds', defaults=None)
1212
paddle.fluid.Program.parse_from_string ArgSpec(args=['binary_str'], varargs=None, keywords=None, defaults=None)
@@ -18,6 +18,9 @@ paddle.fluid.Operator.all_attrs ArgSpec(args=['self'], varargs=None, keywords=No
1818
paddle.fluid.Operator.attr ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
1919
paddle.fluid.Operator.attr_type ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
2020
paddle.fluid.Operator.block_attr ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
21+
paddle.fluid.Operator.block_attr_id ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
22+
paddle.fluid.Operator.blocks_attr ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
23+
paddle.fluid.Operator.blocks_attr_ids ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
2124
paddle.fluid.Operator.has_attr ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
2225
paddle.fluid.Operator.has_kernel ArgSpec(args=['self', 'op_type'], varargs=None, keywords=None, defaults=None)
2326
paddle.fluid.Operator.input ArgSpec(args=['self', 'name'], varargs=None, keywords=None, defaults=None)
@@ -74,7 +77,7 @@ paddle.fluid.io.save_persistables ArgSpec(args=['executor', 'dirname', 'main_pro
7477
paddle.fluid.io.load_vars ArgSpec(args=['executor', 'dirname', 'main_program', 'vars', 'predicate', 'filename'], varargs=None, keywords=None, defaults=(None, None, None, None))
7578
paddle.fluid.io.load_params ArgSpec(args=['executor', 'dirname', 'main_program', 'filename'], varargs=None, keywords=None, defaults=(None, None))
7679
paddle.fluid.io.load_persistables ArgSpec(args=['executor', 'dirname', 'main_program', 'filename'], varargs=None, keywords=None, defaults=(None, None))
77-
paddle.fluid.io.save_inference_model ArgSpec(args=['dirname', 'feeded_var_names', 'target_vars', 'executor', 'main_program', 'model_filename', 'params_filename'], varargs=None, keywords=None, defaults=(None, None, None))
80+
paddle.fluid.io.save_inference_model ArgSpec(args=['dirname', 'feeded_var_names', 'target_vars', 'executor', 'main_program', 'model_filename', 'params_filename', 'export_for_deployment'], varargs=None, keywords=None, defaults=(None, None, None, True))
7881
paddle.fluid.io.load_inference_model ArgSpec(args=['dirname', 'executor', 'model_filename', 'params_filename'], varargs=None, keywords=None, defaults=(None, None))
7982
paddle.fluid.io.get_inference_program ArgSpec(args=['target_vars', 'main_program'], varargs=None, keywords=None, defaults=(None,))
8083
paddle.fluid.initializer.ConstantInitializer.__init__ ArgSpec(args=['self', 'value', 'force_cpu'], varargs=None, keywords=None, defaults=(0.0, False))

paddle/fluid/framework/op_desc.cc

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,20 @@ Attribute OpDesc::GetNullableAttr(const std::string &name) const {
297297
}
298298
}
299299

300-
int OpDesc::GetBlockAttr(const std::string &name) const {
300+
std::vector<int> OpDesc::GetBlocksAttrIds(const std::string &name) const {
301+
auto it = attrs_.find(name);
302+
PADDLE_ENFORCE(it != attrs_.end(), "Attribute %s is not found", name);
303+
auto blocks = boost::get<std::vector<BlockDesc *>>(it->second);
304+
305+
std::vector<int> ids;
306+
for (auto n : blocks) {
307+
ids.push_back(n->ID());
308+
}
309+
310+
return ids;
311+
}
312+
313+
int OpDesc::GetBlockAttrId(const std::string &name) const {
301314
auto it = attrs_.find(name);
302315
PADDLE_ENFORCE(it != attrs_.end(), "Attribute %s is not found", name);
303316
return boost::get<BlockDesc *>(it->second)->ID();

paddle/fluid/framework/op_desc.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ class OpDesc {
8585

8686
Attribute GetNullableAttr(const std::string &name) const;
8787

88-
int GetBlockAttr(const std::string &name) const;
88+
int GetBlockAttrId(const std::string &name) const;
89+
90+
std::vector<int> GetBlocksAttrIds(const std::string &name) const;
8991

9092
void Rename(const std::string &old_name, const std::string &new_name);
9193

paddle/fluid/framework/program_desc.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ ProgramDesc::ProgramDesc(const ProgramDesc &o) {
5858
for (const std::string &attr_name : op->AttrNames()) {
5959
if (op->GetAttrType(attr_name) == proto::AttrType::BLOCK) {
6060
int sub_block_id =
61-
o.Block(block_id).Op(op_id)->GetBlockAttr(attr_name);
61+
o.Block(block_id).Op(op_id)->GetBlockAttrId(attr_name);
6262
op->SetBlockAttr(attr_name, MutableBlock(sub_block_id));
6363
}
6464
}

paddle/fluid/platform/profiler.cc

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -270,12 +270,13 @@ struct EventItem {
270270
double min_time;
271271
double max_time;
272272
double ave_time;
273+
float ratio;
273274
};
274275

275276
// Print results
276277
void PrintProfiler(const std::vector<std::vector<EventItem>>& events_table,
277278
const std::string& sorted_domain, const size_t name_width,
278-
const size_t data_width) {
279+
const size_t data_width, double total) {
279280
// Output header information
280281
std::cout << "\n------------------------->"
281282
<< " Profiling Report "
@@ -300,7 +301,8 @@ void PrintProfiler(const std::vector<std::vector<EventItem>>& events_table,
300301
std::cout << std::setw(name_width) << "Event" << std::setw(data_width)
301302
<< "Calls" << std::setw(data_width) << "Total"
302303
<< std::setw(data_width) << "Min." << std::setw(data_width)
303-
<< "Max." << std::setw(data_width) << "Ave." << std::endl;
304+
<< "Max." << std::setw(data_width) << "Ave."
305+
<< std::setw(data_width) << "Ratio." << std::endl;
304306
for (size_t i = 0; i < events_table.size(); ++i) {
305307
for (size_t j = 0; j < events_table[i].size(); ++j) {
306308
const EventItem& event_item = events_table[i][j];
@@ -309,7 +311,9 @@ void PrintProfiler(const std::vector<std::vector<EventItem>>& events_table,
309311
<< std::setw(data_width) << event_item.total_time
310312
<< std::setw(data_width) << event_item.min_time
311313
<< std::setw(data_width) << event_item.max_time
312-
<< std::setw(data_width) << event_item.ave_time << std::endl;
314+
<< std::setw(data_width) << event_item.ave_time
315+
<< std::setw(data_width) << event_item.total_time / total
316+
<< std::endl;
313317
}
314318
}
315319
std::cout << std::endl;
@@ -359,6 +363,7 @@ void ParseEvents(const std::vector<std::vector<Event>>& events,
359363

360364
std::vector<std::vector<EventItem>> events_table;
361365
size_t max_name_width = 0;
366+
double total = 0.; // the total time
362367
for (size_t i = 0; i < events.size(); i++) {
363368
std::list<Event> pushed_events;
364369
std::vector<EventItem> event_items;
@@ -379,6 +384,7 @@ void ParseEvents(const std::vector<std::vector<Event>>& events,
379384
g_state == ProfilerState::kAll)
380385
? rit->CudaElapsedMs(events[i][j])
381386
: rit->CpuElapsedMs(events[i][j]);
387+
total += event_time;
382388

383389
std::string event_name =
384390
"thread" + std::to_string(rit->thread_id()) + "::" + rit->name();
@@ -387,7 +393,8 @@ void ParseEvents(const std::vector<std::vector<Event>>& events,
387393
if (event_idx.find(event_name) == event_idx.end()) {
388394
event_idx[event_name] = event_items.size();
389395
EventItem event_item = {event_name, 1, event_time,
390-
event_time, event_time, event_time};
396+
event_time, event_time, event_time,
397+
0.};
391398
event_items.push_back(event_item);
392399
} else {
393400
int index = event_idx[event_name];
@@ -431,7 +438,7 @@ void ParseEvents(const std::vector<std::vector<Event>>& events,
431438
}
432439

433440
// Print report
434-
PrintProfiler(events_table, sorted_domain, max_name_width + 4, 12);
441+
PrintProfiler(events_table, sorted_domain, max_name_width + 4, 12, total);
435442
}
436443

437444
void DisableProfiler(EventSortingKey sorted_key,

paddle/fluid/pybind/protobuf.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ void BindOpDesc(pybind11::module *m) {
296296
std::string ser(seriralized);
297297
self.SetAttr(name, ser);
298298
})
299-
.def("block_attr", &pd::OpDesc::GetBlockAttr)
299+
.def("block_attr_id", &pd::OpDesc::GetBlockAttrId)
300+
.def("blocks_attr_ids", &pd::OpDesc::GetBlocksAttrIds)
300301
.def("check_attrs", &pd::OpDesc::CheckAttrs)
301302
.def("infer_shape", &pd::OpDesc::InferShape)
302303
.def("infer_var_type", &pd::OpDesc::InferVarType)

python/paddle/fluid/backward.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ def _append_backward_ops_(block,
344344
grad_sub_block_list = []
345345
# If the op has its own sub-block, deal with the sub-block first
346346
if op.has_attr("sub_block"):
347-
sub_block = program.block(op.block_attr("sub_block"))
347+
sub_block = program.block(op.block_attr_id("sub_block"))
348348
grad_sub_block = program.create_block()
349349
grad_sub_block._set_forward_block_idx(sub_block.idx)
350350
cb = _callback_lookup_(op)
@@ -406,7 +406,7 @@ def _append_backward_vars_(block, start_op_idx, grad_to_var, grad_info_map):
406406
for op_idx in range(start_op_idx, block.desc.op_size()):
407407
op_desc = block.desc.op(op_idx)
408408
if op_desc.has_attr("sub_block"):
409-
sub_block = block.program.block(op_desc.block_attr("sub_block"))
409+
sub_block = block.program.block(op_desc.block_attr_id("sub_block"))
410410
_append_backward_vars_(sub_block, 0, grad_to_var, grad_info_map)
411411
new_vars = set()
412412
# create new gradient variables

python/paddle/fluid/framework.py

Lines changed: 97 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -477,23 +477,25 @@ def __init__(self,
477477
attrs=None):
478478
self.block = block
479479
self.desc = desc
480-
self.attrs = attrs
481-
if self.attrs is None:
482-
self.attrs = dict()
480+
# note: not add self.attrs here:
481+
# https://github.com/PaddlePaddle/Paddle/pull/12583#pullrequestreview-145093173
482+
op_attrs = attrs
483+
if op_attrs is None:
484+
op_attrs = dict()
483485
del attrs
484486

485487
op_maker = core.op_proto_and_checker_maker
486488

487-
if op_maker.kOpRoleAttrName() not in self.attrs:
488-
self.attrs[op_maker.kOpRoleAttrName()] = self.block.program.op_role
489+
if op_maker.kOpRoleAttrName() not in op_attrs:
490+
op_attrs[op_maker.kOpRoleAttrName()] = self.block.program.op_role
489491

490492
role_var_name = op_maker.kOpRoleVarAttrName()
491493
if len(self.block.program.
492-
op_role_var) != 0 and role_var_name not in self.attrs:
493-
self.attrs[role_var_name] = self.block.program.op_role_var
494+
op_role_var) != 0 and role_var_name not in op_attrs:
495+
op_attrs[role_var_name] = self.block.program.op_role_var
494496

495-
if role_var_name in self.attrs and len(self.attrs[role_var_name]) == 0:
496-
del self.attrs[role_var_name]
497+
if role_var_name in op_attrs and len(op_attrs[role_var_name]) == 0:
498+
del op_attrs[role_var_name]
497499

498500
if len(self.desc.type()) != 0:
499501
return
@@ -563,15 +565,14 @@ def find_name(var_list, name):
563565
arg.op = self
564566
self.desc.set_output(out_proto.name, out_arg_names)
565567

566-
if self.attrs is not None:
567-
if not isinstance(self.attrs, dict):
568+
if op_attrs is not None:
569+
if not isinstance(op_attrs, dict):
568570
raise TypeError("'attrs' should be a dict.")
569571
for attr in proto.attrs:
570572
attr_name = attr.name
571-
if (attr_name not in self.attrs) or (
572-
self.attrs[attr_name] is None):
573+
if (attr_name not in op_attrs) or (op_attrs[attr_name] is None):
573574
continue
574-
attr_val = self.attrs[attr_name]
575+
attr_val = op_attrs[attr_name]
575576
self._update_desc_attr(attr_name, attr_val)
576577

577578
self.desc.check_attrs()
@@ -719,7 +720,6 @@ def set_attr(self, name, val):
719720
Raises:
720721
ValueError: If the type of value doesn't match with desc.attr_type(name).
721722
"""
722-
self.attrs[name] = val
723723
self._update_desc_attr(name, val)
724724

725725
def _update_desc_attr(self, name, val):
@@ -761,32 +761,84 @@ def attr(self, name):
761761
"""
762762
return self.desc.attr(name)
763763

764-
def block_attr(self, name):
764+
def block_attr_id(self, name):
765765
"""
766-
Get the block attribute by name.
766+
Get the block attribute's id by name.
767767
768768
Args:
769769
name(str): the attribute name.
770770
771771
Returns:
772772
int: the block index.
773773
"""
774-
return self.desc.block_attr(name)
774+
return self.desc.block_attr_id(name)
775+
776+
def block_attr(self, name):
777+
"""
778+
Get the block attribute by name.
779+
780+
Args:
781+
name(str): the attribute name.
782+
783+
Returns:
784+
block: the block attribute.
785+
"""
786+
787+
id = self.block_attr_id(name)
788+
assert (id >= 0 and id < len(self.block.program.blocks))
789+
return self.block.program.blocks[id]
790+
791+
def blocks_attr(self, name):
792+
"""
793+
Get the blocks attribute by name.
794+
795+
Args:
796+
name(str): the attribute name.
797+
798+
Returns:
799+
list: list of the blocks attribute.
800+
"""
801+
attrs = []
802+
for i in self.blocks_attr_ids(name):
803+
assert (i >= 0 and i < len(self.block.program.blocks))
804+
attrs.append(self.block.program.blocks[i])
805+
806+
return attrs
807+
808+
def blocks_attr_ids(self, name):
809+
"""
810+
Get the blocks attribute's ids by name.
811+
812+
Args:
813+
name(str): the attribute name.
814+
815+
Returns:
816+
list: list of the blocks ids.
817+
"""
818+
819+
return self.desc.blocks_attr_ids(name)
775820

776821
def all_attrs(self):
777822
"""
778823
Get the attribute dict.
779824
780825
Returns:
781-
dict: The Operator's attribute dict.
826+
dict: The Operator's attribute dict, name->attr.
782827
"""
783828
attr_names = self.attr_names
784829
attr_map = {}
785830
for n in attr_names:
786-
if n == 'sub_block':
831+
attr_type = self.desc.attr_type(n)
832+
if attr_type == core.AttrType.BLOCK:
787833
attr_map[n] = self.block_attr(n)
788-
else:
789-
attr_map[n] = self.attr(n)
834+
continue
835+
836+
if attr_type == core.AttrType.BLOCKS:
837+
attr_map[n] = self.blocks_attr(n)
838+
continue
839+
840+
attr_map[n] = self.attr(n)
841+
790842
return attr_map
791843

792844

@@ -1507,13 +1559,19 @@ def clone(self, for_test=False):
15071559
The two code snippets above will generate same programs.
15081560
"""
15091561
if for_test:
1510-
p = self.inference_optimize()
1562+
p = self.inference_optimize(export_for_deployment=False)
15111563
else:
15121564
p = Program()
1565+
p.current_block_idx = self.current_block_idx
1566+
p._seed = self._seed
15131567
p.desc = core.ProgramDesc(self.desc)
15141568
p.blocks = [
15151569
Block(p, i) for i in six.moves.range(self.desc.num_blocks())
15161570
]
1571+
1572+
p._current_role = self._current_role
1573+
p._op_role_var = self._op_role_var
1574+
15171575
p._sync_with_cpp()
15181576

15191577
p._copy_param_info_from(self)
@@ -1571,7 +1629,7 @@ def prune(self, targets):
15711629
res._sync_with_cpp()
15721630
return res
15731631

1574-
def inference_optimize(self):
1632+
def inference_optimize(self, export_for_deployment=True):
15751633
"""
15761634
This method will create a new program and do following adjustments on it:
15771635
1. Remove all reader variables and their creator ops if exist.
@@ -1582,6 +1640,10 @@ def inference_optimize(self):
15821640
attribute of operators to :code:`True`. All the :code:`Parameter`
15831641
information will be lost.
15841642
1643+
Args:
1644+
export_for_deployment(bool): remove the read ops that are added by py_reader
1645+
for cpp inference library
1646+
15851647
Notes: This API is a very low level API. Use
15861648
:code:`Program.clone(for_test=True)` instead.
15871649
@@ -1596,16 +1658,17 @@ def inference_optimize(self):
15961658
# remove all readers and the read_op if exist
15971659
read_op_idx = 0
15981660
root_block = res.desc.block(0)
1599-
while True:
1600-
if read_op_idx >= root_block.op_size() or root_block.op(
1601-
read_op_idx).type() == 'read':
1602-
break
1603-
read_op_idx += 1
1604-
if read_op_idx < root_block.op_size():
1605-
root_block._remove_op(0, read_op_idx + 1)
1606-
for var in root_block.all_vars():
1607-
if var.type() == core.VarDesc.VarType.READER:
1608-
root_block._remove_var(var.name())
1661+
if export_for_deployment:
1662+
while True:
1663+
if read_op_idx >= root_block.op_size() or root_block.op(
1664+
read_op_idx).type() == 'read':
1665+
break
1666+
read_op_idx += 1
1667+
if read_op_idx < root_block.op_size():
1668+
root_block._remove_op(0, read_op_idx + 1)
1669+
for var in root_block.all_vars():
1670+
if var.type() == core.VarDesc.VarType.READER:
1671+
root_block._remove_var(var.name())
16091672

16101673
# change all `is_test` attributes to True
16111674
for i in six.moves.range(res.desc.num_blocks()):

0 commit comments

Comments
 (0)