Files
TheRock/rocm-systems/projects/rccl/plugins/profiler/proxytrace/proxytrace_plugin.cc
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

141 lines
4.5 KiB
C++

/*
* RCCL proxy-trace profiler plugin: implements the same in-memory proxy
* diagnostics as the legacy RCCL_ENABLE_PROXY_TRACE path, driven only via
* the NCCL profiler API (ncclProfileProxyDiag + proxy op/step events).
*/
#include "proxytrace_plugin_shim.h"
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <string>
#include <sys/types.h>
#include "proxy_trace/proxy_trace.h"
#include "nccl_profiler.h"
struct CommCtx {
uint64_t commHash;
int rank;
facebook_rccl::ProxyTrace* trace;
};
struct ProxyOpProfEvent {
uint64_t tag; /* ncclProfileProxyOp */
ncclProfilerEventDescr_v6_t descr;
facebook_rccl::ProxyTraceRecordKey traceKey;
bool haveTraceOp;
CommCtx* comm;
};
struct StepProfEvent {
uint64_t tag; /* ncclProfileProxyStep */
};
static ncclDebugLogger_t gLog;
static ncclResult_t pluginInit(void** context, uint64_t commId, int* eActivationMask, const char* /*commName*/,
int /*nNodes*/, int /*nRanks*/, int rank, ncclDebugLogger_t logfn) {
gLog = logfn;
*eActivationMask = ncclProfileProxyOp | ncclProfileProxyStep | ncclProfileProxyDiag;
CommCtx* c = new CommCtx();
c->commHash = commId;
c->rank = rank;
c->trace = new facebook_rccl::ProxyTrace(rank);
*context = c;
return ncclSuccess;
}
static ncclResult_t pluginStartEvent(void* context, void** eHandle, ncclProfilerEventDescr_v6_t* eDescr) {
if (eDescr->type == ncclProfileProxyOp) {
auto* ev = new ProxyOpProfEvent();
ev->tag = ncclProfileProxyOp;
memcpy(&ev->descr, eDescr, sizeof(ev->descr));
ev->traceKey.commHash = eDescr->proxyOp.commHash;
ev->traceKey.opCount = eDescr->proxyOp.opCount;
ev->traceKey.proxyOpId = -1;
ev->haveTraceOp = false;
ev->comm = (CommCtx*)context;
*eHandle = ev;
return ncclSuccess;
}
if (eDescr->type == ncclProfileProxyStep) {
auto* se = new StepProfEvent();
se->tag = ncclProfileProxyStep;
*eHandle = se;
return ncclSuccess;
}
*eHandle = nullptr;
return ncclSuccess;
}
static ncclResult_t pluginStopEvent(void* eHandle) {
if (!eHandle) return ncclSuccess;
uint64_t tag = *(uint64_t*)eHandle;
if (tag == ncclProfileProxyOp) {
delete (ProxyOpProfEvent*)eHandle;
} else if (tag == ncclProfileProxyStep) {
delete (StepProfEvent*)eHandle;
}
return ncclSuccess;
}
static ncclResult_t pluginRecordEventState(void* eHandle, ncclProfilerEventState_v6_t eState,
ncclProfilerEventStateArgs_v6_t* eStateArgs) {
if (!eHandle) return ncclSuccess;
uint64_t tag = *(uint64_t*)eHandle;
if (tag != ncclProfileProxyOp) return ncclSuccess;
auto* ev = (ProxyOpProfEvent*)eHandle;
CommCtx* ctx = ev->comm;
if (!ctx || !ctx->trace) return ncclSuccess;
if (eState == ncclProfilerProxyOpInProgress_v4) {
facebook_rccl::ProxyTraceExtraInfo ex;
ex.funcIdx = ev->descr.proxyOp.traceFuncIdx;
ex.protocol = ev->descr.proxyOp.traceProtocol;
ex.pattern = ev->descr.proxyOp.tracePattern;
ex.totalBytes = ev->descr.proxyOp.traceTotalBytes;
ex.chunkSize = (uint32_t)ev->descr.proxyOp.chunkSize;
auto opType = ev->descr.proxyOp.isSend ? facebook_rccl::ProxyOpType::SEND : facebook_rccl::ProxyOpType::RECV;
ctx->trace->addNewProxyOp(ev->traceKey, ex, opType, ev->descr.proxyOp.channelId, ev->descr.proxyOp.rawProxyNsteps,
ev->descr.proxyOp.proxyNbytes, ev->descr.proxyOp.peer);
ev->haveTraceOp = true;
return ncclSuccess;
}
if (eState == ncclProfilerProxyDiagUpdate && eStateArgs && ev->haveTraceOp) {
auto kind = (facebook_rccl::ProxyCounterTypes)eStateArgs->proxyDiag.counterKind;
if ((eStateArgs->proxyDiag.flags & 2u) == 0) {
ctx->trace->updateProxyOpCounter(ev->traceKey, kind, eStateArgs->proxyDiag.value);
}
if (eStateArgs->proxyDiag.flags & 1u) {
ctx->trace->setProxyOpTimestamp(ev->traceKey, kind);
}
return ncclSuccess;
}
return ncclSuccess;
}
static ncclResult_t pluginFinalize(void* context) {
CommCtx* c = (CommCtx*)context;
if (!c) return ncclSuccess;
delete c->trace;
delete c;
return ncclSuccess;
}
extern "C" {
void ncclProfilerProxyTraceDump(void* profilerContext, ncclDebugLogger_t logfn) {
CommCtx* c = (CommCtx*)profilerContext;
if (!c || !c->trace || !logfn) return;
std::string s = c->trace->dump();
logfn(NCCL_LOG_WARN, NCCL_ALL, __func__, __LINE__, "%s", s.c_str());
}
ncclProfiler_v6_t ncclProfiler_v6 = {"ProxyTrace", pluginInit, pluginStartEvent, pluginStopEvent, pluginRecordEventState,
pluginFinalize};
}