Skip to content

Commit

Permalink
Deliver Glow traces through onnxifi (#2678)
Browse files Browse the repository at this point in the history
  • Loading branch information
jackm321 committed Apr 17, 2019
1 parent c2f7786 commit 3b2b8ad
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 17 deletions.
3 changes: 3 additions & 0 deletions include/glow/Backends/TraceEvents.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ class TraceContext {
/// \returns TraceEvents for the last run.
std::vector<TraceEvent> &getTraceEvents() { return traceEvents_; }

/// \returns TraceEvents for the last run.
llvm::ArrayRef<TraceEvent> getTraceEvents() const { return traceEvents_; }

/// \returns the integer thread id used for logged events in this context.
int getTraceThread() const { return traceThread_; }

Expand Down
52 changes: 50 additions & 2 deletions lib/Onnxifi/Base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,16 @@ onnxStatus Graph::setIOAndRun(uint32_t inputsCount,
const onnxTensorDescriptorV1 *inputDescriptors,
uint32_t outputsCount,
const onnxTensorDescriptorV1 *outputDescriptors,
EventPtr outputEvent) {
EventPtr outputEvent,
onnxTraceEventList *traceEvents) {
auto ctx = llvm::make_unique<ExecutionContext>();

if (traceEvents) {
// TODO: get thread ID
ctx->setTraceContext(
llvm::make_unique<TraceContext>(TraceLevel::STANDARD, 0));
}

// Create tensors for input placeholders
for (unsigned i = 0; i < inputsCount; ++i) {
const auto &inOnnxTensor = inputDescriptors[i];
Expand Down Expand Up @@ -161,7 +168,48 @@ onnxStatus Graph::setIOAndRun(uint32_t inputsCount,
ctx->getPlaceholderBindings()->insert(outPhPtr, std::move(t));
}

return run(std::move(ctx), outputEvent, std::move(phNameToOnnxTensorOutputs));
return run(std::move(ctx), outputEvent, std::move(phNameToOnnxTensorOutputs),
traceEvents);
}

void Graph::setTraceEvents(onnxTraceEventList *traceEvents,
const TraceContext &traceContext) {
if (!traceEvents) {
return;
}

std::vector<onnxTraceEvent *> traceEventsVec;
for (const auto &glowTraceEvent : traceContext.getTraceEvents()) {
auto *traceEvent = new onnxTraceEvent();
assert(
glowTraceEvent.type.size() == 1 &&
"Events with types longer than a single char not supported by onnxifi");
traceEvent->eventType = glowTraceEvent.type[0];
traceEvent->timestamp = glowTraceEvent.timestamp;
traceEvent->tid = glowTraceEvent.tid;
char *eventName = new char[glowTraceEvent.name.size() + 1];
assert(eventName);
strcpy(eventName, glowTraceEvent.name.c_str());
traceEvent->eventName = eventName;
traceEventsVec.push_back(traceEvent);
}

traceEvents->numEvents = traceEventsVec.size();
traceEvents->traceEvents = new onnxTraceEvent *[traceEventsVec.size()];
assert(traceEvents->traceEvents);
std::copy(traceEventsVec.begin(), traceEventsVec.end(),
traceEvents->traceEvents);
}

void Graph::releaseTraceEvents(onnxTraceEventList *traceEvents) {
assert(traceEvents);
for (uint64_t i = 0; i < traceEvents->numEvents; ++i) {
onnxTraceEvent *traceEvent = traceEvents->traceEvents[i];
delete[] traceEvent->eventName;
delete traceEvent;
}

delete[] traceEvents->traceEvents;
}

Graph::Graph(BackendPtr backendPtr) : backendPtr_(backendPtr) {}
Expand Down
18 changes: 15 additions & 3 deletions lib/Onnxifi/Base.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,14 @@ class Graph {
/// Set input memory addresses for inputs based on the \p inputDescriptors.
/// Set output memory addresses for outputs based on the \p
/// outputDescriptors. Will async signal the \p outputEvent when run is
/// complete.
/// complete. \p traceEvents is a pointer to onnxTraceEventList, if it is not
/// null then it is expected that this will be populated with trace events
/// from the run before signalling the outputEvent.
onnxStatus setIOAndRun(uint32_t inputsCount,
const onnxTensorDescriptorV1 *inputDescriptors,
uint32_t outputsCount,
const onnxTensorDescriptorV1 *outputDescriptors,
EventPtr outputEvent);
EventPtr outputEvent, onnxTraceEventList *traceEvents);

/// Init Glow graph based on the ONNX model \p onnxModel and
/// static trained weights \p weightDescriptors.
Expand All @@ -131,7 +133,17 @@ class Graph {
virtual onnxStatus
run(std::unique_ptr<ExecutionContext> ctx, EventPtr outputEvent,
std::unordered_map<Placeholder *, onnxTensorDescriptorV1>
phNameToOnnxTensorOutputs) = 0;
phNameToOnnxTensorOutputs,
onnxTraceEventList *traceEvents) = 0;

/// Copy any trace events \p traceContext into \p traceEvents. If
/// \p traceEvents is null then do nothing.
static void setTraceEvents(onnxTraceEventList *traceEvents,
const TraceContext &traceContext);

/// Free all memory that was allocated by setTraceEvents when creating \p
/// traceEvents.
static void releaseTraceEvents(onnxTraceEventList *traceEvents);

protected:
BackendPtr backendPtr_;
Expand Down
10 changes: 8 additions & 2 deletions lib/Onnxifi/HostManagerOnnxifi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,13 @@ onnxStatus
HostManagerGraph::run(std::unique_ptr<ExecutionContext> ctx,
EventPtr outputEvent,
std::unordered_map<Placeholder *, onnxTensorDescriptorV1>
phNameToOnnxTensorOutputs) {
phNameToOnnxTensorOutputs,
onnxTraceEventList *traceEvents) {
backendPtr_->getBackendId()->runNetwork(
this, std::move(ctx),
[phNameToOnnxTensorOutputs = std::move(phNameToOnnxTensorOutputs),
outputEvent](runtime::RunIdentifierTy runId, llvm::Error err,
outputEvent,
traceEvents](runtime::RunIdentifierTy runId, llvm::Error err,
std::unique_ptr<ExecutionContext> ctx) {
// If an Error occurred then log it in errToBool and signal the output
// event.
Expand All @@ -104,6 +106,10 @@ HostManagerGraph::run(std::unique_ptr<ExecutionContext> ctx,
res->size() * res->getType().getElementSize());
}

if (auto *traceContext = ctx->getTraceContext()) {
setTraceEvents(traceEvents, *traceContext);
}

outputEvent->signal();
});

Expand Down
3 changes: 2 additions & 1 deletion lib/Onnxifi/HostManagerOnnxifi.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ class HostManagerGraph : public Graph {
/// copy output placeholder tensors back to the given onnxifi tensors.
onnxStatus run(std::unique_ptr<ExecutionContext> ctx, EventPtr outputEvent,
std::unordered_map<Placeholder *, onnxTensorDescriptorV1>
phNameToOnnxTensorOutputs) override;
phNameToOnnxTensorOutputs,
onnxTraceEventList *traceEvents) override;

/// \returns the unique string name of the HostManagerGraph that the
/// underlying HostManagerGraph uses to identify this network.
Expand Down
8 changes: 6 additions & 2 deletions lib/Onnxifi/InlineOnnxifi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ InlineGraph::initGraph(const void *onnxModel, size_t onnxModelSize,
onnxStatus
InlineGraph::run(std::unique_ptr<ExecutionContext> ctx, EventPtr outputEvent,
std::unordered_map<Placeholder *, onnxTensorDescriptorV1>
phNameToOnnxTensorOutputs) {

phNameToOnnxTensorOutputs,
onnxTraceEventList *traceEvents) {
executionEngine_.run(*ctx);

// Dump profile if requested.
Expand All @@ -97,6 +97,10 @@ InlineGraph::run(std::unique_ptr<ExecutionContext> ctx, EventPtr outputEvent,
serializeToYaml(getProfileFile(modelHash_), QI);
}

if (auto *traceContext = ctx->getTraceContext()) {
setTraceEvents(traceEvents, *traceContext);
}

outputEvent->signal();
return ONNXIFI_STATUS_SUCCESS;
}
Expand Down
3 changes: 2 additions & 1 deletion lib/Onnxifi/InlineOnnxifi.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class InlineGraph : public Graph {

onnxStatus run(std::unique_ptr<ExecutionContext> ctx, EventPtr outputEvent,
std::unordered_map<Placeholder *, onnxTensorDescriptorV1>
phNameToOnnxTensorOutputs) override;
phNameToOnnxTensorOutputs,
onnxTraceEventList *traceEvents) override;

private:
ExecutionEngine executionEngine_;
Expand Down
8 changes: 2 additions & 6 deletions lib/Onnxifi/onnxifiGlow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -456,10 +456,6 @@ GLOW_ONNXIFI_LIBRARY_FUNCTION_WRAPPER(onnxSetIOAndRunGraph)(
const onnxTensorDescriptorV1 *inputDescriptors, uint32_t outputsCount,
const onnxTensorDescriptorV1 *outputDescriptors,
onnxMemoryFenceV1 *outputFence, onnxTraceEventList *traceEvents) {
if (traceEvents) {
llvm::errs() << "Glow doesn't support tracing yet\n";
}

auto &manager = glow::onnxifi::GlowOnnxifiManager::get();

if (!inputDescriptors || !outputDescriptors || !outputFence) {
Expand Down Expand Up @@ -501,7 +497,7 @@ GLOW_ONNXIFI_LIBRARY_FUNCTION_WRAPPER(onnxSetIOAndRunGraph)(

// Set graph IO and run async
return glowGraph->setIOAndRun(inputsCount, inputDescriptors, outputsCount,
outputDescriptors, outputEvent);
outputDescriptors, outputEvent, traceEvents);
}

/// Deinitialize an ONNXIFI graph and release associated resources.
Expand All @@ -527,7 +523,7 @@ GLOW_ONNXIFI_LIBRARY_FUNCTION_WRAPPER(onnxReleaseTraceEvents)(
if (!traceEvents) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
llvm::errs() << "onnxReleaseTraceEvents not implemented\n";
glow::onnxifi::Graph::releaseTraceEvents(traceEvents);
return ONNXIFI_STATUS_INTERNAL_ERROR;
}

Expand Down

0 comments on commit 3b2b8ad

Please sign in to comment.