|
|
|
@ -523,7 +523,7 @@ PynativeExecutor::~PynativeExecutor() {
|
|
|
|
|
ClearRes();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
py::tuple RunOp(const py::args &args) {
|
|
|
|
|
py::object RunOp(const py::args &args) {
|
|
|
|
|
auto executor = PynativeExecutor::GetInstance();
|
|
|
|
|
MS_EXCEPTION_IF_NULL(executor);
|
|
|
|
|
OpExecInfoPtr op_exec_info = executor->GenerateOpExecInfo(args);
|
|
|
|
@ -555,10 +555,10 @@ py::tuple RunOp(const py::args &args) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
py::tuple PynativeExecutor::RunOpInner(const OpExecInfoPtr &op_exec_info) {
|
|
|
|
|
py::object PynativeExecutor::RunOpInner(const OpExecInfoPtr &op_exec_info) {
|
|
|
|
|
MS_EXCEPTION_IF_NULL(op_exec_info);
|
|
|
|
|
if (op_exec_info->op_name == prim::kPrimMixedPrecisionCast->name()) {
|
|
|
|
|
return RunOpWithInitBackendPolicy(op_exec_info);
|
|
|
|
|
return RunOpWithInitBackendPolicy(op_exec_info)[0];
|
|
|
|
|
}
|
|
|
|
|
// make cnode for building grad graph if grad flag is set.
|
|
|
|
|
abstract::AbstractBasePtrList args_spec_list;
|
|
|
|
@ -574,14 +574,10 @@ py::tuple PynativeExecutor::RunOpInner(const OpExecInfoPtr &op_exec_info) {
|
|
|
|
|
MS_EXCEPTION_IF_NULL(prim);
|
|
|
|
|
py::dict output = abstract::ConvertAbstractToPython(op_exec_info->abstract);
|
|
|
|
|
if (!output["value"].is_none()) {
|
|
|
|
|
py::tuple value_ret(1);
|
|
|
|
|
value_ret[0] = output["value"];
|
|
|
|
|
return value_ret;
|
|
|
|
|
return output["value"];
|
|
|
|
|
}
|
|
|
|
|
if (prim->is_const_prim()) {
|
|
|
|
|
py::tuple value_ret(1);
|
|
|
|
|
value_ret[0] = "";
|
|
|
|
|
return value_ret;
|
|
|
|
|
return py::cast("");
|
|
|
|
|
}
|
|
|
|
|
// add output abstract info into cache
|
|
|
|
|
if (!is_find && !op_exec_info->is_dynamic_shape) {
|
|
|
|
@ -593,10 +589,12 @@ py::tuple PynativeExecutor::RunOpInner(const OpExecInfoPtr &op_exec_info) {
|
|
|
|
|
}
|
|
|
|
|
// run op with selected backend
|
|
|
|
|
auto result = RunOpWithInitBackendPolicy(op_exec_info);
|
|
|
|
|
py::object out_real = result;
|
|
|
|
|
if (result.size() == 1) {
|
|
|
|
|
MS_LOG(DEBUG) << "Output size is 1";
|
|
|
|
|
py::object out_real;
|
|
|
|
|
if (result.size() == 1 && op_exec_info->abstract != nullptr &&
|
|
|
|
|
!op_exec_info->abstract->isa<abstract::AbstractSequeue>()) {
|
|
|
|
|
out_real = result[0];
|
|
|
|
|
} else {
|
|
|
|
|
out_real = result;
|
|
|
|
|
}
|
|
|
|
|
// update output abstract for cnode
|
|
|
|
|
if (cnode != nullptr) {
|
|
|
|
@ -609,7 +607,7 @@ py::tuple PynativeExecutor::RunOpInner(const OpExecInfoPtr &op_exec_info) {
|
|
|
|
|
SaveAllResult(op_exec_info, cnode, out_real);
|
|
|
|
|
// Update the abstract and device address of value node with tensor in grad graph
|
|
|
|
|
UpdateAbstractAndDeviceAddress(op_exec_info, out_real);
|
|
|
|
|
return result;
|
|
|
|
|
return out_real;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OpExecInfoPtr PynativeExecutor::GenerateOpExecInfo(const py::args &args) {
|
|
|
|
@ -788,7 +786,7 @@ py::object PynativeExecutor::DoAutoCast(const py::object &arg, const TypeId &typ
|
|
|
|
|
op_exec->is_mixed_precision_cast = true;
|
|
|
|
|
op_exec->next_op_name = op_name;
|
|
|
|
|
op_exec->next_input_index = index;
|
|
|
|
|
return RunOpInner(op_exec)[0];
|
|
|
|
|
return RunOpInner(op_exec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
py::object PynativeExecutor::DoParamMixPrecisionCast(bool *is_cast, const py::object obj, const std::string &op_name,
|
|
|
|
@ -1249,11 +1247,9 @@ py::tuple PynativeExecutor::RunOpWithInitBackendPolicy(const OpExecInfoPtr &op_e
|
|
|
|
|
auto backend_policy = InitEnv(op_exec_info);
|
|
|
|
|
PynativeStatusCode status = PYNATIVE_UNKNOWN_STATE;
|
|
|
|
|
// returns a null py::tuple on error
|
|
|
|
|
py::tuple err_ret(0);
|
|
|
|
|
py::object result = RunOpWithBackendPolicy(backend_policy, op_exec_info, &status);
|
|
|
|
|
if (status != PYNATIVE_SUCCESS) {
|
|
|
|
|
MS_LOG(ERROR) << "Failed to run " << op_exec_info->op_name;
|
|
|
|
|
return err_ret;
|
|
|
|
|
MS_LOG(EXCEPTION) << "Failed to run " << op_exec_info->op_name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MS_LOG(DEBUG) << "RunOp end";
|
|
|
|
@ -1361,16 +1357,18 @@ py::object PynativeExecutor::RunOpInVM(const OpExecInfoPtr &op_exec_info, Pynati
|
|
|
|
|
auto primitive = op_exec_info->py_primitive;
|
|
|
|
|
MS_EXCEPTION_IF_NULL(primitive);
|
|
|
|
|
auto result = primitive->RunPyComputeFunction(op_inputs);
|
|
|
|
|
MS_LOG(INFO) << "RunOpInVM end";
|
|
|
|
|
if (py::isinstance<py::none>(result)) {
|
|
|
|
|
MS_LOG(ERROR) << "VM got the result none, please check whether it is failed to get func";
|
|
|
|
|
*status = PYNATIVE_OP_NOT_IMPLEMENTED_ERR;
|
|
|
|
|
py::tuple err_ret(0);
|
|
|
|
|
return std::move(err_ret);
|
|
|
|
|
}
|
|
|
|
|
// execute op
|
|
|
|
|
py::tuple tuple_result = py::make_tuple(result);
|
|
|
|
|
*status = PYNATIVE_SUCCESS;
|
|
|
|
|
MS_LOG(INFO) << "RunOpInVM end";
|
|
|
|
|
if (py::isinstance<py::tuple>(result)) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
py::tuple tuple_result = py::make_tuple(result);
|
|
|
|
|
return std::move(tuple_result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|