mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-07 12:21:27 +01:00
Summary:
This is an automatic change generated by the following script:
```
#!/usr/bin/env python3
from subprocess import check_output, check_call
import os
def get_compiled_files_list():
import json
with open("build/compile_commands.json") as f:
data = json.load(f)
files = [os.path.relpath(node['file']) for node in data]
for idx, fname in enumerate(files):
if fname.startswith('build/') and fname.endswith('.DEFAULT.cpp'):
files[idx] = fname[len('build/'):-len('.DEFAULT.cpp')]
return files
def run_clang_tidy(fname):
check_call(["python3", "tools/clang_tidy.py", "-c", "build", "-x", fname,"-s"])
changes = check_output(["git", "ls-files", "-m"])
if len(changes) == 0:
return
check_call(["git", "commit","--all", "-m", f"NOLINT stubs for {fname}"])
def main():
git_files = check_output(["git", "ls-files"]).decode("ascii").split("\n")
compiled_files = get_compiled_files_list()
for idx, fname in enumerate(git_files):
if fname not in compiled_files:
continue
if fname.startswith("caffe2/contrib/aten/"):
continue
print(f"[{idx}/{len(git_files)}] Processing {fname}")
run_clang_tidy(fname)
if __name__ == "__main__":
main()
```
Pull Request resolved: https://github.com/pytorch/pytorch/pull/56892
Reviewed By: H-Huang
Differential Revision: D27991944
Pulled By: malfet
fbshipit-source-id: 5415e1eb2c1b34319a4f03024bfaa087007d7179
184 lines
5.4 KiB
C++
184 lines
5.4 KiB
C++
#include "caffe2/opt/backend_transformer_base.h"
|
|
#include "caffe2/onnx/onnx_exporter.h"
|
|
#include "caffe2/utils/proto_utils.h"
|
|
|
|
namespace caffe2 {
|
|
|
|
// Populate 'net_pos' argument for any ops that don't already have it. 'net_pos'
|
|
// we populate here starts after the max 'net_pos' value we encountered.
|
|
void BackendTransformerBase::annotateOpIndex(NetDef* net) {
|
|
// find the max net_pos that we have so far.
|
|
int i = -1;
|
|
for (const auto& op : net->op()) {
|
|
ArgumentHelper helper(op);
|
|
int old_index = helper.GetSingleArgument(op, kNetPos, -1);
|
|
i = std::max(i, old_index);
|
|
}
|
|
|
|
// populate net_pos for any op that doesn't already have it.
|
|
for (auto& op : *(net->mutable_op())) {
|
|
if (!ArgumentHelper::HasArgument(op, kNetPos)) {
|
|
AddArgument(kNetPos, ++i, &op);
|
|
}
|
|
}
|
|
}
|
|
|
|
std::string BackendTransformerBase::getModelId(const NetDef& net) {
|
|
static std::atomic<size_t> seq_id{0};
|
|
std::string model_id;
|
|
for (const auto& arg : net.arg()) {
|
|
if (arg.name() == kModelId) {
|
|
if (arg.has_s()) {
|
|
model_id = arg.s();
|
|
} else if (arg.has_i()) {
|
|
model_id = c10::to_string(arg.i());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (model_id.empty()) {
|
|
model_id = "unnamed_" + c10::to_string(seq_id++);
|
|
}
|
|
return model_id;
|
|
}
|
|
|
|
TensorProto wrapShapeInfoIntoTensorProto(
|
|
const std::string& name,
|
|
const ShapeInfo& shape_info) {
|
|
TensorProto t;
|
|
t.set_name(name);
|
|
t.set_data_type(shape_info.shape.data_type());
|
|
for (const auto i : shape_info.shape.dims()) {
|
|
t.add_dims(i);
|
|
}
|
|
for (const auto& dimType : shape_info.getDimType()) {
|
|
t.add_int32_data(static_cast<int32_t>(dimType));
|
|
}
|
|
return t;
|
|
}
|
|
|
|
QTensorProto wrapShapeInfoIntoQTensorProto(
|
|
const std::string& name,
|
|
const ShapeInfo& shape_info) {
|
|
QTensorProto t;
|
|
CAFFE_ENFORCE(
|
|
shape_info.is_quantized == true,
|
|
"Only quantized shapeinfo can be extracted into QTensor!");
|
|
t.set_name(name);
|
|
t.set_data_type(shape_info.shape.data_type());
|
|
t.set_axis(shape_info.q_info.axis);
|
|
t.set_is_multiparam(true);
|
|
for (const auto i : shape_info.q_info.scale) {
|
|
t.add_scales(i);
|
|
}
|
|
t.set_scale(1.0);
|
|
for (const auto i : shape_info.q_info.offset) {
|
|
t.add_biases(i);
|
|
}
|
|
t.set_bias(0.0);
|
|
// precision and is_signed is not used in onnxifi workflow, but it is required
|
|
// field
|
|
t.set_precision(0);
|
|
// NOLINTNEXTLINE(modernize-use-bool-literals)
|
|
t.set_is_signed(0);
|
|
for (const auto i : shape_info.shape.dims()) {
|
|
t.add_dims(i);
|
|
}
|
|
for (const auto& dimType : shape_info.getDimType()) {
|
|
t.add_data(static_cast<int32_t>(dimType));
|
|
}
|
|
return t;
|
|
}
|
|
|
|
ShapeInfoMap BackendTransformerBase::ssaRewriteAndMapNames(
|
|
Workspace* ws,
|
|
NetDef* pred_net,
|
|
const ShapeInfoMap& input_shape_hints) {
|
|
input_mapping_ = onnx::SsaRewrite(nullptr, pred_net);
|
|
// Annote the ops with net position
|
|
annotateOpIndex(pred_net);
|
|
|
|
// Since we are going to create a mapped workspace, we need to make sure that
|
|
// the parent workspace has the mapped blob names. If the blobs don't exist
|
|
// (usually such blobs are input tensor names), we exclude them from mapping.
|
|
std::vector<std::string> exclude_mapping;
|
|
for (const auto& kv : input_mapping_) {
|
|
if (!ws->HasBlob(kv.second)) {
|
|
exclude_mapping.emplace_back(kv.first);
|
|
}
|
|
}
|
|
for (const auto& i : exclude_mapping) {
|
|
input_mapping_.erase(i);
|
|
}
|
|
|
|
ShapeInfoMap shape_hints_mapped;
|
|
for (const auto& kv : input_shape_hints) {
|
|
shape_hints_mapped.emplace(kv.first, kv.second);
|
|
}
|
|
return shape_hints_mapped;
|
|
}
|
|
|
|
ShapeInfoMap BackendTransformerBase::inferShapes(
|
|
Workspace* ws,
|
|
NetDef* pred_net,
|
|
const ShapeInfoMap& shape_hints_mapped,
|
|
const BoundShapeSpec& spec) {
|
|
ShapeInfoMap shape_map;
|
|
|
|
// Populate shapes from workplace
|
|
const std::vector<std::string> ws_blobs = ws->Blobs();
|
|
for (const auto& s : ws_blobs) {
|
|
auto shape_info = getShapeInfoFromBlob(ws->GetBlob(s));
|
|
if (shape_info.dimTypeIsSet()) {
|
|
shape_map.emplace(s, shape_info);
|
|
}
|
|
}
|
|
for (const auto& s : shape_hints_mapped) {
|
|
shape_map.insert(s);
|
|
}
|
|
auto eng = BoundShapeInferencerRegistry()->Create("C10", spec);
|
|
eng->InferBoundShapeAndType(*pred_net, shape_map, ws);
|
|
const auto& out_map = eng->shape_info();
|
|
shape_map.clear();
|
|
for (const auto& kv : out_map) {
|
|
shape_map.emplace(
|
|
std::piecewise_construct,
|
|
std::forward_as_tuple(kv.first),
|
|
std::forward_as_tuple(
|
|
kv.second.getDimType(),
|
|
kv.second.shape,
|
|
kv.second.is_quantized,
|
|
kv.second.q_info));
|
|
}
|
|
return shape_map;
|
|
}
|
|
|
|
void BackendTransformerBase::addShapeToNet(
|
|
NetDef& shape_net,
|
|
const ShapeInfoMap& shape_hints) const {
|
|
auto* shape_arg = shape_net.add_arg();
|
|
auto* qshape_arg = shape_net.add_arg();
|
|
shape_arg->set_name("shape_info");
|
|
qshape_arg->set_name("qshape_info");
|
|
for (const auto& kv : shape_hints) {
|
|
if (!kv.second.is_quantized) {
|
|
auto t = wrapShapeInfoIntoTensorProto(kv.first, kv.second);
|
|
shape_arg->mutable_tensors()->Add()->CopyFrom(t);
|
|
} else {
|
|
auto t = wrapShapeInfoIntoQTensorProto(kv.first, kv.second);
|
|
qshape_arg->mutable_qtensors()->Add()->CopyFrom(t);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BackendTransformerBase::dumpNet(
|
|
const NetDef& pred_net,
|
|
const ShapeInfoMap& shape_hints,
|
|
const std::string& fname) const {
|
|
NetDef shape_net(pred_net);
|
|
addShapeToNet(shape_net, shape_hints);
|
|
WriteProtoToTextFile(shape_net, fname, false);
|
|
}
|
|
} // namespace caffe2
|