āļĢāļēāļĒāļ‡āļēāļ™

124x āļŠāđ‰āļēāļāļ§āđˆāļē: āļŠāļīāđˆāļ‡āļ—āļĩāđˆ PyTorch DataLoader āļ—āļģāļ—āļĩāđˆāļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ

mm
āđ€āļžāļīāđˆāļĄ Unite.AI āļĨāļ‡āđƒāļ™āđāļŦāļĨāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢāļšāļ™ Google
A conceptual widescreen illustration of an hourglass containing glowing digital data streams and circuit patterns, with the bottom half featuring a large data block and a GPU hardware component sitting idle to the side, representing data processing delays and GPU starvation.

āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļœāļĨāļāļēāļĢāļ§āļīāļˆāļąāļĒāļˆāļēāļāļāļēāļĢāļŠāļ·āļšāļŠāļ§āļ™āļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļ—āļĩāđˆāļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ‚āļ”āļĒāđƒāļŠāđ‰ eBPF uprobes āđƒāļ™āļ›āļąāļāļŦāļē PyTorch āļˆāļĢāļīāļ‡ (#154318) āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āđ€āļœāļĒāđāļžāļĢāđˆāđƒāļ™äŧ“åšŦ Ingero āļ—āļĩāđˆāđ€āļ›āļīāļ”āļāļ§āđ‰āļēāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļīāļŠāļĢāļ°

TL;DR

DataLoader āļ‚āļ­āļ‡ PyTorch āļŠāļēāļĄāļēāļĢāļ–āļŠāđ‰āļēāļāļ§āđˆāļēāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ€āļ—āļ™āđ€āļ‹āļ­āļĢāđŒāđ‚āļ”āļĒāļ•āļĢāļ‡ 50-124 āđ€āļ—āđˆāļēāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ GPU āđ€āļĢāļēāđ„āļ”āđ‰āļ—āļģāļ‹āđ‰āļģāļ›āļąāļāļŦāļē PyTorch āļˆāļĢāļīāļ‡āļšāļ™ RTX 4090 āđāļĨāļ°āļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ API CUDA āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āđāļĨāļ°āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ Linux āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāļŠāļēāđ€āļŦāļ•āļļāļ‚āļ­āļ‡āļ›āļąāļāļŦāļē GPU āđ„āļĄāđˆāļŠāđ‰āļē – āļĄāļąāļ™āļ–āļđāļāļ—āļ­āļ”āļ—āļīāđ‰āļ‡ āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™ DataLoader āļŠāđˆāļ‡āļœāļĨāđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļšāļĢāļīāļšāļ— CPU 200,000 āļ„āļĢāļąāđ‰āļ‡āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđ‰āļē 300,000 āļ„āļĢāļąāđ‰āļ‡āđƒāļ™ 40 āļ§āļīāļ™āļēāļ—āļĩ āļ—āļģāđƒāļŦāđ‰ GPU āļ•āđ‰āļ­āļ‡āļĢāļ­āđ€āļ‰āļĨāļĩāđˆāļĒ 301 āļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩāđƒāļ™āļāļēāļĢāļ–āđˆāļēāļĒāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ„āļ§āļĢāđƒāļŠāđ‰āđ€āļ§āļĨāļēāđ„āļĄāđ‚āļ„āļĢāļ§āļīāļ™āļēāļ—āļĩ

āļ›āļąāļāļŦāļē

āļœāļđāđ‰āđƒāļŠāđ‰ PyTorch āļĢāļēāļĒāļŦāļ™āļķāđˆāļ‡ āļĢāļēāļĒāļ‡āļēāļ™ āļ§āđˆāļē DataLoader āļŠāđ‰āļēāļāļ§āđˆāļēāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ€āļ—āļ™āđ€āļ‹āļ­āļĢāđŒāđ‚āļ”āļĒāļ•āļĢāļ‡ 7-22 āđ€āļ—āđˆāļēāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ­āļ™āļļāļĄāļēāļ™ MLP āļ—āļĩāđˆāļ‡āđˆāļēāļĒ āđāļĄāđ‰āļ§āđˆāļēāļˆāļ°āļĄāļĩ num_workers=12, pin_memory=True āđāļĨāļ° prefetch_factor=12 āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļĒāļąāļ‡āļ„āļ‡āļĄāļēāļ āļāļēāļĢāđƒāļŠāđ‰ GPU āļ­āļĒāļđāđˆāļ—āļĩāđˆ 10-20%

āđ€āļĢāļēāļ—āļģāļ‹āđ‰āļģāļĄāļąāļ™ āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļĒāļąāļ‡āļ„āļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™āļšāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āđ€āļĢāļē:

āļ§āļīāļ˜āļĩāļāļēāļĢ āđ€āļ§āļĨāļē āđ€āļ—āļĩāļĒāļšāļāļąāļšāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡
āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ€āļ—āļ™āđ€āļ‹āļ­āļĢāđŒāđ‚āļ”āļĒāļ•āļĢāļ‡ 0.39 āļ§āļīāļ™āļēāļ—āļĩ 1 āđ€āļ—āđˆāļē
DataLoader (shuffle=True) 48.49 āļ§āļīāļ™āļēāļ—āļĩ āļŠāđ‰āļēāļāļ§āđˆāļē 124 āđ€āļ—āđˆāļē
DataLoader (āļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄ, 4 āļ„āļ™āļ‡āļēāļ™, pin_memory) 43.29 āļ§āļīāļ™āļēāļ—āļĩ āļŠāđ‰āļēāļāļ§āđˆāļē 111 āđ€āļ—āđˆāļē

āļ‡āļēāļ™āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ‡āđˆāļēāļĒ: 7 āļĨāđ‰āļēāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡, 100 āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°, 2-āļŠāļąāđ‰āļ™ MLP, āļ‚āļ™āļēāļ”āđāļšāļ•āļŠāđŒ 1 āļĨāđ‰āļēāļ™ āļĄāļ­āļ”āļđāļĨāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļ•āļŠāđŒāđƒāļ™āđ„āļĄāđˆāļāļĩāđˆāļ§āļīāļ™āļēāļ—āļĩ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļ§āļĨāļēāđ„āļ›āđ„āļŦāļ™?

āļŠāļīāđˆāļ‡āļ—āļĩāđˆ nvidia-smi āđāļŠāļ”āļ‡

āđ„āļĄāđˆāļĄāļĩāļ­āļ°āđ„āļĢāļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ āļāļēāļĢāđƒāļŠāđ‰ GPU āļĄāļĩāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļžāļĢāļ°āļŦāļ§āđˆāļēāļ‡ 0% āļ–āļķāļ‡ 30% āļāļēāļĢāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĄāļĩāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļž āļ­āļļāļ“āļŦāļ āļđāļĄāļīāđ€āļ›āđ‡āļ™āļ›āļāļ•āļī GPU āļ­āļĒāļđāđˆāđƒāļ™āļŠāļ–āļēāļ™āļ°āļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ āđāļ•āđˆ nvidia-smi āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļšāļ­āļāđ„āļ”āđ‰āļ§āđˆāļēāļ—āļģāđ„āļĄ

āļŠāļīāđˆāļ‡āļ—āļĩāđˆ torch.profiler āđāļŠāļ”āļ‡

āļœāļđāđ‰āļĢāļēāļĒāļ‡āļēāļ™āļžāļĒāļēāļĒāļēāļĄāđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™ PyTorch āđāļĨāļ° â€œāđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļĄāļēāļĒ” āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļœāļīāļ”āļŦāļ§āļąāļ‡āļ—āļąāđˆāļ§āđ„āļ› â€“ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļĢāļ°āļ”āļąāļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļ„āļ­āļĢāđŒ CUDA āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™ āđāļ•āđˆāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļŦāđ‡āļ™āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļāļēāļĢāļˆāļąāļ”āļ•āļēāļĢāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļŪāļŠāļ•āđŒ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļĨāļ°āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ§āđˆāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļĄāļēāļ–āļķāļ‡ GPU āđ€āļĄāļ·āđˆāļ­āđ„āļŦāļĢāđˆ

āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļ—āļĩāđˆāļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļŠāļ”āļ‡

āđ€āļĢāļēāļ—āļģāļāļēāļĢāļ§āļąāļ”āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ API CUDA (āļœāđˆāļēāļ™ eBPF uprobes āļšāļ™ libcudart.so) āđāļĨāļ°āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ Linux (āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļšāļĢāļīāļšāļ—, āļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđ‰āļē, āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ) āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļĨāđˆāļēāđ€āļĢāļ·āđˆāļ­āļ‡āļĢāļēāļ§āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒ

āļ§āļīāļ”āļĩāđ‚āļ­āļ—āļąāļ§āļĢāđŒāđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļš: https://asciinema.org/a/RGwhPeXAPJdhXqxp

āđƒāļ™č§†éĒ‘ āđ€āļĢāļēāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ LLM āļ—āļĩāđˆāđ€āļ›āļīāļ”āļāļ§āđ‰āļēāļ‡ (MiniMax-M2.7) āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļœāđˆāļēāļ™ MCP (Model Context Protocol):

ollmcp -m minimax-m2.7:cloud -j /tmp/ingero-mcp-dataloader.json

āđ„āļŸāļĨāđŒ JSON āļ„āļ­āļ™āļŸāļīāļāļšāļ­āļ MCP client āļ§āđˆāļēāļ„āļ§āļĢāļŦāļēāļŠerver Ingero āđāļĨāļ°āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āđƒāļ”āļ—āļĩāđˆāļˆāļ°āđ‚āļŦāļĨāļ”:

{
"mcpServers": {
"ingero": {
"command": "./bin/ingero",
"args": ["mcp", "--db", "investigations/pytorch-dataloader-starvation.db"]
}
}
}

āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰ LLM āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļœāđˆāļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ 7 āļŠāļīāđ‰āļ™: get_trace_stats, get_causal_chains, get_per_process_breakdown āđāļĨāļ°āļ­āļ·āđˆāļ™āđ† AI āļŠāļēāļĄāļēāļĢāļ–āļŠāļ·āļšāļ„āđ‰āļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ, āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļšāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒ CUDA āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļāļģāļŦāļ™āļ”āļ•āļēāļĢāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļ§āļīāļ™āļīāļˆāļ‰āļąāļĒāļ āļēāļĐāļēāļ˜āļĢāļĢāļĄāļ”āļēāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļšāļšāļĄāļ·āļ­

4 āđ‚āļ‹āđˆāļŠāļēāđ€āļŦāļ•āļļāļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļĢāļļāļ™āđāļĢāļ‡āļŠāļđāļ‡

āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđ‚āļ‹āđˆāļŠāļēāđ€āļŦāļ•āļļāļ•āļĢāļ§āļˆāļžāļš 4 āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļĢāļļāļ™āđāļĢāļ‡āļŠāļđāļ‡ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĄāļĩāļŠāļēāđ€āļŦāļ•āļļāđ€āļ”āļĩāļĒāļ§āļāļąāļ™:

[HIGH] cudaStreamSync p99=42ms (1,638x p50=25us) - CPU 100% + 1,880 sched_switch events
Timeline:
[SYSTEM] CPU 100%
[HOST ] 1,880 context switches (21s off-CPU)
[CUDA ] p99=42ms (1,638x p50=25us)
Root cause: DataLoader workers āļ•āđˆāļ­āļŠāļđāđ‰āļāļąāļ™āđ€āļžāļ·āđˆāļ­ CPU, āļ„āļ§āļēāļĄāļāļ”āļ”āļąāļ™āļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđ‰āļēāļĄāļēāļ
[HIGH] cudaLaunchKernel p99=24.67ms (349x p50=70us) - CPU 100%
Root: 34 sched_switch events

[HIGH] cuMemAlloc p99=627us (4.0x p50) - CPU 100%
[HIGH] cuLaunchKernel p99=106us (4.0x p50) - CPU 100%

cudaStreamSync p99 āļ„āļ·āļ­ 1,638 āđ€āļ—āđˆāļēāļ‚āļ­āļ‡ p50 āļ™āļąāđˆāļ™āđ„āļĄāđˆāđƒāļŠāđˆāļ„āļ§āļēāļĄāļŠāđ‰āļēāļ‚āļ­āļ‡ GPU – āļ™āļąāđˆāļ™āļ„āļ·āļ­ GPU āļ—āļĩāđˆāļĢāļ­āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļĄāļēāļ–āļķāļ‡āļ—āļąāļ™āđ€āļ§āļĨāļē

āļĢāļđāļ›āļ—āļĩāđˆ 1: āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āđ‚āļ”āļĒ AI āļŦāļĨāļąāļ‡āļāļēāļĢāļ§āļīāđˆāļ‡ /investigate āļĄāļ­āļ”āļđāļĨāđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ MCP 7 āļŠāļīāđ‰āļ™āļ‚āļ­āļ‡ Ingero āđ€āļžāļ·āđˆāļ­āļŠāļ·āļšāļ„āđ‰āļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļ„āļģāļ­āļ˜āļīāļšāļēāļĒāļ āļēāļĐāļēāļ˜āļĢāļĢāļĄāļ”āļēāļ—āļĩāđˆāļĄāļĩāļ„āļģāđāļ™āļ°āļ™āļģāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡

āļāļēāļĢāđāļšāđˆāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ

āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļŠāļąāļ”āđ€āļˆāļ™ āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļŦāļĨāļąāļāđāļĨāļ°āļ„āļ™āļ‡āļēāļ™ DataLoader 4 āļ„āļ™āļ‚āļ­āļ‡āļĄāļąāļ™āļ›āļĢāļēāļāļāđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ—āļĩāđˆāđāļĒāļāļˆāļēāļāļāļąāļ™:
āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļŦāļĨāļąāļ:

- cudaMemcpyAsync (āļāļēāļĢāļ–āđˆāļēāļĒāđ‚āļ­āļ™āļˆāļēāļāđ‚āļŪāļŠāļ•āđŒāđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ): āļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒ 301ms, āļŠāļđāļ‡āļŠāļļāļ” 2.9 āļ§āļīāļ™āļēāļ—āļĩ
- cudaStreamSync: p99 = 42ms (āļ›āļāļ•āļī 25us)
- 1,567 context switches, āļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒ 16ms off-CPU, āļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ—āļĩāđˆāđāļĒāđˆāļ—āļĩāđˆāļŠāļļāļ” 5 āļ§āļīāļ™āļēāļ—āļĩ
- 799,018 page allocations
DataLoader worker 1: 52,863 context switches, 89,338 page allocations, āļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ—āļĩāđˆāđāļĒāđˆāļ—āļĩāđˆāļŠāļļāļ” 5s
DataLoader worker 2: 50,638 context switches, 83,509 page allocations, āļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ—āļĩāđˆāđāļĒāđˆāļ—āļĩāđˆāļŠāļļāļ” 5s
DataLoader worker 3: 49,361 context switches, 70,035 page allocations, āļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ—āļĩāđˆāđāļĒāđˆāļ—āļĩāđˆāļŠāļļāļ” 5s
DataLoader worker 4: 38,862 context switches, 56,354 page allocations, āļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ—āļĩāđˆāđāļĒāđˆāļ—āļĩāđˆāļŠāļļāļ” 5s

āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļąāđˆāļ§āļ„āļ™āļ‡āļēāļ™: ~191,000 context switches āđāļĨāļ° ~299,000 page allocations āđƒāļ™ 40 āļ§āļīāļ™āļēāļ—āļĩ

āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļŦāļĄāļēāļĒāļ–āļķāļ‡

āļ„āļ™āļ‡āļēāļ™ DataLoader āļ—āļģāļŠāļīāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒāļŠāļđāļ‡āļŠāļēāļĄāļŠāļīāđˆāļ‡āļ—āļĩāđˆāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡:

  1. āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđāļšāļšāļŠāļļāđˆāļĄāđāļĨāļ°āļ”āļąāļŠāļ™āļĩ: DataLoader āļ—āļĩāđˆāļĄāļĩ shuffle=True āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ‡āļŠāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļšāļšāļŠāļļāđˆāļĄāļ‚āļ­āļ‡āļ”āļąāļŠāļ™āļĩ āļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļ™āļ‡āļēāļ™āđāļ•āđˆāļĨāļ°āļ„āļ™āđ€āļĨāļ·āļ­āļāļŠāļīāđ‰āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļĄāļąāļ™ āļ‹āļķāđˆāļ‡āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļŠāļļāđˆāļĄāļ—āļąāđˆāļ§āļ—āļąāđ‰āļ‡āđ€āļ—āļ™āđ€āļ‹āļ­āļĢāđŒ 7 āļĨāđ‰āļēāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ â€“ āļ‹āļķāđˆāļ‡āđ„āļĄāđˆāļ”āļĩāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāđƒāļ™āđāļ„āļŠāđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ” page faults
  2. āļāļēāļĢāļĢāļ§āļšāļĢāļ§āļĄāđāļĨāļ°āļ„āļąāļ”āļĨāļ­āļ: āļ„āļ™āļ‡āļēāļ™āđāļ•āđˆāļĨāļ°āļ„āļ™āļĢāļ§āļšāļĢāļ§āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļāļĢāļ°āļˆāļēāļĒāļ­āļĒāļđāđˆāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āđ€āļ›āđ‡āļ™āđ€āļ—āļ™āđ€āļ‹āļ­āļĢāđŒāđāļšāļ•āļŠāđŒāļ—āļĩāđˆāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļ™ āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāļĄāđˆ (page allocations), āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļ•āļģāđāļŦāļ™āđˆāļ‡āđāļšāļšāļŠāļļāđˆāļĄ (cache misses) āđāļĨāļ°āļāļēāļĢāļ­āļ™āļļāļāļĢāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļŦāļĨāļąāļāļœāđˆāļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāđˆāļ§āļĄāļŦāļĢāļ·āļ­āļ„āļīāļ§
  3. āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āļŠāļģāļŦāļĢāļąāļš CPU: āļ„āļ™āļ‡āļēāļ™ 4 āļ„āļ™ + āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļŦāļĨāļąāļāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ 4-vCPU āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāļžāļĢāļĩāđ€āļ­āļĄāļ›āđŒāļ•āđāļšāļšāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļ„āļ™āļ‡āļēāļ™āđāļ•āđˆāļĨāļ°āļ„āļ™āļ–āļđāļāļžāļĢāļĩāđ€āļ­āļĄāļ›āđŒāļ• 50,000 āļ„āļĢāļąāđ‰āļ‡ āļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ—āļĩāđˆāđāļĒāđˆāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­ 5 āļ§āļīāļ™āļēāļ—āļĩ – āđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ™āļąāđ‰āļ™ GPU āđ„āļĄāđˆāļĄāļĩāļ­āļ°āđ„āļĢāļ—āļĩāđˆāļˆāļ°āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ

āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡: X[i:i+batch_size] āđ€āļ›āđ‡āļ™āļĄāļļāļĄāļĄāļ­āļ‡āļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļ‚āļ­āļ‡āđ€āļ—āļ™āđ€āļ‹āļ­āļĢāđŒāļ—āļĩāđˆāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļ™āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ .to(device)č§ļ发āļāļēāļĢāļ–āđˆāļēāļĒāđ‚āļ­āļ™ DMA āļˆāļēāļāļ āļđāļĄāļīāļ āļēāļ„āļ—āļĩāđˆāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļ™āđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§ āđ„āļĄāđˆāļĄāļĩāļ„āļ™āļ‡āļēāļ™, āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļŠāļļāđˆāļĄ, āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļĢāļ§āļšāļĢāļ§āļĄ, āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļēāļĄāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ, āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļšāļĢāļīāļšāļ— āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ GPU āđ„āļ”āđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ„āļĄāđ‚āļ„āļĢāļ§āļīāļ™āļēāļ—āļĩ āđ„āļĄāđˆāđƒāļŠāđˆāļŦāļĨāļēāļĒāļĢāđ‰āļ­āļĒāļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ

āļāļēāļĢāđāļāđ‰āđ„āļ‚

āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ GPU āļ—āļĩāđˆāļ—āļąāđ‰āļ‡āđ€āļ‹āļ•āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđˆāđƒāļ™ RAM:

  1. āđ„āļĄāđˆāđƒāļŠāđ‰ DataLoader. āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡āļ”āđ‰āļ§āļĒāļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļ”āļąāļŠāļ™āļĩāļ—āļĩāđˆāļŠāļļāđˆāļĄāļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļ‡āđˆāļēāļĒāļāļ§āđˆāļēāđāļĨāļ°āđ€āļĢāđ‡āļ§āļāļ§āđˆāļē 100 āđ€āļ—āđˆāļē:
    indices = torch.randperm(num_samples)
    for i in range(0, num_samples, batch_size):
    batch = X[indices[i:i+batch_size]].to(device)
    output = model(batch)
    
  2. āļŦāļēāļāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ DataLoader, āļˆāļąāļšāļ„āļđāđˆ num_workers āļāļąāļšāđāļāļ™ CPU āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡āļ„āļļāļ“āļĨāļš 1 āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ 4-āđāļāļ™ āļˆāļąāļšāļ„āļđāđˆ num_workers=2 āđ€āļžāļ·āđˆāļ­āļĨāļ”āļāļēāļĢāļ‚āļąāļ”āđāļĒāđ‰āļ‡āļāļąāļ™ āđ€āļžāļīāđˆāļĄ persistent_workers=True āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāđƒāļŦāļĄāđˆ
  3. āļŠāļģāļŦāļĢāļąāļšāđ€āļ‹āļ•āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđƒāļŦāļāđˆāļāļ§āđˆāļēāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ DataLoader āļˆāļļāļ”āļ­āļļāļ”āļ•āļąāļ™āļˆāļĢāļīāļ‡āđ† āļ„āļ·āļ­ I/O āļ”āļīāļŠāļāđŒ āđƒāļŠāđ‰ prefetch_factor=2 (āđ„āļĄāđˆāđƒāļŠāđˆāļĄāļēāļāļāļ§āđˆāļēāļ™āļąāđ‰āļ™ â€“ āļāļēāļĢāļžāļĢāļĩāđ€āļŸāļ•āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļĄāļēāļāļ‚āļķāđ‰āļ™āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļ§āļēāļĄāļāļ”āļ”āļąāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāļĄāļēāļāļ‚āļķāđ‰āļ™) āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđƒāļŦāđ‰āđāļ™āđˆāđƒāļˆāļ§āđˆāļēāļĢāļ°āļšāļšāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāđ„āļ”āđ‰

āļ āļēāļžāļĢāļ§āļĄāļ—āļĩāđˆāđƒāļŦāļāđˆāļāļ§āđˆāļē

āļāļēāļĢāļŠāļ­āļšāļŠāļ§āļ™āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāđ€āļĢāļēāđ€āļŦāđ‡āļ™āļšāđˆāļ­āļĒāđ† āđƒāļ™āļ‡āļēāļ™ GPU: GPU āđ€āļĢāđ‡āļ§, āđ‚āļŪāļŠāļ•āđŒāļŠāđ‰āļē, āđāļĨāļ°āđ€āļĄāļ•āļĢāļīāļ GPU āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰ nvidia-smi āļĢāļēāļĒāļ‡āļēāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđˆāļģ āđāļ•āđˆāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ­āļ˜āļīāļšāļēāļĒāđ„āļ”āđ‰āļ§āđˆāļēāļ—āļģāđ„āļĄ

āļ§āļīāļ˜āļĩāđ€āļ”āļĩāļĒāļ§āļ—āļĩāđˆāļˆāļ°āđ€āļŦāđ‡āļ™āļ āļēāļžāļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļ„āļ·āļ­āļ•āļīāļ”āļ•āļēāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ”āđ‰āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ â€“ āļāļēāļĢāđ€āļĢāļĩāļĒāļ API CUDA āđāļĨāļ°āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ Linux – āđāļĨāļ°āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™āđ‚āļ”āļĒāđ€āļ§āļĨāļēāđāļĨāļ° ID āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ āđ‚āļ‹āđˆāļŠāļēāđ€āļŦāļ•āļļ “CPU 100% -> 1,880 sched_switch -> cudaMemcpyAsync 301ms -> cudaStreamSync 42ms” āđ€āļĨāđˆāļēāđ€āļĢāļ·āđˆāļ­āļ‡āļĢāļēāļ§āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļ™āļŦāļ™āļķāđˆāļ‡āļšāļĢāļĢāļ—āļąāļ” āļŦāļēāļāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļ—āļĩāđˆāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļˆāļ°āļĒāļąāļ‡āļ„āļ‡āđ€āļ›āđ‡āļ™āļ›āļĢāļīāļĻāļ™āļē – āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļ—āļĩāđˆāļœāļđāđ‰āļĢāļēāļĒāļ‡āļēāļ™āđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļŦāļĨāļēāļĒāļŠāļąāļ›āļ”āļēāļŦāđŒāđƒāļ™āļāļēāļĢāđāļāđ‰āļ›āļąāļāļŦāļē

āļĢāļđāļ›āļ—āļĩāđˆ 2: āđ€āļĄāļ·āđˆāļ­āļ–āļēāļĄ â€œāļŠāļēāđ€āļŦāļ•āļļāļŦāļĨāļąāļāļ„āļ·āļ­āļ­āļ°āđ„āļĢ?” āļĄāļ­āļ”āļđāļĨāļĢāļ°āļšāļļāļ§āđˆāļē CPU āļĄāļĩāļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļĄāļēāļāđ€āļāļīāļ™āđ„āļ›āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļ„āļ§āļēāļĄāļĨāđˆāļēāļŠāđ‰āļēāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļ•āļēāļĢāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļŪāļŠāļ•āđŒ cudaLaunchKernel āļĨāđˆāļēāļŠāđ‰āļēāļˆāļēāļ 73us āđ„āļ›āđ€āļ›āđ‡āļ™ 25.8ms (356 āđ€āļ—āđˆāļē)

āļĨāļ­āļ‡āļ”āđ‰āļ§āļĒāļ•āļąāļ§āđ€āļ­āļ‡

āļ—āļģāļ‹āđ‰āļģāļāļēāļĢāļ§āļąāļ”āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž:

import torch, time
from torch.utils.data import DataLoader

X = torch.randn(7_000_000, 100) model = torch.nn.Sequential( torch.nn.Linear(100, 512), torch.nn.ReLU(), torch.nn.Linear(512, 512), torch.nn.ReLU(), torch.nn.Linear(512, 10) ).cuda()

# Fast path start = time.time() with torch.no_grad(): for i in range(0, len(X), 1_048_576): model(X[i:i+1_048_576].cuda()) torch.cuda.synchronize() print(f'Direct: {time.time()-start:.3f}s')

# Slow path loader = DataLoader(X, batch_size=1_048_576, shuffle=True) start = time.time() with torch.no_grad(): for batch in loader: model(batch.cuda()) torch.cuda.synchronize() print(f'DataLoader: {time.time()-start:.3f}s')

āļ•āļīāļ”āļ•āļēāļĄāļ”āđ‰āļ§āļĒ Ingero āđ€āļžāļ·āđˆāļ­āļ”āļđāļŠāļīāđˆāļ‡āļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡:

git clone https://github.com/ingero-io/ingero.git
cd ingero && make build
sudo ./bin/ingero trace --duration 60s # in one terminal
python3 benchmark.py # in another terminal
./bin/ingero explain --since 60s # after benchmark completes

āļŦāļĢāļ·āļ­āđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāļ—āļģāļ‹āđ‰āļģāđāļĨāļ°āļŠāļģāļĢāļ§āļˆāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļ‚āļ­āļ‡āđ€āļĢāļēāđ‚āļ”āļĒāļ•āļĢāļ‡ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļŠāļ­āļšāļŠāļ§āļ™ (764KB) āļ­āļĒāļđāđˆāđƒāļ™äŧ“åšŦ:

# View causal chains from the investigation
./bin/ingero explain --db investigations/pytorch-dataloader-starvation.db --since 5m

# Per-process breakdown (see DataLoader workers vs main process) ./bin/ingero explain --db investigations/pytorch-dataloader-starvation.db --per-process --since 5m

# Connect your AI assistant for interactive investigation ./bin/ingero mcp --db investigations/pytorch-dataloader-starvation.db

āļŠāļ·āļšāļ„āđ‰āļ™āļ”āđ‰āļ§āļĒ AI (āđāļ™āļ°āļ™āļģ). āļ§āļīāļ˜āļĩāļ—āļĩāđˆāđ€āļĢāđ‡āļ§āļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āļ„āļ·āļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ AI āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļš MCP āđƒāļ”āđ† āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ•āļĢāļ‡ āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļšāļšāļĄāļ·āļ­
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ„āļ­āļ™āļŸāļīāļ:

cat > /tmp/ingero-mcp-dataloader.json << 'EOF'
{
"mcpServers": {
"ingero": {
"command": "./bin/ingero",
"args": ["mcp", "--db", "investigations/pytorch-dataloader-starvation.db"]
}
}
}
EOF

āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĄāļ­āļ”āļđāļĨāļ‚āļ­āļ‡āļ„āļļāļ“:

# With Ollama + MiniMax (what we used in the video)
ollmcp -m minimax-m2.7:cloud -j /tmp/ingero-mcp-dataloader.json

# With Claude Code claude --mcp-config /tmp/ingero-mcp-dataloader.json

# With any MCP-compatible client # Add the config above to your AI's MCP settings

āļžāļīāļĄāļžāđŒ /investigate āđ€āļžāļ·āđˆāļ­āļāļĢāļ°āļ•āļļāđ‰āļ™āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ—āļĩāđˆāļĄāļĩāļ„āļģāđāļ™āļ°āļ™āļģ āļŦāļĢāļ·āļ­āļ–āļēāļĄāļ„āļģāļ–āļēāļĄāđƒāļ”āđ†: “āļŠāļēāđ€āļŦāļ•āļļāļ‚āļ­āļ‡āļāļēāļĢāļ‚āļēāļ”āđāļ„āļĨāļ™ GPU āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?” AI āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ 7 āļŠāļīāđ‰āļ™āļ—āļĩāđˆāļŠāļ·āļšāļ„āđ‰āļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡

GitHub: github.com/ingero-io/ingero
āļ›āļąāļāļŦāļēāđ€āļ”āļīāļĄ: pytorch/pytorch#154318
āļ§āļīāļ”āļĩāđ‚āļ­āļ—āļąāļ§āļĢāđŒ: https://asciinema.org/a/RGwhPeXAPJdhXqxp

āļāļēāļĢāļŠāļ­āļšāļŠāļ§āļ™āļ™āļĩāđ‰āļ—āļģāļšāļ™ TensorDock RTX 4090 (24GB), Ubuntu 22.04, PyTorch 2.10.0+cu128.

āđ€āļ”āļ§āļīāļ” āđ€āļĄāļĨ āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļĢāđˆāļ§āļĄāđ€āļ‚āļĩāļĒāļ™āđāļĨāļ°āļœāļđāđ‰āļ”āļđāđāļĨ Ingero āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ—āļ™ eBPF āđāļšāļšāđ‚āļ­āđ€āļžāđˆāļ™āļ‹āļ­āļĢāđŒāļŠāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļ‡āđ€āļāļ•āļāļēāļĢāļ“āđŒ GPU āļĢāļ°āļ”āļąāļš CUDA āđ€āļ‚āļēāļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‚āļ­āļ‡ AI āđƒāļ™āļāļēāļĢāļœāļĨāļīāļ•