mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-07 12:21:27 +01:00
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/72607
since python isn't available from libtorch, most of lazy tensor
code can't depend on python.
separate python_util into libtorch_python library
make debug_util and IR dump work with or without python by providing
a default function for 'maybe getting python stacktrace' that returns
an empty stacktrace
use a registration mechanism on libtorch_python library load to update
the 'maybe' function to use the real python stacktrace getter
Test Plan:
OSS build tests:
- test_ptltc by itself works
- LTC_SAVE_TENSORS_FILE=log test_ptltc works, and log contains
empty stacktrces
- python examply.py by itself works
- LTC_SAVE_TENSORS_FILE=log test_ptltc works, and log contains
real stacktraces
fbcode build: rely on CI to run test/lazy
Reviewed By: desertfire
Differential Revision: D34115046
fbshipit-source-id: 8d6222963c146da36b3c1b5ff8a638bbc3f1442e
(cherry picked from commit 3717688ade)
47 lines
1.3 KiB
C++
47 lines
1.3 KiB
C++
#include <torch/csrc/lazy/python/python_util.h>
|
|
|
|
#include <Python.h>
|
|
#include <frameobject.h>
|
|
#include <pybind11/pybind11.h>
|
|
#include <torch/csrc/utils/python_strings.h>
|
|
#include <torch/csrc/lazy/core/debug_util.h>
|
|
|
|
namespace torch {
|
|
namespace lazy {
|
|
|
|
c10::optional<SourceLocation> GetPythonFrameTop() {
|
|
if (!Py_IsInitialized()) {
|
|
return c10::nullopt;
|
|
}
|
|
pybind11::gil_scoped_acquire gil;
|
|
PyFrameObject* frame = PyEval_GetFrame();
|
|
if (frame == nullptr) {
|
|
return c10::nullopt;
|
|
}
|
|
SourceLocation loc;
|
|
loc.line = PyCode_Addr2Line(frame->f_code, frame->f_lasti);
|
|
loc.file = THPUtils_unpackString(frame->f_code->co_filename);
|
|
loc.function = THPUtils_unpackString(frame->f_code->co_name);
|
|
return loc;
|
|
}
|
|
|
|
std::vector<SourceLocation> GetPythonFrames() {
|
|
std::vector<SourceLocation> frames;
|
|
if (Py_IsInitialized()) {
|
|
pybind11::gil_scoped_acquire gil;
|
|
PyFrameObject* frame = PyEval_GetFrame();
|
|
while (frame != nullptr) {
|
|
SourceLocation loc;
|
|
loc.line = PyCode_Addr2Line(frame->f_code, frame->f_lasti);
|
|
loc.file = THPUtils_unpackString(frame->f_code->co_filename);
|
|
loc.function = THPUtils_unpackString(frame->f_code->co_name);
|
|
frames.push_back(std::move(loc));
|
|
frame = frame->f_back;
|
|
}
|
|
}
|
|
return frames;
|
|
}
|
|
|
|
} // namespace lazy
|
|
} // namespace torch
|