Browse documentation
Research

Distributed Dense training benchmark

Matched native CPU and accelerator training on three configurations, alone and together, with measured timing, memory, held out quality and verified weighted gradients.

This controlled experiment measures native Dense training on CPU, Metal/MPS and CUDA, separately and in explicitly configured groups. All 57 measured trials across 19 cases passed the fixed scientific and numerical checks. Nineteen additional warm ups are excluded from timing statistics. The fixture tests portable execution and learning quality; it does not establish real world task accuracy or peak hardware throughput.

Scientific contract

SettingFixed value
SourceNative linear teacher generator; 65,536 rows, 64 finite uniform features, four classes; seed 42
Protected roles45,876 training, 9,830 validation and 9,830 test rows; stratified split seed 42
ModelDense 64 → 128 → 64 → 4; ReLU hidden layers; 16,836 parameters; seeded Xavier MLP initialization
PreprocessingPopulation standardization fitted only to training rows
Loss/updateCross entropy; SGD rate 0.05; one canonical CPU update in the selected group dtype
Batch/horizonGlobal batch 1,536; ten epochs; 300 updates; final batch 1,332 rows retained each epoch
PrecisionFloat32 CPU/MPS/CUDA; Float64 CPU/CUDA. Host SUM/count accumulation is Float64; canonical parameters/optimizer state retain selected group dtype
RepetitionOne excluded warm up and three fresh command repetitions per case; fixed seed 42

Every selected worker returned gradients in its declared native backend. Global row counts, source and partition fingerprints, fixed update counts and declared weight/tail allocations agree. Validation/test rows never supply gradients or normalization statistics. GPU replicas perform forward/backward; Dataset preparation, canonical updates and final fitted evaluation use CPU.

The native source contract is 43aaceb4725f52a5136643b824d790c26600f92378c6cf753287c0b069d5211a. Dataset source identity is 72bde3eff8b278c07be2746ea50d317557c7534244eee0452f1f7907e0f36562. The complete Aner exploration source and distributed neural guide expose the scientific and execution choices.

Platform configurations

Immutable configurationProcessor / acceleratorVisible CPU slotsRAM scopeNative provider policy
Atlas-01 / C03Apple M2 Max / Apple M2 Max1264.00 GiB; installed unified RAMapple_accelerate; one requested; actual unavailable
Atlas-02 / C03Virtual CPU (model unavailable) / NVIDIA GeForce GTX1060 3GB215.05 GiB; guest visible Linux MemTotal; not measured RSSopenblas; one requested; actual 1
Atlas-03 / C03Virtual CPU (model unavailable) / Tesla V100 PCIE 32GB2460.47 GiB; guest visible Linux MemTotal; not measured RSSopenblas; one requested; actual 1

These are configuration capacities, not measured process use or dedicated core guarantees. Atlas identities are opaque inventory numbers; configuration revisions preserve hardware/software policy changes. Earlier MNIST measurements and CPU task measurements retain their historical configurations and results.

Duration and scaling

Measured native fit, complete command and group scaling

Open the duration chart · Download PNG

The table gives median and observed minimum: maximum seconds over three repetitions. These ranges are descriptive, not confidence intervals. Complete command time includes source generation/partitioning, preprocessing, placement/process/SSH initialization, training, validation/final test and shutdown. All cases omit native checkpoint/report file I/O. Compilation and source staging occur outside the timing window. Native fit and complete command time have separate boundaries: standalone backend initialization may precede fit, while configured worker initialization can occur inside fit.

Placement / dtypeNative fit seconds: median [range]Complete command seconds: median [range]Held out test accuracyTest cross entropy
Atlas-01 CPU · Float322.7211 [2.6704 to 2.7432]3.0629 [3.0538 to 3.1175]89.55%0.297054
Atlas-01 CPU · Float643.0861 [3.0773 to 3.0974]3.4517 [3.4309 to 3.4779]89.55%0.297053
Atlas-02 CPU · Float3219.3351 [17.8642 to 20.1869]22.1044 [20.8876 to 22.8521]89.55%0.297053
Atlas-02 CPU · Float6418.0180 [16.6598 to 18.0718]20.6516 [19.7015 to 20.8107]89.55%0.297053
Atlas-03 CPU · Float3212.7087 [12.5878 to 12.8603]14.8287 [14.5909 to 15.1606]89.55%0.297053
Atlas-03 CPU · Float6411.4566 [11.4367 to 11.4791]13.5185 [13.4066 to 13.9420]89.55%0.297053
Atlas-01 MPS · Float322.8042 [2.6329 to 2.8168]3.2152 [3.0367 to 3.2553]89.55%0.297054
Atlas-02 CUDA · Float325.9443 [5.9041 to 6.0290]8.6921 [8.5151 to 8.7703]89.55%0.297056
Atlas-02 CUDA · Float645.9581 [5.8432 to 6.5129]9.5087 [8.7968 to 9.7268]89.55%0.297053
Atlas-03 CUDA · Float324.0420 [4.0253 to 4.0459]6.1135 [6.0218 to 6.5987]89.55%0.297054
Atlas-03 CUDA · Float643.3800 [3.3518 to 3.4232]5.3596 [5.3255 to 5.4403]89.55%0.297053
Atlas-01 MPS + Atlas-02 CUDA · Float3266.4068 [64.4150 to 69.5335]66.8676 [64.8878 to 69.9777]89.55%0.297055
Atlas-01 MPS + Atlas-03 CUDA · Float3258.5972 [57.2089 to 64.4325]59.0436 [57.6454 to 64.8584]89.55%0.297056
Atlas-02 CUDA + Atlas-03 CUDA · Float3290.6031 [82.0128 to 91.6780]91.1092 [82.5244 to 92.1647]89.55%0.297056
Atlas-01 MPS + Atlas-02 CUDA + Atlas-03 CUDA · Float3285.5909 [85.5678 to 86.2928]86.0938 [86.0767 to 86.7966]89.55%0.297053
Atlas-02 CUDA + Atlas-03 CUDA · Float64124.1251 [116.4679 to 125.6942]124.6553 [116.9992 to 126.2309]89.55%0.297053
Atlas-01 CPU + Atlas-02 CPU + Atlas-03 CPU · Float3288.6459 [87.6388 to 92.2319]89.1634 [88.2181 to 92.7419]89.55%0.297054
Atlas-01 CPU + Atlas-02 CPU + Atlas-03 CPU · Float64113.8934 [108.1030 to 116.4695]114.4400 [108.6370 to 117.0271]89.55%0.297053
Atlas-02 CUDA + Atlas-03 CUDA · Float32 · allocation 1:791.6420 [90.0050 to 92.7273]92.1320 [90.5023 to 93.2488]89.55%0.297053

Float32 had a shorter median CPU fit on Atlas-01, while Float64 had a shorter median CUDA fit on Atlas-03. Both precisions retained the same held out test accuracy in this fixture. Precision alone does not determine elapsed time or all host storage peaks; the backend and complete update/staging path are part of the measurement.

GroupFastest selected fit referenceFit speedupFastest selected complete command referenceComplete command speedup
Atlas-01 MPS + Atlas-02 CUDA · Float32Atlas-01 MPS · Float320.042×Atlas-01 MPS · Float320.048×
Atlas-01 MPS + Atlas-03 CUDA · Float32Atlas-01 MPS · Float320.048×Atlas-01 MPS · Float320.054×
Atlas-02 CUDA + Atlas-03 CUDA · Float32Atlas-03 CUDA · Float320.045×Atlas-03 CUDA · Float320.067×
Atlas-01 MPS + Atlas-02 CUDA + Atlas-03 CUDA · Float32Atlas-01 MPS · Float320.033×Atlas-01 MPS · Float320.037×
Atlas-02 CUDA + Atlas-03 CUDA · Float64Atlas-03 CUDA · Float640.027×Atlas-03 CUDA · Float640.043×
Atlas-01 CPU + Atlas-02 CPU + Atlas-03 CPU · Float32Atlas-01 CPU · Float320.031×Atlas-01 CPU · Float320.034×
Atlas-01 CPU + Atlas-02 CPU + Atlas-03 CPU · Float64Atlas-01 CPU · Float640.027×Atlas-01 CPU · Float640.030×
Atlas-02 CUDA + Atlas-03 CUDA · Float32 · allocation 1:7Atlas-03 CUDA · Float320.044×Atlas-03 CUDA · Float320.066×

0 of 8 groups had a lower median native fit time than their fastest selected standalone placement. Values below 1 indicate slower group execution; unfavorable outcomes remain in the report. Baseline selection is independent for fit and complete command time, and the JSON identifies both. This workload does not imply that two computers always improve training speed.

Learning and numerical agreement

Post-epoch validation loss and accuracy

Open the validation chart · Download PNG

The plots use actual detached post epoch validation observations. Pre update online batch loss is a different phase and is not presented as a final model loss snapshot. Final held out test measurements appear in the table; test rows remain outside model selection. Curves can overlap despite small numerical differences.

Compute dtypeMaximum absolute parameter differenceMaximum absolute loss differenceMaximum absolute accuracy fraction differencePredeclared limits: parameter / loss / accuracy
Float325.98e 052.67e 060.0001020.001 / 0.0005 / 0.005
Float643.33e 161.11e 1601e 08 / 1e 08 / 1e 12

Each dtype uses its predeclared standalone CPU reference and first measured trial. Complete retained parameter vectors are compared before publication; hashes and independently recomputed errors are public, while full vectors stay internal. Cross precision quality is descriptive: Float32 and Float64 parameters do not use one shared tight tolerance. The unequal Float32 CUDA allocation case uses relative weights 1:7 but retains the same global rows and one update per batch.

Memory and phase observations

Reported process and tracked Tensor capacity peaks

Open the memory chart · Download PNG

Coordinator RSS is a native high water query before final parameter JSON and shutdown. Worker RSS is queried during accepted gradient steps. Inline coordinator/rank share a process, and those query points differ. The largest rank is selected per trial. Tracked Tensor host/device capacities exclude raw Dataset source, allocator overhead, provider scratch and driver context. Peaks are not simultaneous totals. MPS shared buffers overlap host RAM and must not be added to it. External driver process VRAM remains N/A wherever no PID matched sample was obtained.

Native receipts separately report preparation/upload, forward/backward, readback, worker total duration, request writing, response waiting, payload bytes and coordinator exchange time. Response waiting includes worker computation and transfer; it is not pure network latency. Worker compute is measured with a host steady clock around native forward/backward and completion synchronization, including dispatch/backend work; it is not kernel only GPU event time. Upload/preparation also includes validation, casts and allocations. Worker total time excludes protocol decoding/encoding, checksums and reply delivery. Payload bytes exclude protocol/SSH framing. Request parameter/feature/target values use the selected Float32 or Float64 encoding; detached gradient sum replies use Float64. Metadata and decoded host exchange storage retain their own fixed scopes, so compute dtype alone does not halve all communicated or host staged bytes. Effective link bandwidth, physical host dedication, CPU/GPU utilization and pure network only latency were not measured and are unavailable.

Reproducibility and limits

Download all 57 sanitized trials and 19 excluded warm ups · Download 19 case summaries · Download checksummed public configuration facts

A separate source language correctness exercise used the protected Iris split (90 training, 30 validation and 30 test rows) across the three host execution context. The simple production, development and class based examples agreed: held out accuracy 96.6667% and cross entropy 0.17894501984119415. Development captures identify canonical CPU reference graphs explicitly. These checks verify the source API and modes; their accuracy and timings are not synthetic fixture benchmark results.

The records preserve every same dtype comparison, actual per rank counts/placement, source and partition fingerprints, measured phase/resource scopes, selected baselines and immutable configuration IDs. Private SSH routes, local paths, PIDs and complete parameter vectors are excluded.

This portable path rebuilds local native graphs and stages supported parameter/batch buffers each update. Every replica holds a complete model; memory is not pooled. Direct CUDA collectives, multi GPU per node selection, model/optimizer sharding, convolutional/recurrent models and durable distributed restart were not measured or implemented by this experiment. The synthetic teacher is a controlled numerical fixture. Its accuracy is not evidence about a separate real world task or the hardware performance ceiling.

Aner documentation · Reference and guides