From 0a94bf26f3703d479b930f3957241b36b6b3e6d6 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:03:29 +0800 Subject: [PATCH 1/4] data(ubenchx): preserve Huawei rotating-copy measurements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保留 Ascend 950PR_9579 和 910B3 的完整轮转拷贝测量点、误差范围及来源哈希。 --- .../ubenchx/data/huawei-bandwidth.json | 1186 +++++++++++++++++ 1 file changed, 1186 insertions(+) create mode 100644 packages/app/src/components/ubenchx/data/huawei-bandwidth.json diff --git a/packages/app/src/components/ubenchx/data/huawei-bandwidth.json b/packages/app/src/components/ubenchx/data/huawei-bandwidth.json new file mode 100644 index 000000000..4c7f2387b --- /dev/null +++ b/packages/app/src/components/ubenchx/data/huawei-bandwidth.json @@ -0,0 +1,1186 @@ +{ + "sourceHashes": { + "plot-data.json": "72c246de9aa994fff141715391d6bc651fb08cf2818d363c65cd6465381fae96", + "mbu-comparison.json": "59b6f0f201b038f7fdb034b588dcf71e2612d29fbfedb2bfefc7ee7afd883589" + }, + "method": { + "protocol": "rotating-pool-npu-graph", + "dtype": "float16", + "minimumBytesPerPool": 536870912, + "minimumSlots": 2, + "processes": 3, + "blocksPerProcess": 6, + "observationsPerBlock": 20, + "validation": "Full destination-bit comparison before and after every block; graph validation before timing.", + "cacheClaim": "No cache-miss or physical HBM-traffic counters were collected.", + "comparison": "Amortized full-rotation graph timing differs from the Triton FP32 copy protocol of the GPU curves.", + "missing910B3": "16 GiB omitted: two source and two destination slots require 64 GiB before runtime overhead." + }, + "curves": { + "Ascend 950PR_9579": [ + { + "size_bytes": 4096, + "samples": 360, + "slots": 131072, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0005702691851183772, + "effective_GBps": 14.365145818460267, + "GBps_low": 14.327436005139848, + "GBps_high": 14.412772704974659, + "mbu_percent": 0.8978216136537667, + "process_GBps": [14.364048408475348, 14.411478962728552, 14.342808447766135], + "batch_GBps_median": 14.364266091249895 + }, + { + "size_bytes": 8192, + "samples": 360, + "slots": 65536, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0005940047849435359, + "effective_GBps": 27.582269394610023, + "GBps_low": 27.481367193191318, + "GBps_high": 27.84117844615321, + "mbu_percent": 1.7238918371631264, + "process_GBps": [27.488153087043237, 27.828670162745063, 27.582269394610023], + "batch_GBps_median": 27.579877402667684 + }, + { + "size_bytes": 16384, + "samples": 360, + "slots": 32768, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0006229721184354275, + "effective_GBps": 52.59946477588062, + "GBps_low": 52.36497028501048, + "GBps_high": 52.73664160441561, + "mbu_percent": 3.2874665484925387, + "process_GBps": [52.411065473553684, 52.69168746758244, 52.6083175557098], + "batch_GBps_median": 52.603376899676775 + }, + { + "size_bytes": 32768, + "samples": 360, + "slots": 16384, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0006463481695391238, + "effective_GBps": 101.39426873712694, + "GBps_low": 100.85125189230465, + "GBps_high": 102.22767615695236, + "mbu_percent": 6.3371417960704335, + "process_GBps": [102.15424964913102, 101.39426873712694, 100.90658708760559], + "batch_GBps_median": 101.37306610777266 + }, + { + "size_bytes": 65536, + "samples": 360, + "slots": 8192, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0006662394443992525, + "effective_GBps": 196.73407376560763, + "GBps_low": 196.26266400547743, + "GBps_high": 197.16570758024264, + "mbu_percent": 12.295879610350477, + "process_GBps": [196.76399430812592, 196.4309984754961, 196.95375143532294], + "batch_GBps_median": 196.72301540552075 + }, + { + "size_bytes": 131072, + "samples": 360, + "slots": 4096, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0007195061189122498, + "effective_GBps": 364.33880561892875, + "GBps_low": 363.12074483931417, + "GBps_high": 365.1521295743117, + "mbu_percent": 22.771175351183047, + "process_GBps": [363.56513174458007, 364.6284489048512, 364.69990541338376], + "batch_GBps_median": 364.2804842987366 + }, + { + "size_bytes": 262144, + "samples": 360, + "slots": 2048, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.000844078604131937, + "effective_GBps": 621.1364645822122, + "GBps_low": 615.250629012125, + "GBps_high": 628.6672699985434, + "mbu_percent": 38.82102903638826, + "process_GBps": [615.7588569343593, 621.1364645822122, 627.8756728229461], + "batch_GBps_median": 620.9686541056155 + }, + { + "size_bytes": 524288, + "samples": 360, + "slots": 1024, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0031780170975252986, + "effective_GBps": 329.94662011621, + "GBps_low": 329.2355792227781, + "GBps_high": 330.87846515950685, + "mbu_percent": 20.621663757263125, + "process_GBps": [329.92995378815425, 330.1963693698262, 329.7884847358392], + "batch_GBps_median": 329.96834567930404 + }, + { + "size_bytes": 1048576, + "samples": 360, + "slots": 512, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.003461894579231739, + "effective_GBps": 605.781589243367, + "GBps_low": 604.1844103586747, + "GBps_high": 607.5343065651464, + "mbu_percent": 37.861349327710435, + "process_GBps": [605.3072555017843, 606.7590979679034, 605.5757694870043], + "batch_GBps_median": 605.4209277493137 + }, + { + "size_bytes": 2097152, + "samples": 360, + "slots": 256, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.004387195222079754, + "effective_GBps": 956.0331345391296, + "GBps_low": 952.9973075264429, + "GBps_high": 958.93766395145, + "mbu_percent": 59.7520709086956, + "process_GBps": [955.7395073504729, 957.6851957064066, 955.2080999198523], + "batch_GBps_median": 954.8897926354608 + }, + { + "size_bytes": 3145728, + "samples": 360, + "slots": 171, + "combined_pool_bytes": 1075838976, + "amortized_copy_ms": 0.005587263239754571, + "effective_GBps": 1126.0353647264994, + "GBps_low": 1122.7849712816576, + "GBps_high": 1129.6886350059103, + "mbu_percent": 70.37721029540621, + "process_GBps": [1124.0377115938306, 1128.511718525218, 1126.0442512285124], + "batch_GBps_median": 1125.0290721959668 + }, + { + "size_bytes": 4194304, + "samples": 360, + "slots": 128, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.006938999984413385, + "effective_GBps": 1208.9073380664033, + "GBps_low": 1177.402355803721, + "GBps_high": 1212.7778548647907, + "mbu_percent": 75.55670862915021, + "process_GBps": [1211.097879874776, 1210.4869168626078, 1178.9190655661212], + "batch_GBps_median": 1208.9490890624584 + }, + { + "size_bytes": 6291456, + "samples": 360, + "slots": 86, + "combined_pool_bytes": 1082130432, + "amortized_copy_ms": 0.00984141265237054, + "effective_GBps": 1278.56766548338, + "GBps_low": 1274.1247269310666, + "GBps_high": 1284.158674156476, + "mbu_percent": 79.91047909271126, + "process_GBps": [1282.6617782820608, 1276.198765385342, 1277.6286712390001], + "batch_GBps_median": 1276.3195232299317 + }, + { + "size_bytes": 8388608, + "samples": 360, + "slots": 64, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.012577531393617392, + "effective_GBps": 1333.903726808727, + "GBps_low": 1326.1317625707748, + "GBps_high": 1340.565966742003, + "mbu_percent": 83.36898292554544, + "process_GBps": [1334.1515397527842, 1327.766858133526, 1339.6194438688508], + "batch_GBps_median": 1332.6867850151746 + }, + { + "size_bytes": 10485760, + "samples": 360, + "slots": 52, + "combined_pool_bytes": 1090519040, + "amortized_copy_ms": 0.015623923104542952, + "effective_GBps": 1342.2697909913634, + "GBps_low": 1336.6772622737928, + "GBps_high": 1347.9781150815716, + "mbu_percent": 83.89186193696021, + "process_GBps": [1337.9460335993538, 1342.306966375744, 1346.9433877673446], + "batch_GBps_median": 1340.7311119397755 + }, + { + "size_bytes": 12582912, + "samples": 360, + "slots": 43, + "combined_pool_bytes": 1082130432, + "amortized_copy_ms": 0.018632860377777456, + "effective_GBps": 1350.6151760796806, + "GBps_low": 1344.0398897862465, + "GBps_high": 1358.748497891573, + "mbu_percent": 84.41344850498004, + "process_GBps": [1350.6505949132234, 1346.2757751177407, 1356.9850326410058], + "batch_GBps_median": 1348.8537056521081 + }, + { + "size_bytes": 14680064, + "samples": 360, + "slots": 37, + "combined_pool_bytes": 1086324736, + "amortized_copy_ms": 0.022153202746365522, + "effective_GBps": 1325.3220464845363, + "GBps_low": 1319.9093811900254, + "GBps_high": 1330.0781760726736, + "mbu_percent": 82.83262790528352, + "process_GBps": [1327.1240991973198, 1321.7325829398656, 1326.4005859737204], + "batch_GBps_median": 1324.9484015710134 + }, + { + "size_bytes": 16777216, + "samples": 360, + "slots": 32, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.02452706266194582, + "effective_GBps": 1368.05749887288, + "GBps_low": 1362.4227558956425, + "GBps_high": 1405.1738543571612, + "mbu_percent": 85.503593679555, + "process_GBps": [1403.7070409211979, 1366.4757829674227, 1365.1267696454465], + "batch_GBps_median": 1365.134384116032 + }, + { + "size_bytes": 20971520, + "samples": 360, + "slots": 26, + "combined_pool_bytes": 1090519040, + "amortized_copy_ms": 0.03062876944358532, + "effective_GBps": 1369.4001019941159, + "GBps_low": 1363.9707531361396, + "GBps_high": 1377.9132642784325, + "mbu_percent": 85.58750637463224, + "process_GBps": [1376.3019554998873, 1368.7993794418499, 1365.8001884701316], + "batch_GBps_median": 1367.3373559143379 + }, + { + "size_bytes": 25165824, + "samples": 360, + "slots": 22, + "combined_pool_bytes": 1107296256, + "amortized_copy_ms": 0.036556841297583145, + "effective_GBps": 1376.8051673361488, + "GBps_low": 1371.858982254753, + "GBps_high": 1382.3759137486902, + "mbu_percent": 86.0503229585093, + "process_GBps": [1380.4311165869726, 1374.072416844146, 1376.8590964457214], + "batch_GBps_median": 1375.348029222982 + }, + { + "size_bytes": 29360128, + "samples": 360, + "slots": 19, + "combined_pool_bytes": 1115684864, + "amortized_copy_ms": 0.04246739337318822, + "effective_GBps": 1382.713920866003, + "GBps_low": 1377.669562096928, + "GBps_high": 1387.3488780220366, + "mbu_percent": 86.41962005412519, + "process_GBps": [1381.8011213782559, 1385.1437943122432, 1381.5991771896959], + "batch_GBps_median": 1380.5958957194011 + }, + { + "size_bytes": 33554432, + "samples": 360, + "slots": 16, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.04832074977457523, + "effective_GBps": 1388.8208339703876, + "GBps_low": 1384.4338520112901, + "GBps_high": 1392.2640006079937, + "mbu_percent": 86.80130212314923, + "process_GBps": [1387.8192098065958, 1389.010375863181, 1389.4390705018664], + "batch_GBps_median": 1387.0774159404414 + }, + { + "size_bytes": 41943040, + "samples": 360, + "slots": 13, + "combined_pool_bytes": 1090519040, + "amortized_copy_ms": 0.06041388557507442, + "effective_GBps": 1388.5231714778124, + "GBps_low": 1383.8758414401218, + "GBps_high": 1393.3063584376398, + "mbu_percent": 86.78269821736328, + "process_GBps": [1390.0089669108295, 1389.6370221270724, 1385.8331729059744], + "batch_GBps_median": 1387.8124588484288 + }, + { + "size_bytes": 50331648, + "samples": 360, + "slots": 11, + "combined_pool_bytes": 1107296256, + "amortized_copy_ms": 0.07186286286874251, + "effective_GBps": 1400.76935403842, + "GBps_low": 1396.7396948436487, + "GBps_high": 1404.5265250412012, + "mbu_percent": 87.54808462740125, + "process_GBps": [1400.346839807555, 1400.3176010977477, 1402.0889550831864], + "batch_GBps_median": 1399.556664039117 + }, + { + "size_bytes": 58720256, + "samples": 360, + "slots": 10, + "combined_pool_bytes": 1174405120, + "amortized_copy_ms": 0.08327209949493408, + "effective_GBps": 1410.322457489433, + "GBps_low": 1405.7274212201607, + "GBps_high": 1413.7738360010965, + "mbu_percent": 88.14515359308956, + "process_GBps": [1409.3188375584293, 1411.0671928396293, 1410.7502546894375], + "batch_GBps_median": 1408.781172319667 + }, + { + "size_bytes": 67108864, + "samples": 360, + "slots": 8, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.09513581544160843, + "effective_GBps": 1410.8012568870963, + "GBps_low": 1406.9945003916703, + "GBps_high": 1414.1961037821745, + "mbu_percent": 88.17507855544352, + "process_GBps": [1411.050670550063, 1411.695333004461, 1409.8713471535327], + "batch_GBps_median": 1409.2369701670573 + }, + { + "size_bytes": 83886080, + "samples": 360, + "slots": 7, + "combined_pool_bytes": 1174405120, + "amortized_copy_ms": 0.11860078573226929, + "effective_GBps": 1414.5956872387903, + "GBps_low": 1410.6375269373686, + "GBps_high": 1417.3131440614306, + "mbu_percent": 88.4122304524244, + "process_GBps": [1414.6621620153617, 1414.8035623006328, 1414.3324901912774], + "batch_GBps_median": 1412.7804242883767 + }, + { + "size_bytes": 100663296, + "samples": 360, + "slots": 6, + "combined_pool_bytes": 1207959552, + "amortized_copy_ms": 0.14194091657797497, + "effective_GBps": 1418.3830628527865, + "GBps_low": 1415.0715362540511, + "GBps_high": 1421.4749376709563, + "mbu_percent": 88.64894142829915, + "process_GBps": [1417.197439640835, 1419.9669831246383, 1418.5671319453127], + "batch_GBps_median": 1417.1970038008044 + }, + { + "size_bytes": 117440512, + "samples": 360, + "slots": 5, + "combined_pool_bytes": 1174405120, + "amortized_copy_ms": 0.16549269556999208, + "effective_GBps": 1419.2833296419503, + "GBps_low": 1415.7046164879473, + "GBps_high": 1422.7888803064116, + "mbu_percent": 88.7052081026219, + "process_GBps": [1418.035726791431, 1421.5406888253556, 1419.221531165787], + "batch_GBps_median": 1417.373295444885 + }, + { + "size_bytes": 134217728, + "samples": 360, + "slots": 4, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.18802624940872192, + "effective_GBps": 1427.6488354372725, + "GBps_low": 1424.3697850269964, + "GBps_high": 1430.5182208391896, + "mbu_percent": 89.22805221482953, + "process_GBps": [1426.9003991044156, 1428.8447267430195, 1427.4391013847599], + "batch_GBps_median": 1425.8724737670598 + }, + { + "size_bytes": 167772160, + "samples": 360, + "slots": 4, + "combined_pool_bytes": 1342177280, + "amortized_copy_ms": 0.23519062995910645, + "effective_GBps": 1426.6908509847626, + "GBps_low": 1423.1268520607425, + "GBps_high": 1429.481720077409, + "mbu_percent": 89.16817818654766, + "process_GBps": [1427.211970331157, 1427.1839288892766, 1425.7724723159786], + "batch_GBps_median": 1425.6267553058578 + }, + { + "size_bytes": 201326592, + "samples": 360, + "slots": 3, + "combined_pool_bytes": 1207959552, + "amortized_copy_ms": 0.28174516558647156, + "effective_GBps": 1429.1396381614934, + "GBps_low": 1425.8124605395335, + "GBps_high": 1431.8558297908203, + "mbu_percent": 89.32122738509334, + "process_GBps": [1428.6841038184275, 1430.32671050888, 1428.4932214139817], + "batch_GBps_median": 1427.274822290363 + }, + { + "size_bytes": 234881024, + "samples": 360, + "slots": 3, + "combined_pool_bytes": 1409286144, + "amortized_copy_ms": 0.3278158406416575, + "effective_GBps": 1433.0059434605143, + "GBps_low": 1429.67433105145, + "GBps_high": 1435.7928738333292, + "mbu_percent": 89.56287146628215, + "process_GBps": [1432.3978508665973, 1432.8070813174613, 1434.1047609854077], + "batch_GBps_median": 1431.3857785295954 + }, + { + "size_bytes": 268435456, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.3740215003490448, + "effective_GBps": 1435.4012042061236, + "GBps_low": 1431.904196702147, + "GBps_high": 1437.892052940043, + "mbu_percent": 89.71257526288272, + "process_GBps": [1435.0981202520124, 1434.1569237785213, 1436.775462699177], + "batch_GBps_median": 1433.2310041203525 + }, + { + "size_bytes": 402653184, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 1610612736, + "amortized_copy_ms": 0.5620547533035278, + "effective_GBps": 1432.789889715795, + "GBps_low": 1428.8349576419362, + "GBps_high": 1436.227466579229, + "mbu_percent": 89.54936810723719, + "process_GBps": [1430.7731666693924, 1432.4834079629481, 1435.277805401062], + "batch_GBps_median": 1431.1821217661327 + }, + { + "size_bytes": 536870912, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 2147483648, + "amortized_copy_ms": 0.7447257339954376, + "effective_GBps": 1441.7949789909878, + "GBps_low": 1439.3552545002076, + "GBps_high": 1443.74480021992, + "mbu_percent": 90.11218618693674, + "process_GBps": [1442.0147246892238, 1441.567974938845, 1441.7049764557262], + "batch_GBps_median": 1440.8970842451374 + }, + { + "size_bytes": 805306368, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 3221225472, + "amortized_copy_ms": 1.1200995445251465, + "effective_GBps": 1437.9192848282078, + "GBps_low": 1436.1065741200653, + "GBps_high": 1439.9701529328927, + "mbu_percent": 89.86995530176299, + "process_GBps": [1437.5820769450886, 1438.772266531497, 1437.6411992869985], + "batch_GBps_median": 1437.3523678865686 + }, + { + "size_bytes": 1073741824, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 4294967296, + "amortized_copy_ms": 1.4882272481918335, + "effective_GBps": 1442.9810034785683, + "GBps_low": 1441.2330394734774, + "GBps_high": 1444.5463566820863, + "mbu_percent": 90.18631271741052, + "process_GBps": [1443.3638069253957, 1443.1904160850872, 1442.4622134332415], + "batch_GBps_median": 1442.7277551709155 + }, + { + "size_bytes": 2147483648, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 8589934592, + "amortized_copy_ms": 2.967597246170044, + "effective_GBps": 1447.2878021244455, + "GBps_low": 1445.3349460340112, + "GBps_high": 1448.8148362854529, + "mbu_percent": 90.45548763277785, + "process_GBps": [1447.7066912988864, 1446.9365013812408, 1446.9506221940387], + "batch_GBps_median": 1446.8216162553915 + }, + { + "size_bytes": 4294967296, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 17179869184, + "amortized_copy_ms": 5.950134038925171, + "effective_GBps": 1443.653964062914, + "GBps_low": 1441.012436867068, + "GBps_high": 1445.7000531256922, + "mbu_percent": 90.22837275393212, + "process_GBps": [1443.8215067244923, 1444.6956034982918, 1441.9575889809778], + "batch_GBps_median": 1443.6855618225197 + }, + { + "size_bytes": 8589934592, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 34359738368, + "amortized_copy_ms": 11.879819393157959, + "effective_GBps": 1446.1389197460815, + "GBps_low": 1444.9356122718234, + "GBps_high": 1447.2923369021803, + "mbu_percent": 90.38368248413009, + "process_GBps": [1445.894414437915, 1446.0273644616723, 1446.644442512111], + "batch_GBps_median": 1445.9562499800982 + }, + { + "size_bytes": 17179869184, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 68719476736, + "amortized_copy_ms": 23.74101161956787, + "effective_GBps": 1447.2735584561165, + "GBps_low": 1446.4640837505524, + "GBps_high": 1448.0364484174981, + "mbu_percent": 90.45459740350728, + "process_GBps": [1447.3357675590314, 1447.4756703662817, 1447.1418323453292], + "batch_GBps_median": 1447.2186686979203 + } + ], + "Ascend 910B3": [ + { + "size_bytes": 4096, + "samples": 360, + "slots": 131072, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.00064296685741283, + "effective_GBps": 12.740936652571751, + "GBps_low": 12.667644478717802, + "GBps_high": 12.795661481936607, + "process_GBps": [12.794493919854892, 12.740936652571751, 12.669473855495113], + "process_GBps_min": 12.669473855495113, + "process_GBps_max": 12.794493919854892, + "mbu_percent": null, + "batch_GBps_median": 12.740712544779093 + }, + { + "size_bytes": 8192, + "samples": 360, + "slots": 65536, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0006784234719816595, + "effective_GBps": 24.150107825931652, + "GBps_low": 23.912609043600902, + "GBps_high": 24.165663327071968, + "process_GBps": [24.150825809502628, 24.16035115970605, 23.91988926619204], + "process_GBps_min": 23.91988926619204, + "process_GBps_max": 24.16035115970605, + "mbu_percent": null, + "batch_GBps_median": 24.149647244064028 + }, + { + "size_bytes": 16384, + "samples": 360, + "slots": 32768, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0007227837922982872, + "effective_GBps": 45.33582566344668, + "GBps_low": 45.16128161729691, + "GBps_high": 45.40979517646315, + "process_GBps": [45.399387499051365, 45.33582566344668, 45.16813293652278], + "process_GBps_min": 45.16813293652278, + "process_GBps_max": 45.399387499051365, + "mbu_percent": null, + "batch_GBps_median": 45.33290724401909 + }, + { + "size_bytes": 32768, + "samples": 360, + "slots": 16384, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0007742504822090268, + "effective_GBps": 84.64444195503522, + "GBps_low": 84.17056590148228, + "GBps_high": 84.92335516406746, + "process_GBps": [84.89372971592749, 84.64444195503522, 84.19503433534386], + "process_GBps_min": 84.19503433534386, + "process_GBps_max": 84.89372971592749, + "mbu_percent": null, + "batch_GBps_median": 84.62308884080423 + }, + { + "size_bytes": 65536, + "samples": 360, + "slots": 8192, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0008192566165234894, + "effective_GBps": 159.98894284943742, + "GBps_low": 158.90266499544688, + "GBps_high": 160.53484855428925, + "process_GBps": [160.45875142909688, 160.0063534767347, 158.95370179648108], + "process_GBps_min": 158.95370179648108, + "process_GBps_max": 160.45875142909688, + "mbu_percent": null, + "batch_GBps_median": 159.94527550904348 + }, + { + "size_bytes": 131072, + "samples": 360, + "slots": 4096, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0009043432655744255, + "effective_GBps": 289.872231020032, + "GBps_low": 288.9659030260927, + "GBps_high": 290.46567918499693, + "process_GBps": [290.20755792217506, 289.9826134926982, 289.2085860183856], + "process_GBps_min": 289.2085860183856, + "process_GBps_max": 290.20755792217506, + "mbu_percent": null, + "batch_GBps_median": 289.6265601324474 + }, + { + "size_bytes": 262144, + "samples": 360, + "slots": 2048, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0010265234159305692, + "effective_GBps": 510.74139358498684, + "GBps_low": 506.57995828313204, + "GBps_high": 511.99465206449855, + "process_GBps": [511.3129100356118, 511.0330806880515, 507.6385458346263], + "process_GBps_min": 507.6385458346263, + "process_GBps_max": 511.3129100356118, + "mbu_percent": null, + "batch_GBps_median": 510.26080838113677 + }, + { + "size_bytes": 524288, + "samples": 360, + "slots": 1024, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0042370897717773914, + "effective_GBps": 247.47552128453938, + "GBps_low": 246.99732959044795, + "GBps_high": 249.39792388839993, + "process_GBps": [249.29404473977655, 247.4612704271502, 247.09906449932978], + "process_GBps_min": 247.09906449932978, + "process_GBps_max": 249.29404473977655, + "mbu_percent": null, + "batch_GBps_median": 247.37374028251458 + }, + { + "size_bytes": 1048576, + "samples": 360, + "slots": 512, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.0048616798594594, + "effective_GBps": 431.3636563130661, + "GBps_low": 424.07199425629824, + "GBps_high": 447.3271739630151, + "process_GBps": [431.3636563130661, 446.8748084496909, 424.32003616561633], + "process_GBps_min": 424.32003616561633, + "process_GBps_max": 446.8748084496909, + "mbu_percent": null, + "batch_GBps_median": 431.0697805293238 + }, + { + "size_bytes": 2097152, + "samples": 360, + "slots": 256, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.006031797034665942, + "effective_GBps": 695.3655727960502, + "GBps_low": 663.0598238135087, + "GBps_high": 700.4278257824051, + "process_GBps": [699.793283503668, 695.5007191127618, 663.6557037994087], + "process_GBps_min": 663.6557037994087, + "process_GBps_max": 699.793283503668, + "mbu_percent": null, + "batch_GBps_median": 694.5837926590171 + }, + { + "size_bytes": 3145728, + "samples": 360, + "slots": 171, + "combined_pool_bytes": 1075838976, + "amortized_copy_ms": 0.007845263034976714, + "effective_GBps": 801.9432837306613, + "GBps_low": 792.1647383294679, + "GBps_high": 804.695313582959, + "process_GBps": [793.6139937461252, 803.0266967643645, 803.4285014488452], + "process_GBps_min": 793.6139937461252, + "process_GBps_max": 803.4285014488452, + "mbu_percent": null, + "batch_GBps_median": 800.6964688814464 + }, + { + "size_bytes": 4194304, + "samples": 360, + "slots": 128, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.009661953430622816, + "effective_GBps": 868.2103531375916, + "GBps_low": 856.9491237449967, + "GBps_high": 894.1917445145093, + "process_GBps": [857.6829394040927, 868.2103531375916, 893.5785351788037], + "process_GBps_min": 857.6829394040927, + "process_GBps_max": 893.5785351788037, + "mbu_percent": null, + "batch_GBps_median": 866.9244545712777 + }, + { + "size_bytes": 6291456, + "samples": 360, + "slots": 86, + "combined_pool_bytes": 1082130432, + "amortized_copy_ms": 0.012946047062097593, + "effective_GBps": 971.9501203451707, + "GBps_low": 964.7923316848454, + "GBps_high": 976.0231060886489, + "process_GBps": [966.7403345773677, 972.0287503036294, 975.006508829251], + "process_GBps_min": 966.7403345773677, + "process_GBps_max": 975.006508829251, + "mbu_percent": null, + "batch_GBps_median": 968.3074209260785 + }, + { + "size_bytes": 8388608, + "samples": 360, + "slots": 64, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.016400625929236412, + "effective_GBps": 1022.961932818202, + "GBps_low": 1019.1693923488257, + "GBps_high": 1041.0728968083438, + "process_GBps": [1040.0746378486406, 1020.3179187675204, 1022.2218829224903], + "process_GBps_min": 1020.3179187675204, + "process_GBps_max": 1040.0746378486406, + "mbu_percent": null, + "batch_GBps_median": 1020.4672740095054 + }, + { + "size_bytes": 10485760, + "samples": 360, + "slots": 52, + "combined_pool_bytes": 1090519040, + "amortized_copy_ms": 0.020107308259377114, + "effective_GBps": 1042.979981680037, + "GBps_low": 1037.9490129886829, + "GBps_high": 1050.280740570645, + "process_GBps": [1039.549902132009, 1043.099740670968, 1049.2216882201878], + "process_GBps_min": 1039.549902132009, + "process_GBps_max": 1049.2216882201878, + "mbu_percent": null, + "batch_GBps_median": 1039.4161370423121 + }, + { + "size_bytes": 12582912, + "samples": 360, + "slots": 43, + "combined_pool_bytes": 1082130432, + "amortized_copy_ms": 0.02297139514324277, + "effective_GBps": 1095.5287584003247, + "GBps_low": 1082.708615609237, + "GBps_high": 1099.2344891387493, + "process_GBps": [1097.6734634749737, 1096.4722905220517, 1084.396829035821], + "process_GBps_min": 1084.396829035821, + "process_GBps_max": 1097.6734634749737, + "mbu_percent": null, + "batch_GBps_median": 1093.460925835774 + }, + { + "size_bytes": 14680064, + "samples": 360, + "slots": 37, + "combined_pool_bytes": 1086324736, + "amortized_copy_ms": 0.026478648991198152, + "effective_GBps": 1108.8227352445244, + "GBps_low": 1105.4264864141526, + "GBps_high": 1112.6317754973436, + "process_GBps": [1111.830096203733, 1108.1553868701953, 1107.4098396344814], + "process_GBps_min": 1107.4098396344814, + "process_GBps_max": 1111.830096203733, + "mbu_percent": null, + "batch_GBps_median": 1105.8237367365573 + }, + { + "size_bytes": 16777216, + "samples": 360, + "slots": 32, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.02984906267374754, + "effective_GBps": 1124.1368738024514, + "GBps_low": 1118.5905746095134, + "GBps_high": 1127.880041240026, + "process_GBps": [1125.952228435239, 1124.925967032729, 1120.0327900769294], + "process_GBps_min": 1120.0327900769294, + "process_GBps_max": 1125.952228435239, + "mbu_percent": null, + "batch_GBps_median": 1123.0317025151624 + }, + { + "size_bytes": 20971520, + "samples": 360, + "slots": 26, + "combined_pool_bytes": 1090519040, + "amortized_copy_ms": 0.03697461462937869, + "effective_GBps": 1134.3739595509828, + "GBps_low": 1126.5366461526291, + "GBps_high": 1137.9748706586547, + "process_GBps": [1128.1659235602885, 1136.5966451898346, 1135.3659946220312], + "process_GBps_min": 1128.1659235602885, + "process_GBps_max": 1136.5966451898346, + "mbu_percent": null, + "batch_GBps_median": 1132.3044722736481 + }, + { + "size_bytes": 25165824, + "samples": 360, + "slots": 22, + "combined_pool_bytes": 1107296256, + "amortized_copy_ms": 0.04344681853597814, + "effective_GBps": 1158.4656758772926, + "GBps_low": 1150.050543077041, + "GBps_high": 1164.5502059760431, + "process_GBps": [1151.7060088827493, 1158.7445202696676, 1163.5907989612683], + "process_GBps_min": 1151.7060088827493, + "process_GBps_max": 1163.5907989612683, + "mbu_percent": null, + "batch_GBps_median": 1155.9688893008154 + }, + { + "size_bytes": 29360128, + "samples": 360, + "slots": 19, + "combined_pool_bytes": 1115684864, + "amortized_copy_ms": 0.050162632214395625, + "effective_GBps": 1170.5975824599673, + "GBps_low": 1164.7438515682481, + "GBps_high": 1181.146337658531, + "process_GBps": [1166.5219188953545, 1170.8064432625833, 1180.231741975629], + "process_GBps_min": 1166.5219188953545, + "process_GBps_max": 1180.231741975629, + "mbu_percent": null, + "batch_GBps_median": 1167.940925864533 + }, + { + "size_bytes": 33554432, + "samples": 360, + "slots": 16, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.057202501222491264, + "effective_GBps": 1173.1805876630738, + "GBps_low": 1164.0689191280192, + "GBps_high": 1181.3666666886566, + "process_GBps": [1165.6915907042833, 1173.6165901102145, 1180.2084527682355], + "process_GBps_min": 1165.6915907042833, + "process_GBps_max": 1180.2084527682355, + "mbu_percent": null, + "batch_GBps_median": 1170.7297845435226 + }, + { + "size_bytes": 41943040, + "samples": 360, + "slots": 13, + "combined_pool_bytes": 1090519040, + "amortized_copy_ms": 0.07071076906644382, + "effective_GBps": 1186.3267944544052, + "GBps_low": 1182.926921022022, + "GBps_high": 1189.307727577966, + "process_GBps": [1185.8624005870138, 1187.4506244149118, 1185.965520821283], + "process_GBps_min": 1185.8624005870138, + "process_GBps_max": 1187.4506244149118, + "mbu_percent": null, + "batch_GBps_median": 1183.093933069865 + }, + { + "size_bytes": 50331648, + "samples": 360, + "slots": 11, + "combined_pool_bytes": 1107296256, + "amortized_copy_ms": 0.0836518190123818, + "effective_GBps": 1203.3605149112207, + "GBps_low": 1194.128493677315, + "GBps_high": 1207.312461733816, + "process_GBps": [1195.9521902924196, 1204.6565950374031, 1205.4172267030042], + "process_GBps_min": 1195.9521902924196, + "process_GBps_max": 1205.4172267030042, + "mbu_percent": null, + "batch_GBps_median": 1201.1075968593095 + }, + { + "size_bytes": 58720256, + "samples": 360, + "slots": 10, + "combined_pool_bytes": 1174405120, + "amortized_copy_ms": 0.09680000245571137, + "effective_GBps": 1213.228398973773, + "GBps_low": 1208.740576153593, + "GBps_high": 1217.080827494203, + "process_GBps": [1210.989086192684, 1215.5137632231442, 1213.5418283400986], + "process_GBps_min": 1210.989086192684, + "process_GBps_max": 1215.5137632231442, + "mbu_percent": null, + "batch_GBps_median": 1210.7069688293716 + }, + { + "size_bytes": 67108864, + "samples": 360, + "slots": 8, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.11023375019431114, + "effective_GBps": 1217.5738171241733, + "GBps_low": 1212.4154810497598, + "GBps_high": 1220.1361790240042, + "process_GBps": [1217.1459538127845, 1218.4442507113736, 1217.3253384395343], + "process_GBps_min": 1217.1459538127845, + "process_GBps_max": 1218.4442507113736, + "mbu_percent": null, + "batch_GBps_median": 1211.8818364796662 + }, + { + "size_bytes": 83886080, + "samples": 360, + "slots": 7, + "combined_pool_bytes": 1174405120, + "amortized_copy_ms": 0.13727428231920516, + "effective_GBps": 1222.167453113161, + "GBps_low": 1215.310022107034, + "GBps_high": 1226.6096017703298, + "process_GBps": [1216.9749008959548, 1225.687923356119, 1222.7527930870824], + "process_GBps_min": 1216.9749008959548, + "process_GBps_max": 1225.687923356119, + "mbu_percent": null, + "batch_GBps_median": 1219.4120627940963 + }, + { + "size_bytes": 100663296, + "samples": 360, + "slots": 6, + "combined_pool_bytes": 1207959552, + "amortized_copy_ms": 0.16387166579564413, + "effective_GBps": 1228.5625524247978, + "GBps_low": 1225.4292649325014, + "GBps_high": 1231.48084901754, + "process_GBps": [1226.927874538513, 1228.8375086074013, 1230.1514865298172], + "process_GBps_min": 1226.927874538513, + "process_GBps_max": 1230.1514865298172, + "mbu_percent": null, + "batch_GBps_median": 1225.3976013786441 + }, + { + "size_bytes": 117440512, + "samples": 360, + "slots": 5, + "combined_pool_bytes": 1174405120, + "amortized_copy_ms": 0.19060399532318115, + "effective_GBps": 1232.29853394072, + "GBps_low": 1227.4685986644254, + "GBps_high": 1237.7324342754125, + "process_GBps": [1229.4345988564473, 1236.8278129738746, 1232.634773178068], + "process_GBps_min": 1229.4345988564473, + "process_GBps_max": 1236.8278129738746, + "mbu_percent": null, + "batch_GBps_median": 1230.0224367078622 + }, + { + "size_bytes": 134217728, + "samples": 360, + "slots": 4, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.21727249771356583, + "effective_GBps": 1235.4782994849315, + "GBps_low": 1202.0242369995308, + "GBps_high": 1238.8880877728725, + "process_GBps": [1235.2651067188792, 1237.885445800486, 1234.1150599113494], + "process_GBps_min": 1234.1150599113494, + "process_GBps_max": 1237.885445800486, + "mbu_percent": null, + "batch_GBps_median": 1228.654965037295 + }, + { + "size_bytes": 167772160, + "samples": 360, + "slots": 4, + "combined_pool_bytes": 1342177280, + "amortized_copy_ms": 0.27097249031066895, + "effective_GBps": 1238.296624189783, + "GBps_low": 1233.0975127796007, + "GBps_high": 1240.9940783807515, + "process_GBps": [1234.4130878306244, 1239.6805114837257, 1239.2913472411472], + "process_GBps_min": 1234.4130878306244, + "process_GBps_max": 1239.6805114837257, + "mbu_percent": null, + "batch_GBps_median": 1235.5221867631626 + }, + { + "size_bytes": 201326592, + "samples": 360, + "slots": 3, + "combined_pool_bytes": 1207959552, + "amortized_copy_ms": 0.3237499992052714, + "effective_GBps": 1243.716401508624, + "GBps_low": 1239.8637540456448, + "GBps_high": 1246.8410734842973, + "process_GBps": [1242.4883146587254, 1245.22925813838, 1244.113497889597], + "process_GBps_min": 1242.4883146587254, + "process_GBps_max": 1245.22925813838, + "mbu_percent": null, + "batch_GBps_median": 1240.1775326499837 + }, + { + "size_bytes": 234881024, + "samples": 360, + "slots": 3, + "combined_pool_bytes": 1409286144, + "amortized_copy_ms": 0.3758466641108195, + "effective_GBps": 1249.8768589881358, + "GBps_low": 1247.1757784050417, + "GBps_high": 1252.0355087197313, + "process_GBps": [1250.9085603112103, 1249.3450101252179, 1249.44463540754], + "process_GBps_min": 1249.3450101252179, + "process_GBps_max": 1250.9085603112103, + "mbu_percent": null, + "batch_GBps_median": 1246.9219358221235 + }, + { + "size_bytes": 268435456, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 1073741824, + "amortized_copy_ms": 0.43090999126434326, + "effective_GBps": 1245.9003571134526, + "GBps_low": 1223.8940098814571, + "GBps_high": 1250.6339644677844, + "process_GBps": [1248.00005968168, 1248.5369838831805, 1240.8896617994008], + "process_GBps_min": 1240.8896617994008, + "process_GBps_max": 1248.5369838831805, + "mbu_percent": null, + "batch_GBps_median": 1239.106858760494 + }, + { + "size_bytes": 402653184, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 1610612736, + "amortized_copy_ms": 0.6409749984741211, + "effective_GBps": 1256.3771908687227, + "GBps_low": 1253.5707611945543, + "GBps_high": 1258.556702103437, + "process_GBps": [1256.7301203851607, 1257.2500590538973, 1255.3783189760666], + "process_GBps_min": 1255.3783189760666, + "process_GBps_max": 1257.2500590538973, + "mbu_percent": null, + "batch_GBps_median": 1254.7675459795228 + }, + { + "size_bytes": 536870912, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 2147483648, + "amortized_copy_ms": 0.852649986743927, + "effective_GBps": 1259.2996431048707, + "GBps_low": 1256.5262034450727, + "GBps_high": 1261.4907514327017, + "process_GBps": [1258.0823321373516, 1260.164222017919, 1259.5433616200153], + "process_GBps_min": 1258.0823321373516, + "process_GBps_max": 1260.164222017919, + "mbu_percent": null, + "batch_GBps_median": 1257.4657884613462 + }, + { + "size_bytes": 805306368, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 3221225472, + "amortized_copy_ms": 1.2745000123977661, + "effective_GBps": 1263.7212399628713, + "GBps_low": 1261.7402972129019, + "GBps_high": 1265.3703324326996, + "process_GBps": [1263.7609567827249, 1263.5626339871412, 1263.7956519405284], + "process_GBps_min": 1263.5626339871412, + "process_GBps_max": 1263.7956519405284, + "mbu_percent": null, + "batch_GBps_median": 1262.5171861494418 + }, + { + "size_bytes": 1073741824, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 4294967296, + "amortized_copy_ms": 1.6949899792671204, + "effective_GBps": 1266.9594949042287, + "GBps_low": 1264.8238324864594, + "GBps_high": 1268.524411480047, + "process_GBps": [1267.1388901625403, 1267.340803998021, 1266.5074000868399], + "process_GBps_min": 1266.5074000868399, + "process_GBps_max": 1267.340803998021, + "mbu_percent": null, + "batch_GBps_median": 1266.305948472574 + }, + { + "size_bytes": 2147483648, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 8589934592, + "amortized_copy_ms": 3.389169931411743, + "effective_GBps": 1267.2623040211356, + "GBps_low": 1264.9228762379962, + "GBps_high": 1268.696378409177, + "process_GBps": [1267.6363025077367, 1267.653161715018, 1266.3916558546073], + "process_GBps_min": 1266.3916558546073, + "process_GBps_max": 1267.653161715018, + "mbu_percent": null, + "batch_GBps_median": 1267.088898829921 + }, + { + "size_bytes": 4294967296, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 17179869184, + "amortized_copy_ms": 6.7716498374938965, + "effective_GBps": 1268.514290924858, + "GBps_low": 1266.937085206279, + "GBps_high": 1269.943869672069, + "process_GBps": [1268.4899057844216, 1268.0947828481117, 1269.0924396502785], + "process_GBps_min": 1268.0947828481117, + "process_GBps_max": 1269.0924396502785, + "mbu_percent": null, + "batch_GBps_median": 1268.6056074912306 + }, + { + "size_bytes": 8589934592, + "samples": 360, + "slots": 2, + "combined_pool_bytes": 34359738368, + "amortized_copy_ms": 13.51129961013794, + "effective_GBps": 1271.5186310508147, + "GBps_low": 1270.2004762322842, + "GBps_high": 1272.5370739182154, + "process_GBps": [1271.7430860105414, 1271.0346238839213, 1271.5623399209603], + "process_GBps_min": 1271.0346238839213, + "process_GBps_max": 1271.7430860105414, + "mbu_percent": null, + "batch_GBps_median": 1271.6637257209586 + } + ] + } +} From eb3d3a6cb9fcb24fed99076e795614c4db0f2eb9 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 20:35:56 +0800 Subject: [PATCH 2/4] feat(ubenchx): add qualified Huawei copy-bandwidth curves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 展示 Ascend 950PR_9579 与 910B3 轮转拷贝数据,明确摊销计时、带宽参考值和缺失大小,并同步 API 与技能文档。 --- docs/ubenchx-huawei-bandwidth.md | 11 ++++ packages/app/cypress/e2e/ubenchx.cy.ts | 32 ++++++++++ .../app/api/v1/views/ubenchx/route.test.ts | 36 +++++++++++ .../app/src/app/api/v1/views/ubenchx/route.ts | 19 +++--- .../src/components/ubenchx/UbenchxContent.tsx | 61 ++++++++++++++----- .../src/components/ubenchx/ubenchx-data.ts | 54 ++++++++++++++++ .../ubenchx/ubenchx-transform.test.ts | 10 +++ .../components/ubenchx/ubenchx-transform.ts | 23 ++++++- packages/app/src/lib/api/api-route-catalog.ts | 19 +++++- .../app/src/lib/views-api/docs/extensions.ts | 12 ++-- .../skills/inferencex-api/integrity.json | 2 +- .../references/dashboard-views.md | 46 +++++++------- 12 files changed, 266 insertions(+), 59 deletions(-) create mode 100644 docs/ubenchx-huawei-bandwidth.md create mode 100644 packages/app/src/components/ubenchx/ubenchx-transform.test.ts diff --git a/docs/ubenchx-huawei-bandwidth.md b/docs/ubenchx-huawei-bandwidth.md new file mode 100644 index 000000000..a89954cf2 --- /dev/null +++ b/docs/ubenchx-huawei-bandwidth.md @@ -0,0 +1,11 @@ +# Huawei copy-bandwidth evidence + +The added static series are Ascend950PR_9579 (28 Cube, 56 Vector, 128 GiB) and Ascend910B3 on Atlas 800T A2 (20 Cube, 40 Vector, 64 GiB). No power-limited A3 data is included. Neither series changes the global GPU specification catalog or inference-data normalization. + +`huawei-bandwidth.json` preserves all 42/41 full-precision plotted points, source input hashes, per-process medians, observed p10/p90 ranges, pool geometry and sample counts. Each size has three processes × six blocks × twenty observations. Aggregation is the pooled median amortized time, converted by `2 * message bytes / time`; bounds invert p90/p10 latency and are not confidence intervals. No observations are smoothed or supplied for missing sizes. Source files are the validated October 7 rotating-pool 950PR experiment and October 13 A2 comparison; the initial scratch-fill curves and overlap-rejected runs are excluded. + +Both experiments use FP16 `copy_` operations in complete rotating-pool NPU graph replays. Each direction has at least 512 MiB and two slots. Every block is checked against source bits before and after timing. The time is amortized over a complete rotation, not an isolated-copy latency. Unlike the GPU series, it is not `triton.testing.do_bench` on one FP32 buffer pair. The UI states this above the chart and labels Huawei tooltip times as amortized. No physical HBM-traffic counters prove that every access misses cache. + +The 950PR endpoint is about 1,447 GB/s at 16 GiB. The 910B3 endpoint is 1,271.519 GB/s at 8 GiB; 16 GiB is absent because two source and two destination slots would occupy all 64 GiB before runtime overhead. Both MBU curves use 1,600 GB/s. The 950PR figure is an assumed nominal reference, and the 910B3 figure is corroborated by the [OEM 910B3/2 brochure](https://www.yingjiangdata.com/UpLoad/202601/2026013061541417.pdf#page=15) and [CANN memory example](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/800alpha002/devguide/opdevg/ascendcbestP/atlas_ascendc_best_practices_10_0036.html). Neither exact board ceiling was independently measured. + +UI/API coverage: the existing bandwidth/MBU/latency selector is presentation-only. Both hardware keys are available through `test=mem-bw`, `gpu=` and `gpu=all`; `test=all` returns empty sections for tests unavailable on an explicitly selected device. API rows retain optional uncertainty/pool fields, `metadata.protocol`, `dtype`, CANN/torch_npu versions and `missingSizesBytes`. `peakBandwidthSource` states the per-run reference qualification. The dashboard and API share `transformUbenchxRun`. diff --git a/packages/app/cypress/e2e/ubenchx.cy.ts b/packages/app/cypress/e2e/ubenchx.cy.ts index 9a6b5103e..2525bad11 100644 --- a/packages/app/cypress/e2e/ubenchx.cy.ts +++ b/packages/app/cypress/e2e/ubenchx.cy.ts @@ -125,3 +125,35 @@ describe('ubenchX hub and test routes', () => { cy.get('meta[name="robots"]').should('have.attr', 'content').and('contain', 'noindex'); }); }); + +const dismiss = { + onBeforeLoad(win: Cypress.AUTWindow) { + win.localStorage.setItem('inferencex-star-modal-dismissed', String(Date.now())); + }, +}; + +describe('Huawei copy-bandwidth evidence', () => { + it('renders both SKUs and qualifies the graph timing in English and Chinese', () => { + cy.visit('/ubenchx/mem-bw', dismiss); + cy.contains('Ascend 950PR_9579').should('be.visible'); + cy.contains('Ascend 910B3').should('be.visible'); + cy.contains('Graph time is amortized per copy').should('be.visible'); + cy.contains('16 GiB is absent').should('be.visible'); + cy.get('[data-testid="ubenchx-metric-select"]').click(); + cy.contains('[role="option"]', 'Bandwidth (TB/s)').click(); + cy.contains('h2', 'Bandwidth vs Message Size').should('be.visible'); + cy.screenshot('huawei-bandwidth-en', { capture: 'fullPage' }); + cy.visit('/zh/ubenchx/mem-bw', dismiss); + cy.contains('图执行时间按拷贝次数摊销').should('be.visible'); + cy.contains('910B3 未测量 16 GiB').should('be.visible'); + cy.screenshot('huawei-bandwidth-zh', { capture: 'fullPage' }); + }); + it('serves measured endpoints and empty unavailable tests through the public API', () => { + cy.request('/api/v1/views/ubenchx?test=all&gpu=Ascend%20910B3').then(({ body }) => { + expect(body.memBw.gpus[0].rows.at(-1).bytes).to.equal(8589934592); + expect(body.memBw.gpus[0].rows.at(-1).mbuPercent).to.be.closeTo(79.46994, 0.0001); + expect(body.smL2Distance.gpus).to.deep.equal([]); + expect(body.tpcSkyline.gpus).to.deep.equal([]); + }); + }); +}); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts index bd0032b5f..225432f1d 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts @@ -158,3 +158,39 @@ describe('ubenchx view', () => { expect(h200Last.mbuPercent).toBeCloseTo((4305.39 / 4800) * 100, 4); }); }); + +it('exposes Huawei rotating-copy evidence without inventing missing tests or sizes', async () => { + const response = await GET(request({ test: 'all', gpu: 'ascend 910b3' })); + expect(response.status).toBe(200); + const body = await response.json(); + const run = body.memBw.gpus[0]; + expect(run.gpu).toBe('Ascend 910B3'); + expect(run.peakBandwidthGbps).toBe(1600); + expect(run.peakBandwidthSource).toContain('exact board ceiling not independently measured'); + expect(run.metadata).toMatchObject({ + protocol: 'rotating-pool-npu-graph', + dtype: 'float16', + missingSizesBytes: [17179869184], + }); + expect(run.rows.some((row: { bytes: number }) => row.bytes === 17179869184)).toBe(false); + const endpoint = run.rows.find((row: { bytes: number }) => row.bytes === 8589934592); + expect(endpoint.bandwidthGbps).toBeCloseTo(1271.519, 3); + expect(endpoint.mbuPercent).toBeCloseTo(79.46994, 4); + expect(endpoint.observations).toBe(360); + expect(body.smL2Distance.gpus).toEqual([]); + expect(body.tpcSkyline.gpus).toEqual([]); +}); + +it('preserves full-precision Huawei bandwidth arithmetic and API/UI normalization', async () => { + for (const gpu of ['Ascend 950PR_9579', 'Ascend 910B3']) { + const response = await GET(request({ test: 'mem-bw', gpu })); + const body = await response.json(); + const run = body.gpus[0]; + expect(run).toEqual(transformUbenchxRun(gpu, UBENCHX_RUNS[gpu])); + for (const row of run.rows) { + expect(row.bandwidthGbps).toBeCloseTo((2 * row.bytes) / row.timeMs / 1e6, 6); + expect(row.bandwidthP10Gbps).toBeLessThanOrEqual(row.bandwidthGbps); + expect(row.bandwidthP90Gbps).toBeGreaterThanOrEqual(row.bandwidthGbps); + } + } +}); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.ts b/packages/app/src/app/api/v1/views/ubenchx/route.ts index 22b6fff9a..d2c8eaf25 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.ts @@ -64,13 +64,11 @@ export function GET(request: NextRequest) { } // test === 'all': return every test - const smL2GpuKeys = Object.keys(SM_L2_RUNS); - const smL2Gpu = parseEnumParam(s.get('gpu'), 'gpu', ['all', ...smL2GpuKeys], 'all'); const smL2Results = - smL2Gpu === 'all' + rawGpu === null || gpu === 'all' ? Object.entries(SM_L2_RUNS).map(([key, run]) => transformSmL2Run(key, run)) - : SM_L2_RUNS[smL2Gpu] - ? [transformSmL2Run(smL2Gpu, SM_L2_RUNS[smL2Gpu])] + : SM_L2_RUNS[gpu] + ? [transformSmL2Run(gpu, SM_L2_RUNS[gpu])] : []; return Promise.resolve( @@ -85,11 +83,12 @@ export function GET(request: NextRequest) { // Like smL2Distance, default to every GPU rather than mem-bw's first one, and // match the GPU key case-insensitively as parseEnumParam does for the others. tpcSkyline: { - gpus: tpcSkylineResults( - Object.keys(TPC_SKYLINE_RUNS).find( - (key) => key.toLowerCase() === rawGpu?.toLowerCase(), - ) ?? 'all', - ), + gpus: + rawGpu === null || gpu === 'all' + ? tpcSkylineResults('all') + : TPC_SKYLINE_RUNS[gpu] + ? tpcSkylineResults(gpu) + : [], }, }), ); diff --git a/packages/app/src/components/ubenchx/UbenchxContent.tsx b/packages/app/src/components/ubenchx/UbenchxContent.tsx index c6f13faaa..9596dc845 100644 --- a/packages/app/src/components/ubenchx/UbenchxContent.tsx +++ b/packages/app/src/components/ubenchx/UbenchxContent.tsx @@ -16,7 +16,12 @@ import { useLocale } from '@/lib/i18n/use-locale'; import type { Locale } from '@/lib/i18n/i18n'; import { UBENCHX_GPU_KEYS, UBENCHX_RUNS } from './ubenchx-data'; -import { transformUbenchxRun, formatBytes, type UbenchxDerivedRow } from './ubenchx-transform'; +import { + transformUbenchxRun, + formatBytes, + sizeAxisTicks, + type UbenchxDerivedRow, +} from './ubenchx-transform'; const GPU_COLORS: Record = { 'B300 SXM': 'oklch(0.62 0.15 128)', @@ -27,13 +32,17 @@ const GPU_COLORS: Record = { MI355X: 'oklch(0.62 0.20 18)', MI325X: 'oklch(0.55 0.20 28)', MI300X: 'oklch(0.48 0.20 38)', + 'Ascend 950PR_9579': '#C7000B', + 'Ascend 910B3': '#7F0011', }; const STRINGS = { en: { pageTitle: 'HBM Bandwidth', pageSubtitle: - 'Microbenchmark measuring device-memory copy bandwidth across message sizes on NVIDIA and AMD GPUs.', + 'Microbenchmark measuring device-memory copy bandwidth across message sizes on NVIDIA, AMD and Huawei accelerators.', + protocolNote: + 'Huawei uses amortized rotating-buffer graph timing; NVIDIA/AMD use Triton copy timing. Small-message latency is not directly comparable.', latencyTitle: 'Latency vs Message Size', latencyY: 'Latency (ms)', mbuTitle: 'Memory Bandwidth Utilization (MBU) vs Message Size', @@ -42,10 +51,18 @@ const STRINGS = { bwY: 'Bandwidth (TB/s)', xAxis: 'Message Size', yMetric: 'Y-axis', - peakNote: "MBU is relative to each GPU's own peak HBM bandwidth from GPU_SPECS.", + peakNote: + 'MBU uses each device’s bandwidth reference. Huawei’s 1.6 TB/s references are qualified below.', methodology: 'Methodology', methodologyText: - 'Times b.copy_(a) on float32 tensors using triton.testing.do_bench; bandwidth = 2 * bytes / time (read + write). Power-of-two sizes from 8 B to 16 GiB.', + 'NVIDIA/AMD: times b.copy_(a) on float32 tensors using triton.testing.do_bench; bandwidth = 2 * bytes / time (read + write). Power-of-two sizes from 8 B to 16 GiB.', + huaweiMethodology: + 'Huawei: FP16 rotating source/destination pools of at least 512 MiB each, timed as full rotating-buffer NPU graph replays. Three processes, 360 observations per size; full copied-bit checks before/after each block. Graph time is amortized per copy, not isolated-copy latency. Protocols differ from the GPU curves. No physical HBM-traffic counters were collected.', + huaweiMissing: + '910B3: 16 GiB is absent because the two-slot source/destination geometry requires 64 GiB before runtime overhead.', + huaweiReference: + 'Huawei MBU uses a 1,600 GB/s reference; the exact board bandwidth ceiling was not independently measured.', + amortized: 'Amortized graph copy time', source: 'Source', instructions: 'Shift+Scroll to zoom · Drag to pan · Double-click to reset · Click a point to pin tooltip', @@ -54,12 +71,14 @@ const STRINGS = { tooltipLatency: 'Latency', tooltipBandwidth: 'Bandwidth', tooltipMbu: 'MBU', - tooltipPeak: 'Peak BW', + tooltipPeak: 'Bandwidth reference', aria: 'ubenchX device-memory copy bandwidth charts', }, zh: { pageTitle: 'HBM 带宽', - pageSubtitle: '在 NVIDIA 和 AMD GPU 上测量不同消息大小的显存拷贝带宽微基准测试。', + pageSubtitle: '测量 NVIDIA、AMD 和 Huawei 加速器在不同消息大小下的显存拷贝带宽。', + protocolNote: + 'Huawei 使用轮转缓冲区的图执行摊销计时;NVIDIA/AMD 使用 Triton 拷贝计时。小消息延迟不能直接比较。', latencyTitle: '延迟 vs 消息大小', latencyY: '延迟(ms)', mbuTitle: '显存带宽利用率(MBU)vs 消息大小', @@ -68,10 +87,16 @@ const STRINGS = { bwY: '带宽(TB/s)', xAxis: '消息大小', yMetric: 'Y 轴', - peakNote: 'MBU 基于各 GPU 自身在 GPU_SPECS 中的峰值 HBM 带宽计算。', + peakNote: 'MBU 按各设备的带宽参考值计算。Huawei 的 1.6 TB/s 参考值及其限制见下文。', methodology: '测试方法', methodologyText: - '使用 triton.testing.do_bench 计时 b.copy_(a)(float32 张量);带宽 = 2 * bytes / time(读 + 写)。消息大小为 2 的幂次,从 8 B 到 16 GiB。', + 'NVIDIA/AMD:使用 triton.testing.do_bench 计时 b.copy_(a)(float32 张量);带宽 = 2 * bytes / time(读 + 写)。消息大小为 2 的幂次,从 8 B 到 16 GiB。', + huaweiMethodology: + 'Huawei:源和目标分别使用至少 512 MiB 的 FP16 轮转缓冲池,每次计时覆盖完整缓冲池轮转的一次 NPU 图重放。每个大小在三个进程中共测量 360 次,每个测量块前后逐位校验全部拷贝结果。图执行时间按拷贝次数摊销,不代表单次独立拷贝延迟;与 GPU 曲线的测试协议不同,且未采集物理 HBM 流量计数器。', + huaweiMissing: + '910B3 未测量 16 GiB:源和目标各保留两个缓冲槽,尚未计入运行时开销就需要 64 GiB。', + huaweiReference: 'Huawei 的 MBU 使用 1,600 GB/s 参考值,两款板卡的确切带宽上限未经独立实测。', + amortized: '摊销后的图拷贝时间', source: '数据来源', instructions: 'Shift+滚轮缩放 · 拖动平移 · 双击重置 · 点击数据点固定提示框', dismiss: '点击其他区域关闭', @@ -79,7 +104,7 @@ const STRINGS = { tooltipLatency: '延迟', tooltipBandwidth: '带宽', tooltipMbu: 'MBU', - tooltipPeak: '峰值带宽', + tooltipPeak: '带宽参考值', aria: 'ubenchX 显存拷贝带宽图表', }, } as const; @@ -143,7 +168,7 @@ function formatTooltip(point: ChartPoint, isPinned: boolean, t: (typeof STRINGS) ${point.gpuKey} ${tooltipLine(t.tooltipSize, point.sizeLabel)} - ${tooltipLine(t.tooltipLatency, `${point.timeMs.toFixed(4)} ms`)} + ${tooltipLine(UBENCHX_RUNS[point.gpuKey].metadata.protocol ? t.amortized : t.tooltipLatency, `${point.timeMs.toFixed(4)} ms`)} ${tooltipLine(t.tooltipBandwidth, `${(point.bandwidthGbps / 1000).toFixed(3)} TB/s`)} ${tooltipLine(t.tooltipMbu, `${point.mbuPercent.toFixed(1)}%`)} ${tooltipLine(t.tooltipPeak, `${point.peakBandwidthGbps / 1000} TB/s`)} @@ -215,10 +240,7 @@ function UbenchxChart({ return ticks; }, [yScaleType, yDomain]); - const xTickValues = useMemo(() => { - const all = [...new Set(allPoints.map((p) => p.x))].sort((a, b) => a - b); - return all.filter((_, i) => i % 3 === 0 || i === all.length - 1); - }, [allPoints]); + const xTickValues = useMemo(() => sizeAxisTicks(...xDomain), [xDomain]); return ( @@ -324,6 +346,7 @@ export function UbenchxContent() {

{t.pageTitle}

{t.pageSubtitle}

+

{t.protocolNote}

@@ -376,11 +399,17 @@ export function UbenchxContent() {

{t.methodology}

{t.methodologyText}

+

{t.huaweiMethodology}

+

{t.huaweiMissing}

+

{t.huaweiReference}

{viewResults.map((r) => (

{r.gpu}: {r.metadata.gpu} | Driver: {r.metadata.driver} | PyTorch:{' '} - {r.metadata.torch} | Triton: {r.metadata.triton} | Container: {r.metadata.container} | - Peak: {r.peakBandwidthGbps / 1000} TB/s (GPU_SPECS) + {r.metadata.torch} |{' '} + {r.metadata.cann + ? `CANN: ${r.metadata.cann} | torch_npu: ${r.metadata.torchNpu}` + : `Triton: ${r.metadata.triton} | Container: ${r.metadata.container}`}{' '} + |{r.peakBandwidthGbps / 1000} TB/s

))} {sourceUrls.map((url) => ( diff --git a/packages/app/src/components/ubenchx/ubenchx-data.ts b/packages/app/src/components/ubenchx/ubenchx-data.ts index deb4343a8..bb3c4d8ab 100644 --- a/packages/app/src/components/ubenchx/ubenchx-data.ts +++ b/packages/app/src/components/ubenchx/ubenchx-data.ts @@ -1,7 +1,15 @@ +import huawei from './data/huawei-bandwidth.json'; + export interface UbenchxRow { readonly bytes: number; readonly timeMs: number; readonly bandwidthGbps: number; + readonly observations?: number; + readonly bandwidthP10Gbps?: number; + readonly bandwidthP90Gbps?: number; + readonly processBandwidthGbps?: readonly number[]; + readonly slots?: number; + readonly combinedPoolBytes?: number; } export interface UbenchxRunMetadata { @@ -12,11 +20,17 @@ export interface UbenchxRunMetadata { readonly container: string; readonly date: string; readonly sourceUrl: string; + readonly protocol?: 'rotating-pool-npu-graph'; + readonly dtype?: 'float16'; + readonly cann?: string; + readonly torchNpu?: string; + readonly missingSizesBytes?: readonly number[]; } export interface UbenchxRun { readonly metadata: UbenchxRunMetadata; readonly rows: readonly UbenchxRow[]; + readonly bandwidthReference?: { readonly gbps: number; readonly source: string }; } export const UBENCHX_GPU_KEYS = [ @@ -28,6 +42,8 @@ export const UBENCHX_GPU_KEYS = [ 'MI355X', 'MI325X', 'MI300X', + 'Ascend 950PR_9579', + 'Ascend 910B3', ] as const; export type UbenchxGpuKey = (typeof UBENCHX_GPU_KEYS)[number]; @@ -394,3 +410,41 @@ export const UBENCHX_RUNS: Record = { ], }, }; + +for (const [gpu, points] of Object.entries(huawei.curves)) { + const b3 = gpu === 'Ascend 910B3'; + UBENCHX_RUNS[gpu] = { + metadata: { + gpu, + driver: b3 ? '26.1.1' : '25.7.rc1.10', + torch: '2.10.0+cpu', + torchNpu: '2.10.0.post4', + cann: '9.1.0', + triton: 'Not used', + container: 'Not recorded', + date: b3 ? '2026-10-13' : '2026-10-07', + dtype: 'float16', + protocol: 'rotating-pool-npu-graph', + missingSizesBytes: b3 ? [17179869184] : [], + sourceUrl: + 'https://github.com/SemiAnalysisAI/InferenceX-app/blob/0a94bf26f3703d479b930f3957241b36b6b3e6d6/packages/app/src/components/ubenchx/data/huawei-bandwidth.json', + }, + bandwidthReference: { + gbps: 1600, + source: b3 + ? '910B3/2 64 GB OEM specification and CANN 20-core memory example; exact board ceiling not independently measured' + : '950PR 128 GiB nominal reference assumed at 1600 GB/s; not independently verified by memory-controller counters', + }, + rows: points.map((point) => ({ + bytes: point.size_bytes, + timeMs: point.amortized_copy_ms, + bandwidthGbps: point.effective_GBps, + observations: point.samples, + bandwidthP10Gbps: point.GBps_low, + bandwidthP90Gbps: point.GBps_high, + processBandwidthGbps: point.process_GBps, + slots: point.slots, + combinedPoolBytes: point.combined_pool_bytes, + })), + }; +} diff --git a/packages/app/src/components/ubenchx/ubenchx-transform.test.ts b/packages/app/src/components/ubenchx/ubenchx-transform.test.ts new file mode 100644 index 000000000..414d7c154 --- /dev/null +++ b/packages/app/src/components/ubenchx/ubenchx-transform.test.ts @@ -0,0 +1,10 @@ +import { expect, it } from 'vitest'; +import { sizeAxisTicks } from './ubenchx-transform'; + +it('spaces binary-size labels independently of dense sample clusters', () => { + expect(sizeAxisTicks(8, 17179869184)).toEqual([ + 8, 256, 8192, 262144, 8388608, 268435456, 17179869184, + ]); + expect(sizeAxisTicks(4096, 4096)).toEqual([4096]); + expect(() => sizeAxisTicks(0, 1024)).toThrow('Invalid'); +}); diff --git a/packages/app/src/components/ubenchx/ubenchx-transform.ts b/packages/app/src/components/ubenchx/ubenchx-transform.ts index f48bdec0a..098fc749b 100644 --- a/packages/app/src/components/ubenchx/ubenchx-transform.ts +++ b/packages/app/src/components/ubenchx/ubenchx-transform.ts @@ -30,7 +30,9 @@ export function formatBytes(bytes: number): string { } export function transformUbenchxRun(gpuKey: string, run: UbenchxRun): UbenchxViewResult { - const peakBandwidthGbps = getPeakBandwidthGbps(gpuKey); + const peakBandwidthGbps = run.bandwidthReference?.gbps ?? getPeakBandwidthGbps(gpuKey); + if (!Number.isFinite(peakBandwidthGbps) || peakBandwidthGbps <= 0) + throw new Error('Bandwidth reference must be finite and positive'); const rows: UbenchxDerivedRow[] = run.rows.map((row) => ({ ...row, mbuPercent: peakBandwidthGbps > 0 ? (row.bandwidthGbps / peakBandwidthGbps) * 100 : 0, @@ -40,8 +42,25 @@ export function transformUbenchxRun(gpuKey: string, run: UbenchxRun): UbenchxVie return { gpu: gpuKey, peakBandwidthGbps, - peakBandwidthSource: `GPU_SPECS ${gpuKey} memoryBandwidth (${peakBandwidthGbps / 1000} TB/s)`, + peakBandwidthSource: + run.bandwidthReference?.source ?? + `GPU_SPECS ${gpuKey} memoryBandwidth (${peakBandwidthGbps / 1000} TB/s)`, metadata: run.metadata, rows, }; } + +export function sizeAxisTicks(min: number, max: number): number[] { + if (!(min > 0 && max >= min) || !Number.isFinite(max)) throw new Error('Invalid size domain'); + if (min === max) return [min]; + const first = Math.ceil(Math.log2(min)), + last = Math.floor(Math.log2(max)); + const step = Math.max(1, Math.ceil((last - first) / 7)); + const ticks = [min]; + for (let exponent = first + step; exponent <= last; exponent += step) ticks.push(2 ** exponent); + if (ticks.at(-1) !== max) { + if (ticks.length > 1 && Math.log2(max / ticks.at(-1)!) < step / 2) ticks.pop(); + ticks.push(max); + } + return ticks; +} diff --git a/packages/app/src/lib/api/api-route-catalog.ts b/packages/app/src/lib/api/api-route-catalog.ts index 96a7d18d8..f6d3df0f1 100644 --- a/packages/app/src/lib/api/api-route-catalog.ts +++ b/packages/app/src/lib/api/api-route-catalog.ts @@ -518,7 +518,7 @@ export const apiRouteCatalog = [ method: 'GET', classification: 'published-read', operationId: 'get-ubenchx-view', - sourceSha256: '237d7b2f095786cea52f8d65eaed73a4f091fa880803809271e2542b0d62b4d9', + sourceSha256: '7446193b97506c03e3df2908ea8d25f61e134e18005efe8839ff2bb3ed105595', }, { source: 'src/app/api/v1/operatorx/runs/route.ts', @@ -1158,6 +1158,23 @@ export interface ApiContractSourceDigest { * touching a route module. Digest changes require an explicit documentation review. */ export const apiContractSourceDigests = [ + { + source: 'src/components/ubenchx/ubenchx-transform.ts', + sourceSha256: '9458ad2b969525fe68da5a3b54ac151384610d0bd2ba84585a9043b3a67bf949', + reviewArea: { + en: 'ubenchX Huawei measurement units, protocol metadata and shared UI/API calculations.', + zh: 'ubenchX Huawei 测量单位、协议元数据及界面与 API 共用的计算。', + }, + }, + { + source: 'src/components/ubenchx/ubenchx-data.ts', + sourceSha256: 'f8a87d08efba5c17a312f3c3ffe274c31399fb4c8e3d29c43031395dda444964', + reviewArea: { + en: 'ubenchX Huawei measurement units, protocol metadata and shared UI/API calculations.', + zh: 'ubenchX Huawei 测量单位、协议元数据及界面与 API 共用的计算。', + }, + }, + { source: 'src/lib/catalog/gpu-specs.ts', sourceSha256: 'fb9dc719f347fb5b73ea73cf35a19d12c640b34a284f31cd70a8b9b2df76b4fd', diff --git a/packages/app/src/lib/views-api/docs/extensions.ts b/packages/app/src/lib/views-api/docs/extensions.ts index 8866d32e6..d638f2bb6 100644 --- a/packages/app/src/lib/views-api/docs/extensions.ts +++ b/packages/app/src/lib/views-api/docs/extensions.ts @@ -357,8 +357,8 @@ const PARAMETER_NOTES: Record = { 'JSON 对象,将视频数据点 ID 映射为 {hourly,source,date} 字符串;hourly 为非负 USD/deployment-hour。', ], gpu: [ - 'GPU key, e.g. "H100 SXM"; default first available GPU. "all" returns every GPU.', - 'GPU 键,如 "H100 SXM";默认首个可用 GPU。设为 "all" 返回全部 GPU。', + 'Accelerator key, e.g. "H100 SXM", "Ascend 950PR_9579" or "Ascend 910B3". Default: first available device. "all" returns all devices; unavailable tests retain their section object with an empty gpus array for an explicitly selected device.', + '加速器键,如 "H100 SXM"、"Ascend 950PR_9579" 或 "Ascend 910B3"。默认首个可用设备;"all" 返回全部设备。显式选择设备时,没有数据的测试部分保留对象结构,其中 gpus 数组为空。', ], test: [ 'ubenchX test selector: mem-bw, sm-l2-distance, tpc-skyline, or all (default). Determines which benchmark data is returned.', @@ -503,8 +503,8 @@ const NEW_VIEWS = { }, ], ubenchx: [ - 'ubenchX microbenchmarks (mem-bw, sm-l2-distance, and tpc-skyline)', - 'ubenchX 微基准测试(mem-bw、sm-l2-distance 和 tpc-skyline)', + 'ubenchX microbenchmarks with per-device protocols and bandwidth references (mem-bw, sm-l2-distance, and tpc-skyline)', + 'ubenchX 微基准测试及各设备的测试协议和带宽参考值(mem-bw、sm-l2-distance 和 tpc-skyline)', { gpus: objects, tests: strings, memBw: object, smL2Distance: object, tpcSkyline: object }, ], } as const; @@ -519,7 +519,7 @@ export const operations: ApiOperation[] = Object.entries(NEW_VIEWS).map( path: `/api/v1/views/${view}`, summary: text(en, zh), description: text( - `Read-only ${en.toLowerCase()} using the dashboard's source handlers and calculation helpers. Unknown and repeated query keys return 400. The response includes resolved params and preserves missing evidence. Renderer-only styling is not an API parameter.${ + `Read-only ${en.toLowerCase()} using the dashboard's source handlers and calculation helpers. Unknown and repeated query keys return 400. The response includes resolved params and preserves missing evidence. Renderer-only styling is not an API parameter.${view === 'ubenchx' ? ' mem-bw includes Huawei rotating-pool FP16 graph results. timeMs is amortized per copy for metadata.protocol=rotating-pool-npu-graph. peakBandwidthSource documents the per-run normalization reference; optional rows retain observations, bandwidthP10Gbps, bandwidthP90Gbps, processBandwidthGbps, slots and combinedPoolBytes. Missing sizes are listed in metadata.missingSizesBytes.' : ''}${ view === 'video' ? ' Only already published artifacts are read. Cell, phase, slot and GPU-basis choices select result evidence and normalized serving rates; x/y/cost/workload filters produce computed tradeoff points. Local bundles and arbitrary URLs are excluded. Responses are no-store.' : view === 'current-inferencex-image' @@ -528,7 +528,7 @@ export const operations: ApiOperation[] = Object.entries(NEW_VIEWS).map( ? ' Telemetry comes from one source per run: its stored DB series once the run is ingested, otherwise its GitHub artifacts. Stored coverage describes the entire run: complete means the recorded artifact/file inventory is present, partial means recorded telemetry is missing, and unknown means no complete inventory was retained; missingArtifacts names entirely missing artifacts and may be empty when only a file is incomplete. GitHub coverage is null (unassessed). Responses use private, no-store; an upstream database failure remains HTTP 503 rather than an empty dataset. File/host series retain separate identities. Raw rows and charts respect selected GPU indices. Statistics cover every chip of the selected file/host series, including startup and warmup, and are computed from its samples on each read; a stored series whose samples do not match its recorded sample count returns none. Mean is sample-weighted, P50/P95/P99 interpolate linearly at p*(N-1), and standard deviation divides by N. These statistics are not serving-window power or J/token. Line time remains relative to the first sample across all chips; missing metric readings are omitted rather than zero-filled. Correlations require both readings. This endpoint projects the raw GPU-metrics explorer, not the inference Power Timeline. Timeline role/window evidence comes from its existing series=power read plus benchmark power_audit. Timeline i_ptaxis, i_ptlines, i_ptwindow, i_ptfocus, i_ptutility and i_ptconc share fields control client rendering only and are not accepted here; they do not change raw telemetry or full-record statistics.' : '' }`, - `只读${zh},使用仪表板的数据读取和计算函数。未知或重复查询键返回 400;响应包含解析后的参数,保留缺失数据。仅影响样式的控件不作为 API 参数。${ + `只读${zh},使用仪表板的数据读取和计算函数。未知或重复查询键返回 400;响应包含解析后的参数,保留缺失数据。仅影响样式的控件不作为 API 参数。${view === 'ubenchx' ? ' mem-bw 包含 Huawei FP16 轮转缓冲池图执行结果。metadata.protocol=rotating-pool-npu-graph 时,timeMs 为每次拷贝的摊销时间。peakBandwidthSource 说明该次测量采用的归一化参考值;行数据可保留 observations、bandwidthP10Gbps、bandwidthP90Gbps、processBandwidthGbps、slots 和 combinedPoolBytes。缺失大小列在 metadata.missingSizesBytes。' : ''}${ view === 'video' ? ' 仅读取已发布产物。cell、阶段、slot 和 GPU 口径选择对应结果证据,并计算 serving 归一化速率;x/y、成本及工作负载筛选生成权衡图数据点。不读取本地数据包或任意 URL。响应不缓存。' : view === 'current-inferencex-image' diff --git a/packages/skills/skills/inferencex-api/integrity.json b/packages/skills/skills/inferencex-api/integrity.json index 8f9eddf82..951ff422f 100644 --- a/packages/skills/skills/inferencex-api/integrity.json +++ b/packages/skills/skills/inferencex-api/integrity.json @@ -9,7 +9,7 @@ "references/cli-contract.md": "4f070877eeefffad2860c58f79f68432fbe27aa21fc578a1c696f0309a3d7d7b", "references/cli.md": "11e1183f7ed70d669019e8435ac16a6a9f873de027507b8850a9943f6659bfd9", "references/collectivex.md": "f79cf8e2779a9289ab69f79f4a4b338e0b9a5f76a3750a3e969f33a744e726a1", - "references/dashboard-views.md": "db9ba48896f75acf6531bd49d26062ee09307c6348f1e10b055cf62e093df85d", + "references/dashboard-views.md": "7b911ec9e50b8d9afbe907e5f2e54caacc033692e708079c48d59b7ae573ad3f", "references/offline-exports.md": "95aa565dcd4c9e592159baa560a9a58217bc61e395de1c6daf0576795c7f4ec9", "references/pareto.md": "1b4d2d163f982e3f2d97addce310789eae9c1e5badd82dd7501708c9e0385027", "references/powerx.md": "5af5527d54a7e6191a5769080c122638b333b1ceb59e19fdee7df662a5cd3c8f", diff --git a/packages/skills/skills/inferencex-api/references/dashboard-views.md b/packages/skills/skills/inferencex-api/references/dashboard-views.md index 6515340c6..a4d73e834 100644 --- a/packages/skills/skills/inferencex-api/references/dashboard-views.md +++ b/packages/skills/skills/inferencex-api/references/dashboard-views.md @@ -172,29 +172,29 @@ All paths below are relative to `/api/v1/views/`. The maintained exhaustive query-key list is in the app's OpenAPI contract. The following groups explain which API selectors belong together. -| View | Selection and calculation | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | -| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | -| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | -| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | -| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | -| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | -| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | -| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | -| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | -| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | -| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | -| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | -| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | -| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | -| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | -| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | -| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | -| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | -| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | -| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `all` (default) returns every test. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | -| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | +| View | Selection and calculation | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | +| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | +| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | +| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | +| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | +| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | +| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | +| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | +| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | +| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | +| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | +| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | +| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | +| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | +| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | +| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | +| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | +| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | +| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | +| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. Huawei keys are `Ascend 950PR_9579` and `Ascend 910B3`: FP16 rotating-pool graph timings, 360 observations per size, and explicit 1,600 GB/s reference assumptions in `peakBandwidthSource`. `metadata.protocol`, CANN/torch_npu versions, and absent sizes distinguish them from the GPU protocol. `timeMs` is amortized graph-copy time for these rows; optional row fields retain p10/p90 bandwidth, process medians, slots and working-set bytes. An explicit device filter leaves unavailable tests empty. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `all` (default) returns every test. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | +| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | ## Interpretation and maintenance From 0e7525c9b62124a43856d26e1ce2ac5b2ae31b93 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 21:50:04 +0800 Subject: [PATCH 3/4] data(ubenchx): retain only the Huawei 950PR bandwidth series MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按要求移除 910B3 带宽系列,并将展示名称统一为 Huawei 950PR。 --- .../ubenchx/data/huawei-bandwidth.json | 625 +----------------- 1 file changed, 3 insertions(+), 622 deletions(-) diff --git a/packages/app/src/components/ubenchx/data/huawei-bandwidth.json b/packages/app/src/components/ubenchx/data/huawei-bandwidth.json index 4c7f2387b..8f5eb9d60 100644 --- a/packages/app/src/components/ubenchx/data/huawei-bandwidth.json +++ b/packages/app/src/components/ubenchx/data/huawei-bandwidth.json @@ -1,7 +1,6 @@ { "sourceHashes": { - "plot-data.json": "72c246de9aa994fff141715391d6bc651fb08cf2818d363c65cd6465381fae96", - "mbu-comparison.json": "59b6f0f201b038f7fdb034b588dcf71e2612d29fbfedb2bfefc7ee7afd883589" + "plot-data.json": "72c246de9aa994fff141715391d6bc651fb08cf2818d363c65cd6465381fae96" }, "method": { "protocol": "rotating-pool-npu-graph", @@ -13,11 +12,10 @@ "observationsPerBlock": 20, "validation": "Full destination-bit comparison before and after every block; graph validation before timing.", "cacheClaim": "No cache-miss or physical HBM-traffic counters were collected.", - "comparison": "Amortized full-rotation graph timing differs from the Triton FP32 copy protocol of the GPU curves.", - "missing910B3": "16 GiB omitted: two source and two destination slots require 64 GiB before runtime overhead." + "comparison": "Amortized full-rotation graph timing differs from the Triton FP32 copy protocol of the GPU curves." }, "curves": { - "Ascend 950PR_9579": [ + "Huawei 950PR": [ { "size_bytes": 4096, "samples": 360, @@ -564,623 +562,6 @@ "process_GBps": [1447.3357675590314, 1447.4756703662817, 1447.1418323453292], "batch_GBps_median": 1447.2186686979203 } - ], - "Ascend 910B3": [ - { - "size_bytes": 4096, - "samples": 360, - "slots": 131072, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.00064296685741283, - "effective_GBps": 12.740936652571751, - "GBps_low": 12.667644478717802, - "GBps_high": 12.795661481936607, - "process_GBps": [12.794493919854892, 12.740936652571751, 12.669473855495113], - "process_GBps_min": 12.669473855495113, - "process_GBps_max": 12.794493919854892, - "mbu_percent": null, - "batch_GBps_median": 12.740712544779093 - }, - { - "size_bytes": 8192, - "samples": 360, - "slots": 65536, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0006784234719816595, - "effective_GBps": 24.150107825931652, - "GBps_low": 23.912609043600902, - "GBps_high": 24.165663327071968, - "process_GBps": [24.150825809502628, 24.16035115970605, 23.91988926619204], - "process_GBps_min": 23.91988926619204, - "process_GBps_max": 24.16035115970605, - "mbu_percent": null, - "batch_GBps_median": 24.149647244064028 - }, - { - "size_bytes": 16384, - "samples": 360, - "slots": 32768, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0007227837922982872, - "effective_GBps": 45.33582566344668, - "GBps_low": 45.16128161729691, - "GBps_high": 45.40979517646315, - "process_GBps": [45.399387499051365, 45.33582566344668, 45.16813293652278], - "process_GBps_min": 45.16813293652278, - "process_GBps_max": 45.399387499051365, - "mbu_percent": null, - "batch_GBps_median": 45.33290724401909 - }, - { - "size_bytes": 32768, - "samples": 360, - "slots": 16384, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0007742504822090268, - "effective_GBps": 84.64444195503522, - "GBps_low": 84.17056590148228, - "GBps_high": 84.92335516406746, - "process_GBps": [84.89372971592749, 84.64444195503522, 84.19503433534386], - "process_GBps_min": 84.19503433534386, - "process_GBps_max": 84.89372971592749, - "mbu_percent": null, - "batch_GBps_median": 84.62308884080423 - }, - { - "size_bytes": 65536, - "samples": 360, - "slots": 8192, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0008192566165234894, - "effective_GBps": 159.98894284943742, - "GBps_low": 158.90266499544688, - "GBps_high": 160.53484855428925, - "process_GBps": [160.45875142909688, 160.0063534767347, 158.95370179648108], - "process_GBps_min": 158.95370179648108, - "process_GBps_max": 160.45875142909688, - "mbu_percent": null, - "batch_GBps_median": 159.94527550904348 - }, - { - "size_bytes": 131072, - "samples": 360, - "slots": 4096, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0009043432655744255, - "effective_GBps": 289.872231020032, - "GBps_low": 288.9659030260927, - "GBps_high": 290.46567918499693, - "process_GBps": [290.20755792217506, 289.9826134926982, 289.2085860183856], - "process_GBps_min": 289.2085860183856, - "process_GBps_max": 290.20755792217506, - "mbu_percent": null, - "batch_GBps_median": 289.6265601324474 - }, - { - "size_bytes": 262144, - "samples": 360, - "slots": 2048, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0010265234159305692, - "effective_GBps": 510.74139358498684, - "GBps_low": 506.57995828313204, - "GBps_high": 511.99465206449855, - "process_GBps": [511.3129100356118, 511.0330806880515, 507.6385458346263], - "process_GBps_min": 507.6385458346263, - "process_GBps_max": 511.3129100356118, - "mbu_percent": null, - "batch_GBps_median": 510.26080838113677 - }, - { - "size_bytes": 524288, - "samples": 360, - "slots": 1024, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0042370897717773914, - "effective_GBps": 247.47552128453938, - "GBps_low": 246.99732959044795, - "GBps_high": 249.39792388839993, - "process_GBps": [249.29404473977655, 247.4612704271502, 247.09906449932978], - "process_GBps_min": 247.09906449932978, - "process_GBps_max": 249.29404473977655, - "mbu_percent": null, - "batch_GBps_median": 247.37374028251458 - }, - { - "size_bytes": 1048576, - "samples": 360, - "slots": 512, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.0048616798594594, - "effective_GBps": 431.3636563130661, - "GBps_low": 424.07199425629824, - "GBps_high": 447.3271739630151, - "process_GBps": [431.3636563130661, 446.8748084496909, 424.32003616561633], - "process_GBps_min": 424.32003616561633, - "process_GBps_max": 446.8748084496909, - "mbu_percent": null, - "batch_GBps_median": 431.0697805293238 - }, - { - "size_bytes": 2097152, - "samples": 360, - "slots": 256, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.006031797034665942, - "effective_GBps": 695.3655727960502, - "GBps_low": 663.0598238135087, - "GBps_high": 700.4278257824051, - "process_GBps": [699.793283503668, 695.5007191127618, 663.6557037994087], - "process_GBps_min": 663.6557037994087, - "process_GBps_max": 699.793283503668, - "mbu_percent": null, - "batch_GBps_median": 694.5837926590171 - }, - { - "size_bytes": 3145728, - "samples": 360, - "slots": 171, - "combined_pool_bytes": 1075838976, - "amortized_copy_ms": 0.007845263034976714, - "effective_GBps": 801.9432837306613, - "GBps_low": 792.1647383294679, - "GBps_high": 804.695313582959, - "process_GBps": [793.6139937461252, 803.0266967643645, 803.4285014488452], - "process_GBps_min": 793.6139937461252, - "process_GBps_max": 803.4285014488452, - "mbu_percent": null, - "batch_GBps_median": 800.6964688814464 - }, - { - "size_bytes": 4194304, - "samples": 360, - "slots": 128, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.009661953430622816, - "effective_GBps": 868.2103531375916, - "GBps_low": 856.9491237449967, - "GBps_high": 894.1917445145093, - "process_GBps": [857.6829394040927, 868.2103531375916, 893.5785351788037], - "process_GBps_min": 857.6829394040927, - "process_GBps_max": 893.5785351788037, - "mbu_percent": null, - "batch_GBps_median": 866.9244545712777 - }, - { - "size_bytes": 6291456, - "samples": 360, - "slots": 86, - "combined_pool_bytes": 1082130432, - "amortized_copy_ms": 0.012946047062097593, - "effective_GBps": 971.9501203451707, - "GBps_low": 964.7923316848454, - "GBps_high": 976.0231060886489, - "process_GBps": [966.7403345773677, 972.0287503036294, 975.006508829251], - "process_GBps_min": 966.7403345773677, - "process_GBps_max": 975.006508829251, - "mbu_percent": null, - "batch_GBps_median": 968.3074209260785 - }, - { - "size_bytes": 8388608, - "samples": 360, - "slots": 64, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.016400625929236412, - "effective_GBps": 1022.961932818202, - "GBps_low": 1019.1693923488257, - "GBps_high": 1041.0728968083438, - "process_GBps": [1040.0746378486406, 1020.3179187675204, 1022.2218829224903], - "process_GBps_min": 1020.3179187675204, - "process_GBps_max": 1040.0746378486406, - "mbu_percent": null, - "batch_GBps_median": 1020.4672740095054 - }, - { - "size_bytes": 10485760, - "samples": 360, - "slots": 52, - "combined_pool_bytes": 1090519040, - "amortized_copy_ms": 0.020107308259377114, - "effective_GBps": 1042.979981680037, - "GBps_low": 1037.9490129886829, - "GBps_high": 1050.280740570645, - "process_GBps": [1039.549902132009, 1043.099740670968, 1049.2216882201878], - "process_GBps_min": 1039.549902132009, - "process_GBps_max": 1049.2216882201878, - "mbu_percent": null, - "batch_GBps_median": 1039.4161370423121 - }, - { - "size_bytes": 12582912, - "samples": 360, - "slots": 43, - "combined_pool_bytes": 1082130432, - "amortized_copy_ms": 0.02297139514324277, - "effective_GBps": 1095.5287584003247, - "GBps_low": 1082.708615609237, - "GBps_high": 1099.2344891387493, - "process_GBps": [1097.6734634749737, 1096.4722905220517, 1084.396829035821], - "process_GBps_min": 1084.396829035821, - "process_GBps_max": 1097.6734634749737, - "mbu_percent": null, - "batch_GBps_median": 1093.460925835774 - }, - { - "size_bytes": 14680064, - "samples": 360, - "slots": 37, - "combined_pool_bytes": 1086324736, - "amortized_copy_ms": 0.026478648991198152, - "effective_GBps": 1108.8227352445244, - "GBps_low": 1105.4264864141526, - "GBps_high": 1112.6317754973436, - "process_GBps": [1111.830096203733, 1108.1553868701953, 1107.4098396344814], - "process_GBps_min": 1107.4098396344814, - "process_GBps_max": 1111.830096203733, - "mbu_percent": null, - "batch_GBps_median": 1105.8237367365573 - }, - { - "size_bytes": 16777216, - "samples": 360, - "slots": 32, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.02984906267374754, - "effective_GBps": 1124.1368738024514, - "GBps_low": 1118.5905746095134, - "GBps_high": 1127.880041240026, - "process_GBps": [1125.952228435239, 1124.925967032729, 1120.0327900769294], - "process_GBps_min": 1120.0327900769294, - "process_GBps_max": 1125.952228435239, - "mbu_percent": null, - "batch_GBps_median": 1123.0317025151624 - }, - { - "size_bytes": 20971520, - "samples": 360, - "slots": 26, - "combined_pool_bytes": 1090519040, - "amortized_copy_ms": 0.03697461462937869, - "effective_GBps": 1134.3739595509828, - "GBps_low": 1126.5366461526291, - "GBps_high": 1137.9748706586547, - "process_GBps": [1128.1659235602885, 1136.5966451898346, 1135.3659946220312], - "process_GBps_min": 1128.1659235602885, - "process_GBps_max": 1136.5966451898346, - "mbu_percent": null, - "batch_GBps_median": 1132.3044722736481 - }, - { - "size_bytes": 25165824, - "samples": 360, - "slots": 22, - "combined_pool_bytes": 1107296256, - "amortized_copy_ms": 0.04344681853597814, - "effective_GBps": 1158.4656758772926, - "GBps_low": 1150.050543077041, - "GBps_high": 1164.5502059760431, - "process_GBps": [1151.7060088827493, 1158.7445202696676, 1163.5907989612683], - "process_GBps_min": 1151.7060088827493, - "process_GBps_max": 1163.5907989612683, - "mbu_percent": null, - "batch_GBps_median": 1155.9688893008154 - }, - { - "size_bytes": 29360128, - "samples": 360, - "slots": 19, - "combined_pool_bytes": 1115684864, - "amortized_copy_ms": 0.050162632214395625, - "effective_GBps": 1170.5975824599673, - "GBps_low": 1164.7438515682481, - "GBps_high": 1181.146337658531, - "process_GBps": [1166.5219188953545, 1170.8064432625833, 1180.231741975629], - "process_GBps_min": 1166.5219188953545, - "process_GBps_max": 1180.231741975629, - "mbu_percent": null, - "batch_GBps_median": 1167.940925864533 - }, - { - "size_bytes": 33554432, - "samples": 360, - "slots": 16, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.057202501222491264, - "effective_GBps": 1173.1805876630738, - "GBps_low": 1164.0689191280192, - "GBps_high": 1181.3666666886566, - "process_GBps": [1165.6915907042833, 1173.6165901102145, 1180.2084527682355], - "process_GBps_min": 1165.6915907042833, - "process_GBps_max": 1180.2084527682355, - "mbu_percent": null, - "batch_GBps_median": 1170.7297845435226 - }, - { - "size_bytes": 41943040, - "samples": 360, - "slots": 13, - "combined_pool_bytes": 1090519040, - "amortized_copy_ms": 0.07071076906644382, - "effective_GBps": 1186.3267944544052, - "GBps_low": 1182.926921022022, - "GBps_high": 1189.307727577966, - "process_GBps": [1185.8624005870138, 1187.4506244149118, 1185.965520821283], - "process_GBps_min": 1185.8624005870138, - "process_GBps_max": 1187.4506244149118, - "mbu_percent": null, - "batch_GBps_median": 1183.093933069865 - }, - { - "size_bytes": 50331648, - "samples": 360, - "slots": 11, - "combined_pool_bytes": 1107296256, - "amortized_copy_ms": 0.0836518190123818, - "effective_GBps": 1203.3605149112207, - "GBps_low": 1194.128493677315, - "GBps_high": 1207.312461733816, - "process_GBps": [1195.9521902924196, 1204.6565950374031, 1205.4172267030042], - "process_GBps_min": 1195.9521902924196, - "process_GBps_max": 1205.4172267030042, - "mbu_percent": null, - "batch_GBps_median": 1201.1075968593095 - }, - { - "size_bytes": 58720256, - "samples": 360, - "slots": 10, - "combined_pool_bytes": 1174405120, - "amortized_copy_ms": 0.09680000245571137, - "effective_GBps": 1213.228398973773, - "GBps_low": 1208.740576153593, - "GBps_high": 1217.080827494203, - "process_GBps": [1210.989086192684, 1215.5137632231442, 1213.5418283400986], - "process_GBps_min": 1210.989086192684, - "process_GBps_max": 1215.5137632231442, - "mbu_percent": null, - "batch_GBps_median": 1210.7069688293716 - }, - { - "size_bytes": 67108864, - "samples": 360, - "slots": 8, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.11023375019431114, - "effective_GBps": 1217.5738171241733, - "GBps_low": 1212.4154810497598, - "GBps_high": 1220.1361790240042, - "process_GBps": [1217.1459538127845, 1218.4442507113736, 1217.3253384395343], - "process_GBps_min": 1217.1459538127845, - "process_GBps_max": 1218.4442507113736, - "mbu_percent": null, - "batch_GBps_median": 1211.8818364796662 - }, - { - "size_bytes": 83886080, - "samples": 360, - "slots": 7, - "combined_pool_bytes": 1174405120, - "amortized_copy_ms": 0.13727428231920516, - "effective_GBps": 1222.167453113161, - "GBps_low": 1215.310022107034, - "GBps_high": 1226.6096017703298, - "process_GBps": [1216.9749008959548, 1225.687923356119, 1222.7527930870824], - "process_GBps_min": 1216.9749008959548, - "process_GBps_max": 1225.687923356119, - "mbu_percent": null, - "batch_GBps_median": 1219.4120627940963 - }, - { - "size_bytes": 100663296, - "samples": 360, - "slots": 6, - "combined_pool_bytes": 1207959552, - "amortized_copy_ms": 0.16387166579564413, - "effective_GBps": 1228.5625524247978, - "GBps_low": 1225.4292649325014, - "GBps_high": 1231.48084901754, - "process_GBps": [1226.927874538513, 1228.8375086074013, 1230.1514865298172], - "process_GBps_min": 1226.927874538513, - "process_GBps_max": 1230.1514865298172, - "mbu_percent": null, - "batch_GBps_median": 1225.3976013786441 - }, - { - "size_bytes": 117440512, - "samples": 360, - "slots": 5, - "combined_pool_bytes": 1174405120, - "amortized_copy_ms": 0.19060399532318115, - "effective_GBps": 1232.29853394072, - "GBps_low": 1227.4685986644254, - "GBps_high": 1237.7324342754125, - "process_GBps": [1229.4345988564473, 1236.8278129738746, 1232.634773178068], - "process_GBps_min": 1229.4345988564473, - "process_GBps_max": 1236.8278129738746, - "mbu_percent": null, - "batch_GBps_median": 1230.0224367078622 - }, - { - "size_bytes": 134217728, - "samples": 360, - "slots": 4, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.21727249771356583, - "effective_GBps": 1235.4782994849315, - "GBps_low": 1202.0242369995308, - "GBps_high": 1238.8880877728725, - "process_GBps": [1235.2651067188792, 1237.885445800486, 1234.1150599113494], - "process_GBps_min": 1234.1150599113494, - "process_GBps_max": 1237.885445800486, - "mbu_percent": null, - "batch_GBps_median": 1228.654965037295 - }, - { - "size_bytes": 167772160, - "samples": 360, - "slots": 4, - "combined_pool_bytes": 1342177280, - "amortized_copy_ms": 0.27097249031066895, - "effective_GBps": 1238.296624189783, - "GBps_low": 1233.0975127796007, - "GBps_high": 1240.9940783807515, - "process_GBps": [1234.4130878306244, 1239.6805114837257, 1239.2913472411472], - "process_GBps_min": 1234.4130878306244, - "process_GBps_max": 1239.6805114837257, - "mbu_percent": null, - "batch_GBps_median": 1235.5221867631626 - }, - { - "size_bytes": 201326592, - "samples": 360, - "slots": 3, - "combined_pool_bytes": 1207959552, - "amortized_copy_ms": 0.3237499992052714, - "effective_GBps": 1243.716401508624, - "GBps_low": 1239.8637540456448, - "GBps_high": 1246.8410734842973, - "process_GBps": [1242.4883146587254, 1245.22925813838, 1244.113497889597], - "process_GBps_min": 1242.4883146587254, - "process_GBps_max": 1245.22925813838, - "mbu_percent": null, - "batch_GBps_median": 1240.1775326499837 - }, - { - "size_bytes": 234881024, - "samples": 360, - "slots": 3, - "combined_pool_bytes": 1409286144, - "amortized_copy_ms": 0.3758466641108195, - "effective_GBps": 1249.8768589881358, - "GBps_low": 1247.1757784050417, - "GBps_high": 1252.0355087197313, - "process_GBps": [1250.9085603112103, 1249.3450101252179, 1249.44463540754], - "process_GBps_min": 1249.3450101252179, - "process_GBps_max": 1250.9085603112103, - "mbu_percent": null, - "batch_GBps_median": 1246.9219358221235 - }, - { - "size_bytes": 268435456, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 1073741824, - "amortized_copy_ms": 0.43090999126434326, - "effective_GBps": 1245.9003571134526, - "GBps_low": 1223.8940098814571, - "GBps_high": 1250.6339644677844, - "process_GBps": [1248.00005968168, 1248.5369838831805, 1240.8896617994008], - "process_GBps_min": 1240.8896617994008, - "process_GBps_max": 1248.5369838831805, - "mbu_percent": null, - "batch_GBps_median": 1239.106858760494 - }, - { - "size_bytes": 402653184, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 1610612736, - "amortized_copy_ms": 0.6409749984741211, - "effective_GBps": 1256.3771908687227, - "GBps_low": 1253.5707611945543, - "GBps_high": 1258.556702103437, - "process_GBps": [1256.7301203851607, 1257.2500590538973, 1255.3783189760666], - "process_GBps_min": 1255.3783189760666, - "process_GBps_max": 1257.2500590538973, - "mbu_percent": null, - "batch_GBps_median": 1254.7675459795228 - }, - { - "size_bytes": 536870912, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 2147483648, - "amortized_copy_ms": 0.852649986743927, - "effective_GBps": 1259.2996431048707, - "GBps_low": 1256.5262034450727, - "GBps_high": 1261.4907514327017, - "process_GBps": [1258.0823321373516, 1260.164222017919, 1259.5433616200153], - "process_GBps_min": 1258.0823321373516, - "process_GBps_max": 1260.164222017919, - "mbu_percent": null, - "batch_GBps_median": 1257.4657884613462 - }, - { - "size_bytes": 805306368, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 3221225472, - "amortized_copy_ms": 1.2745000123977661, - "effective_GBps": 1263.7212399628713, - "GBps_low": 1261.7402972129019, - "GBps_high": 1265.3703324326996, - "process_GBps": [1263.7609567827249, 1263.5626339871412, 1263.7956519405284], - "process_GBps_min": 1263.5626339871412, - "process_GBps_max": 1263.7956519405284, - "mbu_percent": null, - "batch_GBps_median": 1262.5171861494418 - }, - { - "size_bytes": 1073741824, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 4294967296, - "amortized_copy_ms": 1.6949899792671204, - "effective_GBps": 1266.9594949042287, - "GBps_low": 1264.8238324864594, - "GBps_high": 1268.524411480047, - "process_GBps": [1267.1388901625403, 1267.340803998021, 1266.5074000868399], - "process_GBps_min": 1266.5074000868399, - "process_GBps_max": 1267.340803998021, - "mbu_percent": null, - "batch_GBps_median": 1266.305948472574 - }, - { - "size_bytes": 2147483648, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 8589934592, - "amortized_copy_ms": 3.389169931411743, - "effective_GBps": 1267.2623040211356, - "GBps_low": 1264.9228762379962, - "GBps_high": 1268.696378409177, - "process_GBps": [1267.6363025077367, 1267.653161715018, 1266.3916558546073], - "process_GBps_min": 1266.3916558546073, - "process_GBps_max": 1267.653161715018, - "mbu_percent": null, - "batch_GBps_median": 1267.088898829921 - }, - { - "size_bytes": 4294967296, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 17179869184, - "amortized_copy_ms": 6.7716498374938965, - "effective_GBps": 1268.514290924858, - "GBps_low": 1266.937085206279, - "GBps_high": 1269.943869672069, - "process_GBps": [1268.4899057844216, 1268.0947828481117, 1269.0924396502785], - "process_GBps_min": 1268.0947828481117, - "process_GBps_max": 1269.0924396502785, - "mbu_percent": null, - "batch_GBps_median": 1268.6056074912306 - }, - { - "size_bytes": 8589934592, - "samples": 360, - "slots": 2, - "combined_pool_bytes": 34359738368, - "amortized_copy_ms": 13.51129961013794, - "effective_GBps": 1271.5186310508147, - "GBps_low": 1270.2004762322842, - "GBps_high": 1272.5370739182154, - "process_GBps": [1271.7430860105414, 1271.0346238839213, 1271.5623399209603], - "process_GBps_min": 1271.0346238839213, - "process_GBps_max": 1271.7430860105414, - "mbu_percent": null, - "batch_GBps_median": 1271.6637257209586 - } ] } } From 83012b41c47f17e753dea20fe8446090827a0078 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Mon, 26 Oct 2026 21:52:36 +0800 Subject: [PATCH 4/4] fix(ubenchx): label Huawei 950PR and align hover rulers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一 Huawei 950PR 展示名称,移除 910B3 界面及 API 数据,并使悬停参考线与当前指标和缩放后的数据点对齐。 --- docs/ubenchx-huawei-bandwidth.md | 12 +-- packages/app/cypress/e2e/ubenchx.cy.ts | 74 +++++++++++++++++-- .../app/api/v1/views/ubenchx/route.test.ts | 26 ++++--- .../src/components/ubenchx/UbenchxContent.tsx | 12 +-- .../src/components/ubenchx/ubenchx-data.ts | 19 ++--- packages/app/src/lib/api/api-route-catalog.ts | 2 +- .../app/src/lib/views-api/docs/extensions.ts | 4 +- .../skills/inferencex-api/integrity.json | 2 +- .../references/dashboard-views.md | 46 ++++++------ 9 files changed, 129 insertions(+), 68 deletions(-) diff --git a/docs/ubenchx-huawei-bandwidth.md b/docs/ubenchx-huawei-bandwidth.md index a89954cf2..956cc06e3 100644 --- a/docs/ubenchx-huawei-bandwidth.md +++ b/docs/ubenchx-huawei-bandwidth.md @@ -1,11 +1,13 @@ # Huawei copy-bandwidth evidence -The added static series are Ascend950PR_9579 (28 Cube, 56 Vector, 128 GiB) and Ascend910B3 on Atlas 800T A2 (20 Cube, 40 Vector, 64 GiB). No power-limited A3 data is included. Neither series changes the global GPU specification catalog or inference-data normalization. +The displayed series is **Huawei 950PR**, measured on Ascend950PR_9579 (28 Cube, 56 Vector, 128 GiB). The measured SKU remains in API metadata. This series does not change the global GPU specification catalog or inference-data normalization. -`huawei-bandwidth.json` preserves all 42/41 full-precision plotted points, source input hashes, per-process medians, observed p10/p90 ranges, pool geometry and sample counts. Each size has three processes × six blocks × twenty observations. Aggregation is the pooled median amortized time, converted by `2 * message bytes / time`; bounds invert p90/p10 latency and are not confidence intervals. No observations are smoothed or supplied for missing sizes. Source files are the validated October 7 rotating-pool 950PR experiment and October 13 A2 comparison; the initial scratch-fill curves and overlap-rejected runs are excluded. +`huawei-bandwidth.json` preserves all 42 full-precision plotted points, source input hashes, per-process medians, observed p10/p90 ranges, pool geometry and sample counts. Each size has three processes × six blocks × twenty observations. Aggregation is the pooled median amortized time, converted by `2 * message bytes / time`; bounds invert p90/p10 latency and are not confidence intervals. No observations are smoothed or supplied for missing sizes. The source is the validated October 7 rotating-pool 950PR experiment; the initial scratch-fill curves and overlap-rejected runs are excluded. -Both experiments use FP16 `copy_` operations in complete rotating-pool NPU graph replays. Each direction has at least 512 MiB and two slots. Every block is checked against source bits before and after timing. The time is amortized over a complete rotation, not an isolated-copy latency. Unlike the GPU series, it is not `triton.testing.do_bench` on one FP32 buffer pair. The UI states this above the chart and labels Huawei tooltip times as amortized. No physical HBM-traffic counters prove that every access misses cache. +The experiment uses FP16 `copy_` operations in complete rotating-pool NPU graph replays. Each direction has at least 512 MiB and two slots. Every block is checked against source bits before and after timing. The time is amortized over a complete rotation, not an isolated-copy latency. Unlike the GPU series, it is not `triton.testing.do_bench` on one FP32 buffer pair. The UI states this above the chart and labels Huawei tooltip times as amortized. No physical HBM-traffic counters prove that every access misses cache. -The 950PR endpoint is about 1,447 GB/s at 16 GiB. The 910B3 endpoint is 1,271.519 GB/s at 8 GiB; 16 GiB is absent because two source and two destination slots would occupy all 64 GiB before runtime overhead. Both MBU curves use 1,600 GB/s. The 950PR figure is an assumed nominal reference, and the 910B3 figure is corroborated by the [OEM 910B3/2 brochure](https://www.yingjiangdata.com/UpLoad/202601/2026013061541417.pdf#page=15) and [CANN memory example](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/800alpha002/devguide/opdevg/ascendcbestP/atlas_ascendc_best_practices_10_0036.html). Neither exact board ceiling was independently measured. +The endpoint is about 1,447 GB/s at 16 GiB. MBU uses an assumed nominal reference of 1,600 GB/s; the exact board ceiling was not independently measured. -UI/API coverage: the existing bandwidth/MBU/latency selector is presentation-only. Both hardware keys are available through `test=mem-bw`, `gpu=` and `gpu=all`; `test=all` returns empty sections for tests unavailable on an explicitly selected device. API rows retain optional uncertainty/pool fields, `metadata.protocol`, `dtype`, CANN/torch_npu versions and `missingSizesBytes`. `peakBandwidthSource` states the per-run reference qualification. The dashboard and API share `transformUbenchxRun`. +UI/API coverage: the existing bandwidth/MBU/latency selector is presentation-only. `Huawei 950PR` is available through `test=mem-bw`, `gpu=` and `gpu=all`; `test=all` returns empty sections for tests unavailable on an explicitly selected device. API rows retain optional uncertainty/pool fields, `metadata.protocol`, `dtype`, CANN/torch_npu versions and `missingSizesBytes`. `peakBandwidthSource` states the per-run reference qualification. The dashboard and API share `transformUbenchxRun`. + +Hover rulers use the currently selected metric and the same scaled coordinates as the displayed point, including after zoom. diff --git a/packages/app/cypress/e2e/ubenchx.cy.ts b/packages/app/cypress/e2e/ubenchx.cy.ts index 2525bad11..eae5264af 100644 --- a/packages/app/cypress/e2e/ubenchx.cy.ts +++ b/packages/app/cypress/e2e/ubenchx.cy.ts @@ -133,27 +133,85 @@ const dismiss = { }; describe('Huawei copy-bandwidth evidence', () => { - it('renders both SKUs and qualifies the graph timing in English and Chinese', () => { + it('renders Huawei 950PR and qualifies the graph timing in English and Chinese', () => { cy.visit('/ubenchx/mem-bw', dismiss); - cy.contains('Ascend 950PR_9579').should('be.visible'); - cy.contains('Ascend 910B3').should('be.visible'); + cy.contains('Huawei 950PR').should('be.visible'); + cy.contains('910B3').should('not.exist'); cy.contains('Graph time is amortized per copy').should('be.visible'); - cy.contains('16 GiB is absent').should('be.visible'); cy.get('[data-testid="ubenchx-metric-select"]').click(); cy.contains('[role="option"]', 'Bandwidth (TB/s)').click(); cy.contains('h2', 'Bandwidth vs Message Size').should('be.visible'); cy.screenshot('huawei-bandwidth-en', { capture: 'fullPage' }); cy.visit('/zh/ubenchx/mem-bw', dismiss); cy.contains('图执行时间按拷贝次数摊销').should('be.visible'); - cy.contains('910B3 未测量 16 GiB').should('be.visible'); + cy.contains('910B3').should('not.exist'); cy.screenshot('huawei-bandwidth-zh', { capture: 'fullPage' }); }); it('serves measured endpoints and empty unavailable tests through the public API', () => { - cy.request('/api/v1/views/ubenchx?test=all&gpu=Ascend%20910B3').then(({ body }) => { - expect(body.memBw.gpus[0].rows.at(-1).bytes).to.equal(8589934592); - expect(body.memBw.gpus[0].rows.at(-1).mbuPercent).to.be.closeTo(79.46994, 0.0001); + cy.request('/api/v1/views/ubenchx?test=all&gpu=Huawei%20950PR').then(({ body }) => { + expect(body.memBw.gpus[0].rows.at(-1).bytes).to.equal(17179869184); + expect(body.memBw.gpus[0].rows.at(-1).mbuPercent).to.be.closeTo(90.4545974, 0.0001); expect(body.smL2Distance.gpus).to.deep.equal([]); expect(body.tpcSkyline.gpus).to.deep.equal([]); }); }); }); + +function assertBandwidthRuler(chart: string) { + cy.get(`${chart} circle.point`) + .filter((_, element) => { + const datum = ( + element as unknown as SVGCircleElement & { __data__: { gpuKey: string; bytes: number } } + ).__data__; + return datum.gpuKey === 'H200 SXM' && datum.bytes === 33554432; + }) + .should('have.length', 1) + .then(($point) => { + const x = Number($point.attr('cx')), + y = Number($point.attr('cy')); + cy.wrap($point).trigger('mouseenter', { force: true }); + cy.get(`${chart} .horizontal-ruler`).should(($line) => { + expect(Number($line.attr('y1'))).to.be.closeTo(y, 0.01); + expect(Number($line.attr('y2'))).to.be.closeTo(y, 0.01); + }); + cy.get(`${chart} .vertical-ruler`).should(($line) => { + expect(Number($line.attr('x1'))).to.be.closeTo(x, 0.01); + expect(Number($line.attr('x2'))).to.be.closeTo(x, 0.01); + }); + }); +} + +it('keeps bandwidth hover guides on the rendered point in every metric and after zoom', () => { + cy.visit('/ubenchx/mem-bw', dismiss); + assertBandwidthRuler('#ubenchx-mbu'); + for (const [label, chart] of [ + ['Bandwidth (TB/s)', '#ubenchx-bandwidth'], + ['Latency (ms)', '#ubenchx-latency'], + ]) { + cy.get('[data-testid="ubenchx-metric-select"]').click(); + cy.contains('[role="option"]', label).click(); + assertBandwidthRuler(chart); + } + cy.get('#ubenchx-latency circle.point') + .first() + .then(($point) => { + const previousX = $point.attr('cx'); + cy.get('#ubenchx-latency svg').then(($svg) => { + const rect = $svg[0].getBoundingClientRect(); + cy.wrap($svg).trigger('wheel', { + eventConstructor: 'WheelEvent', + deltaY: -200, + shiftKey: true, + clientX: rect.left + 150, + clientY: rect.top + 100, + force: true, + }); + }); + cy.get('#ubenchx-latency circle.point') + .first() + .should(($current) => { + expect($current.attr('cx')).not.to.equal(previousX); + }); + }); + assertBandwidthRuler('#ubenchx-latency'); +}); diff --git a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts index 225432f1d..f09e55b33 100644 --- a/packages/app/src/app/api/v1/views/ubenchx/route.test.ts +++ b/packages/app/src/app/api/v1/views/ubenchx/route.test.ts @@ -160,29 +160,29 @@ describe('ubenchx view', () => { }); it('exposes Huawei rotating-copy evidence without inventing missing tests or sizes', async () => { - const response = await GET(request({ test: 'all', gpu: 'ascend 910b3' })); + const response = await GET(request({ test: 'all', gpu: 'huawei 950pr' })); expect(response.status).toBe(200); const body = await response.json(); const run = body.memBw.gpus[0]; - expect(run.gpu).toBe('Ascend 910B3'); + expect(run.gpu).toBe('Huawei 950PR'); expect(run.peakBandwidthGbps).toBe(1600); - expect(run.peakBandwidthSource).toContain('exact board ceiling not independently measured'); + expect(run.peakBandwidthSource).toContain('not independently verified'); expect(run.metadata).toMatchObject({ protocol: 'rotating-pool-npu-graph', dtype: 'float16', - missingSizesBytes: [17179869184], + missingSizesBytes: [], }); - expect(run.rows.some((row: { bytes: number }) => row.bytes === 17179869184)).toBe(false); - const endpoint = run.rows.find((row: { bytes: number }) => row.bytes === 8589934592); - expect(endpoint.bandwidthGbps).toBeCloseTo(1271.519, 3); - expect(endpoint.mbuPercent).toBeCloseTo(79.46994, 4); + expect(run.rows.some((row: { bytes: number }) => row.bytes === 17179869184)).toBe(true); + const endpoint = run.rows.find((row: { bytes: number }) => row.bytes === 17179869184); + expect(endpoint.bandwidthGbps).toBeCloseTo(1447.2735584561165, 6); + expect(endpoint.mbuPercent).toBeCloseTo(90.45459740350728, 6); expect(endpoint.observations).toBe(360); expect(body.smL2Distance.gpus).toEqual([]); expect(body.tpcSkyline.gpus).toEqual([]); }); it('preserves full-precision Huawei bandwidth arithmetic and API/UI normalization', async () => { - for (const gpu of ['Ascend 950PR_9579', 'Ascend 910B3']) { + for (const gpu of ['Huawei 950PR']) { const response = await GET(request({ test: 'mem-bw', gpu })); const body = await response.json(); const run = body.gpus[0]; @@ -194,3 +194,11 @@ it('preserves full-precision Huawei bandwidth arithmetic and API/UI normalizatio } } }); + +it('does not expose the removed 910B3 bandwidth series', async () => { + const all = await GET(request({ test: 'mem-bw', gpu: 'all' })); + const body = await all.json(); + expect(body.gpus.some((run: { gpu: string }) => run.gpu === 'Ascend 910B3')).toBe(false); + const removed = await GET(request({ test: 'mem-bw', gpu: 'Ascend 910B3' })); + expect(removed.status).toBe(400); +}); diff --git a/packages/app/src/components/ubenchx/UbenchxContent.tsx b/packages/app/src/components/ubenchx/UbenchxContent.tsx index 9596dc845..2d373e1bd 100644 --- a/packages/app/src/components/ubenchx/UbenchxContent.tsx +++ b/packages/app/src/components/ubenchx/UbenchxContent.tsx @@ -32,8 +32,7 @@ const GPU_COLORS: Record = { MI355X: 'oklch(0.62 0.20 18)', MI325X: 'oklch(0.55 0.20 28)', MI300X: 'oklch(0.48 0.20 38)', - 'Ascend 950PR_9579': '#C7000B', - 'Ascend 910B3': '#7F0011', + 'Huawei 950PR': '#C7000B', }; const STRINGS = { @@ -58,8 +57,6 @@ const STRINGS = { 'NVIDIA/AMD: times b.copy_(a) on float32 tensors using triton.testing.do_bench; bandwidth = 2 * bytes / time (read + write). Power-of-two sizes from 8 B to 16 GiB.', huaweiMethodology: 'Huawei: FP16 rotating source/destination pools of at least 512 MiB each, timed as full rotating-buffer NPU graph replays. Three processes, 360 observations per size; full copied-bit checks before/after each block. Graph time is amortized per copy, not isolated-copy latency. Protocols differ from the GPU curves. No physical HBM-traffic counters were collected.', - huaweiMissing: - '910B3: 16 GiB is absent because the two-slot source/destination geometry requires 64 GiB before runtime overhead.', huaweiReference: 'Huawei MBU uses a 1,600 GB/s reference; the exact board bandwidth ceiling was not independently measured.', amortized: 'Amortized graph copy time', @@ -93,9 +90,7 @@ const STRINGS = { 'NVIDIA/AMD:使用 triton.testing.do_bench 计时 b.copy_(a)(float32 张量);带宽 = 2 * bytes / time(读 + 写)。消息大小为 2 的幂次,从 8 B 到 16 GiB。', huaweiMethodology: 'Huawei:源和目标分别使用至少 512 MiB 的 FP16 轮转缓冲池,每次计时覆盖完整缓冲池轮转的一次 NPU 图重放。每个大小在三个进程中共测量 360 次,每个测量块前后逐位校验全部拷贝结果。图执行时间按拷贝次数摊销,不代表单次独立拷贝延迟;与 GPU 曲线的测试协议不同,且未采集物理 HBM 流量计数器。', - huaweiMissing: - '910B3 未测量 16 GiB:源和目标各保留两个缓冲槽,尚未计入运行时开销就需要 64 GiB。', - huaweiReference: 'Huawei 的 MBU 使用 1,600 GB/s 参考值,两款板卡的确切带宽上限未经独立实测。', + huaweiReference: 'Huawei 的 MBU 使用 1,600 GB/s 参考值,该板卡的确切带宽上限未经独立实测。', amortized: '摊销后的图拷贝时间', source: '数据来源', instructions: 'Shift+滚轮缩放 · 拖动平移 · 双击重置 · 点击数据点固定提示框', @@ -306,6 +301,8 @@ function UbenchxChart({ }} tooltip={{ rulerType: 'crosshair', + getRulerX: (point, scale) => (scale as d3.ScaleLogarithmic)(point.x), + getRulerY: (point, scale) => scale(point.y), attachToLayer: 1, content: (point, isPinned) => formatTooltip(point, isPinned, STRINGS[locale]), }} @@ -400,7 +397,6 @@ export function UbenchxContent() {

{t.methodology}

{t.methodologyText}

{t.huaweiMethodology}

-

{t.huaweiMissing}

{t.huaweiReference}

{viewResults.map((r) => (

diff --git a/packages/app/src/components/ubenchx/ubenchx-data.ts b/packages/app/src/components/ubenchx/ubenchx-data.ts index bb3c4d8ab..1816139cf 100644 --- a/packages/app/src/components/ubenchx/ubenchx-data.ts +++ b/packages/app/src/components/ubenchx/ubenchx-data.ts @@ -42,8 +42,7 @@ export const UBENCHX_GPU_KEYS = [ 'MI355X', 'MI325X', 'MI300X', - 'Ascend 950PR_9579', - 'Ascend 910B3', + 'Huawei 950PR', ] as const; export type UbenchxGpuKey = (typeof UBENCHX_GPU_KEYS)[number]; @@ -412,28 +411,26 @@ export const UBENCHX_RUNS: Record = { }; for (const [gpu, points] of Object.entries(huawei.curves)) { - const b3 = gpu === 'Ascend 910B3'; UBENCHX_RUNS[gpu] = { metadata: { - gpu, - driver: b3 ? '26.1.1' : '25.7.rc1.10', + gpu: 'Ascend950PR_9579', + driver: '25.7.rc1.10', torch: '2.10.0+cpu', torchNpu: '2.10.0.post4', cann: '9.1.0', triton: 'Not used', container: 'Not recorded', - date: b3 ? '2026-10-13' : '2026-10-07', + date: '2026-10-07', dtype: 'float16', protocol: 'rotating-pool-npu-graph', - missingSizesBytes: b3 ? [17179869184] : [], + missingSizesBytes: [], sourceUrl: - 'https://github.com/SemiAnalysisAI/InferenceX-app/blob/0a94bf26f3703d479b930f3957241b36b6b3e6d6/packages/app/src/components/ubenchx/data/huawei-bandwidth.json', + 'https://github.com/SemiAnalysisAI/InferenceX-app/blob/0e7525c9b62124a43856d26e1ce2ac5b2ae31b93/packages/app/src/components/ubenchx/data/huawei-bandwidth.json', }, bandwidthReference: { gbps: 1600, - source: b3 - ? '910B3/2 64 GB OEM specification and CANN 20-core memory example; exact board ceiling not independently measured' - : '950PR 128 GiB nominal reference assumed at 1600 GB/s; not independently verified by memory-controller counters', + source: + '950PR 128 GiB nominal reference assumed at 1600 GB/s; not independently verified by memory-controller counters', }, rows: points.map((point) => ({ bytes: point.size_bytes, diff --git a/packages/app/src/lib/api/api-route-catalog.ts b/packages/app/src/lib/api/api-route-catalog.ts index f6d3df0f1..a8bf17779 100644 --- a/packages/app/src/lib/api/api-route-catalog.ts +++ b/packages/app/src/lib/api/api-route-catalog.ts @@ -1168,7 +1168,7 @@ export const apiContractSourceDigests = [ }, { source: 'src/components/ubenchx/ubenchx-data.ts', - sourceSha256: 'f8a87d08efba5c17a312f3c3ffe274c31399fb4c8e3d29c43031395dda444964', + sourceSha256: '21beff5ed2452035aae42df208734cbda323272539ed265bf8dd39c3043981d1', reviewArea: { en: 'ubenchX Huawei measurement units, protocol metadata and shared UI/API calculations.', zh: 'ubenchX Huawei 测量单位、协议元数据及界面与 API 共用的计算。', diff --git a/packages/app/src/lib/views-api/docs/extensions.ts b/packages/app/src/lib/views-api/docs/extensions.ts index d638f2bb6..59f99a10b 100644 --- a/packages/app/src/lib/views-api/docs/extensions.ts +++ b/packages/app/src/lib/views-api/docs/extensions.ts @@ -357,8 +357,8 @@ const PARAMETER_NOTES: Record = { 'JSON 对象,将视频数据点 ID 映射为 {hourly,source,date} 字符串;hourly 为非负 USD/deployment-hour。', ], gpu: [ - 'Accelerator key, e.g. "H100 SXM", "Ascend 950PR_9579" or "Ascend 910B3". Default: first available device. "all" returns all devices; unavailable tests retain their section object with an empty gpus array for an explicitly selected device.', - '加速器键,如 "H100 SXM"、"Ascend 950PR_9579" 或 "Ascend 910B3"。默认首个可用设备;"all" 返回全部设备。显式选择设备时,没有数据的测试部分保留对象结构,其中 gpus 数组为空。', + 'Accelerator key, e.g. "H100 SXM", "Huawei 950PR". Default: first available device. "all" returns all devices; unavailable tests retain their section object with an empty gpus array for an explicitly selected device.', + '加速器键,如 "H100 SXM"或 "Huawei 950PR"。默认首个可用设备;"all" 返回全部设备。显式选择设备时,没有数据的测试部分保留对象结构,其中 gpus 数组为空。', ], test: [ 'ubenchX test selector: mem-bw, sm-l2-distance, tpc-skyline, or all (default). Determines which benchmark data is returned.', diff --git a/packages/skills/skills/inferencex-api/integrity.json b/packages/skills/skills/inferencex-api/integrity.json index 951ff422f..bf69dab0f 100644 --- a/packages/skills/skills/inferencex-api/integrity.json +++ b/packages/skills/skills/inferencex-api/integrity.json @@ -9,7 +9,7 @@ "references/cli-contract.md": "4f070877eeefffad2860c58f79f68432fbe27aa21fc578a1c696f0309a3d7d7b", "references/cli.md": "11e1183f7ed70d669019e8435ac16a6a9f873de027507b8850a9943f6659bfd9", "references/collectivex.md": "f79cf8e2779a9289ab69f79f4a4b338e0b9a5f76a3750a3e969f33a744e726a1", - "references/dashboard-views.md": "7b911ec9e50b8d9afbe907e5f2e54caacc033692e708079c48d59b7ae573ad3f", + "references/dashboard-views.md": "24c1f4d8bebf776a2ddfda588baa81f584c770c0d71ab8011bfa1ec19b69082e", "references/offline-exports.md": "95aa565dcd4c9e592159baa560a9a58217bc61e395de1c6daf0576795c7f4ec9", "references/pareto.md": "1b4d2d163f982e3f2d97addce310789eae9c1e5badd82dd7501708c9e0385027", "references/powerx.md": "5af5527d54a7e6191a5769080c122638b333b1ceb59e19fdee7df662a5cd3c8f", diff --git a/packages/skills/skills/inferencex-api/references/dashboard-views.md b/packages/skills/skills/inferencex-api/references/dashboard-views.md index a4d73e834..904d52d0f 100644 --- a/packages/skills/skills/inferencex-api/references/dashboard-views.md +++ b/packages/skills/skills/inferencex-api/references/dashboard-views.md @@ -172,29 +172,29 @@ All paths below are relative to `/api/v1/views/`. The maintained exhaustive query-key list is in the app's OpenAPI contract. The following groups explain which API selectors belong together. -| View | Selection and calculation | -| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | -| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | -| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | -| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | -| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | -| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | -| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | -| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | -| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | -| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | -| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | -| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | -| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | -| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | -| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | -| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | -| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | -| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | -| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | -| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. Huawei keys are `Ascend 950PR_9579` and `Ascend 910B3`: FP16 rotating-pool graph timings, 360 observations per size, and explicit 1,600 GB/s reference assumptions in `peakBandwidthSource`. `metadata.protocol`, CANN/torch_npu versions, and absent sizes distinguish them from the GPU protocol. `timeMs` is amortized graph-copy time for these rows; optional row fields retain p10/p90 bandwidth, process medians, slots and working-set bytes. An explicit device filter leaves unavailable tests empty. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `all` (default) returns every test. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | -| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | +| View | Selection and calculation | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `options` | Static registries and defaults, JSON only. Data-dependent run/config choices come from their own views. | +| `inference` | Model, sequence, precisions, date/exact run, GPU/vendor/framework/deployment/spec/power filters; metric, xmode, xstat, xmetric, percentile, optimal/best/allPoints; API-only equal-service sources/target; roleShare and powerFit panels; TCO, custom costs/powers, pricing, unofficial runs, comparison dates/endpoints. JSON or CSV. | +| `historical` | Model, sequence, target, metric, precisions, GPUs/vendors/frameworks/deployment, start/end, TCO and pricing. `extendToDate` labels synthetic extension, defaults to current UTC date. JSON or CSV. | +| `calculator` | Model/sequence/run/date, precisions/GPUs, percentile, target/mode, token type, owning/renting cost, TCO, power budget, cost cap, hide-above-limit and public unofficial runs. JSON or CSV. | +| `first-token` | Benchmark selection plus 1–8 positive TTFT caps in seconds, minimum interactivity, cost provider and token type. Shared dashboard winner selection. | +| `cache-reuse` | AgentX selection plus exact `config` from returned configurations and `recipe` from data.recipes. Cache-reuse curves retain official versus unofficial evidence. | +| `profit-estimator` | AgentX selection, comparison dates/runs, target, utilization, lab revenue share, list/OpenRouter/custom token prices, own/rent/custom chip costs, TCO, actual/theoretical cache-hit mode and provisioned/modeled/compare power. USD/chip-hour. | +| `profit-estimator-per-gigawatt` | Same selectors; USD/GW-year basis and owning-cost default. | +| `fleet` | Model/sequence/precision/GPUs, target/percentile, TCO/token type/cost provider, MW, input/output prices, ramp, cache discount, MTBI, recovery, horizon and metric. JSON or CSV. | +| `evaluation` | Model, task, date, precision and GPU selection; public unofficial runs remain separately labeled and independent of the official date cutoff. JSON or CSV. | +| `reliability` | Rolling range, GPU selection and optional `asOf` date for reproducibility. JSON or CSV. | +| `gpu-specs` | Full hardware properties or selected metric ranking; table/radar/bar are renderings of these values. JSON or CSV. | +| `overview` | Models, model/hardware row limits, hardware tier, engine, comparison mode and reference. JSON or CSV. | +| `rankings` | Ranking kind (model or chip), selected model/scenario and format. Use the exact values in OpenAPI. | +| `compare` | GPU pairs, model/slug, scenario, tier selection and variant. JSON or CSV. | +| `collectivex` | Ordered run selection and suite; EP size/phase/modes/precision/operation/percentile/axis/SKU/backend/series; KV page size/x/y/pull/push/overlap ISL/series; swap direction/layout/metric/percentile/series. | +| `submissions` | Search, table sort/direction/offset/limit, weekly/cumulative chart, on-change cutoff and NVIDIA/AMD/total lines. Table search does not filter the independent submission-volume chart. | +| `current-inferencex-image` | Model, sequence, hardware, precision, speculation, node type, framework families, `asOf` for image age/release status, and `includeHistory` for daily age history. | +| `gpu-metrics` | Required run, file/host artifact, GPU indices, metric or correlation axes, statistics sorting, chart mode and interactive downsampling preference. One telemetry source per run; full-record statistics computed on read. Not a serving-window/role-pool projection. Responses are no-store. | +| `ubenchx` | Test selector (`test`: `mem-bw`, `sm-l2-distance`, `tpc-skyline`, or `all`) plus GPU selector (`all` or one GPU). `mem-bw` returns static device-memory copy bandwidth rows with derived MBU and latency. The Huawei key is `Huawei 950PR` (measured SKU `Ascend950PR_9579`): FP16 rotating-pool graph timings, 360 observations per size, and explicit 1,600 GB/s reference assumptions in `peakBandwidthSource`. `metadata.protocol`, CANN/torch_npu versions, and absent sizes distinguish them from the GPU protocol. `timeMs` is amortized graph-copy time for these rows; optional row fields retain p10/p90 bandwidth, process medians, slots and working-set bytes. An explicit device filter leaves unavailable tests empty. `sm-l2-distance` returns SM-to-SM L2 latency difference matrix with GPC/die topology and summary statistics. `tpc-skyline` returns measured TPCs per GPC (sorted descending) with GPC, TPC, and SM counts, defaulting to every GPU. `all` (default) returns every test. The Y-axis selector on `/ubenchx/mem-bw` is presentation-only. | +| `video` | CI run/artifact discovery; only already-published artifact reads; source, serving cell, media/fidelity slot, power phase and GPU denominator; same-workload comparisons, axes, deployment costs and selected tradeoff point. No-store. | ## Interpretation and maintenance