using mindspore::tensor::TensorPy;
const size_t PTR_LEN = 15;
// 原语无法推断 PyNative 模式下恒定输入的值
static const std::set<std::string> vm_operators = {"make_ref", "HookBackward", "InsertGradientOf", "stop_gradient",
"mixed_precision_cast"};
static const char kOpsFunctionModelName[] = "mindspore.ops.functional";
static const char kMSDtypeModelName[] = "mindspore.common.dtype";
// mindspore命名空间
namespace mindspore::pynative {
// 设置一些值为nullptr
static std::shared_ptr<session::SessionBasic> session = nullptr;
PynativeExecutorPtr PynativeExecutor::executor_ = nullptr;
ForwardExecutorPtr PynativeExecutor::forward_executor_ = nullptr;
GradExecutorPtr PynativeExecutor::grad_executor_ = nullptr;
std::mutex PynativeExecutor::instance_lock_;
/* 声明为constexpr函数的意义是:
如果其参数均为合适的编译期常量,则对这个constexpr函数的调用就可用于期望常量表达式的场合
(如模板的非类型参数,或枚举(enum)常量的值)
如果参数的值在运行期才能确定,或者虽然参数的值是编译期常量,
但不匹配这个函数的要求,则对这个函数调用的求值只能在运行期进行 */
constexpr auto implcast = "implcast";
template <typename T, typename... Args>
// 泛化
void PynativeExecutorTry(std::function<void(T *ret, const Args &...)> method, T *ret, const Args &... args) {
/* auto是一个C/C++语言存储类型,仅在语句块内部使用
初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式 */
const auto inst = PynativeExecutor::GetInstance();
MS_EXCEPTION_IF_NULL(inst);
MS_EXCEPTION_IF_NULL(method);
// 异常处理
try {
method(ret, args...);
} catch (const py::error_already_set &ex) {
// 发布前打印函数调用堆栈信息
std::ostringstream oss;
trace::TraceGraphEval();
trace::GetEvalStackInfo(oss);
// py::print 将函数调用栈输出到STDOUT,如果输出到文件,用户可以看到
// 这些信息来自屏幕,无需打开日志文件即可找到这些信息
py::print(oss.str());
MS_LOG(ERROR) << oss.str();
inst->ClearRes();
// 将此异常重新抛出给 Python 解释器来处理它
throw(py::error_already_set(ex));
} catch (const py::type_error &ex) {
inst->ClearRes();
throw py::type_error(ex);
} catch (const py::value_error &ex) {
inst->ClearRes();
throw py::value_error(ex);
} catch (const py::index_error &ex) {
inst->ClearRes();
throw py::index_error(ex);
} catch (const py::name_error &ex) {
inst->ClearRes();
throw py::name_error(ex);
} catch (const std::exception &ex) {
inst->ClearRes();
// 将此异常重新抛出给 Python 解释器来处理它
throw(std::runtime_error(ex.what()));
} catch (...) {
inst->ClearRes();
std::string exName(abi::__cxa_current_exception_type()->name());
// 输出:“编译图时出错。异常名称:”
MS_LOG(EXCEPTION) << "Error occurred when compile graph. Exception name: " << exName;
}
}
动态图pynative_execute的个人理解
最新推荐文章于 2024-03-04 20:24:41 发布