forked from mindspore-Ecosystem/mindspore
!2604 Add partial memory reuse support to Debugger module
Merge pull request !2604 from lichen_101010/lichen_tmp
This commit is contained in:
commit
a3adf4e115
|
@ -13,13 +13,16 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "backend/optimizer/mem_reuse/mem_reuse_allocator.h"
|
||||
#include "backend/optimizer/mem_reuse/mem_reuse.h"
|
||||
#include "backend/optimizer/mem_reuse/mem_reuse_checker.h"
|
||||
#ifdef ENABLE_D
|
||||
#include "runtime/device/ascend/ascend_stream_assign.h"
|
||||
#endif
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
#include "debug/debugger/debugger.h"
|
||||
#include "debug/debug_services.h"
|
||||
#endif
|
||||
|
||||
namespace mindspore {
|
||||
namespace memreuse {
|
||||
|
@ -75,6 +78,15 @@ bool BestFitMemReuse::IsUsable(const KernelDefPtr &kernel_curr, const MembufPtr
|
|||
MS_EXCEPTION_IF_NULL(mem_buf);
|
||||
auto kernel_prev = mem_buf->used_kernel_;
|
||||
MS_EXCEPTION_IF_NULL(kernel_prev);
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
auto debugger_ = mindspore::Debugger::GetInstance();
|
||||
DebugServices *debug_services = debugger_->debug_services();
|
||||
auto watchpoint_table = debug_services->GetWatchpointTable();
|
||||
std::string current_kernel_name = kernel_curr->scope_full_name();
|
||||
if (debug_services->IsWatchPoint(current_kernel_name, watchpoint_table)) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
auto curr_stream_id = kernel_curr->stream_id();
|
||||
auto prev_stream_id = kernel_prev->stream_id();
|
||||
if (curr_stream_id == prev_stream_id) {
|
||||
|
|
|
@ -331,6 +331,11 @@ GraphId AscendSession::CompileGraph(NotNull<FuncGraphPtr> func_graph) {
|
|||
device::KernelAdjust::GetInstance().Profiling(NOT_NULL(root_graph.get()));
|
||||
// build kernel
|
||||
BuildKernel(root_graph);
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
if (debugger_) {
|
||||
debugger_->PreExecute(root_graph);
|
||||
}
|
||||
#endif
|
||||
// alloc mem
|
||||
MemoryAlloc(root_graph.get());
|
||||
// task generate
|
||||
|
@ -407,6 +412,11 @@ void AscendSession::BuildGraph(GraphId graph_id) {
|
|||
BuildKernel(graph);
|
||||
auto ms_context = MsContext::GetInstance();
|
||||
MS_EXCEPTION_IF_NULL(ms_context);
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
if (debugger_) {
|
||||
debugger_->PreExecute(graph);
|
||||
}
|
||||
#endif
|
||||
if (ms_context->precompile_only()) {
|
||||
MS_LOG(INFO) << "Precompile only, stop in build kernel step";
|
||||
} else {
|
||||
|
@ -475,12 +485,6 @@ void AscendSession::RunGraph(const GraphId &graph_id, const std::vector<tensor::
|
|||
LoadInputData(kernel_graph, inputs);
|
||||
// convert inputs to model
|
||||
predictmodel::StepConvertWeight(inputs);
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
// debugger pre-execution processing
|
||||
if (debugger_) {
|
||||
debugger_->PreExecute(kernel_graph);
|
||||
}
|
||||
#endif
|
||||
{
|
||||
py::gil_scoped_release release;
|
||||
// run task on device
|
||||
|
@ -791,7 +795,8 @@ void AscendSession::LoadTensor(const std::shared_ptr<KernelGraph> &kernel_graph)
|
|||
auto runtime_instance = device::KernelRuntimeManager::Instance().GetKernelRuntime(kAscendDevice, device_id_);
|
||||
MS_EXCEPTION_IF_NULL(runtime_instance);
|
||||
DebugServices *debug_services = debugger_->debug_services();
|
||||
TensorLoader *tensor_loader = debug_services->get_tensor_loader();
|
||||
TensorLoader *tensor_loader = debug_services->tensor_loader();
|
||||
// TensorData will be freed up here
|
||||
tensor_loader->EmptyTensor();
|
||||
uint32_t iter_num = tensor_loader->GetIterNum();
|
||||
tensor_loader->set_iter_num(++iter_num);
|
||||
|
|
|
@ -37,8 +37,8 @@ DebugServices &DebugServices::operator=(const DebugServices &other) {
|
|||
|
||||
DebugServices::~DebugServices() { delete tensor_loader_; }
|
||||
|
||||
void DebugServices::add_watchpoint(unsigned int id, unsigned int watch_condition,
|
||||
const std::vector<std::tuple<std::string, bool>> &check_node_list) {
|
||||
void DebugServices::AddWatchpoint(unsigned int id, unsigned int watch_condition,
|
||||
const std::vector<std::tuple<std::string, bool>> &check_node_list) {
|
||||
std::lock_guard<std::mutex> lg(lock_);
|
||||
|
||||
watchpoint_t watchpoint_item;
|
||||
|
@ -57,14 +57,14 @@ void DebugServices::add_watchpoint(unsigned int id, unsigned int watch_condition
|
|||
watchpoint_table[id] = watchpoint_item;
|
||||
}
|
||||
|
||||
void DebugServices::remove_watchpoint(unsigned int id) {
|
||||
void DebugServices::RemoveWatchpoint(unsigned int id) {
|
||||
std::lock_guard<std::mutex> lg(lock_);
|
||||
watchpoint_table.erase(id);
|
||||
}
|
||||
|
||||
void DebugServices::check_watchpoints(std::vector<std::string> *name, std::vector<std::string> *slot,
|
||||
std::vector<char *> *data_ptr, std::vector<unsigned int> *data_size,
|
||||
std::vector<int> *condition, std::vector<unsigned int> *wacthpoint_id) {
|
||||
void DebugServices::CheckWatchpoints(std::vector<std::string> *name, std::vector<std::string> *slot,
|
||||
std::vector<char *> *data_ptr, std::vector<unsigned int> *data_size,
|
||||
std::vector<int> *condition, std::vector<unsigned int> *wacthpoint_id) {
|
||||
std::lock_guard<std::mutex> lg(lock_);
|
||||
|
||||
std::vector<std::shared_ptr<TensorData>> tensor_list = tensor_loader_->GetTensor();
|
||||
|
@ -171,9 +171,9 @@ void DebugServices::check_watchpoints(std::vector<std::string> *name, std::vecto
|
|||
}
|
||||
}
|
||||
|
||||
void DebugServices::read_nodes_tensors(std::vector<std::string> name, std::vector<std::string> *ret_name,
|
||||
std::vector<char *> *data_ptr, std::vector<unsigned int> *data_size,
|
||||
std::vector<TypePtr> *dtype, std::vector<std::vector<int>> *shape) {
|
||||
void DebugServices::ReadNodesTensors(std::vector<std::string> name, std::vector<std::string> *ret_name,
|
||||
std::vector<char *> *data_ptr, std::vector<unsigned int> *data_size,
|
||||
std::vector<TypePtr> *dtype, std::vector<std::vector<int>> *shape) {
|
||||
std::vector<std::tuple<std::string, std::shared_ptr<TensorData>>> result_list;
|
||||
tensor_loader_->SearchTensors(name, &result_list);
|
||||
|
||||
|
@ -189,6 +189,28 @@ void DebugServices::read_nodes_tensors(std::vector<std::string> name, std::vecto
|
|||
}
|
||||
}
|
||||
|
||||
TensorLoader *DebugServices::get_tensor_loader() const { return tensor_loader_; }
|
||||
bool DebugServices::IsWatchPoint(std::string kernel_name,
|
||||
std::unordered_map<unsigned int, watchpoint_t> watchpoint_table) {
|
||||
bool ret = false;
|
||||
for (auto w_table_item : watchpoint_table) {
|
||||
auto check_node_list = std::get<1>(w_table_item).check_node_list;
|
||||
for (auto check_node : check_node_list) {
|
||||
std::string w_name = std::get<0>(check_node);
|
||||
bool w_type = std::get<1>(check_node);
|
||||
if ((w_type == true &&
|
||||
((kernel_name.find(w_name) != string::npos && kernel_name.rfind(w_name, 0) == 0) || w_name == "*")) ||
|
||||
(w_type == false && kernel_name == w_name)) {
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
TensorLoader *DebugServices::tensor_loader() const { return tensor_loader_; }
|
||||
std::unordered_map<unsigned int, DebugServices::watchpoint_t> DebugServices::GetWatchpointTable() {
|
||||
return watchpoint_table;
|
||||
}
|
||||
|
||||
} // namespace mindspore
|
||||
|
|
|
@ -37,22 +37,6 @@ class DebugServices {
|
|||
|
||||
~DebugServices();
|
||||
|
||||
void add_watchpoint(unsigned int id, unsigned int watch_condition,
|
||||
const std::vector<std::tuple<std::string, bool>> &check_node_list);
|
||||
|
||||
void remove_watchpoint(unsigned int id);
|
||||
|
||||
void check_watchpoints(std::vector<std::string> *name, std::vector<std::string> *slot, std::vector<char *> *data_ptr,
|
||||
std::vector<unsigned int> *data_size, std::vector<int> *condition,
|
||||
std::vector<unsigned int> *wacthpoint_id);
|
||||
|
||||
void read_nodes_tensors(std::vector<std::string> name, std::vector<std::string> *ret_name,
|
||||
std::vector<char *> *data_ptr, std::vector<unsigned int> *data_size,
|
||||
std::vector<TypePtr> *dtype, std::vector<std::vector<int>> *shape);
|
||||
|
||||
TensorLoader *get_tensor_loader() const;
|
||||
|
||||
private:
|
||||
typedef struct condition_no_param {
|
||||
bool enabled = false;
|
||||
} condition_no_param_t;
|
||||
|
@ -84,6 +68,26 @@ class DebugServices {
|
|||
std::vector<std::tuple<std::string, bool>> check_node_list;
|
||||
} watchpoint_t;
|
||||
|
||||
void AddWatchpoint(unsigned int id, unsigned int watch_condition,
|
||||
const std::vector<std::tuple<std::string, bool>> &check_node_list);
|
||||
|
||||
void RemoveWatchpoint(unsigned int id);
|
||||
|
||||
void CheckWatchpoints(std::vector<std::string> *name, std::vector<std::string> *slot, std::vector<char *> *data_ptr,
|
||||
std::vector<unsigned int> *data_size, std::vector<int> *condition,
|
||||
std::vector<unsigned int> *wacthpoint_id);
|
||||
|
||||
void ReadNodesTensors(std::vector<std::string> name, std::vector<std::string> *ret_name,
|
||||
std::vector<char *> *data_ptr, std::vector<unsigned int> *data_size,
|
||||
std::vector<TypePtr> *dtype, std::vector<std::vector<int>> *shape);
|
||||
|
||||
bool IsWatchPoint(std::string kernel_name, std::unordered_map<unsigned int, watchpoint_t> watchpoint_table);
|
||||
|
||||
TensorLoader *tensor_loader() const;
|
||||
|
||||
std::unordered_map<unsigned int, watchpoint_t> GetWatchpointTable();
|
||||
|
||||
private:
|
||||
std::mutex lock_;
|
||||
|
||||
std::unordered_map<unsigned int, watchpoint_t> watchpoint_table;
|
||||
|
|
|
@ -43,7 +43,8 @@ Debugger::Debugger()
|
|||
device_id_(0),
|
||||
num_step_(0),
|
||||
debugger_enabled_(false),
|
||||
is_dataset_graph_(false) {}
|
||||
is_dataset_graph_(false),
|
||||
partial_memory_(false) {}
|
||||
|
||||
void Debugger::Init(const uint32_t device_id) {
|
||||
// access lock for public method
|
||||
|
@ -57,6 +58,7 @@ void Debugger::EnableDebugger() {
|
|||
// reset some of the class members
|
||||
num_step_ = 0;
|
||||
debugger_enabled_ = false;
|
||||
partial_memory_ = false;
|
||||
grpc_client_ = nullptr;
|
||||
debug_services_ = nullptr;
|
||||
|
||||
|
@ -72,7 +74,8 @@ void Debugger::EnableDebugger() {
|
|||
MS_LOG(WARNING) << "Not enabling debugger. Set environment variable ENABLE_MS_DEBUGGER=1 to enable debugger.";
|
||||
return;
|
||||
}
|
||||
// configure host
|
||||
|
||||
// configure grpc host
|
||||
const char *env_host_str = std::getenv("MS_DEBUGGER_HOST");
|
||||
std::string host;
|
||||
if (env_host_str != nullptr) {
|
||||
|
@ -82,7 +85,7 @@ void Debugger::EnableDebugger() {
|
|||
MS_LOG(WARNING) << "Environment variable MS_DEBUGGER_HOST doesn't exist. Using default debugger host: localhost";
|
||||
host = "localhost";
|
||||
}
|
||||
// configure port
|
||||
// configure grpc port
|
||||
const char *env_port_str = std::getenv("MS_DEBUGGER_PORT");
|
||||
std::string port;
|
||||
if (env_port_str != nullptr) {
|
||||
|
@ -93,6 +96,27 @@ void Debugger::EnableDebugger() {
|
|||
port = "50051";
|
||||
}
|
||||
|
||||
// configure partial memory reuse
|
||||
const char *env_partial_mem_str = std::getenv("MS_DEBUGGER_PARTIAL_MEM");
|
||||
if (env_partial_mem_str != nullptr) {
|
||||
MS_LOG(INFO) << "Getenv MS_DEBUGGER_PARTIAL_MEM: " << env_partial_mem_str;
|
||||
if (std::strcmp(env_partial_mem_str, "1") == 0) {
|
||||
partial_memory_ = true;
|
||||
}
|
||||
}
|
||||
// switch memory reuse on or off
|
||||
auto context_ptr = MsContext::GetInstance();
|
||||
MS_EXCEPTION_IF_NULL(context_ptr);
|
||||
context_ptr->set_enable_mem_reuse(partial_memory_);
|
||||
// print some message about memory reuse to user
|
||||
if (partial_memory_) {
|
||||
MS_LOG(WARNING) << "Partial Memory Reuse is enabled. Note: 1. Please only set watchpoints before running the first "
|
||||
"step. 2. Tensor values are only available for nodes that are watched by any watchpoint.";
|
||||
} else {
|
||||
MS_LOG(WARNING) << "Memory Reuse is disabled. Set environment variable MS_DEBUGGER_PARTIAL_MEM=1 to reduce memory "
|
||||
"usage for large models.";
|
||||
}
|
||||
|
||||
// initialize grpc client
|
||||
grpc_client_ = std::make_unique<GrpcClient>(host, port);
|
||||
debug_services_ = std::make_unique<DebugServices>();
|
||||
|
@ -106,6 +130,7 @@ void Debugger::Reset() {
|
|||
num_step_ = 0;
|
||||
debugger_enabled_ = false;
|
||||
is_dataset_graph_ = false;
|
||||
partial_memory_ = false;
|
||||
graph_ptr_ = nullptr;
|
||||
grpc_client_ = nullptr;
|
||||
debug_services_ = nullptr;
|
||||
|
@ -317,11 +342,10 @@ void Debugger::SetWatchpoint(const ProtoVector<WatchNode> &nodes, const WatchCon
|
|||
[](WatchNode node) -> std::tuple<std::string, bool> {
|
||||
return make_tuple(node.node_name(), node.node_type() == "scope");
|
||||
});
|
||||
|
||||
debug_services_->add_watchpoint(id, condition.condition(), check_node_list);
|
||||
debug_services_->AddWatchpoint(id, condition.condition(), check_node_list);
|
||||
}
|
||||
|
||||
void Debugger::RemoveWatchpoint(const int32_t id) { debug_services_->remove_watchpoint(id); }
|
||||
void Debugger::RemoveWatchpoint(const int32_t id) { debug_services_->RemoveWatchpoint(id); }
|
||||
|
||||
std::list<TensorProto> Debugger::LoadTensors(const ProtoVector<TensorProto> &tensors) const {
|
||||
std::vector<std::string> name;
|
||||
|
@ -335,7 +359,7 @@ std::list<TensorProto> Debugger::LoadTensors(const ProtoVector<TensorProto> &ten
|
|||
|
||||
// ret_name will contain tensor names that are found in TensorLoader
|
||||
// items in ret_name will be in the same order with tensors if found
|
||||
debug_services_->read_nodes_tensors(name, &ret_name, &data_ptr, &data_size, &dtype, &shape);
|
||||
debug_services_->ReadNodesTensors(name, &ret_name, &data_ptr, &data_size, &dtype, &shape);
|
||||
|
||||
std::list<TensorProto> tensor_list;
|
||||
unsigned int result_index = 0;
|
||||
|
@ -384,8 +408,7 @@ std::list<WatchpointHit> Debugger::CheckWatchpoints() const {
|
|||
std::vector<int> condition;
|
||||
std::vector<unsigned int> watchpoint_id;
|
||||
|
||||
debug_services_->check_watchpoints(&name, &slot, &data_ptr, &data_size, &condition, &watchpoint_id);
|
||||
|
||||
debug_services_->CheckWatchpoints(&name, &slot, &data_ptr, &data_size, &condition, &watchpoint_id);
|
||||
std::list<WatchpointHit> hits;
|
||||
for (unsigned int i = 0; i < name.size(); i++) {
|
||||
WatchpointHit hit;
|
||||
|
@ -494,4 +517,6 @@ std::string GetTensorFullName(const TensorProto &tensor) {
|
|||
return node_name + ":" + tensor.slot() + (tensor.iter() == "" ? "" : ":" + tensor.iter());
|
||||
}
|
||||
|
||||
bool Debugger::partial_memory() { return partial_memory_; }
|
||||
|
||||
} // namespace mindspore
|
||||
|
|
|
@ -76,6 +76,8 @@ class Debugger : public std::enable_shared_from_this<Debugger> {
|
|||
|
||||
bool debugger_enabled() const;
|
||||
|
||||
bool partial_memory();
|
||||
|
||||
private:
|
||||
// private constructor for singleton
|
||||
Debugger();
|
||||
|
@ -129,6 +131,7 @@ class Debugger : public std::enable_shared_from_this<Debugger> {
|
|||
int32_t num_step_;
|
||||
bool debugger_enabled_;
|
||||
bool is_dataset_graph_;
|
||||
bool partial_memory_;
|
||||
std::mutex access_lock_;
|
||||
|
||||
// singleton
|
||||
|
|
|
@ -51,25 +51,13 @@ class TensorData {
|
|||
|
||||
int GetExecutionOrder() { return this->execution_order; }
|
||||
|
||||
int SetExecutionOrder(int execution_order) {
|
||||
this->execution_order = execution_order;
|
||||
return true;
|
||||
}
|
||||
void SetExecutionOrder(int execution_order) { this->execution_order = execution_order; }
|
||||
|
||||
int SetName(const std::string &name) {
|
||||
this->name = name;
|
||||
return true;
|
||||
}
|
||||
void SetName(const std::string &name) { this->name = name; }
|
||||
|
||||
bool SetTensor(mindspore::tensor::TensorPtr out_tensor) {
|
||||
this->tensor_ptr = out_tensor;
|
||||
return true;
|
||||
}
|
||||
void SetTensor(mindspore::tensor::TensorPtr out_tensor) { this->tensor_ptr = out_tensor; }
|
||||
|
||||
bool SetSlot(size_t slot) {
|
||||
this->slot = slot;
|
||||
return true;
|
||||
}
|
||||
void SetSlot(size_t slot) { this->slot = slot; }
|
||||
};
|
||||
} // namespace mindspore
|
||||
#endif // MINDSPORE_CCSRC_DEBUG_TENSOR_DATA_H_
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <memory>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
#include <tuple>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
@ -28,9 +29,10 @@ class TensorLoader {
|
|||
public:
|
||||
TensorLoader() : iter_num(-1) {}
|
||||
|
||||
~TensorLoader() {}
|
||||
~TensorLoader() { EmptyTensor(); }
|
||||
|
||||
bool LoadNewTensor(std::shared_ptr<TensorData> tensor, bool keep_prev) {
|
||||
std::lock_guard<std::mutex> lg(lock_);
|
||||
if (keep_prev) {
|
||||
// add prev step tensor into current step map with ":prev" suffix
|
||||
auto handle = prev_tensor_list_map.extract(tensor->GetName());
|
||||
|
@ -61,11 +63,11 @@ class TensorLoader {
|
|||
}
|
||||
}
|
||||
|
||||
bool EmptyTensor() {
|
||||
void EmptyTensor() {
|
||||
std::lock_guard<std::mutex> lg(lock_);
|
||||
prev_tensor_list_map.clear();
|
||||
tensor_list_map.swap(prev_tensor_list_map);
|
||||
tensor_list.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
void EmptyPrevTensor() { prev_tensor_list_map.clear(); }
|
||||
|
@ -77,6 +79,7 @@ class TensorLoader {
|
|||
std::map<std::string, std::shared_ptr<TensorData>> tensor_list_map;
|
||||
std::map<std::string, std::shared_ptr<TensorData>> prev_tensor_list_map;
|
||||
uint32_t iter_num;
|
||||
std::mutex lock_;
|
||||
};
|
||||
} // namespace mindspore
|
||||
#endif // MINDSPORE_CCSRC_DEBUG_TENSOR_LOAD_H_
|
||||
|
|
|
@ -372,10 +372,13 @@ bool AscendDeviceAddress::LoadMemToHost(bool trans_flag, const std::string &tens
|
|||
const std::string &host_fmt, const std::vector<int> &host_shape,
|
||||
TypeId host_type, size_t slot, Debugger *debugger, bool keep_prev) const {
|
||||
bool ret = false;
|
||||
|
||||
DebugServices *debug_services = debugger->debug_services();
|
||||
TensorLoader *tensor_loader = debug_services->get_tensor_loader();
|
||||
|
||||
TensorLoader *tensor_loader = debug_services->tensor_loader();
|
||||
// TensorData is freed up in AscendSession class
|
||||
auto tensor_data = std::make_shared<mindspore::TensorData>();
|
||||
tensor_data->SetName(tensor_name);
|
||||
tensor_data->SetExecutionOrder(execution_order);
|
||||
tensor_data->SetSlot(slot);
|
||||
if (trans_flag) {
|
||||
MS_LOG(INFO) << "E2E tensor name is " << tensor_name;
|
||||
mindspore::tensor::TensorPtr out_tensor = std::make_shared<tensor::Tensor>(host_type, host_shape);
|
||||
|
@ -385,28 +388,18 @@ bool AscendDeviceAddress::LoadMemToHost(bool trans_flag, const std::string &tens
|
|||
MS_LOG(ERROR) << "Copy device mem to host failed";
|
||||
return ret;
|
||||
}
|
||||
auto tensor_data = std::make_shared<mindspore::TensorData>();
|
||||
tensor_data->SetName(tensor_name);
|
||||
tensor_data->SetExecutionOrder(execution_order);
|
||||
tensor_data->SetTensor(out_tensor);
|
||||
tensor_data->SetSlot(slot);
|
||||
ret = tensor_loader->LoadNewTensor(tensor_data, keep_prev);
|
||||
} else {
|
||||
mindspore::tensor::TensorPtr out_tensor = std::make_shared<tensor::Tensor>(type_id_, host_shape);
|
||||
size_t host_size = out_tensor->data().nbytes();
|
||||
auto ret_rt_memcpy = rtMemcpy(out_tensor->data_c(), host_size, ptr_, host_size, RT_MEMCPY_DEVICE_TO_HOST);
|
||||
|
||||
auto tensor_data = std::make_shared<mindspore::TensorData>();
|
||||
tensor_data->SetName(tensor_name);
|
||||
tensor_data->SetExecutionOrder(execution_order);
|
||||
tensor_data->SetTensor(out_tensor);
|
||||
tensor_data->SetSlot(slot);
|
||||
ret = tensor_loader->LoadNewTensor(tensor_data, keep_prev);
|
||||
if (ret_rt_memcpy != RT_ERROR_NONE) {
|
||||
MS_LOG(ERROR) << "SyncDeviceToHost: rtMemcpy mem size[" << size_ << "] fail, ret[" << ret_rt_memcpy << "]";
|
||||
}
|
||||
MS_LOG(INFO) << "E2E tensor name is " << tensor_name;
|
||||
tensor_data->SetTensor(out_tensor);
|
||||
}
|
||||
ret = tensor_loader->LoadNewTensor(tensor_data, keep_prev);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -311,15 +311,24 @@ bool AscendKernelRuntime::DumpData(mindspore::session::KernelGraph *graph) {
|
|||
namespace {
|
||||
void LoadOutput(mindspore::session::KernelGraph *graph, Debugger *debugger) {
|
||||
MS_EXCEPTION_IF_NULL(graph);
|
||||
// trans_flag: "true" means tensor values will be transfered to host format, otherwise not.
|
||||
bool trans_flag = false;
|
||||
const auto &apply_kernels = graph->execution_order();
|
||||
// for kernels, execution order starts from 1
|
||||
int exec_order = 1;
|
||||
auto debugger_ = mindspore::Debugger::GetInstance();
|
||||
DebugServices *debug_services = debugger_->debug_services();
|
||||
auto watchpoint_table = debug_services->GetWatchpointTable();
|
||||
for (const auto &node : apply_kernels) {
|
||||
MS_EXCEPTION_IF_NULL(node);
|
||||
auto node_name = AnfAlgo::GetCNodeName(node);
|
||||
std::string kernel_name = node->fullname_with_scope();
|
||||
auto output_size = AnfAlgo::GetOutputTensorNum(node);
|
||||
if (debugger_->partial_memory()) {
|
||||
if (!debug_services->IsWatchPoint(kernel_name, watchpoint_table)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
for (size_t j = 0; j < output_size; ++j) {
|
||||
auto addr = AnfAlgo::GetOutputAddr(node, j);
|
||||
auto type = AnfAlgo::GetOutputInferDataType(node, j);
|
||||
|
@ -347,6 +356,7 @@ void LoadOutput(mindspore::session::KernelGraph *graph, Debugger *debugger) {
|
|||
|
||||
void LoadParameters(mindspore::session::KernelGraph *graph, Debugger *debugger) {
|
||||
MS_EXCEPTION_IF_NULL(graph);
|
||||
// trans_flag: "true" means tensor values will be transfered to host format, otherwise not.
|
||||
bool trans_flag = false;
|
||||
const auto ¶meters = graph->inputs();
|
||||
// for parameters, set its execution order to be 0;
|
||||
|
|
Loading…
Reference in New Issue