diff --git a/specs/mvp/remain_problems.md b/specs/mvp/remain_problems.md new file mode 100644 index 0000000..44510aa --- /dev/null +++ b/specs/mvp/remain_problems.md @@ -0,0 +1,27 @@ + +# v3.6 +wandb 映射目录是/vol 固定问题: +查过官方文档/公开资料后结论是:wandb/local(W&B local server 容器)没有提供“把服务端持 + 久化根目录从 /vol 改成别的路径”的官方环境变量/启动参数。官方用法一直是假设你把持久化卷 + 挂到容器内的固定路径 /vol(例如 -v :/vol)。(github.com (https://github.com/ + wandb/server)) + + 需要注意区分两类“目录”: + + - 服务端(wandb/local 容器):持久化目录是容器内固定 /vol,用于保存实例元数据、账号/初 + 始化信息等(license 也可以用 env 配,但数据目录仍是 /vol)。(github.com (https:// + github.com/wandb/server)) + - 训练侧(wandb Python SDK / VERL 任务):WANDB_DIR、WANDB_DATA_DIR 等环境变量只影响“客 + 户端本地生成文件/缓存”,不改变服务端容器的数据落盘路径。(docs.wandb.ai (https:// + docs.wandb.ai/platform/hosting/env-vars)) + + 所以如果你现在的约束是“只能挂 ../../shared:/private,不能再额外挂 ../../shared/common/ + wandb:/vol”,要把 W&B 服务端数据落到 shared 下面,现实可行的路子是: + + - 自定义 W&B 容器 entrypoint(或 wrapper)在启动前做一次 ln -s /private/common/wandb / + vol(或 bind-mount 到 /vol),让服务仍然写 /vol,但实际落到 /private/common/wandb。 + 这属于“容器层改造”,不是 W&B 官方参数。 + + 如果你允许 compose 再加一条 volume,那最简单仍是:保留 ../../shared:/private,再额外 + 加 ../../shared/common/wandb:/vol(服务端就无需任何改造)。 + diff --git a/specs/mvp/sw_arch.excalidraw b/specs/mvp/sw_arch.excalidraw index 3504791..c026691 100644 --- a/specs/mvp/sw_arch.excalidraw +++ b/specs/mvp/sw_arch.excalidraw @@ -2398,8 +2398,8 @@ "type": "text", "x": 154.90147538843206, "y": 1942.0901138836757, - "width": 781.6194458007812, - "height": 50, + "width": 562.5595703125, + "height": 25, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -2413,20 +2413,20 @@ "index": "b02", "roundness": null, "seed": 1960456801, - "version": 746, - "versionNonce": 54710305, + "version": 748, + "versionNonce": 1287253379, "isDeleted": false, "boundElements": [], - "updated": 1766548609119, + "updated": 1767579887038, "link": null, "locked": false, - "text": "v3.5 Advanced task (customized param, reward function, verl version/code, etc) \n & resubmit from last checkpoint & ib network supporting & model serving", + "text": "v3.5 Advanced task (customized param, reward function)", "fontSize": 20, "fontFamily": 5, "textAlign": "left", "verticalAlign": "top", "containerId": null, - "originalText": "v3.5 Advanced task (customized param, reward function, verl version/code, etc) \n & resubmit from last checkpoint & ib network supporting & model serving", + "originalText": "v3.5 Advanced task (customized param, reward function)", "autoResize": true, "lineHeight": 1.25 }, @@ -2789,7 +2789,7 @@ "height": 55.000000000000014, "angle": 0, "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", + "backgroundColor": "#ffc9c9", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", @@ -2800,8 +2800,8 @@ "index": "b0D", "roundness": null, "seed": 1968738561, - "version": 894, - "versionNonce": 2004715169, + "version": 895, + "versionNonce": 425863533, "isDeleted": false, "boundElements": [ { @@ -2809,7 +2809,7 @@ "id": "eON0BC4wPRqMcWvu_Thde" } ], - "updated": 1766542978938, + "updated": 1767579953447, "link": null, "locked": false }, @@ -2890,9 +2890,9 @@ { "id": "D_32yPttd9giCH42fMVwj", "type": "text", - "x": 605.9793228386666, + "x": 611.8193268059517, "y": 2307.3761703818636, - "width": 146.57989501953125, + "width": 134.89988708496094, "height": 75, "angle": 0, "strokeColor": "#1e1e1e", @@ -2907,20 +2907,20 @@ "index": "b0G", "roundness": null, "seed": 726423471, - "version": 723, - "versionNonce": 754280481, + "version": 740, + "versionNonce": 1995148323, "isDeleted": false, "boundElements": [], - "updated": 1766548439582, + "updated": 1767579913843, "link": null, "locked": false, - "text": "Advanced\nVerlTaskSpec \n(code, ckpt, ib)", + "text": "Advanced\nVerlTaskSpec \n(python cmd)", "fontSize": 20, "fontFamily": 5, "textAlign": "center", "verticalAlign": "middle", "containerId": "D6Mbsmb7s6kKZ3ue7w8KF", - "originalText": "Advanced VerlTaskSpec \n(code, ckpt, ib)", + "originalText": "Advanced VerlTaskSpec \n(python cmd)", "autoResize": true, "lineHeight": 1.25 }, @@ -3331,10 +3331,10 @@ { "id": "hfyGYREhwfOiJ0NmS7nWJ", "type": "rectangle", - "x": 145.70805709406656, - "y": 2619.319767745958, + "x": 184.78887213940638, + "y": 4494.097308130087, "width": 647.3203086953981, - "height": 526.3260713720084, + "height": 641.2700333334831, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", @@ -3350,19 +3350,19 @@ "type": 3 }, "seed": 1547009185, - "version": 833, - "versionNonce": 123286017, + "version": 1063, + "versionNonce": 2017335811, "isDeleted": false, "boundElements": [], - "updated": 1766545303838, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "kcnXooRmgv12d40l7DX1I", "type": "rectangle", - "x": 351.3615872250116, - "y": 2799.9864242400986, + "x": 390.4424022703514, + "y": 4674.763964624228, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -3378,8 +3378,8 @@ "index": "b0T", "roundness": null, "seed": 142557313, - "version": 581, - "versionNonce": 1369576865, + "version": 781, + "versionNonce": 1578230179, "isDeleted": false, "boundElements": [ { @@ -3395,15 +3395,15 @@ "type": "arrow" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "-kTPtQM7ZjAJg_O72uvP0", "type": "text", - "x": 372.3049542294061, - "y": 2817.4864242400986, + "x": 411.38576927474594, + "y": 4692.263964624228, "width": 114.77995300292969, "height": 50, "angle": 0, @@ -3419,11 +3419,11 @@ "index": "b0U", "roundness": null, "seed": 849709153, - "version": 571, - "versionNonce": 921745793, + "version": 771, + "versionNonce": 1363916099, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "ray job tool\n(ray client)", @@ -3439,8 +3439,8 @@ { "id": "syy4HE220r-q_RMUUSsel", "type": "rectangle", - "x": 596.3615872250116, - "y": 2799.4864242400986, + "x": 635.4424022703514, + "y": 4674.263964624228, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -3456,8 +3456,8 @@ "index": "b0V", "roundness": null, "seed": 1954010177, - "version": 718, - "versionNonce": 61717793, + "version": 918, + "versionNonce": 1838907523, "isDeleted": false, "boundElements": [ { @@ -3469,15 +3469,15 @@ "type": "arrow" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "CA5CuK3pSeEixp1YwKENQ", "type": "text", - "x": 607.2449871883905, - "y": 2816.9864242400986, + "x": 646.3258022337303, + "y": 4691.763964624228, "width": 134.89988708496094, "height": 50, "angle": 0, @@ -3493,11 +3493,11 @@ "index": "b0W", "roundness": null, "seed": 30778401, - "version": 722, - "versionNonce": 136016129, + "version": 922, + "versionNonce": 1073641507, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "VerlTaskSpec \nyaml", @@ -3513,8 +3513,8 @@ { "id": "BfGeVEKVLbnnxWatX-CuX", "type": "arrow", - "x": 597.694930730871, - "y": 2837.9864242400986, + "x": 636.7757457762108, + "y": 4712.763964624228, "width": 90.33331298828125, "height": 4, "angle": 0, @@ -3532,11 +3532,11 @@ "type": 2 }, "seed": 1722710017, - "version": 1460, - "versionNonce": 1568273583, + "version": 2068, + "versionNonce": 243331309, "isDeleted": false, "boundElements": [], - "updated": 1766545238799, + "updated": 1767580422053, "link": null, "locked": false, "points": [ @@ -3552,12 +3552,12 @@ "lastCommittedPoint": null, "startBinding": { "elementId": "syy4HE220r-q_RMUUSsel", - "focus": 0.16118805172016915, + "focus": 0.1611880517201622, "gap": 1.333343505859375 }, "endBinding": { "elementId": "kcnXooRmgv12d40l7DX1I", - "focus": 0.06393742185082188, + "focus": 0.06393742185083832, "gap": 1 }, "startArrowhead": null, @@ -3567,8 +3567,8 @@ { "id": "XwaSYITVD0m2YORWBiATj", "type": "text", - "x": 324.49455587811565, - "y": 2586.6531112518173, + "x": 363.57537092345547, + "y": 4461.430651635947, "width": 480.5596923828125, "height": 25, "angle": 0, @@ -3584,11 +3584,11 @@ "index": "b0Y", "roundness": null, "seed": 84004833, - "version": 652, - "versionNonce": 1828651841, + "version": 852, + "versionNonce": 399615747, "isDeleted": false, "boundElements": [], - "updated": 1766546120049, + "updated": 1767580421422, "link": null, "locked": false, "text": "v4.0 observability (prom, grafana, alert, ELK, etc)", @@ -3604,8 +3604,8 @@ { "id": "hO23c7cUKniC0ShSkbYHY", "type": "rectangle", - "x": 537.1855352981856, - "y": 2642.153019699083, + "x": 576.2663503435255, + "y": 4516.930560083212, "width": 210.1763265850289, "height": 55.000000000000014, "angle": 0, @@ -3621,8 +3621,8 @@ "index": "b0Z", "roundness": null, "seed": 1390357441, - "version": 870, - "versionNonce": 1752066177, + "version": 1070, + "versionNonce": 1034669731, "isDeleted": false, "boundElements": [ { @@ -3630,15 +3630,15 @@ "id": "WvC3BnzbmedjQgc_rcGOG" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "WvC3BnzbmedjQgc_rcGOG", "type": "text", - "x": 589.4237382635517, - "y": 2657.153019699083, + "x": 628.5045533088916, + "y": 4531.930560083212, "width": 105.69992065429688, "height": 25, "angle": 0, @@ -3654,11 +3654,11 @@ "index": "b0a", "roundness": null, "seed": 1483082657, - "version": 909, - "versionNonce": 443527265, + "version": 1109, + "versionNonce": 1629487683, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "API server", @@ -3674,8 +3674,8 @@ { "id": "QTuaauYBrKurb9Uym-vJ0", "type": "rectangle", - "x": 351.19493073087096, - "y": 2713.153019699083, + "x": 390.2757457762108, + "y": 4587.930560083212, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -3691,8 +3691,8 @@ "index": "b0b", "roundness": null, "seed": 1841688449, - "version": 1100, - "versionNonce": 817691713, + "version": 1300, + "versionNonce": 1527562723, "isDeleted": false, "boundElements": [ { @@ -3700,15 +3700,15 @@ "id": "wds-TjwVp7NzSUYdwGMzH" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "wds-TjwVp7NzSUYdwGMzH", "type": "text", - "x": 367.39679926156066, - "y": 2718.153019699083, + "x": 406.4776143069005, + "y": 4592.930560083212, "width": 122.23991394042969, "height": 50, "angle": 0, @@ -3724,11 +3724,11 @@ "index": "b0c", "roundness": null, "seed": 960386913, - "version": 1159, - "versionNonce": 1261816865, + "version": 1359, + "versionNonce": 1686146435, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "task\nmanagement ", @@ -3744,8 +3744,8 @@ { "id": "h-InDEDqJ6h9usuQPtO1A", "type": "rectangle", - "x": 535.3024693165407, - "y": 2713.7273280117965, + "x": 574.3832843618806, + "y": 4588.504868395925, "width": 207.59447102997498, "height": 60, "angle": 0, @@ -3761,8 +3761,8 @@ "index": "b0d", "roundness": null, "seed": 1830732609, - "version": 1191, - "versionNonce": 1640603649, + "version": 1391, + "versionNonce": 280618275, "isDeleted": false, "boundElements": [ { @@ -3770,15 +3770,15 @@ "id": "B1uYGWk1HK8JtizGFaaGC" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "B1uYGWk1HK8JtizGFaaGC", "type": "text", - "x": 551.5697747167821, - "y": 2718.7273280117965, + "x": 590.650589762122, + "y": 4593.504868395925, "width": 175.0598602294922, "height": 50, "angle": 0, @@ -3794,11 +3794,11 @@ "index": "b0e", "roundness": null, "seed": 1170649889, - "version": 1281, - "versionNonce": 1115158497, + "version": 1481, + "versionNonce": 120015043, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "node management\n(ssh, ray cluster) ", @@ -3814,8 +3814,8 @@ { "id": "XS4hxHD7hkjqqdIPoHNyM", "type": "rectangle", - "x": 872.6485818367171, - "y": 2851.7015263882736, + "x": 911.7293968820569, + "y": 4726.479066772403, "width": 163.1357446724801, "height": 106.45708709635272, "angle": 0, @@ -3831,8 +3831,8 @@ "index": "b0f", "roundness": null, "seed": 1202038529, - "version": 516, - "versionNonce": 390245327, + "version": 716, + "versionNonce": 2103916643, "isDeleted": false, "boundElements": [ { @@ -3840,15 +3840,15 @@ "id": "ilnIrrhwIwdl5yMP0J_-o" } ], - "updated": 1766545564008, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "ilnIrrhwIwdl5yMP0J_-o", "type": "text", - "x": 903.5664984234454, - "y": 2879.93006993645, + "x": 942.6473134687852, + "y": 4754.707610320578, "width": 101.29991149902344, "height": 50, "angle": 0, @@ -3864,11 +3864,11 @@ "index": "b0g", "roundness": null, "seed": 1027284705, - "version": 579, - "versionNonce": 291944867, + "version": 779, + "versionNonce": 1900557315, "isDeleted": false, "boundElements": [], - "updated": 1766652384276, + "updated": 1767580421422, "link": null, "locked": false, "text": "ray worker\nnode", @@ -3884,8 +3884,8 @@ { "id": "qYCyZgffVShRdxYkZZEQC", "type": "rectangle", - "x": 873.4503851219463, - "y": 2658.663290367263, + "x": 912.5312001672861, + "y": 4533.440830751391, "width": 163.1357446724801, "height": 85, "angle": 0, @@ -3901,8 +3901,8 @@ "index": "b0h", "roundness": null, "seed": 1964415681, - "version": 537, - "versionNonce": 235739009, + "version": 737, + "versionNonce": 583580579, "isDeleted": false, "boundElements": [ { @@ -3910,15 +3910,15 @@ "id": "7cAjOCsL26YdZ9huXHSvG" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "7cAjOCsL26YdZ9huXHSvG", "type": "text", - "x": 904.3683017086746, - "y": 2676.163290367263, + "x": 943.4491167540144, + "y": 4550.940830751391, "width": 101.29991149902344, "height": 50, "angle": 0, @@ -3934,11 +3934,11 @@ "index": "b0i", "roundness": null, "seed": 1071094433, - "version": 603, - "versionNonce": 1021609667, + "version": 803, + "versionNonce": 1310150467, "isDeleted": false, "boundElements": [], - "updated": 1766652382577, + "updated": 1767580421422, "link": null, "locked": false, "text": "ray worker\nnode", @@ -3954,8 +3954,8 @@ { "id": "Ov7Ctp7PvJITFoQy7Yb4E", "type": "rectangle", - "x": 354.00044019695827, - "y": 2639.9401270333396, + "x": 393.0812552422981, + "y": 4514.717667417468, "width": 147.4799234681481, "height": 55.000000000000014, "angle": 0, @@ -3971,8 +3971,8 @@ "index": "b0j", "roundness": null, "seed": 774741633, - "version": 988, - "versionNonce": 867953473, + "version": 1188, + "versionNonce": 630353635, "isDeleted": false, "boundElements": [ { @@ -3980,15 +3980,15 @@ "id": "hkWZM79d15pmmlJnpM5GC" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "hkWZM79d15pmmlJnpM5GC", "type": "text", - "x": 396.5104290916768, - "y": 2654.9401270333396, + "x": 435.59124413701664, + "y": 4529.717667417468, "width": 62.45994567871094, "height": 25, "angle": 0, @@ -4004,11 +4004,11 @@ "index": "b0k", "roundness": null, "seed": 249046625, - "version": 1038, - "versionNonce": 243194657, + "version": 1238, + "versionNonce": 197696131, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "WebUI", @@ -4024,8 +4024,8 @@ { "id": "hJ1qbW1rf0n6-WrDss2Ro", "type": "rectangle", - "x": 597.672221957931, - "y": 2915.035517049753, + "x": 636.7530370032708, + "y": 4789.813057433881, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -4041,8 +4041,8 @@ "index": "b0l", "roundness": null, "seed": 749122113, - "version": 770, - "versionNonce": 1067673025, + "version": 970, + "versionNonce": 225989155, "isDeleted": false, "boundElements": [ { @@ -4054,15 +4054,15 @@ "type": "arrow" } ], - "updated": 1766545307006, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "w68ybhw27soUMyLsMu-vA", "type": "text", - "x": 602.7156179540248, - "y": 2920.035517049753, + "x": 641.7964329993646, + "y": 4794.813057433881, "width": 146.57989501953125, "height": 75, "angle": 0, @@ -4078,11 +4078,11 @@ "index": "b0m", "roundness": null, "seed": 1282982433, - "version": 784, - "versionNonce": 2124728655, + "version": 984, + "versionNonce": 462427587, "isDeleted": false, "boundElements": [], - "updated": 1766548451240, + "updated": 1767580421422, "link": null, "locked": false, "text": "Advanced\nVerlTaskSpec \n(code, ckpt, ib)", @@ -4098,8 +4098,8 @@ { "id": "OJ2YvI_4pyTp3tvnog5HM", "type": "arrow", - "x": 597.2084151610145, - "y": 2959.4005095639527, + "x": 636.2892302063543, + "y": 4834.178049948081, "width": 80.66214281697523, "height": 84.85848269127973, "angle": 0, @@ -4117,11 +4117,11 @@ "type": 2 }, "seed": 1799214593, - "version": 307, - "versionNonce": 389666031, + "version": 831, + "versionNonce": 74337101, "isDeleted": false, "boundElements": [], - "updated": 1766545238799, + "updated": 1767580422053, "link": null, "locked": false, "points": [ @@ -4137,14 +4137,10 @@ "lastCommittedPoint": null, "startBinding": { "elementId": "hJ1qbW1rf0n6-WrDss2Ro", - "focus": -0.6785882314731592, + "focus": -0.6785882314731579, "gap": 1 }, - "endBinding": { - "elementId": "kcnXooRmgv12d40l7DX1I", - "focus": -0.4748599898404937, - "gap": 8.517998107308927 - }, + "endBinding": null, "startArrowhead": null, "endArrowhead": "arrow", "elbowed": false @@ -4152,8 +4148,8 @@ { "id": "ozgVxBsj7snNecNunrp11", "type": "rectangle", - "x": 168.79639165083321, - "y": 2713.0580483353347, + "x": 207.87720669617303, + "y": 4587.835588719463, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -4169,8 +4165,8 @@ "index": "b0o", "roundness": null, "seed": 1005940193, - "version": 1162, - "versionNonce": 919389825, + "version": 1362, + "versionNonce": 443066531, "isDeleted": false, "boundElements": [ { @@ -4178,15 +4174,15 @@ "id": "i3wz2t7mbs8b39oPir_Gf" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "i3wz2t7mbs8b39oPir_Gf", "type": "text", - "x": 184.99826018152297, - "y": 2718.0580483353347, + "x": 224.07907522686276, + "y": 4592.835588719463, "width": 122.23991394042969, "height": 50, "angle": 0, @@ -4202,11 +4198,11 @@ "index": "b0p", "roundness": null, "seed": 1705970113, - "version": 1230, - "versionNonce": 156388961, + "version": 1430, + "versionNonce": 87137347, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "user\nmanagement ", @@ -4222,8 +4218,8 @@ { "id": "-6-EuXJhEm2mWx5ISTwFk", "type": "rectangle", - "x": 174.85778806975028, - "y": 2906.6428799880864, + "x": 213.93860311509013, + "y": 4781.420420372215, "width": 154.6436510018092, "height": 85, "angle": 0, @@ -4239,8 +4235,8 @@ "index": "b0q", "roundness": null, "seed": 25831841, - "version": 1394, - "versionNonce": 630970945, + "version": 1594, + "versionNonce": 2111511523, "isDeleted": false, "boundElements": [ { @@ -4248,15 +4244,15 @@ "id": "GabFf-T0sdW_Oq8DrJ2I3" } ], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "GabFf-T0sdW_Oq8DrJ2I3", "type": "text", - "x": 195.05965660044004, - "y": 2911.6428799880864, + "x": 234.14047164577983, + "y": 4786.420420372215, "width": 114.23991394042969, "height": 75, "angle": 0, @@ -4272,11 +4268,11 @@ "index": "b0r", "roundness": null, "seed": 1488342401, - "version": 1476, - "versionNonce": 1015605793, + "version": 1676, + "versionNonce": 276014979, "isDeleted": false, "boundElements": [], - "updated": 1766545237730, + "updated": 1767580421422, "link": null, "locked": false, "text": "data\nmanagement\nSFTPGo ", @@ -4292,8 +4288,8 @@ { "id": "OkOW_h1bpRwbXvHRE98qO", "type": "rectangle", - "x": 182.78414498765986, - "y": 3050.6268158384833, + "x": 229.40224214693444, + "y": 5023.3894549921515, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -4309,8 +4305,8 @@ "index": "b0s", "roundness": null, "seed": 905236833, - "version": 1230, - "versionNonce": 1563580431, + "version": 1466, + "versionNonce": 1127857955, "isDeleted": false, "boundElements": [ { @@ -4318,15 +4314,15 @@ "id": "dr1KmTO-yRI3g5vju74ZK" } ], - "updated": 1766545349965, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "dr1KmTO-yRI3g5vju74ZK", "type": "text", - "x": 205.13600741483398, - "y": 3068.1268158384833, + "x": 251.75410457410862, + "y": 5040.8894549921515, "width": 109.93992614746094, "height": 25, "angle": 0, @@ -4342,11 +4338,11 @@ "index": "b0t", "roundness": null, "seed": 1089862977, - "version": 1310, - "versionNonce": 656720751, + "version": 1546, + "versionNonce": 1352393411, "isDeleted": false, "boundElements": [], - "updated": 1766545320817, + "updated": 1767580421422, "link": null, "locked": false, "text": "prometheus", @@ -4362,8 +4358,8 @@ { "id": "PwNRlpy3F_V5w-3sfAYAQ", "type": "rectangle", - "x": 380.47625420486156, - "y": 3048.761908698168, + "x": 427.0943513641362, + "y": 5021.524547851837, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -4379,8 +4375,8 @@ "index": "b0u", "roundness": null, "seed": 1448322511, - "version": 1274, - "versionNonce": 130692193, + "version": 1510, + "versionNonce": 557355619, "isDeleted": false, "boundElements": [ { @@ -4388,15 +4384,15 @@ "id": "kWS_uGtXbrBusArKpVdGc" } ], - "updated": 1766545349965, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "kWS_uGtXbrBusArKpVdGc", "type": "text", - "x": 421.01811907344194, - "y": 3066.261908698168, + "x": 467.63621623271655, + "y": 5039.024547851837, "width": 73.55992126464844, "height": 25, "angle": 0, @@ -4412,11 +4408,11 @@ "index": "b0v", "roundness": null, "seed": 1134302191, - "version": 1363, - "versionNonce": 2067682977, + "version": 1599, + "versionNonce": 98455043, "isDeleted": false, "boundElements": [], - "updated": 1766545330509, + "updated": 1767580421422, "link": null, "locked": false, "text": "grafana", @@ -4429,1392 +4425,11 @@ "autoResize": true, "lineHeight": 1.25 }, - { - "id": "Kh_k-i4xvHEjEJb8_WQGe", - "type": "rectangle", - "x": 144.7756888977941, - "y": 3318.702674993213, - "width": 647.3203086953981, - "height": 641.0568098019863, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b0y", - "roundness": { - "type": 3 - }, - "seed": 1341573071, - "version": 944, - "versionNonce": 857091553, - "isDeleted": false, - "boundElements": [], - "updated": 1766545521716, - "link": null, - "locked": false - }, - { - "id": "_W--_CG68zeuj3T62ETPL", - "type": "rectangle", - "x": 350.4292190287391, - "y": 3499.3693314873535, - "width": 156.66668701171875, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b0z", - "roundness": null, - "seed": 545977839, - "version": 661, - "versionNonce": 1136311439, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "ta4lpkZtQQzWOHjvV7FUZ" - }, - { - "id": "EHQ4kp8hzyDTaf37J9ZtT", - "type": "arrow" - }, - { - "id": "bkx6LQav2SUWAUBD5ulLa", - "type": "arrow" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "ta4lpkZtQQzWOHjvV7FUZ", - "type": "text", - "x": 371.37258603313364, - "y": 3516.8693314873535, - "width": 114.77995300292969, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b10", - "roundness": null, - "seed": 1186226191, - "version": 651, - "versionNonce": 158487215, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "ray job tool\n(ray client)", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "_W--_CG68zeuj3T62ETPL", - "originalText": "ray job tool\n(ray client)", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "ff2ONOPa1y8jPmi5h653t", - "type": "rectangle", - "x": 595.4292190287391, - "y": 3498.8693314873535, - "width": 156.66668701171875, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b11", - "roundness": null, - "seed": 1416332847, - "version": 800, - "versionNonce": 250191489, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "Sp8TUJYedU9gJGAI-AxfH" - }, - { - "id": "EHQ4kp8hzyDTaf37J9ZtT", - "type": "arrow" - } - ], - "updated": 1766546214569, - "link": null, - "locked": false - }, - { - "id": "Sp8TUJYedU9gJGAI-AxfH", - "type": "text", - "x": 606.312618992118, - "y": 3516.3693314873535, - "width": 134.89988708496094, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b12", - "roundness": null, - "seed": 144238671, - "version": 802, - "versionNonce": 2080899887, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "VerlTaskSpec \nyaml", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "ff2ONOPa1y8jPmi5h653t", - "originalText": "VerlTaskSpec \nyaml", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "EHQ4kp8hzyDTaf37J9ZtT", - "type": "arrow", - "x": 596.7625625345985, - "y": 3537.3693314873535, - "width": 90.33331298828125, - "height": 4, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b13", - "roundness": { - "type": 2 - }, - "seed": 823461487, - "version": 1696, - "versionNonce": 1657674593, - "isDeleted": false, - "boundElements": [], - "updated": 1766545390322, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -90.33331298828125, - 4 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "ff2ONOPa1y8jPmi5h653t", - "focus": 0.1611880517201695, - "gap": 1.333343505859375 - }, - "endBinding": { - "elementId": "_W--_CG68zeuj3T62ETPL", - "focus": 0.06393742185081497, - "gap": 1 - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": false - }, - { - "id": "L4pG2mhd5e-0Pd1Pi3Rtf", - "type": "text", - "x": 323.0959182098221, - "y": 3285.1034795550304, - "width": 248.73980712890625, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b14", - "roundness": null, - "seed": 1286103183, - "version": 773, - "versionNonce": 1540512385, - "isDeleted": false, - "boundElements": [], - "updated": 1766546254231, - "link": null, - "locked": false, - "text": "v4.5 observerbility (wanb)", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "v4.5 observerbility (wanb)", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "-nJJwacshyGBduJHI6hXt", - "type": "rectangle", - "x": 536.2531671019132, - "y": 3341.535926946338, - "width": 210.1763265850289, - "height": 55.000000000000014, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b15", - "roundness": null, - "seed": 1829467823, - "version": 950, - "versionNonce": 1744925615, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "jDNKsROHTO2oMIWzI3OsA" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "jDNKsROHTO2oMIWzI3OsA", - "type": "text", - "x": 588.4913700672791, - "y": 3356.535926946338, - "width": 105.69992065429688, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b16", - "roundness": null, - "seed": 1491519695, - "version": 990, - "versionNonce": 1578444239, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "API server", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "-nJJwacshyGBduJHI6hXt", - "originalText": "API server", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "up-AtpppOYdyyCNXNlwgr", - "type": "rectangle", - "x": 350.2625625345985, - "y": 3412.535926946338, - "width": 154.6436510018092, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b17", - "roundness": null, - "seed": 1842534127, - "version": 1180, - "versionNonce": 1462604783, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "jXoEPKCyuLdoL1i4yThdA" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "jXoEPKCyuLdoL1i4yThdA", - "type": "text", - "x": 366.4644310652883, - "y": 3417.535926946338, - "width": 122.23991394042969, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b18", - "roundness": null, - "seed": 1113071887, - "version": 1240, - "versionNonce": 190004751, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "task\nmanagement ", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "up-AtpppOYdyyCNXNlwgr", - "originalText": "task management ", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "7zXodXAZupZo9ox9VxG2c", - "type": "rectangle", - "x": 534.3701011202683, - "y": 3413.1102352590515, - "width": 207.59447102997498, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b19", - "roundness": null, - "seed": 133113647, - "version": 1271, - "versionNonce": 494838831, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "ghLH4zRCaGh2ml_wjH-TO" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "ghLH4zRCaGh2ml_wjH-TO", - "type": "text", - "x": 550.6374065205097, - "y": 3418.1102352590515, - "width": 175.0598602294922, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1A", - "roundness": null, - "seed": 755001679, - "version": 1361, - "versionNonce": 1033389647, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "node management\n(ssh, ray cluster) ", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "7zXodXAZupZo9ox9VxG2c", - "originalText": "node management\n(ssh, ray cluster) ", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "_jFvOMU6QE09vt670MiYY", - "type": "rectangle", - "x": 872.4811085720062, - "y": 3547.260099029891, - "width": 163.1357446724801, - "height": 106.45708709635272, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1B", - "roundness": null, - "seed": 1055156079, - "version": 602, - "versionNonce": 1494939727, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "MlWwMns8GvsbUSPuAkpxn" - } - ], - "updated": 1766545582405, - "link": null, - "locked": false - }, - { - "id": "MlWwMns8GvsbUSPuAkpxn", - "type": "text", - "x": 903.3990251587345, - "y": 3575.4886425780674, - "width": 101.29991149902344, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1C", - "roundness": null, - "seed": 199467407, - "version": 665, - "versionNonce": 461995779, - "isDeleted": false, - "boundElements": [], - "updated": 1766652390408, - "link": null, - "locked": false, - "text": "ray worker\nnode", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "_jFvOMU6QE09vt670MiYY", - "originalText": "ray worker node", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "tzm932P2Nq-2wiRjYiVPx", - "type": "rectangle", - "x": 872.5180169256738, - "y": 3358.046197614518, - "width": 163.1357446724801, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1D", - "roundness": null, - "seed": 87463855, - "version": 617, - "versionNonce": 1553962159, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "UI2QBOWsvPD_E4TkC2r6A" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "UI2QBOWsvPD_E4TkC2r6A", - "type": "text", - "x": 903.4359335124021, - "y": 3375.546197614518, - "width": 101.29991149902344, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1E", - "roundness": null, - "seed": 1627769295, - "version": 684, - "versionNonce": 379757869, - "isDeleted": false, - "boundElements": [], - "updated": 1766652387677, - "link": null, - "locked": false, - "text": "ray worker\nnode", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "tzm932P2Nq-2wiRjYiVPx", - "originalText": "ray worker node", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "vzmun3KBgH1bWxrCLhdr4", - "type": "rectangle", - "x": 353.0680720006858, - "y": 3339.3230342805946, - "width": 147.4799234681481, - "height": 55.000000000000014, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1F", - "roundness": null, - "seed": 2087303151, - "version": 1068, - "versionNonce": 24605935, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "VEsmYxCGuRpYe7MsXVGH4" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "VEsmYxCGuRpYe7MsXVGH4", - "type": "text", - "x": 395.5780608954044, - "y": 3354.3230342805946, - "width": 62.45994567871094, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1G", - "roundness": null, - "seed": 2104156687, - "version": 1119, - "versionNonce": 1941503759, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "WebUI", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "vzmun3KBgH1bWxrCLhdr4", - "originalText": "WebUI", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "kqsUdl0CACk1QR5EJIsUM", - "type": "rectangle", - "x": 596.7398537616585, - "y": 3614.4184242970077, - "width": 156.66668701171875, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1H", - "roundness": null, - "seed": 889309231, - "version": 852, - "versionNonce": 1692812815, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "48jcZ2N3xXiaxLPFd7pd-" - }, - { - "id": "bkx6LQav2SUWAUBD5ulLa", - "type": "arrow" - } - ], - "updated": 1766546214569, - "link": null, - "locked": false - }, - { - "id": "48jcZ2N3xXiaxLPFd7pd-", - "type": "text", - "x": 607.6232537250374, - "y": 3631.9184242970077, - "width": 134.89988708496094, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1I", - "roundness": null, - "seed": 1092020815, - "version": 882, - "versionNonce": 1330794145, - "isDeleted": false, - "boundElements": [], - "updated": 1766548533430, - "link": null, - "locked": false, - "text": "Advanced\nVerlTaskSpec ", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "kqsUdl0CACk1QR5EJIsUM", - "originalText": "Advanced VerlTaskSpec ", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "bkx6LQav2SUWAUBD5ulLa", - "type": "arrow", - "x": 596.276046964742, - "y": 3658.7834168112076, - "width": 80.66214281697523, - "height": 84.85848269127973, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#ffc9c9", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1J", - "roundness": { - "type": 2 - }, - "seed": 1854064751, - "version": 543, - "versionNonce": 1496676129, - "isDeleted": false, - "boundElements": [], - "updated": 1766545390322, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -80.66214281697523, - -84.85848269127973 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "kqsUdl0CACk1QR5EJIsUM", - "focus": -0.6785882314731533, - "gap": 1 - }, - "endBinding": { - "elementId": "_W--_CG68zeuj3T62ETPL", - "focus": -0.4748599898404899, - "gap": 8.517998107308927 - }, - "startArrowhead": null, - "endArrowhead": "arrow", - "elbowed": false - }, - { - "id": "IOTv_Hn-HGdkkJrYt0s5v", - "type": "rectangle", - "x": 167.86402345456077, - "y": 3412.4409555825896, - "width": 154.6436510018092, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1K", - "roundness": null, - "seed": 1527636623, - "version": 1242, - "versionNonce": 676115887, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "m_jx2UrHXZ0NfOapDPm-L" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "m_jx2UrHXZ0NfOapDPm-L", - "type": "text", - "x": 184.06589198525052, - "y": 3417.4409555825896, - "width": 122.23991394042969, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1L", - "roundness": null, - "seed": 1467005103, - "version": 1310, - "versionNonce": 933767119, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "user\nmanagement ", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "IOTv_Hn-HGdkkJrYt0s5v", - "originalText": "user management ", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "YTMJ4-LAXakruC_IZ4VMV", - "type": "rectangle", - "x": 173.92541987347784, - "y": 3606.0257872353413, - "width": 154.6436510018092, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1M", - "roundness": null, - "seed": 156486351, - "version": 1474, - "versionNonce": 1259361775, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "3zvswnkz729ixr6DjNPxl" - } - ], - "updated": 1766545389705, - "link": null, - "locked": false - }, - { - "id": "3zvswnkz729ixr6DjNPxl", - "type": "text", - "x": 194.1272884041676, - "y": 3611.0257872353413, - "width": 114.23991394042969, - "height": 75, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1N", - "roundness": null, - "seed": 1297062127, - "version": 1556, - "versionNonce": 965591055, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "data\nmanagement\nSFTPGo ", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "YTMJ4-LAXakruC_IZ4VMV", - "originalText": "data management\nSFTPGo ", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "KLsJgrEgTOZMoS63wjzN_", - "type": "rectangle", - "x": 181.8517767913874, - "y": 3750.009723085738, - "width": 154.6436510018092, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1O", - "roundness": null, - "seed": 1491903247, - "version": 1311, - "versionNonce": 1980786799, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "ep3LNDs6SOtIx1TDhkW8G" - } - ], - "updated": 1766545503640, - "link": null, - "locked": false - }, - { - "id": "ep3LNDs6SOtIx1TDhkW8G", - "type": "text", - "x": 204.20363921856153, - "y": 3767.509723085738, - "width": 109.93992614746094, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1P", - "roundness": null, - "seed": 480471343, - "version": 1390, - "versionNonce": 1553614927, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "prometheus", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "KLsJgrEgTOZMoS63wjzN_", - "originalText": "prometheus", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "v560fy5BrT8Z52JNzT8xm", - "type": "rectangle", - "x": 379.5438860085891, - "y": 3748.144815945423, - "width": 154.6436510018092, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1Q", - "roundness": null, - "seed": 1708944207, - "version": 1355, - "versionNonce": 2145114625, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "ooj5Xb_9jcdjO3WZ1Vijt" - } - ], - "updated": 1766545503640, - "link": null, - "locked": false - }, - { - "id": "ooj5Xb_9jcdjO3WZ1Vijt", - "type": "text", - "x": 420.0857508771695, - "y": 3765.644815945423, - "width": 73.55992126464844, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1R", - "roundness": null, - "seed": 1089481071, - "version": 1443, - "versionNonce": 1473364111, - "isDeleted": false, - "boundElements": [], - "updated": 1766545389705, - "link": null, - "locked": false, - "text": "grafana", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "v560fy5BrT8Z52JNzT8xm", - "originalText": "grafana", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "SBmp6XU2_8KPazefCsLpu", - "type": "rectangle", - "x": 581.8987326329435, - "y": 3746.2797380573393, - "width": 154.6436510018092, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1S", - "roundness": null, - "seed": 455549839, - "version": 1403, - "versionNonce": 466490881, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "0EqDUcXu-9N73qqFrRs52" - } - ], - "updated": 1766546131803, - "link": null, - "locked": false - }, - { - "id": "0EqDUcXu-9N73qqFrRs52", - "type": "text", - "x": 640.5905685098246, - "y": 3763.7797380573393, - "width": 37.259979248046875, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1T", - "roundness": null, - "seed": 616159663, - "version": 1511, - "versionNonce": 703097903, - "isDeleted": false, - "boundElements": [], - "updated": 1766546128096, - "link": null, - "locked": false, - "text": "ELK", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "SBmp6XU2_8KPazefCsLpu", - "originalText": "ELK", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "uhMYcKaMG2rZhI00IcBSD", - "type": "rectangle", - "x": 355.7896175628582, - "y": 2294.6225286985473, - "width": 156.66668701171875, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#ffc9c9", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1U", - "roundness": null, - "seed": 183438625, - "version": 747, - "versionNonce": 743207841, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "tG5qUF40N98-XcVs10hIV" - } - ], - "updated": 1766545460643, - "link": null, - "locked": false - }, - { - "id": "tG5qUF40N98-XcVs10hIV", - "type": "text", - "x": 399.91299250182306, - "y": 2312.1225286985473, - "width": 68.41993713378906, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1V", - "roundness": null, - "seed": 984793345, - "version": 776, - "versionNonce": 1133276417, - "isDeleted": false, - "boundElements": [], - "updated": 1766545474186, - "link": null, - "locked": false, - "text": "model\nServing", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "uhMYcKaMG2rZhI00IcBSD", - "originalText": "model\nServing", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "WqZBuHMkJ_xXpYPfrQPkl", - "type": "rectangle", - "x": 361.14377704466176, - "y": 2918.757745757631, - "width": 156.66668701171875, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1W", - "roundness": null, - "seed": 1897690607, - "version": 814, - "versionNonce": 1206380609, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "zyzk1x5dPQV0NxUlyzpVt" - } - ], - "updated": 1766545485370, - "link": null, - "locked": false - }, - { - "id": "zyzk1x5dPQV0NxUlyzpVt", - "type": "text", - "x": 405.2671519836266, - "y": 2936.257745757631, - "width": 68.41993713378906, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1X", - "roundness": null, - "seed": 152428559, - "version": 842, - "versionNonce": 391770127, - "isDeleted": false, - "boundElements": [], - "updated": 1766545482988, - "link": null, - "locked": false, - "text": "model\nServing", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "WqZBuHMkJ_xXpYPfrQPkl", - "originalText": "model\nServing", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "HLOBaDvlTUpD2yQy4lUZI", - "type": "rectangle", - "x": 358.0842673445005, - "y": 3614.0260906693875, - "width": 156.66668701171875, - "height": 85, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1Y", - "roundness": null, - "seed": 704275425, - "version": 874, - "versionNonce": 746143073, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "2fK4AUySK3XyYyYntFqtC" - } - ], - "updated": 1766545494104, - "link": null, - "locked": false - }, - { - "id": "2fK4AUySK3XyYyYntFqtC", - "type": "text", - "x": 402.20764228346536, - "y": 3631.5260906693875, - "width": 68.41993713378906, - "height": 50, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1Z", - "roundness": null, - "seed": 1940209601, - "version": 902, - "versionNonce": 1141696833, - "isDeleted": false, - "boundElements": [], - "updated": 1766545494104, - "link": null, - "locked": false, - "text": "model\nServing", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "HLOBaDvlTUpD2yQy4lUZI", - "originalText": "model\nServing", - "autoResize": true, - "lineHeight": 1.25 - }, { "id": "DHdIrKA2SmPRr2rTtJJ8E", "type": "rectangle", - "x": 901.0073882308212, - "y": 2951.1443487304227, + "x": 940.088203276161, + "y": 4825.921889114552, "width": 106.83929336612698, "height": 60, "angle": 0, @@ -5830,8 +4445,8 @@ "index": "b1a", "roundness": null, "seed": 1809008399, - "version": 1385, - "versionNonce": 2086522159, + "version": 1585, + "versionNonce": 831231395, "isDeleted": false, "boundElements": [ { @@ -5839,15 +4454,15 @@ "id": "HbJRSZyHsD6NLPzLVoa9C" } ], - "updated": 1766545568758, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "HbJRSZyHsD6NLPzLVoa9C", "type": "text", - "x": 912.3370614641777, - "y": 2968.6443487304227, + "x": 951.4178765095176, + "y": 4843.421889114552, "width": 84.17994689941406, "height": 25, "angle": 0, @@ -5863,11 +4478,11 @@ "index": "b1b", "roundness": null, "seed": 1662356783, - "version": 1476, - "versionNonce": 682250063, + "version": 1676, + "versionNonce": 1936648515, "isDeleted": false, "boundElements": [], - "updated": 1766545568758, + "updated": 1767580421422, "link": null, "locked": false, "text": "exporter", @@ -5883,8 +4498,8 @@ { "id": "SYvgt1uhLv6KU1Snpyha0", "type": "rectangle", - "x": 902.7282442681425, - "y": 2740.039825032305, + "x": 941.8090593134823, + "y": 4614.817365416434, "width": 106.83929336612698, "height": 60, "angle": 0, @@ -5900,8 +4515,8 @@ "index": "b1c", "roundness": null, "seed": 1250827695, - "version": 1399, - "versionNonce": 852631169, + "version": 1599, + "versionNonce": 820431075, "isDeleted": false, "boundElements": [ { @@ -5909,15 +4524,15 @@ "id": "zbUHQA7llONcizbRp8kkI" } ], - "updated": 1766545566574, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "zbUHQA7llONcizbRp8kkI", "type": "text", - "x": 914.057917501499, - "y": 2757.539825032305, + "x": 953.1387325468388, + "y": 4632.317365416434, "width": 84.17994689941406, "height": 25, "angle": 0, @@ -5933,11 +4548,11 @@ "index": "b1d", "roundness": null, "seed": 1568444367, - "version": 1490, - "versionNonce": 183281249, + "version": 1690, + "versionNonce": 528594051, "isDeleted": false, "boundElements": [], - "updated": 1766545566574, + "updated": 1767580421422, "link": null, "locked": false, "text": "exporter", @@ -5950,151 +4565,11 @@ "autoResize": true, "lineHeight": 1.25 }, - { - "id": "fPC0GPrONm31BqGfJwBv-", - "type": "rectangle", - "x": 896.1313493540686, - "y": 3649.472220848862, - "width": 106.83929336612698, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1e", - "roundness": null, - "seed": 857988591, - "version": 1451, - "versionNonce": 266393807, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "LS0wSTonqjRNneUbZVukD" - } - ], - "updated": 1766545590131, - "link": null, - "locked": false - }, - { - "id": "LS0wSTonqjRNneUbZVukD", - "type": "text", - "x": 907.4610225874251, - "y": 3666.972220848862, - "width": 84.17994689941406, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1f", - "roundness": null, - "seed": 1710245903, - "version": 1541, - "versionNonce": 477998447, - "isDeleted": false, - "boundElements": [], - "updated": 1766545577140, - "link": null, - "locked": false, - "text": "exporter", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "fPC0GPrONm31BqGfJwBv-", - "originalText": "exporter", - "autoResize": true, - "lineHeight": 1.25 - }, - { - "id": "89v45dCwlOq01K4woKzly", - "type": "rectangle", - "x": 897.85220539139, - "y": 3438.367697150744, - "width": 106.83929336612698, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1g", - "roundness": null, - "seed": 1944743471, - "version": 1465, - "versionNonce": 2110857121, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "H-xVGBDkmPVLm7G5Tmz19" - } - ], - "updated": 1766545590131, - "link": null, - "locked": false - }, - { - "id": "H-xVGBDkmPVLm7G5Tmz19", - "type": "text", - "x": 909.1818786247466, - "y": 3455.867697150744, - "width": 84.17994689941406, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1h", - "roundness": null, - "seed": 670748751, - "version": 1555, - "versionNonce": 1438014895, - "isDeleted": false, - "boundElements": [], - "updated": 1766545577140, - "link": null, - "locked": false, - "text": "exporter", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "89v45dCwlOq01K4woKzly", - "originalText": "exporter", - "autoResize": true, - "lineHeight": 1.25 - }, { "id": "ND0kaXREeIHTrNlSqY34p", "type": "rectangle", - "x": 582.8208303270419, - "y": 3048.283098956208, + "x": 629.4389274863165, + "y": 5021.045738109877, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -6110,8 +4585,8 @@ "index": "b1i", "roundness": null, "seed": 814939215, - "version": 1330, - "versionNonce": 519559151, + "version": 1566, + "versionNonce": 1056844835, "isDeleted": false, "boundElements": [ { @@ -6119,15 +4594,15 @@ "id": "e8-1MnFz0QWrPJXZ-ZnQ3" } ], - "updated": 1766546085637, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "e8-1MnFz0QWrPJXZ-ZnQ3", "type": "text", - "x": 641.5126662039231, - "y": 3065.783098956208, + "x": 688.1307633631977, + "y": 5038.545738109877, "width": 37.259979248046875, "height": 25, "angle": 0, @@ -6143,11 +4618,11 @@ "index": "b1j", "roundness": null, "seed": 2024577647, - "version": 1423, - "versionNonce": 135499201, + "version": 1659, + "versionNonce": 323661763, "isDeleted": false, "boundElements": [], - "updated": 1766546094558, + "updated": 1767580421422, "link": null, "locked": false, "text": "ELK", @@ -6160,81 +4635,11 @@ "autoResize": true, "lineHeight": 1.25 }, - { - "id": "Q-6aV4mSfbyEwllp_M7u2", - "type": "rectangle", - "x": 183.94027304345434, - "y": 3846.0441434972986, - "width": 546.6403289665554, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "#ffc9c9", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1k", - "roundness": null, - "seed": 1627548065, - "version": 1641, - "versionNonce": 511334241, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "ZKpraEqfq0gLY7JI2xzC6" - } - ], - "updated": 1766546166116, - "link": null, - "locked": false - }, - { - "id": "ZKpraEqfq0gLY7JI2xzC6", - "type": "text", - "x": 391.4104924583727, - "y": 3863.5441434972986, - "width": 131.69989013671875, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b1l", - "roundness": null, - "seed": 522620289, - "version": 1768, - "versionNonce": 1020210383, - "isDeleted": false, - "boundElements": [], - "updated": 1766546159215, - "link": null, - "locked": false, - "text": "weight & bias", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "Q-6aV4mSfbyEwllp_M7u2", - "originalText": "weight & bias", - "autoResize": true, - "lineHeight": 1.25 - }, { "id": "UOlgJuhEaQm81KRHgyY-0", "type": "rectangle", - "x": 157.29031698446732, - "y": 4084.8474727592948, + "x": 179.07220592595837, + "y": 5244.209019024574, "width": 647.3203086953981, "height": 717.4711059065564, "angle": 0, @@ -6252,19 +4657,19 @@ "type": 3 }, "seed": 790237583, - "version": 1075, - "versionNonce": 1932557135, + "version": 1166, + "versionNonce": 1146533539, "isDeleted": false, "boundElements": [], - "updated": 1766546448759, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "ExBkrVpyvo_OXAog8ivWn", "type": "rectangle", - "x": 362.9438471154123, - "y": 4265.514129253435, + "x": 384.7257360569034, + "y": 5424.875675518715, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -6280,8 +4685,8 @@ "index": "b1n", "roundness": null, "seed": 1478428591, - "version": 728, - "versionNonce": 1800969423, + "version": 819, + "versionNonce": 573434435, "isDeleted": false, "boundElements": [ { @@ -6297,15 +4702,15 @@ "type": "arrow" } ], - "updated": 1766546319431, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "hqH-l-CJ15NjmjoZtiq-9", "type": "text", - "x": 383.88721411980686, - "y": 4283.014129253435, + "x": 405.6691030612979, + "y": 5442.375675518715, "width": 114.77995300292969, "height": 50, "angle": 0, @@ -6321,11 +4726,11 @@ "index": "b1o", "roundness": null, "seed": 492845519, - "version": 718, - "versionNonce": 2062166767, + "version": 809, + "versionNonce": 303933923, "isDeleted": false, "boundElements": [], - "updated": 1766546319431, + "updated": 1767580076534, "link": null, "locked": false, "text": "ray job tool\n(ray client)", @@ -6341,8 +4746,8 @@ { "id": "kurhiArg2sM7XFjEdTyrI", "type": "rectangle", - "x": 607.9438471154124, - "y": 4265.014129253435, + "x": 629.7257360569034, + "y": 5424.375675518715, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -6358,8 +4763,8 @@ "index": "b1p", "roundness": null, "seed": 603334639, - "version": 867, - "versionNonce": 501759311, + "version": 958, + "versionNonce": 380685603, "isDeleted": false, "boundElements": [ { @@ -6371,15 +4776,15 @@ "type": "arrow" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "7k75o8I7t4NCGdyrtenGs", "type": "text", - "x": 618.8272470787913, - "y": 4282.514129253435, + "x": 640.6091360202823, + "y": 5441.875675518715, "width": 134.89988708496094, "height": 50, "angle": 0, @@ -6395,11 +4800,11 @@ "index": "b1q", "roundness": null, "seed": 1508463119, - "version": 869, - "versionNonce": 1806809967, + "version": 960, + "versionNonce": 2114007235, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "VerlTaskSpec \nyaml", @@ -6415,8 +4820,8 @@ { "id": "qO3lO1bGwrfyKuWKhDJ1J", "type": "arrow", - "x": 609.2771906212718, - "y": 4303.514129253435, + "x": 631.0590795627628, + "y": 5462.875675518715, "width": 90.33331298828125, "height": 4, "angle": 0, @@ -6434,11 +4839,11 @@ "type": 2 }, "seed": 1479686191, - "version": 1893, - "versionNonce": 301239841, + "version": 2170, + "versionNonce": 668673901, "isDeleted": false, "boundElements": [], - "updated": 1766546320485, + "updated": 1767580076859, "link": null, "locked": false, "points": [ @@ -6454,12 +4859,12 @@ "lastCommittedPoint": null, "startBinding": { "elementId": "kurhiArg2sM7XFjEdTyrI", - "focus": 0.16118805172017495, + "focus": 0.16118805172015774, "gap": 1.333343505859375 }, "endBinding": { "elementId": "ExBkrVpyvo_OXAog8ivWn", - "focus": 0.06393742185082298, + "focus": 0.06393742185084282, "gap": 1 }, "startArrowhead": null, @@ -6469,8 +4874,8 @@ { "id": "oZv8__WhJ3c5fkGqXVl2_", "type": "text", - "x": 335.61054629649533, - "y": 4051.2482773211123, + "x": 357.3924352379864, + "y": 5210.609823586392, "width": 385.8797302246094, "height": 25, "angle": 0, @@ -6486,11 +4891,11 @@ "index": "b1s", "roundness": null, "seed": 79256143, - "version": 886, - "versionNonce": 682329921, + "version": 977, + "versionNonce": 571188131, "isDeleted": false, "boundElements": [], - "updated": 1766546372109, + "updated": 1767580076534, "link": null, "locked": false, "text": "v5.0 operability (statistics, sop, agent)", @@ -6506,8 +4911,8 @@ { "id": "WNodxBjaE-CYp8dK1fMQN", "type": "rectangle", - "x": 548.7677951885864, - "y": 4107.68072471242, + "x": 570.5496841300775, + "y": 5267.042270977699, "width": 210.1763265850289, "height": 55.000000000000014, "angle": 0, @@ -6523,8 +4928,8 @@ "index": "b1t", "roundness": null, "seed": 1951873135, - "version": 1017, - "versionNonce": 1038945263, + "version": 1108, + "versionNonce": 884815683, "isDeleted": false, "boundElements": [ { @@ -6532,15 +4937,15 @@ "id": "G2DrVh_u1lhQlxAkO611N" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "G2DrVh_u1lhQlxAkO611N", "type": "text", - "x": 601.0059981539524, - "y": 4122.68072471242, + "x": 622.7878870954435, + "y": 5282.042270977699, "width": 105.69992065429688, "height": 25, "angle": 0, @@ -6556,11 +4961,11 @@ "index": "b1u", "roundness": null, "seed": 215241359, - "version": 1058, - "versionNonce": 1533261327, + "version": 1149, + "versionNonce": 255547107, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "API server", @@ -6576,8 +4981,8 @@ { "id": "XxNyZL0flCwhAO9zT3UQy", "type": "rectangle", - "x": 362.7771906212717, - "y": 4178.68072471242, + "x": 384.55907956276275, + "y": 5338.042270977699, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -6593,8 +4998,8 @@ "index": "b1v", "roundness": null, "seed": 1726556335, - "version": 1247, - "versionNonce": 79698991, + "version": 1338, + "versionNonce": 538215043, "isDeleted": false, "boundElements": [ { @@ -6602,15 +5007,15 @@ "id": "O2dtUuIqb0fs_uv7D29cW" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "O2dtUuIqb0fs_uv7D29cW", "type": "text", - "x": 378.97905915196145, - "y": 4183.68072471242, + "x": 400.7609480934525, + "y": 5343.042270977699, "width": 122.23991394042969, "height": 50, "angle": 0, @@ -6626,11 +5031,11 @@ "index": "b1w", "roundness": null, "seed": 1883126479, - "version": 1308, - "versionNonce": 770358863, + "version": 1399, + "versionNonce": 473635, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "task\nmanagement ", @@ -6646,8 +5051,8 @@ { "id": "UK3M2EByn3haJdkH9Z21T", "type": "rectangle", - "x": 546.8847292069415, - "y": 4179.255033025133, + "x": 568.6666181484326, + "y": 5338.616579290413, "width": 207.59447102997498, "height": 60, "angle": 0, @@ -6663,8 +5068,8 @@ "index": "b1x", "roundness": null, "seed": 1298925807, - "version": 1338, - "versionNonce": 968629359, + "version": 1429, + "versionNonce": 738328003, "isDeleted": false, "boundElements": [ { @@ -6672,15 +5077,15 @@ "id": "_erL3NkeChZxbmMXnWyQ8" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "_erL3NkeChZxbmMXnWyQ8", "type": "text", - "x": 563.1520346071829, - "y": 4184.255033025133, + "x": 584.933923548674, + "y": 5343.616579290413, "width": 175.0598602294922, "height": 50, "angle": 0, @@ -6696,11 +5101,11 @@ "index": "b1y", "roundness": null, "seed": 2080051983, - "version": 1428, - "versionNonce": 469546639, + "version": 1519, + "versionNonce": 2133020003, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "node management\n(ssh, ray cluster) ", @@ -6716,8 +5121,8 @@ { "id": "lQT5-sydwGN_vbadu61qE", "type": "rectangle", - "x": 884.9957366586793, - "y": 4313.4048967959725, + "x": 906.7776256001704, + "y": 5472.766443061252, "width": 163.1357446724801, "height": 106.45708709635272, "angle": 0, @@ -6733,8 +5138,8 @@ "index": "b1z", "roundness": null, "seed": 878958895, - "version": 669, - "versionNonce": 996478127, + "version": 760, + "versionNonce": 1824106755, "isDeleted": false, "boundElements": [ { @@ -6742,15 +5147,15 @@ "id": "yqwCJHk3GkcnyEzFHSU2z" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "yqwCJHk3GkcnyEzFHSU2z", "type": "text", - "x": 915.9136532454077, - "y": 4341.633440344149, + "x": 937.6955421868987, + "y": 5500.994986609428, "width": 101.29991149902344, "height": 50, "angle": 0, @@ -6766,11 +5171,11 @@ "index": "b20", "roundness": null, "seed": 202300239, - "version": 733, - "versionNonce": 786567267, + "version": 824, + "versionNonce": 2051248291, "isDeleted": false, "boundElements": [], - "updated": 1766652405206, + "updated": 1767580076534, "link": null, "locked": false, "text": "ray worker\nnode", @@ -6786,8 +5191,8 @@ { "id": "n74P3TAm78jOVPnYqFccD", "type": "rectangle", - "x": 885.0326450123471, - "y": 4124.1909953806, + "x": 906.8145339538381, + "y": 5283.5525416458795, "width": 163.1357446724801, "height": 85, "angle": 0, @@ -6803,8 +5208,8 @@ "index": "b21", "roundness": null, "seed": 1465162095, - "version": 684, - "versionNonce": 389999855, + "version": 775, + "versionNonce": 2037351491, "isDeleted": false, "boundElements": [ { @@ -6812,15 +5217,15 @@ "id": "BTIKScHoPW_m2eS-Ro8GX" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "BTIKScHoPW_m2eS-Ro8GX", "type": "text", - "x": 915.9505615990754, - "y": 4141.6909953806, + "x": 937.7324505405664, + "y": 5301.0525416458795, "width": 101.29991149902344, "height": 50, "angle": 0, @@ -6836,11 +5241,11 @@ "index": "b22", "roundness": null, "seed": 1266520975, - "version": 750, - "versionNonce": 1196796365, + "version": 841, + "versionNonce": 35390435, "isDeleted": false, "boundElements": [], - "updated": 1766652402009, + "updated": 1767580076534, "link": null, "locked": false, "text": "ray worker\nnode", @@ -6856,8 +5261,8 @@ { "id": "L9owxY-Ly_UhJE3U0jLgC", "type": "rectangle", - "x": 365.582700087359, - "y": 4105.467832046676, + "x": 387.36458902885005, + "y": 5264.829378311956, "width": 147.4799234681481, "height": 55.000000000000014, "angle": 0, @@ -6873,8 +5278,8 @@ "index": "b23", "roundness": null, "seed": 1623345583, - "version": 1135, - "versionNonce": 1238220079, + "version": 1226, + "versionNonce": 743935875, "isDeleted": false, "boundElements": [ { @@ -6882,15 +5287,15 @@ "id": "8S3xYcC5-56RoTln81Vps" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "8S3xYcC5-56RoTln81Vps", "type": "text", - "x": 408.09268898207756, - "y": 4120.467832046676, + "x": 429.8745779235686, + "y": 5279.829378311956, "width": 62.45994567871094, "height": 25, "angle": 0, @@ -6906,11 +5311,11 @@ "index": "b24", "roundness": null, "seed": 1951087567, - "version": 1187, - "versionNonce": 580665167, + "version": 1278, + "versionNonce": 174106403, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "WebUI", @@ -6926,8 +5331,8 @@ { "id": "r5vmCFPIVwxZGcbV8EtDP", "type": "rectangle", - "x": 609.2544818483318, - "y": 4380.56322206309, + "x": 631.0363707898229, + "y": 5539.924768328369, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -6943,8 +5348,8 @@ "index": "b25", "roundness": null, "seed": 707848687, - "version": 919, - "versionNonce": 2123726191, + "version": 1010, + "versionNonce": 1655032515, "isDeleted": false, "boundElements": [ { @@ -6956,15 +5361,15 @@ "type": "arrow" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "BPGRZQXUil0Bmwl2yz1n9", "type": "text", - "x": 620.1378818117107, - "y": 4398.06322206309, + "x": 641.9197707532018, + "y": 5557.424768328369, "width": 134.89988708496094, "height": 50, "angle": 0, @@ -6980,11 +5385,11 @@ "index": "b26", "roundness": null, "seed": 259773455, - "version": 932, - "versionNonce": 170600623, + "version": 1023, + "versionNonce": 700807779, "isDeleted": false, "boundElements": [], - "updated": 1766548543557, + "updated": 1767580076534, "link": null, "locked": false, "text": "Advanced\nVerlTaskSpec ", @@ -7000,8 +5405,8 @@ { "id": "DS3tViVPwVs_FojIMqBSU", "type": "arrow", - "x": 608.7906750514153, - "y": 4424.9282145772895, + "x": 630.5725639929063, + "y": 5584.289760842569, "width": 80.66214281697523, "height": 84.85848269127973, "angle": 0, @@ -7019,11 +5424,11 @@ "type": 2 }, "seed": 2082765359, - "version": 740, - "versionNonce": 1441675745, + "version": 1017, + "versionNonce": 2023747629, "isDeleted": false, "boundElements": [], - "updated": 1766546320485, + "updated": 1767580076859, "link": null, "locked": false, "points": [ @@ -7039,14 +5444,10 @@ "lastCommittedPoint": null, "startBinding": { "elementId": "r5vmCFPIVwxZGcbV8EtDP", - "focus": -0.6785882314731602, + "focus": -0.6785882314731624, "gap": 1 }, - "endBinding": { - "elementId": "ExBkrVpyvo_OXAog8ivWn", - "focus": -0.4748599898404967, - "gap": 8.517998107308927 - }, + "endBinding": null, "startArrowhead": null, "endArrowhead": "arrow", "elbowed": false @@ -7054,8 +5455,8 @@ { "id": "AUK2tr7zEw-7pPSMh0Ric", "type": "rectangle", - "x": 180.37865154123398, - "y": 4178.5857533486715, + "x": 202.16054048272503, + "y": 5337.947299613951, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7071,8 +5472,8 @@ "index": "b28", "roundness": null, "seed": 890461263, - "version": 1309, - "versionNonce": 132107759, + "version": 1400, + "versionNonce": 1564791107, "isDeleted": false, "boundElements": [ { @@ -7080,15 +5481,15 @@ "id": "B-9nH3-XOZNOEeCLd2Fu-" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "B-9nH3-XOZNOEeCLd2Fu-", "type": "text", - "x": 196.58052007192373, - "y": 4183.5857533486715, + "x": 218.36240901341478, + "y": 5342.947299613951, "width": 122.23991394042969, "height": 50, "angle": 0, @@ -7104,11 +5505,11 @@ "index": "b29", "roundness": null, "seed": 1310784111, - "version": 1377, - "versionNonce": 497956879, + "version": 1468, + "versionNonce": 935309539, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "user\nmanagement ", @@ -7124,8 +5525,8 @@ { "id": "rfGCTpcFlf1T-8NxoJELc", "type": "rectangle", - "x": 186.44004796015105, - "y": 4372.170585001423, + "x": 208.2219369016421, + "y": 5531.532131266703, "width": 154.6436510018092, "height": 85, "angle": 0, @@ -7141,8 +5542,8 @@ "index": "b2A", "roundness": null, "seed": 1276499087, - "version": 1541, - "versionNonce": 1584029231, + "version": 1632, + "versionNonce": 721263747, "isDeleted": false, "boundElements": [ { @@ -7150,15 +5551,15 @@ "id": "12ZSYQo1l8nLuktF_M13y" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "12ZSYQo1l8nLuktF_M13y", "type": "text", - "x": 206.6419164908408, - "y": 4377.170585001423, + "x": 228.42380543233185, + "y": 5536.532131266703, "width": 114.23991394042969, "height": 75, "angle": 0, @@ -7174,11 +5575,11 @@ "index": "b2B", "roundness": null, "seed": 111831727, - "version": 1623, - "versionNonce": 486326351, + "version": 1714, + "versionNonce": 1119687715, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "data\nmanagement\nSFTPGo ", @@ -7194,8 +5595,8 @@ { "id": "kvfUPQgQ5eG_Fxn-tGm59", "type": "rectangle", - "x": 194.36640487806062, - "y": 4516.15452085182, + "x": 217.25149426722095, + "y": 5786.938428579538, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7211,8 +5612,8 @@ "index": "b2C", "roundness": null, "seed": 1250376911, - "version": 1378, - "versionNonce": 993910383, + "version": 1501, + "versionNonce": 965575715, "isDeleted": false, "boundElements": [ { @@ -7220,15 +5621,15 @@ "id": "a5mX2A_-o1LoWTFedzdqg" } ], - "updated": 1766546319432, + "updated": 1767580554066, "link": null, "locked": false }, { "id": "a5mX2A_-o1LoWTFedzdqg", "type": "text", - "x": 216.71826730523475, - "y": 4533.65452085182, + "x": 239.60335669439507, + "y": 5804.438428579538, "width": 109.93992614746094, "height": 25, "angle": 0, @@ -7244,11 +5645,11 @@ "index": "b2D", "roundness": null, "seed": 994364143, - "version": 1457, - "versionNonce": 1274427535, + "version": 1580, + "versionNonce": 841942979, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580554066, "link": null, "locked": false, "text": "prometheus", @@ -7264,8 +5665,8 @@ { "id": "_M4VtkTCC_G6rAalQU_8m", "type": "rectangle", - "x": 392.0585140952623, - "y": 4514.289613711505, + "x": 414.9436034844226, + "y": 5785.0735214392225, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7281,8 +5682,8 @@ "index": "b2E", "roundness": null, "seed": 1969984783, - "version": 1422, - "versionNonce": 1960726191, + "version": 1545, + "versionNonce": 253695843, "isDeleted": false, "boundElements": [ { @@ -7290,15 +5691,15 @@ "id": "xQD6qQi-05xLjq0nbHiqd" } ], - "updated": 1766546319432, + "updated": 1767580554066, "link": null, "locked": false }, { "id": "xQD6qQi-05xLjq0nbHiqd", "type": "text", - "x": 432.6003789638427, - "y": 4531.789613711505, + "x": 455.485468353003, + "y": 5802.5735214392225, "width": 73.55992126464844, "height": 25, "angle": 0, @@ -7314,11 +5715,11 @@ "index": "b2F", "roundness": null, "seed": 1886657327, - "version": 1511, - "versionNonce": 278831311, + "version": 1634, + "versionNonce": 1588343555, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580554066, "link": null, "locked": false, "text": "grafana", @@ -7334,8 +5735,8 @@ { "id": "aCuSAi4oJ_KJdRKAHJ5y_", "type": "rectangle", - "x": 594.4133607196168, - "y": 4512.424535823421, + "x": 617.2984501087772, + "y": 5783.208443551139, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7351,8 +5752,8 @@ "index": "b2G", "roundness": null, "seed": 549903695, - "version": 1470, - "versionNonce": 282046191, + "version": 1593, + "versionNonce": 1632950947, "isDeleted": false, "boundElements": [ { @@ -7360,15 +5761,15 @@ "id": "25Rm9RG-UnIb_WWemRDJY" } ], - "updated": 1766546319432, + "updated": 1767580554066, "link": null, "locked": false }, { "id": "25Rm9RG-UnIb_WWemRDJY", "type": "text", - "x": 653.1051965964979, - "y": 4529.924535823421, + "x": 675.9902859856581, + "y": 5800.708443551139, "width": 37.259979248046875, "height": 25, "angle": 0, @@ -7384,11 +5785,11 @@ "index": "b2H", "roundness": null, "seed": 1505516399, - "version": 1579, - "versionNonce": 536475919, + "version": 1702, + "versionNonce": 1137151555, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580554066, "link": null, "locked": false, "text": "ELK", @@ -7404,8 +5805,8 @@ { "id": "aVk5d_J2lP8Z8cTxcLino", "type": "rectangle", - "x": 370.59889543117373, - "y": 4380.170888435469, + "x": 392.3807843726648, + "y": 5539.532434700749, "width": 156.66668701171875, "height": 85, "angle": 0, @@ -7421,8 +5822,8 @@ "index": "b2I", "roundness": null, "seed": 1872565647, - "version": 941, - "versionNonce": 60161839, + "version": 1034, + "versionNonce": 686514829, "isDeleted": false, "boundElements": [ { @@ -7430,15 +5831,15 @@ "id": "-7mLziiSO10QZS0oA7Zmp" } ], - "updated": 1766546319432, + "updated": 1767580076859, "link": null, "locked": false }, { "id": "-7mLziiSO10QZS0oA7Zmp", "type": "text", - "x": 414.7222703701386, - "y": 4397.670888435469, + "x": 436.5041593116296, + "y": 5557.032434700749, "width": 68.41993713378906, "height": 50, "angle": 0, @@ -7454,11 +5855,11 @@ "index": "b2J", "roundness": null, "seed": 430017455, - "version": 969, - "versionNonce": 1040990543, + "version": 1060, + "versionNonce": 907837731, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "model\nServing", @@ -7474,8 +5875,8 @@ { "id": "Kwettsi3WP-Qkpn71oRV_", "type": "rectangle", - "x": 908.6459774407417, - "y": 4415.617018614944, + "x": 930.4278663822328, + "y": 5574.9785648802235, "width": 106.83929336612698, "height": 60, "angle": 0, @@ -7491,8 +5892,8 @@ "index": "b2K", "roundness": null, "seed": 334642639, - "version": 1518, - "versionNonce": 1890926447, + "version": 1609, + "versionNonce": 668128355, "isDeleted": false, "boundElements": [ { @@ -7500,15 +5901,15 @@ "id": "Ws50jhW1M-jJ3lnoEAvY2" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "Ws50jhW1M-jJ3lnoEAvY2", "type": "text", - "x": 919.9756506740981, - "y": 4433.117018614944, + "x": 941.7575396155892, + "y": 5592.4785648802235, "width": 84.17994689941406, "height": 25, "angle": 0, @@ -7524,11 +5925,11 @@ "index": "b2L", "roundness": null, "seed": 27765743, - "version": 1609, - "versionNonce": 2111404431, + "version": 1700, + "versionNonce": 65032195, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "exporter", @@ -7544,8 +5945,8 @@ { "id": "uYm1lMA4TITqp8EHogQDU", "type": "rectangle", - "x": 910.3668334780632, - "y": 4204.512494916826, + "x": 932.1487224195542, + "y": 5363.874041182105, "width": 106.83929336612698, "height": 60, "angle": 0, @@ -7561,8 +5962,8 @@ "index": "b2M", "roundness": null, "seed": 248141327, - "version": 1532, - "versionNonce": 1790013359, + "version": 1623, + "versionNonce": 1677547427, "isDeleted": false, "boundElements": [ { @@ -7570,15 +5971,15 @@ "id": "tX9OTModeIVpu_FonBF3E" } ], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "tX9OTModeIVpu_FonBF3E", "type": "text", - "x": 921.6965067114196, - "y": 4222.012494916826, + "x": 943.4783956529106, + "y": 5381.374041182105, "width": 84.17994689941406, "height": 25, "angle": 0, @@ -7594,11 +5995,11 @@ "index": "b2N", "roundness": null, "seed": 1381153839, - "version": 1623, - "versionNonce": 23437775, + "version": 1714, + "versionNonce": 911764291, "isDeleted": false, "boundElements": [], - "updated": 1766546319432, + "updated": 1767580076534, "link": null, "locked": false, "text": "exporter", @@ -7611,81 +6012,11 @@ "autoResize": true, "lineHeight": 1.25 }, - { - "id": "-OJqAXeLe21OC9Q6YQYNB", - "type": "rectangle", - "x": 196.45490113012755, - "y": 4612.18894126338, - "width": 546.6403289665554, - "height": 60, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b2O", - "roundness": null, - "seed": 1881759311, - "version": 1709, - "versionNonce": 2123334031, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "8eYn92JxE4ky_uFVEGphM" - } - ], - "updated": 1766546376993, - "link": null, - "locked": false - }, - { - "id": "8eYn92JxE4ky_uFVEGphM", - "type": "text", - "x": 403.9251205450459, - "y": 4629.68894126338, - "width": 131.69989013671875, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b2P", - "roundness": null, - "seed": 2066136175, - "version": 1835, - "versionNonce": 968145423, - "isDeleted": false, - "boundElements": [], - "updated": 1766546319432, - "link": null, - "locked": false, - "text": "weight & bias", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "-OJqAXeLe21OC9Q6YQYNB", - "originalText": "weight & bias", - "autoResize": true, - "lineHeight": 1.25 - }, { "id": "yGh_yLim4aBl8oGqW_oU1", "type": "rectangle", - "x": 200.4218292527276, - "y": 4713.67831875264, + "x": 222.20371819421865, + "y": 5873.0398650179195, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7701,8 +6032,8 @@ "index": "b2Q", "roundness": null, "seed": 170223553, - "version": 1420, - "versionNonce": 1579534113, + "version": 1511, + "versionNonce": 1904143907, "isDeleted": false, "boundElements": [ { @@ -7710,15 +6041,15 @@ "id": "lqdb6MLxScVe5ns9aqeeu" } ], - "updated": 1766546445481, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "lqdb6MLxScVe5ns9aqeeu", "type": "text", - "x": 229.18370297140564, - "y": 4731.17831875264, + "x": 250.96559191289668, + "y": 5890.5398650179195, "width": 97.11990356445312, "height": 25, "angle": 0, @@ -7734,11 +6065,11 @@ "index": "b2R", "roundness": null, "seed": 1132775329, - "version": 1508, - "versionNonce": 1918695521, + "version": 1599, + "versionNonce": 2086875587, "isDeleted": false, "boundElements": [], - "updated": 1766546410776, + "updated": 1767580076534, "link": null, "locked": false, "text": "statistics", @@ -7754,8 +6085,8 @@ { "id": "TtGKkGSFi4MbYg3ZfyNiG", "type": "rectangle", - "x": 395.5031174592006, - "y": 4713.67831875264, + "x": 417.28500640069166, + "y": 5873.0398650179195, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7771,8 +6102,8 @@ "index": "b2S", "roundness": null, "seed": 62346383, - "version": 1479, - "versionNonce": 1431730031, + "version": 1570, + "versionNonce": 356385123, "isDeleted": false, "boundElements": [ { @@ -7780,15 +6111,15 @@ "id": "G7gy-YlXMFxKiO7gmm6tl" } ], - "updated": 1766546445481, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "G7gy-YlXMFxKiO7gmm6tl", "type": "text", - "x": 426.81496371205833, - "y": 4731.17831875264, + "x": 448.5968526535494, + "y": 5890.5398650179195, "width": 92.01995849609375, "height": 25, "angle": 0, @@ -7804,11 +6135,11 @@ "index": "b2T", "roundness": null, "seed": 1310452399, - "version": 1576, - "versionNonce": 1626997793, + "version": 1667, + "versionNonce": 1432214787, "isDeleted": false, "boundElements": [], - "updated": 1766546429018, + "updated": 1767580076534, "link": null, "locked": false, "text": "sop tools", @@ -7824,8 +6155,8 @@ { "id": "JldxRrrtgsQXtVb-OKmEY", "type": "rectangle", - "x": 597.7764406036847, - "y": 4713.678318752639, + "x": 619.5583295451758, + "y": 5873.039865017919, "width": 154.6436510018092, "height": 60, "angle": 0, @@ -7841,8 +6172,8 @@ "index": "b2U", "roundness": null, "seed": 1283509455, - "version": 1515, - "versionNonce": 721566465, + "version": 1606, + "versionNonce": 675366051, "isDeleted": false, "boundElements": [ { @@ -7850,15 +6181,15 @@ "id": "YbDIjM6HTsYLldkdyo8ed" } ], - "updated": 1766546445481, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "YbDIjM6HTsYLldkdyo8ed", "type": "text", - "x": 647.6282877720698, - "y": 4731.178318752639, + "x": 669.4101767135609, + "y": 5890.539865017919, "width": 54.93995666503906, "height": 25, "angle": 0, @@ -7874,11 +6205,11 @@ "index": "b2V", "roundness": null, "seed": 1737251567, - "version": 1618, - "versionNonce": 1250251887, + "version": 1709, + "versionNonce": 93763651, "isDeleted": false, "boundElements": [], - "updated": 1766546440005, + "updated": 1767580076534, "link": null, "locked": false, "text": "agent", @@ -8104,8 +6435,8 @@ { "id": "Z88ttfOpQUtGXPUZOTNLh", "type": "rectangle", - "x": 1046.301230542016, - "y": 2690.267563284097, + "x": 1085.3820455873556, + "y": 4565.045103668226, "width": 78.84661364258261, "height": 239.8912269868912, "angle": 0, @@ -8121,8 +6452,8 @@ "index": "b2l", "roundness": null, "seed": 995417473, - "version": 1195, - "versionNonce": 1412336609, + "version": 1395, + "versionNonce": 512081763, "isDeleted": false, "boundElements": [ { @@ -8130,15 +6461,15 @@ "id": "JUS2JvDrkx5GXQjxkI78l" } ], - "updated": 1766549504559, + "updated": 1767580421422, "link": null, "locked": false }, { "id": "JUS2JvDrkx5GXQjxkI78l", "type": "text", - "x": 1058.1145596411393, - "y": 2797.7131767775427, + "x": 1097.1953746864792, + "y": 4672.4907171616715, "width": 55.21995544433594, "height": 25, "angle": 0, @@ -8154,11 +6485,11 @@ "index": "b2m", "roundness": null, "seed": 314541409, - "version": 1211, - "versionNonce": 883072717, + "version": 1411, + "versionNonce": 452844291, "isDeleted": false, "boundElements": [], - "updated": 1766632675825, + "updated": 1767580421422, "link": null, "locked": false, "text": "GPFS", @@ -8171,81 +6502,11 @@ "autoResize": true, "lineHeight": 1.25 }, - { - "id": "YMHES-uetzrMEDwFkCHdH", - "type": "rectangle", - "x": 1045.7959490351118, - "y": 3391.1356675943966, - "width": 78.84661364258261, - "height": 239.8912269868912, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b2n", - "roundness": null, - "seed": 1580012385, - "version": 1257, - "versionNonce": 206700609, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "OlaiVvlhdGvnYHx9Km9Qv" - } - ], - "updated": 1766549511124, - "link": null, - "locked": false - }, - { - "id": "OlaiVvlhdGvnYHx9Km9Qv", - "type": "text", - "x": 1057.6092781342352, - "y": 3498.5812810878424, - "width": 55.21995544433594, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "solid", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "index": "b2o", - "roundness": null, - "seed": 2094399297, - "version": 1274, - "versionNonce": 1657497347, - "isDeleted": false, - "boundElements": [], - "updated": 1766632678507, - "link": null, - "locked": false, - "text": "GPFS", - "fontSize": 20, - "fontFamily": 5, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "YMHES-uetzrMEDwFkCHdH", - "originalText": "GPFS", - "autoResize": true, - "lineHeight": 1.25 - }, { "id": "py2gWjP2fsxBZN-9ttfBh", "type": "rectangle", - "x": 1058.9340084182502, - "y": 4150.114846216833, + "x": 1080.7158973597411, + "y": 5309.476392482113, "width": 78.84661364258261, "height": 239.8912269868912, "angle": 0, @@ -8261,8 +6522,8 @@ "index": "b2p", "roundness": null, "seed": 105076673, - "version": 1253, - "versionNonce": 1238206881, + "version": 1344, + "versionNonce": 854339171, "isDeleted": false, "boundElements": [ { @@ -8270,15 +6531,15 @@ "id": "5tfhe4hwG92sJ3lHY77pG" } ], - "updated": 1766549517790, + "updated": 1767580076534, "link": null, "locked": false }, { "id": "5tfhe4hwG92sJ3lHY77pG", "type": "text", - "x": 1070.7473375173736, - "y": 4257.560459710278, + "x": 1092.5292264588647, + "y": 5416.922005975558, "width": 55.21995544433594, "height": 25, "angle": 0, @@ -8294,11 +6555,11 @@ "index": "b2q", "roundness": null, "seed": 1717876641, - "version": 1270, - "versionNonce": 1662877741, + "version": 1361, + "versionNonce": 1455319555, "isDeleted": false, "boundElements": [], - "updated": 1766632682521, + "updated": 1767580076534, "link": null, "locked": false, "text": "GPFS", @@ -8725,6 +6986,3869 @@ "startArrowhead": null, "endArrowhead": "arrow", "elbowed": false + }, + { + "id": "Bq_0q7B5_bYjojECcPofk", + "type": "rectangle", + "x": 162.52212001415893, + "y": 2569.0105125800087, + "width": 647.3203086953981, + "height": 541.9127073088301, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2y", + "roundness": { + "type": 3 + }, + "seed": 1738026701, + "version": 795, + "versionNonce": 304617965, + "isDeleted": false, + "boundElements": [], + "updated": 1767579964783, + "link": null, + "locked": false + }, + { + "id": "roCJxNYJCfJBTojl34uS9", + "type": "rectangle", + "x": 368.17565014510393, + "y": 2749.6771690741493, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2z", + "roundness": null, + "seed": 396545325, + "version": 544, + "versionNonce": 1924172387, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5qQ3sPG-4rdSwLjfMvNBb" + }, + { + "id": "ab64chV82iAi9ohRHllAw", + "type": "arrow" + }, + { + "id": "Fbi6WgLMToDz_YcJHD1-4", + "type": "arrow" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "5qQ3sPG-4rdSwLjfMvNBb", + "type": "text", + "x": 389.11901714949846, + "y": 2767.1771690741493, + "width": 114.77995300292969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b30", + "roundness": null, + "seed": 2106236813, + "version": 535, + "versionNonce": 1435977219, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "ray job tool\n(ray client)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "roCJxNYJCfJBTojl34uS9", + "originalText": "ray job tool\n(ray client)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9Y8GQT_WwcqR54CpPj3b4", + "type": "rectangle", + "x": 613.1756501451039, + "y": 2749.1771690741493, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b31", + "roundness": null, + "seed": 1334388205, + "version": 681, + "versionNonce": 1789051107, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "qdUsisM9pTt_1BiqB5FPm" + }, + { + "id": "ab64chV82iAi9ohRHllAw", + "type": "arrow" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "qdUsisM9pTt_1BiqB5FPm", + "type": "text", + "x": 624.0590501084828, + "y": 2766.6771690741493, + "width": 134.89988708496094, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b32", + "roundness": null, + "seed": 1084743757, + "version": 685, + "versionNonce": 788442243, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "VerlTaskSpec \nyaml", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "9Y8GQT_WwcqR54CpPj3b4", + "originalText": "VerlTaskSpec \nyaml", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ab64chV82iAi9ohRHllAw", + "type": "arrow", + "x": 614.5089936509632, + "y": 2787.6771690741493, + "width": 90.33331298828125, + "height": 4, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b33", + "roundness": { + "type": 2 + }, + "seed": 1723879085, + "version": 1351, + "versionNonce": 1905876493, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868974, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -90.33331298828125, + 4 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "9Y8GQT_WwcqR54CpPj3b4", + "focus": 0.16118805172017045, + "gap": 1.333343505859375 + }, + "endBinding": { + "elementId": "roCJxNYJCfJBTojl34uS9", + "focus": 0.06393742185081701, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Hz-edBJF0k8DaHhTL77rC", + "type": "text", + "x": 168.45183342388265, + "y": 2504.440205385617, + "width": 663.6594848632812, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b34", + "roundness": null, + "seed": 1618735373, + "version": 879, + "versionNonce": 1897116397, + "isDeleted": false, + "boundElements": [], + "updated": 1767580197637, + "link": null, + "locked": false, + "text": "v3.6 Weight & bias (share user account, individual project for user) ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3.6 Weight & bias (share user account, individual project for user) ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ujGw7lf_sdda3LV-WNX2f", + "type": "rectangle", + "x": 553.9995982182779, + "y": 2591.8437645331337, + "width": 210.1763265850289, + "height": 55.000000000000014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b35", + "roundness": null, + "seed": 995379053, + "version": 833, + "versionNonce": 1748947715, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "cDgcky47ylIEJcA_i0rtZ" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "cDgcky47ylIEJcA_i0rtZ", + "type": "text", + "x": 606.237801183644, + "y": 2606.8437645331337, + "width": 105.69992065429688, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b36", + "roundness": null, + "seed": 429052365, + "version": 872, + "versionNonce": 1603500707, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "API server", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ujGw7lf_sdda3LV-WNX2f", + "originalText": "API server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rLq2UhchXubdrBSBGfEsH", + "type": "rectangle", + "x": 368.0089936509633, + "y": 2662.8437645331337, + "width": 154.6436510018092, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b37", + "roundness": null, + "seed": 407965741, + "version": 1063, + "versionNonce": 1093807683, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "N-xeGnbrBx7DNjp16jVLB" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "N-xeGnbrBx7DNjp16jVLB", + "type": "text", + "x": 384.21086218165306, + "y": 2667.8437645331337, + "width": 122.23991394042969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b38", + "roundness": null, + "seed": 1970832013, + "version": 1122, + "versionNonce": 1341746659, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "task\nmanagement ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rLq2UhchXubdrBSBGfEsH", + "originalText": "task management ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fikW3kqRKF_8F9KRvq_xo", + "type": "rectangle", + "x": 552.116532236633, + "y": 2663.418072845848, + "width": 207.59447102997498, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b39", + "roundness": null, + "seed": 1975691501, + "version": 1154, + "versionNonce": 1861728643, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "wjxoMONmstqEZIgFo-GAO" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "wjxoMONmstqEZIgFo-GAO", + "type": "text", + "x": 568.3838376368744, + "y": 2668.418072845848, + "width": 175.0598602294922, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3A", + "roundness": null, + "seed": 179897165, + "version": 1244, + "versionNonce": 460034339, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "node management\n(ssh, ray cluster) ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fikW3kqRKF_8F9KRvq_xo", + "originalText": "node management\n(ssh, ray cluster) ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Xp3E2mlrzvEYzPOjSCrcs", + "type": "rectangle", + "x": 888.3153373725095, + "y": 2744.791796938897, + "width": 163.1357446724801, + "height": 106.45708709635272, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3B", + "roundness": null, + "seed": 951390637, + "version": 451, + "versionNonce": 650343619, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "tGEUStBUZGhYlFlEgPiNG" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "tGEUStBUZGhYlFlEgPiNG", + "type": "text", + "x": 919.2332539592378, + "y": 2773.020340487073, + "width": 101.29991149902344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3C", + "roundness": null, + "seed": 1021334541, + "version": 513, + "versionNonce": 815653987, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "ray worker\nnode", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Xp3E2mlrzvEYzPOjSCrcs", + "originalText": "ray worker node", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "jDwEHqyyCIFxDq3p9qWt2", + "type": "rectangle", + "x": 890.2644480420386, + "y": 2608.3540352013147, + "width": 163.1357446724801, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3D", + "roundness": null, + "seed": 1932806765, + "version": 500, + "versionNonce": 1623810051, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "uQ36HzOihakgxzEL6U7lT" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "uQ36HzOihakgxzEL6U7lT", + "type": "text", + "x": 921.1823646287669, + "y": 2625.8540352013147, + "width": 101.29991149902344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3E", + "roundness": null, + "seed": 2088400077, + "version": 566, + "versionNonce": 1631872931, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "ray worker\nnode", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "jDwEHqyyCIFxDq3p9qWt2", + "originalText": "ray worker node", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3UlVJoxmTIuxD5GDOcfHG", + "type": "rectangle", + "x": 370.8145031170506, + "y": 2589.6308718673913, + "width": 147.4799234681481, + "height": 55.000000000000014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3F", + "roundness": null, + "seed": 608981805, + "version": 951, + "versionNonce": 406682435, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "HoBGie1pN_WgFNHpbYmd2" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "HoBGie1pN_WgFNHpbYmd2", + "type": "text", + "x": 413.32449201176917, + "y": 2604.6308718673913, + "width": 62.45994567871094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3G", + "roundness": null, + "seed": 118711693, + "version": 1000, + "versionNonce": 571677411, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "WebUI", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "3UlVJoxmTIuxD5GDOcfHG", + "originalText": "WebUI", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "JeKebUMNJV9v7B5fePXsk", + "type": "rectangle", + "x": 614.4862848780233, + "y": 2864.7262618838045, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3H", + "roundness": null, + "seed": 2013866989, + "version": 733, + "versionNonce": 1890998755, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "d2yX6cU1iiTalDcCD-3Cd" + }, + { + "id": "Fbi6WgLMToDz_YcJHD1-4", + "type": "arrow" + } + ], + "updated": 1767579980740, + "link": null, + "locked": false + }, + { + "id": "d2yX6cU1iiTalDcCD-3Cd", + "type": "text", + "x": 625.3696848414022, + "y": 2882.2262618838045, + "width": 134.89988708496094, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3I", + "roundness": null, + "seed": 657925709, + "version": 785, + "versionNonce": 1190913859, + "isDeleted": false, + "boundElements": [], + "updated": 1767579987889, + "link": null, + "locked": false, + "text": "Advanced\nVerlTaskSpec ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "JeKebUMNJV9v7B5fePXsk", + "originalText": "Advanced VerlTaskSpec ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Fbi6WgLMToDz_YcJHD1-4", + "type": "arrow", + "x": 614.0224780811068, + "y": 2909.0912543980044, + "width": 80.66214281697523, + "height": 84.85848269127973, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3J", + "roundness": { + "type": 2 + }, + "seed": 125228205, + "version": 198, + "versionNonce": 1777925837, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868974, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -80.66214281697523, + -84.85848269127973 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "JeKebUMNJV9v7B5fePXsk", + "focus": -0.678588231473157, + "gap": 1 + }, + "endBinding": { + "elementId": "roCJxNYJCfJBTojl34uS9", + "focus": -0.4748599898404835, + "gap": 8.517998107308927 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VaoTGDERjqOoJC3xlNTUv", + "type": "rectangle", + "x": 185.61045457092558, + "y": 2662.7487931693854, + "width": 154.6436510018092, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3K", + "roundness": null, + "seed": 1953609485, + "version": 1125, + "versionNonce": 1815538947, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "wT9Wed9lIgCjhhhjiCtO5" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "wT9Wed9lIgCjhhhjiCtO5", + "type": "text", + "x": 201.81232310161533, + "y": 2667.7487931693854, + "width": 122.23991394042969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3L", + "roundness": null, + "seed": 413224301, + "version": 1193, + "versionNonce": 561534115, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "user\nmanagement ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VaoTGDERjqOoJC3xlNTUv", + "originalText": "user management ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nnVAd0OkVxsNSu7naL8r2", + "type": "rectangle", + "x": 191.67185098984265, + "y": 2856.333624822138, + "width": 154.6436510018092, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3M", + "roundness": null, + "seed": 323950541, + "version": 1357, + "versionNonce": 1701562435, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "IKkiq8hE1Wfbrpe0ab19q" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "IKkiq8hE1Wfbrpe0ab19q", + "type": "text", + "x": 211.8737195205324, + "y": 2861.333624822138, + "width": 114.23991394042969, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3N", + "roundness": null, + "seed": 1586796077, + "version": 1439, + "versionNonce": 770688995, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "data\nmanagement\nSFTPGo ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "nnVAd0OkVxsNSu7naL8r2", + "originalText": "data management\nSFTPGo ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "OyMuyqupt4CsAwM8flms1", + "type": "rectangle", + "x": 1063.3889292276112, + "y": 2631.083373332381, + "width": 78.84661364258261, + "height": 188.34936741723558, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Q", + "roundness": null, + "seed": 421677389, + "version": 1228, + "versionNonce": 476057283, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5GgEcr0L_twORhDdDfAe7" + } + ], + "updated": 1767579868399, + "link": null, + "locked": false + }, + { + "id": "5GgEcr0L_twORhDdDfAe7", + "type": "text", + "x": 1075.2022583267346, + "y": 2712.758057040999, + "width": 55.21995544433594, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3R", + "roundness": null, + "seed": 1980077997, + "version": 1245, + "versionNonce": 999767651, + "isDeleted": false, + "boundElements": [], + "updated": 1767579868399, + "link": null, + "locked": false, + "text": "GPFS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "OyMuyqupt4CsAwM8flms1", + "originalText": "GPFS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dzrZoVfIpG4vit_qCmGQh", + "type": "rectangle", + "x": 196.58168960453048, + "y": 2979.697507510093, + "width": 566.5404057062265, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3S", + "roundness": null, + "seed": 1552901389, + "version": 1800, + "versionNonce": 783584717, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "B9vVqUUh1aDRKtp98kVFT" + } + ], + "updated": 1767579996061, + "link": null, + "locked": false + }, + { + "id": "B9vVqUUh1aDRKtp98kVFT", + "type": "text", + "x": 414.00194738928434, + "y": 2997.197507510093, + "width": 131.69989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3T", + "roundness": null, + "seed": 1289304941, + "version": 1927, + "versionNonce": 433802285, + "isDeleted": false, + "boundElements": [], + "updated": 1767579996061, + "link": null, + "locked": false, + "text": "weight & bias", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "dzrZoVfIpG4vit_qCmGQh", + "originalText": "weight & bias", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "qg8jFPFtp50OAJT2ab_YO", + "type": "rectangle", + "x": 187.2240309153068, + "y": 3838.839430576088, + "width": 647.3203086953981, + "height": 541.9127073088301, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3U", + "roundness": { + "type": 3 + }, + "seed": 253245411, + "version": 1077, + "versionNonce": 1966178979, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "ej_5uPkV3roLWgrNmRVQJ", + "type": "rectangle", + "x": 392.8775610462518, + "y": 4019.5060870702287, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3V", + "roundness": null, + "seed": 866993027, + "version": 826, + "versionNonce": 97465923, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5J21ZHZTHpGu78H0oBGne" + }, + { + "id": "dCW4muSHBOjk2yt4VP-8M", + "type": "arrow" + }, + { + "id": "mfel3yZDZK2O4BoiB9bfp", + "type": "arrow" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "5J21ZHZTHpGu78H0oBGne", + "type": "text", + "x": 413.82092805064633, + "y": 4037.0060870702287, + "width": 114.77995300292969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3W", + "roundness": null, + "seed": 81779491, + "version": 817, + "versionNonce": 196441571, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "ray job tool\n(ray client)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ej_5uPkV3roLWgrNmRVQJ", + "originalText": "ray job tool\n(ray client)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UJvTvQ4khDdrdYsxDaKt0", + "type": "rectangle", + "x": 637.8775610462517, + "y": 4019.0060870702287, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3X", + "roundness": null, + "seed": 790527683, + "version": 963, + "versionNonce": 1352432835, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "0hvq7uN4KgQ1e0xT7DKVG" + }, + { + "id": "dCW4muSHBOjk2yt4VP-8M", + "type": "arrow" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "0hvq7uN4KgQ1e0xT7DKVG", + "type": "text", + "x": 648.7609610096306, + "y": 4036.5060870702287, + "width": 134.89988708496094, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Y", + "roundness": null, + "seed": 1292349027, + "version": 967, + "versionNonce": 1242950755, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "VerlTaskSpec \nyaml", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "UJvTvQ4khDdrdYsxDaKt0", + "originalText": "VerlTaskSpec \nyaml", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "dCW4muSHBOjk2yt4VP-8M", + "type": "arrow", + "x": 639.2109045521111, + "y": 4057.5060870702287, + "width": 90.33331298828125, + "height": 4, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3Z", + "roundness": { + "type": 2 + }, + "seed": 560589315, + "version": 2197, + "versionNonce": 803445773, + "isDeleted": false, + "boundElements": [], + "updated": 1767580422054, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -90.33331298828125, + 4 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "UJvTvQ4khDdrdYsxDaKt0", + "focus": 0.16118805172016018, + "gap": 1.333343505859375 + }, + "endBinding": { + "elementId": "ej_5uPkV3roLWgrNmRVQJ", + "focus": 0.06393742185082936, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "oSLr5BRtyqrLyySPfeO9j", + "type": "text", + "x": 225.14633005688438, + "y": 3790.8170038464273, + "width": 476.19970703125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3a", + "roundness": null, + "seed": 289649059, + "version": 1167, + "versionNonce": 626310957, + "isDeleted": false, + "boundElements": [], + "updated": 1767580447801, + "link": null, + "locked": false, + "text": "v3.8 IB & Roce support for multi node training ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3.8 IB & Roce support for multi node training ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ia_9sG-dZPebY0HaRl5mG", + "type": "rectangle", + "x": 578.7015091194257, + "y": 3861.672682529213, + "width": 210.1763265850289, + "height": 55.000000000000014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3b", + "roundness": null, + "seed": 1573094723, + "version": 1115, + "versionNonce": 1531388643, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "LsfI3OipT-Y5Jx7jpcccf" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "LsfI3OipT-Y5Jx7jpcccf", + "type": "text", + "x": 630.9397120847918, + "y": 3876.672682529213, + "width": 105.69992065429688, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3c", + "roundness": null, + "seed": 508028131, + "version": 1155, + "versionNonce": 281464451, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "API server", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ia_9sG-dZPebY0HaRl5mG", + "originalText": "API server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xrABjxBFNPVtYSJ6ZPiSh", + "type": "rectangle", + "x": 392.7109045521112, + "y": 3932.672682529213, + "width": 154.6436510018092, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3d", + "roundness": null, + "seed": 2053066883, + "version": 1345, + "versionNonce": 1016071715, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "-Kr5CotillYBlIuQsHPGW" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "-Kr5CotillYBlIuQsHPGW", + "type": "text", + "x": 408.9127730828009, + "y": 3937.672682529213, + "width": 122.23991394042969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3e", + "roundness": null, + "seed": 600328227, + "version": 1404, + "versionNonce": 1972455875, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "task\nmanagement ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "xrABjxBFNPVtYSJ6ZPiSh", + "originalText": "task management ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Shkqjthowq7IUHYuPuzXr", + "type": "rectangle", + "x": 576.8184431377808, + "y": 3933.2469908419275, + "width": 207.59447102997498, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3f", + "roundness": null, + "seed": 275860419, + "version": 1436, + "versionNonce": 1894324579, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "NUOv1Sok4Fz4O-Jom4drR" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "NUOv1Sok4Fz4O-Jom4drR", + "type": "text", + "x": 593.0857485380222, + "y": 3938.2469908419275, + "width": 175.0598602294922, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3g", + "roundness": null, + "seed": 1954077539, + "version": 1526, + "versionNonce": 1004926211, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "node management\n(ssh, ray cluster) ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Shkqjthowq7IUHYuPuzXr", + "originalText": "node management\n(ssh, ray cluster) ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rdU6p3LbZpLNIPDuhEU6z", + "type": "rectangle", + "x": 913.0172482736575, + "y": 4014.620714934976, + "width": 163.1357446724801, + "height": 106.45708709635272, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3h", + "roundness": null, + "seed": 2083354371, + "version": 733, + "versionNonce": 906386595, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "fyUCxFxmJICAq48idEvPj" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "fyUCxFxmJICAq48idEvPj", + "type": "text", + "x": 943.9351648603858, + "y": 4042.8492584831524, + "width": 101.29991149902344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3i", + "roundness": null, + "seed": 1175297699, + "version": 795, + "versionNonce": 1257820227, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "ray worker\nnode", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rdU6p3LbZpLNIPDuhEU6z", + "originalText": "ray worker node", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cl1dzmeCwwz4SXuZrad2a", + "type": "rectangle", + "x": 914.9663589431866, + "y": 3878.182953197394, + "width": 163.1357446724801, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3j", + "roundness": null, + "seed": 482857539, + "version": 782, + "versionNonce": 1822150627, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "fPAvr_57exrKFQWCnW2mb" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "fPAvr_57exrKFQWCnW2mb", + "type": "text", + "x": 945.8842755299149, + "y": 3895.682953197394, + "width": 101.29991149902344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3k", + "roundness": null, + "seed": 1899663843, + "version": 848, + "versionNonce": 1291705219, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "ray worker\nnode", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "cl1dzmeCwwz4SXuZrad2a", + "originalText": "ray worker node", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ReF6vnI-dB3lXIMd4AvGs", + "type": "rectangle", + "x": 395.5164140181985, + "y": 3859.4597898634706, + "width": 147.4799234681481, + "height": 55.000000000000014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3l", + "roundness": null, + "seed": 343170435, + "version": 1233, + "versionNonce": 1482519331, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5tqRv0HXQ949u10Kw2eiU" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "5tqRv0HXQ949u10Kw2eiU", + "type": "text", + "x": 438.02640291291704, + "y": 3874.4597898634706, + "width": 62.45994567871094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3m", + "roundness": null, + "seed": 833860899, + "version": 1282, + "versionNonce": 1864963779, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "WebUI", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ReF6vnI-dB3lXIMd4AvGs", + "originalText": "WebUI", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QFS8OSVEFsg_hE5ngbZ3q", + "type": "rectangle", + "x": 639.1881957791711, + "y": 4134.555179879884, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3n", + "roundness": null, + "seed": 140974275, + "version": 1015, + "versionNonce": 1610565219, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "vd21IfNtOA5knKWzVf_sk" + }, + { + "id": "mfel3yZDZK2O4BoiB9bfp", + "type": "arrow" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "vd21IfNtOA5knKWzVf_sk", + "type": "text", + "x": 650.07159574255, + "y": 4152.055179879884, + "width": 134.89988708496094, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3o", + "roundness": null, + "seed": 1714227299, + "version": 1067, + "versionNonce": 565084675, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "Advanced\nVerlTaskSpec ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "QFS8OSVEFsg_hE5ngbZ3q", + "originalText": "Advanced VerlTaskSpec ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mfel3yZDZK2O4BoiB9bfp", + "type": "arrow", + "x": 638.7243889822546, + "y": 4178.920172394084, + "width": 80.66214281697523, + "height": 84.85848269127973, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3p", + "roundness": { + "type": 2 + }, + "seed": 1624507395, + "version": 1044, + "versionNonce": 1833680077, + "isDeleted": false, + "boundElements": [], + "updated": 1767580422054, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -80.66214281697523, + -84.85848269127973 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "QFS8OSVEFsg_hE5ngbZ3q", + "focus": -0.6785882314731545, + "gap": 1 + }, + "endBinding": { + "elementId": "ej_5uPkV3roLWgrNmRVQJ", + "focus": -0.47485998984048416, + "gap": 8.517998107308813 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "aWTI7cnR7QatcqJUTZEkH", + "type": "rectangle", + "x": 210.31236547207345, + "y": 3932.5777111654647, + "width": 154.6436510018092, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3q", + "roundness": null, + "seed": 1348111267, + "version": 1407, + "versionNonce": 213089507, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "NDAe6kDHeZy_G-F24BbSA" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "NDAe6kDHeZy_G-F24BbSA", + "type": "text", + "x": 226.5142340027632, + "y": 3937.5777111654647, + "width": 122.23991394042969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3r", + "roundness": null, + "seed": 149888835, + "version": 1475, + "versionNonce": 1201137795, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "user\nmanagement ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "aWTI7cnR7QatcqJUTZEkH", + "originalText": "user management ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "6DIoCPbBjmqXhdWQiF-Ds", + "type": "rectangle", + "x": 216.37376189099052, + "y": 4126.162542818218, + "width": 154.6436510018092, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3s", + "roundness": null, + "seed": 1425030883, + "version": 1639, + "versionNonce": 1848500259, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ZMAp89RSyrH2uBqKYd6xX" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "ZMAp89RSyrH2uBqKYd6xX", + "type": "text", + "x": 236.57563042168027, + "y": 4131.162542818218, + "width": 114.23991394042969, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3t", + "roundness": null, + "seed": 787245699, + "version": 1721, + "versionNonce": 711189443, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "data\nmanagement\nSFTPGo ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6DIoCPbBjmqXhdWQiF-Ds", + "originalText": "data management\nSFTPGo ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "i9kRvyS1BKdIOzkDPwoS0", + "type": "rectangle", + "x": 1088.0908401287593, + "y": 3900.9122913284605, + "width": 78.84661364258261, + "height": 188.34936741723558, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3u", + "roundness": null, + "seed": 1000481315, + "version": 1510, + "versionNonce": 1683518307, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "j1I0PKrtvzLMy6fsxx_6a" + } + ], + "updated": 1767580421422, + "link": null, + "locked": false + }, + { + "id": "j1I0PKrtvzLMy6fsxx_6a", + "type": "text", + "x": 1099.9041692278827, + "y": 3982.5869750370784, + "width": 55.21995544433594, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3v", + "roundness": null, + "seed": 67102147, + "version": 1528, + "versionNonce": 2086276867, + "isDeleted": false, + "boundElements": [], + "updated": 1767580421422, + "link": null, + "locked": false, + "text": "GPFS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "i9kRvyS1BKdIOzkDPwoS0", + "originalText": "GPFS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mSWRJ8RKPV7XfoaSxNjz8", + "type": "rectangle", + "x": 221.28360050567835, + "y": 4249.526425506172, + "width": 239.9955982022902, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3w", + "roundness": null, + "seed": 1864643939, + "version": 2128, + "versionNonce": 688984067, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "39BgAR4RVEZm9MjMi7RPJ" + } + ], + "updated": 1767580500208, + "link": null, + "locked": false + }, + { + "id": "39BgAR4RVEZm9MjMi7RPJ", + "type": "text", + "x": 275.4314545384641, + "y": 4267.026425506172, + "width": 131.69989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3x", + "roundness": null, + "seed": 2086506755, + "version": 2253, + "versionNonce": 622204835, + "isDeleted": false, + "boundElements": [], + "updated": 1767580500209, + "link": null, + "locked": false, + "text": "weight & bias", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mSWRJ8RKPV7XfoaSxNjz8", + "originalText": "weight & bias", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_dawvRGHc8iIWvtZgQ8my", + "type": "rectangle", + "x": 187.1078063236842, + "y": 3211.040007039422, + "width": 647.3203086953981, + "height": 541.9127073088301, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b40", + "roundness": { + "type": 3 + }, + "seed": 258563459, + "version": 1139, + "versionNonce": 987772547, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "kmSdgT4RJDyvWvTuvvqWh", + "type": "rectangle", + "x": 392.76133645462926, + "y": 3391.7066635335627, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b41", + "roundness": null, + "seed": 101233955, + "version": 888, + "versionNonce": 792489507, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "9LC-U-4w0PKn4xd2rIb9l" + }, + { + "id": "EeKOp5xHmmSFZ6hZb9yAJ", + "type": "arrow" + }, + { + "id": "V3YTAKkdaz8uWYHzMw2Is", + "type": "arrow" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "9LC-U-4w0PKn4xd2rIb9l", + "type": "text", + "x": 413.7047034590238, + "y": 3409.2066635335623, + "width": 114.77995300292969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b42", + "roundness": null, + "seed": 169613507, + "version": 879, + "versionNonce": 644919747, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "ray job tool\n(ray client)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "kmSdgT4RJDyvWvTuvvqWh", + "originalText": "ray job tool\n(ray client)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2Sw17fUgWD30F3Y9a0g9G", + "type": "rectangle", + "x": 637.761336454629, + "y": 3391.2066635335627, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b43", + "roundness": null, + "seed": 1765935203, + "version": 1025, + "versionNonce": 1530840227, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Zsm4APcDK69CbNQ3-ADwB" + }, + { + "id": "EeKOp5xHmmSFZ6hZb9yAJ", + "type": "arrow" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "Zsm4APcDK69CbNQ3-ADwB", + "type": "text", + "x": 648.6447364180079, + "y": 3408.7066635335623, + "width": 134.89988708496094, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b44", + "roundness": null, + "seed": 961086467, + "version": 1029, + "versionNonce": 2095331395, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "VerlTaskSpec \nyaml", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2Sw17fUgWD30F3Y9a0g9G", + "originalText": "VerlTaskSpec \nyaml", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EeKOp5xHmmSFZ6hZb9yAJ", + "type": "arrow", + "x": 639.0946799604884, + "y": 3429.7066635335623, + "width": 90.33331298828125, + "height": 4, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b45", + "roundness": { + "type": 2 + }, + "seed": 1378847651, + "version": 2379, + "versionNonce": 2060224077, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434877, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -90.33331298828125, + 4 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "2Sw17fUgWD30F3Y9a0g9G", + "focus": 0.16118805172019085, + "gap": 1.333343505859375 + }, + "endBinding": { + "elementId": "kmSdgT4RJDyvWvTuvvqWh", + "focus": 0.06393742185080617, + "gap": 1 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "w6vHd2GaQE1AUKsLdmkEj", + "type": "text", + "x": 193.03751973340792, + "y": 3146.4696998450304, + "width": 184.7998809814453, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b46", + "roundness": null, + "seed": 136585027, + "version": 1220, + "versionNonce": 22919299, + "isDeleted": false, + "boundElements": [], + "updated": 1767580456184, + "link": null, + "locked": false, + "text": "v3.7 Model serving ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3.7 Model serving ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kuAX3XgJjBpEQ_Wknjhho", + "type": "rectangle", + "x": 578.5852845278031, + "y": 3233.873258992547, + "width": 210.1763265850289, + "height": 55.000000000000014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b47", + "roundness": null, + "seed": 629489379, + "version": 1177, + "versionNonce": 1008762563, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "rqqvX9jF-OsKMfh49qlrP" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "rqqvX9jF-OsKMfh49qlrP", + "type": "text", + "x": 630.8234874931691, + "y": 3248.873258992547, + "width": 105.69992065429688, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b48", + "roundness": null, + "seed": 618752643, + "version": 1218, + "versionNonce": 1774825059, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "API server", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "kuAX3XgJjBpEQ_Wknjhho", + "originalText": "API server", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "WDXLavd7W_KflvWaXFjOe", + "type": "rectangle", + "x": 392.59467996048863, + "y": 3304.873258992547, + "width": 154.6436510018092, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b49", + "roundness": null, + "seed": 720839203, + "version": 1407, + "versionNonce": 1441524227, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_gZRspPoTlhFqDjthreky" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "_gZRspPoTlhFqDjthreky", + "type": "text", + "x": 408.7965484911784, + "y": 3309.873258992547, + "width": 122.23991394042969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4A", + "roundness": null, + "seed": 1085597123, + "version": 1467, + "versionNonce": 1703260579, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "task\nmanagement ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "WDXLavd7W_KflvWaXFjOe", + "originalText": "task management ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ykIjs9C9gh53emDs_NUZH", + "type": "rectangle", + "x": 576.7022185461582, + "y": 3305.4475673052616, + "width": 207.59447102997498, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4B", + "roundness": null, + "seed": 1295594851, + "version": 1498, + "versionNonce": 1506116931, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "VjawvB3ULBdJHaDf5SUHY" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "VjawvB3ULBdJHaDf5SUHY", + "type": "text", + "x": 592.9695239463996, + "y": 3310.4475673052616, + "width": 175.0598602294922, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4C", + "roundness": null, + "seed": 1339199747, + "version": 1588, + "versionNonce": 1242162403, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "node management\n(ssh, ray cluster) ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ykIjs9C9gh53emDs_NUZH", + "originalText": "node management\n(ssh, ray cluster) ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ztzSxxw4gFHtLebqPFwq_", + "type": "rectangle", + "x": 912.9010236820349, + "y": 3386.821291398311, + "width": 163.1357446724801, + "height": 106.45708709635272, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4D", + "roundness": null, + "seed": 1509914787, + "version": 795, + "versionNonce": 1575047299, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "idEPabW5S1LZD69d85ve1" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "idEPabW5S1LZD69d85ve1", + "type": "text", + "x": 943.8189402687632, + "y": 3415.049834946488, + "width": 101.29991149902344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4E", + "roundness": null, + "seed": 1231973443, + "version": 858, + "versionNonce": 1191856163, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "ray worker\nnode", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ztzSxxw4gFHtLebqPFwq_", + "originalText": "ray worker node", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UhDaYiDTmw9wnsmkDqwgD", + "type": "rectangle", + "x": 914.850134351564, + "y": 3250.383529660728, + "width": 163.1357446724801, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4F", + "roundness": null, + "seed": 1107160035, + "version": 844, + "versionNonce": 2071153603, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "stn0JrExRn0tfK-9wqEh2" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "stn0JrExRn0tfK-9wqEh2", + "type": "text", + "x": 945.7680509382923, + "y": 3267.883529660728, + "width": 101.29991149902344, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4G", + "roundness": null, + "seed": 1740404611, + "version": 910, + "versionNonce": 792386403, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "ray worker\nnode", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "UhDaYiDTmw9wnsmkDqwgD", + "originalText": "ray worker node", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rQ04gFE1LDliFuaK5keJ1", + "type": "rectangle", + "x": 395.4001894265758, + "y": 3231.6603663268047, + "width": 147.4799234681481, + "height": 55.000000000000014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4H", + "roundness": null, + "seed": 1491636003, + "version": 1295, + "versionNonce": 246380291, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "I2Jxhc9ykHruyGsuYtMS7" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "I2Jxhc9ykHruyGsuYtMS7", + "type": "text", + "x": 437.9101783212944, + "y": 3246.6603663268047, + "width": 62.45994567871094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4I", + "roundness": null, + "seed": 1743827651, + "version": 1345, + "versionNonce": 944742051, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "WebUI", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "rQ04gFE1LDliFuaK5keJ1", + "originalText": "WebUI", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "oX4bw99MJwmfVPdk1HTlT", + "type": "rectangle", + "x": 639.0719711875485, + "y": 3506.755756343219, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4J", + "roundness": null, + "seed": 359883363, + "version": 1077, + "versionNonce": 1992938051, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "szDN6jsgPmcwwvSmvoxTV" + }, + { + "id": "V3YTAKkdaz8uWYHzMw2Is", + "type": "arrow" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "szDN6jsgPmcwwvSmvoxTV", + "type": "text", + "x": 649.9553711509274, + "y": 3524.255756343219, + "width": 134.89988708496094, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4K", + "roundness": null, + "seed": 1245650435, + "version": 1129, + "versionNonce": 989630947, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "Advanced\nVerlTaskSpec ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oX4bw99MJwmfVPdk1HTlT", + "originalText": "Advanced VerlTaskSpec ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "V3YTAKkdaz8uWYHzMw2Is", + "type": "arrow", + "x": 638.6081643906319, + "y": 3551.120748857419, + "width": 80.66214281697523, + "height": 84.85848269127973, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4L", + "roundness": { + "type": 2 + }, + "seed": 1364354467, + "version": 1226, + "versionNonce": 707729165, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434877, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -80.66214281697523, + -84.85848269127973 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "oX4bw99MJwmfVPdk1HTlT", + "focus": -0.6785882314731589, + "gap": 1 + }, + "endBinding": { + "elementId": "kmSdgT4RJDyvWvTuvvqWh", + "focus": -0.4748599898404784, + "gap": 8.5179981073087 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "PuOZm640dpTGF1OLq4i5m", + "type": "rectangle", + "x": 210.19614088045086, + "y": 3304.7782876287997, + "width": 154.6436510018092, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4M", + "roundness": null, + "seed": 299612483, + "version": 1469, + "versionNonce": 1365842115, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "m44OLDjbhsnwUR7zhLVdZ" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "m44OLDjbhsnwUR7zhLVdZ", + "type": "text", + "x": 226.3980094111406, + "y": 3309.7782876287997, + "width": 122.23991394042969, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4N", + "roundness": null, + "seed": 154769635, + "version": 1537, + "versionNonce": 1055852643, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "user\nmanagement ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PuOZm640dpTGF1OLq4i5m", + "originalText": "user management ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gDplQ9gnXyCTd6esC3gII", + "type": "rectangle", + "x": 216.25753729936793, + "y": 3498.363119281553, + "width": 154.6436510018092, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4O", + "roundness": null, + "seed": 83526787, + "version": 1701, + "versionNonce": 1364591619, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "rX3wPPrl8npHWdRBFiXUD" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "rX3wPPrl8npHWdRBFiXUD", + "type": "text", + "x": 236.45940583005768, + "y": 3503.363119281553, + "width": 114.23991394042969, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4P", + "roundness": null, + "seed": 484244515, + "version": 1783, + "versionNonce": 1620872099, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "data\nmanagement\nSFTPGo ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "gDplQ9gnXyCTd6esC3gII", + "originalText": "data management\nSFTPGo ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "uN1gn-apNvTwBEgExTqEC", + "type": "rectangle", + "x": 1087.9746155371367, + "y": 3273.1128677917945, + "width": 78.84661364258261, + "height": 188.34936741723558, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Q", + "roundness": null, + "seed": 1825537987, + "version": 1572, + "versionNonce": 1089544003, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "M7vFjbFzjwepVauApsUxl" + } + ], + "updated": 1767580434170, + "link": null, + "locked": false + }, + { + "id": "M7vFjbFzjwepVauApsUxl", + "type": "text", + "x": 1099.7879446362601, + "y": 3354.7875515004125, + "width": 55.21995544433594, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4R", + "roundness": null, + "seed": 250646371, + "version": 1591, + "versionNonce": 1018314467, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "GPFS", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "uN1gn-apNvTwBEgExTqEC", + "originalText": "GPFS", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "aLz6JA4VKycwGE6wJ7aIt", + "type": "rectangle", + "x": 221.16737591405575, + "y": 3621.727001969507, + "width": 566.5404057062265, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4S", + "roundness": null, + "seed": 1435413251, + "version": 2145, + "versionNonce": 444077677, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WnVdMvE92zydRawmASZ06" + } + ], + "updated": 1767580482033, + "link": null, + "locked": false + }, + { + "id": "WnVdMvE92zydRawmASZ06", + "type": "text", + "x": 438.5876336988096, + "y": 3639.227001969507, + "width": 131.69989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4T", + "roundness": null, + "seed": 1160270499, + "version": 2272, + "versionNonce": 451158563, + "isDeleted": false, + "boundElements": [], + "updated": 1767580434170, + "link": null, + "locked": false, + "text": "weight & bias", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "aLz6JA4VKycwGE6wJ7aIt", + "originalText": "weight & bias", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GdoROXtlGBxCQBezTYH1E", + "type": "rectangle", + "x": 393.437456483182, + "y": 4786.201212157448, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4U", + "roundness": null, + "seed": 2087868493, + "version": 1083, + "versionNonce": 1630780301, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "SBSYmCOAYENhuZjDKG2bQ" + } + ], + "updated": 1767580466531, + "link": null, + "locked": false + }, + { + "id": "SBSYmCOAYENhuZjDKG2bQ", + "type": "text", + "x": 437.56083142214686, + "y": 4803.701212157448, + "width": 68.41993713378906, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4V", + "roundness": null, + "seed": 846972589, + "version": 1109, + "versionNonce": 397328877, + "isDeleted": false, + "boundElements": [], + "updated": 1767580466531, + "link": null, + "locked": false, + "text": "model\nServing", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "GdoROXtlGBxCQBezTYH1E", + "originalText": "model\nServing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NUlw66Q9OIa8TIBSh8shW", + "type": "rectangle", + "x": 397.85025827385925, + "y": 4127.595569661166, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4W", + "roundness": null, + "seed": 1603019427, + "version": 1113, + "versionNonce": 319397283, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "iI-RJL93xebiF9s9i5MaW" + } + ], + "updated": 1767580471663, + "link": null, + "locked": false + }, + { + "id": "iI-RJL93xebiF9s9i5MaW", + "type": "text", + "x": 441.9736332128241, + "y": 4145.095569661166, + "width": 68.41993713378906, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4X", + "roundness": null, + "seed": 198563395, + "version": 1139, + "versionNonce": 132903235, + "isDeleted": false, + "boundElements": [], + "updated": 1767580471663, + "link": null, + "locked": false, + "text": "model\nServing", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "NUlw66Q9OIa8TIBSh8shW", + "originalText": "model\nServing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "yPC5J4VL6MFR8KYd3TIqn", + "type": "rectangle", + "x": 395.643907878644, + "y": 3497.672886303671, + "width": 156.66668701171875, + "height": 85, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Y", + "roundness": null, + "seed": 1077772589, + "version": 1123, + "versionNonce": 1715199907, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "aX2wRhDW7R4kZ49ZHsB7X" + } + ], + "updated": 1767580479760, + "link": null, + "locked": false + }, + { + "id": "aX2wRhDW7R4kZ49ZHsB7X", + "type": "text", + "x": 439.7672828176088, + "y": 3515.172886303671, + "width": 68.41993713378906, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4Z", + "roundness": null, + "seed": 682546061, + "version": 1148, + "versionNonce": 539578189, + "isDeleted": false, + "boundElements": [], + "updated": 1767580476679, + "link": null, + "locked": false, + "text": "model\nServing", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yPC5J4VL6MFR8KYd3TIqn", + "originalText": "model\nServing", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "sfgomunt3ThMckJ6XKU_q", + "type": "rectangle", + "x": 488.5689978967893, + "y": 4249.311580728391, + "width": 299.56796787532073, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4a", + "roundness": null, + "seed": 512539075, + "version": 2215, + "versionNonce": 190733965, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WeNR6EN-asrq8s5DPDrqu" + } + ], + "updated": 1767580516436, + "link": null, + "locked": false + }, + { + "id": "WeNR6EN-asrq8s5DPDrqu", + "type": "text", + "x": 541.7930376816176, + "y": 4266.811580728391, + "width": 193.11988830566406, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4b", + "roundness": null, + "seed": 1224116579, + "version": 2358, + "versionNonce": 2100077421, + "isDeleted": false, + "boundElements": [], + "updated": 1767580513277, + "link": null, + "locked": false, + "text": "IB & RoCE support", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "sfgomunt3ThMckJ6XKU_q", + "originalText": "IB & RoCE support", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "MFBSa2ubaUD9ofO7oFDAX", + "type": "rectangle", + "x": 219.23352789007174, + "y": 4915.747023497185, + "width": 239.9955982022902, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4c", + "roundness": null, + "seed": 1230068963, + "version": 2172, + "versionNonce": 1968459331, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "L9ANH6aHqTr18kVeHpkD7" + } + ], + "updated": 1767580528071, + "link": null, + "locked": false + }, + { + "id": "L9ANH6aHqTr18kVeHpkD7", + "type": "text", + "x": 273.3813819228575, + "y": 4933.247023497185, + "width": 131.69989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4d", + "roundness": null, + "seed": 1970915459, + "version": 2297, + "versionNonce": 2060946915, + "isDeleted": false, + "boundElements": [], + "updated": 1767580528071, + "link": null, + "locked": false, + "text": "weight & bias", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "MFBSa2ubaUD9ofO7oFDAX", + "originalText": "weight & bias", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lfA_f7LdHHZOlVJcdyc3d", + "type": "rectangle", + "x": 486.51892528118265, + "y": 4915.532178719405, + "width": 299.56796787532073, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4e", + "roundness": null, + "seed": 1154727971, + "version": 2260, + "versionNonce": 1418667853, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "u1iQgDeEBo4G9WP1xSZyQ" + } + ], + "updated": 1767580531532, + "link": null, + "locked": false + }, + { + "id": "u1iQgDeEBo4G9WP1xSZyQ", + "type": "text", + "x": 539.742965066011, + "y": 4933.032178719405, + "width": 193.11988830566406, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4f", + "roundness": null, + "seed": 1900921795, + "version": 2402, + "versionNonce": 2101457187, + "isDeleted": false, + "boundElements": [], + "updated": 1767580528071, + "link": null, + "locked": false, + "text": "IB & RoCE support", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lfA_f7LdHHZOlVJcdyc3d", + "originalText": "IB & RoCE support", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "d6HJM5niCdXm__tjACWnG", + "type": "rectangle", + "x": 202.68559692521774, + "y": 5681.362225665228, + "width": 239.9955982022902, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4g", + "roundness": null, + "seed": 2084012493, + "version": 2298, + "versionNonce": 29748483, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Qqo4oxKBaxNHFRuFrl-Mx" + } + ], + "updated": 1767580559782, + "link": null, + "locked": false + }, + { + "id": "Qqo4oxKBaxNHFRuFrl-Mx", + "type": "text", + "x": 256.8334509580035, + "y": 5698.862225665228, + "width": 131.69989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4h", + "roundness": null, + "seed": 585089069, + "version": 2423, + "versionNonce": 757552291, + "isDeleted": false, + "boundElements": [], + "updated": 1767580559782, + "link": null, + "locked": false, + "text": "weight & bias", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "d6HJM5niCdXm__tjACWnG", + "originalText": "weight & bias", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "WAAd0XFKUqYZrZJzHBml5", + "type": "rectangle", + "x": 469.97099431632864, + "y": 5681.147380887448, + "width": 299.56796787532073, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4i", + "roundness": null, + "seed": 447820429, + "version": 2386, + "versionNonce": 591054915, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "JtiTV8-vNxkwt8Ymi12EQ" + } + ], + "updated": 1767580559782, + "link": null, + "locked": false + }, + { + "id": "JtiTV8-vNxkwt8Ymi12EQ", + "type": "text", + "x": 523.195034101157, + "y": 5698.647380887448, + "width": 193.11988830566406, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b4j", + "roundness": null, + "seed": 1348819181, + "version": 2528, + "versionNonce": 1507772387, + "isDeleted": false, + "boundElements": [], + "updated": 1767580559782, + "link": null, + "locked": false, + "text": "IB & RoCE support", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "WAAd0XFKUqYZrZJzHBml5", + "originalText": "IB & RoCE support", + "autoResize": true, + "lineHeight": 1.25 } ], "appState": { diff --git a/specs/mvp/v3.5/v3.5_changes.md b/specs/mvp/v3.5/v3.5_changes.md new file mode 100644 index 0000000..b67f58c --- /dev/null +++ b/specs/mvp/v3.5/v3.5_changes.md @@ -0,0 +1,67 @@ +# MVP v3.5 功能变更总结(相对 v3.0) + +> v3.5 本轮按已确认的精简 scope:**只聚焦 Advanced TaskSpec + Custom Reward(方式 A:用户在 command 里写 overrides)**。Serving/IB/断点续训/多版本 verl 等能力本轮仍不做。 + +## 1. TaskSpec / 任务语义 + +### 1.1 新增 Advanced TaskSpec(自定义 command) + +- 新增 `kind: advanced` 的 TaskSpec 类型: + - 用户可提交任意 bash `command`,不再局限于平台内置 PPO/GRPO/SFT 模板。 + - `workload` 不再要求用户填写,也不做 infer;平台内部统一按 `"advanced"` 做任务分类与 task_id 命名(避免未来训练类型扩展带来的限制)。 +- 支持 `$HOME` 宏替换(服务端提交前展开): + - `$HOME` → `/private/users/` + - `$HOME/common/datasets` → `/private/datasets` + - `$HOME/common/hf` → `/private/hf` +- `command` 校验(best-effort,面向内部可信用户): + - 要求包含 `python3 -m verl.`(允许 `verl.trainer.*` / `verl.model_merger` 等)。 + - 不做强沙箱;主要防止明显误用导致的不可预期行为。 + +### 1.2 Custom Reward(方式 A) + +- 平台不新增 reward 专用字段、不扩展 TaskSpec schema。 +- 用户通过在 `command` 里写 VERL 原生 overrides 来注入 reward: + - `custom_reward_function.path=...` + - `custom_reward_function.name=...` + - `custom_reward_function.reward_kwargs=...`(如需) +- 平台侧仅做: + - 基础路径/宏展开($HOME) + - best-effort 的字符串校验(不做深度 AST 解析) + +## 2. WebUI(New Task 体验增强,仍兼容 YAML) + +- `New Task` 页面新增 **YAML 模式 / 表单模式**切换: + - 表单模式只覆盖 **5 个模板**:PPO / GRPO / SFT / Advanced / Model Merge。 + - 表单模式实时生成 YAML 预览;Submit 时提交生成 YAML;可一键切回 YAML 模式继续手工编辑。 +- `Advanced example`: + - 示例命令改为多行、可读性更好。 + - 补齐 PPO 常见 fail-fast 所需的关键 overrides(例如 actor micro batch),避免用户“照抄即失败”。 +- 新增 `Model merge example`(Advanced command 形式): + - 使用 `python3 -m verl.model_merger merge ...` + - 支持用 `$HOME/jobs//...` 访问训练产物目录。 + +## 3. SFTPGo / common 目录可读性(配合 v3.5 的 $HOME/common 语义) + +> 这些变更主要用于保证 v3.5 所定义的 `$HOME/common/{datasets,hf}` 语义在 SFTPGo WebClient/客户端下可用。 + +- `/common/datasets` 与 `/common/hf` 作为 SFTPGo virtual folders 暴露为只读共享目录: + - 允许 list + download(用于浏览与下载/查看内容;仍不允许 upload/rename/delete)。 + - 权限规则覆盖到子路径(避免“能进目录但文件不可读”的情况)。 +- API 调用 SFTPGo admin API 的连通性增强: + - dev 环境下避免依赖容器内 DNS(部分 head 容器环境存在临时解析失败),改为通过 docker bridge 网关 + 映射端口访问 admin API。 +- API 启动脚本确保注入 `SFTPGO_ADMIN_PASSWORD`(与 compose 默认值保持一致),避免 Reset Password 走到 401。 + +## 4. 兼容性与行为变化 + +- **完全兼容 v3.0 的 PPO/GRPO/SFT TaskSpec YAML**(原有字段与提交方式不变)。 +- 新增能力不会影响 ray/node management(仍按 v3.0:head 发布 discovery、worker watchdog join/self-heal)。 +- Advanced 任务不会进入 PPO/GRPO/SFT 的语义约束;平台仅负责: + - 资源字段(`nnodes` / `n_gpus_per_node`)用于队列调度与提交 gate + - 将 `command` 作为 Ray job entrypoint 执行 + +## 5. 已知限制(v3.5 不做) + +- 不提供“可视化” reward 配置面板(仅方式 A:用户自己写 command)。 +- 不支持 per-job 自定义 verl 代码快照/多版本共存(本轮不做 code_path 选择)。 +- 不支持断点续训一键 resubmit / IB(RDMA) / model serving(按 roadmap 后续版本推进)。 + diff --git a/specs/mvp/v3.6/README.md b/specs/mvp/v3.6/README.md new file mode 100644 index 0000000..fc220f4 --- /dev/null +++ b/specs/mvp/v3.6/README.md @@ -0,0 +1,9 @@ +# MVP v3.6 + +本目录包含 v3.6 的需求与设计: + +- `Snipaste_2026-01-05_10-56-34.png`:v3.6 架构草图(在 v3.5 基础上增加 Weights & Biases;其余模块保持不变) +- `requirements.md`:需求要点(W&B + Evaluation 模板) +- `wandb.md`:W&B local server 的前期调研与资料(license、部署方式、VERL 配置要点等) +- `v3.6_design.md`:v3.6 详细设计方案(基于 v3.5) +- `v3.6_progress.md`:v3.6 里程碑进度记录 diff --git a/specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png b/specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png new file mode 100644 index 0000000..8e889e2 Binary files /dev/null and b/specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png differ diff --git a/specs/mvp/v3.6/requirements.md b/specs/mvp/v3.6/requirements.md new file mode 100644 index 0000000..34d8e08 --- /dev/null +++ b/specs/mvp/v3.6/requirements.md @@ -0,0 +1,3 @@ +1. 增加wandb功能 +2. 增加evaluation 模板 + diff --git a/specs/mvp/v3.6/v3.6_design.md b/specs/mvp/v3.6/v3.6_design.md new file mode 100644 index 0000000..2af592a --- /dev/null +++ b/specs/mvp/v3.6/v3.6_design.md @@ -0,0 +1,280 @@ +# MVP v3.6 详细设计方案(基于 v3.5) + +> 设计基线:当前线上已具备 v3.5 能力(PPO/GRPO/SFT + Advanced TaskSpec + SFTPGo 数据管理 + WebUI)。 +> v3.6 的架构草图见:`specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png` + +## 0. 目标与范围 + +### 0.1 v3.6 目标 + +1) **Weights & Biases(W&B)集成** +- 训练/任务运行时自动打点到 W&B local server。 +- 采用“共享 W&B 账号(license 只支持 1 user) + 为每个 MVP 用户创建独立 project”的方式隔离可视化与检索体验。 +- 平台提供 W&B 的跳转链接、以及每个 task 对应 run 的可定位信息(最小闭环)。 + +2) **New Task 增加 Evaluation 模板** +- 在 New Task 页面提供一个最小可用的 “Evaluation” 任务模板(用于离线评估/打分),并能把结果落到 job 输出与(可选)W&B。 + +### 0.2 非目标(v3.6 不做) + +- 不引入新的 node management 机制;保持 v3.5 的 head discovery + worker watchdog stateless pool。 +- 不做 Serving/IB/RDMA/断点续训/多版本 verl code_path 等(仍按 v3.5 的范围)。 +- 不做多租户安全隔离(W&B API Key 注入属于内部可信环境)。 + +--- + +## 1. W&B local server(部署与连通) + +> 资料参考:`specs/mvp/v3.6/wandb.md`。**文档中 license/token 属敏感信息,v3.6 设计不在代码/文档里写死。** + +### 1.1 部署方式(dev/h1) + +建议在 `src/mvp/docker-compose.yaml` 新增 `wandb` 服务(与现有 ray_head / sftpgo 同一 compose network): + +- 镜像:`wandb/local:latest` +- 容器端口:`8080` +- 宿主机端口:建议 `8090:8080`(避免和 MVP API `8080`、SFTPGo `8081` 冲突) +- 持久化:挂载到 NFS/共享目录(例如 `/private/common/wandb`)以持久化 runs/artifacts +- 首次启动后由管理员在 W&B System Admin 页面粘贴 license(见 `wandb.md`) + +### 1.1.1 持久化策略(必须) + +v3.6 约定 **W&B server 的元数据必须持久化**(否则会丢 license/账号/API key、历史 runs/project 索引等): + +- W&B server 数据目录(`/vol`)挂载到共享目录(NFS):例如 `/private/common/wandb:/vol` +- 这部分数据由平台/管理员长期保留(不跟随单个 job 清理) + +与之相对,**每个 Ray job 对应的本地 W&B run 文件**放在 job 目录下(见 §2.3 的 `WANDB_DIR`),并由现有 janitor 随 job 一起清理: + +- `WANDB_DIR=/private/users//jobs//wandb` +- janitor 对 job 的策略是“结束后 3 天移入回收站、7 天后删除”,因此该目录会被一并处理 + +> 说明:W&B 的最终“事实数据”在 server 侧持久化(runs/metrics/可视化);job 目录下的 `WANDB_DIR` 更像运行期缓存/临时文件与调试材料。 + +### 1.2 容器内访问 W&B 的 base_url + +在 v3.5 经验中,Ray head 容器对 docker 内部 DNS 名称解析不稳定(`Temporary failure in name resolution`)。 +为避免再次踩坑,v3.6 统一采用 **“docker bridge 网关 + host 映射端口”** 的方式让容器访问 W&B: + +- `WANDB_BASE_URL=http://172.22.0.1:8090`(其中 `172.22.0.1` 为 `mvp_argus-ray-net` 网关) + +> 注意:如果未来 dev 环境 network 网段变化,需要把网关地址做成配置项(见 §2)。 + +--- + +## 2. 平台侧 W&B 集成(API/Scheduler/Ray Job runtime_env) + +### 2.1 配置设计(YAML) + +在 `configs/dev.yaml`(以及生产配置)中新增一段 W&B 配置,建议结构: + +```yaml +tracking: + wandb: + enabled: true + base_url: "http://172.22.0.1:8090" + api_key_env: "WANDB_API_KEY" + entity: "" # 可选;verL 通过 env WANDB_ENTITY 读取 + project_suffix: "_project" # 例如 alice_project + # 可选:代理(verL 支持 trainer.wandb_proxy) + proxy: null +``` + +平台读取 `api_key_env` 对应的环境变量,并在 job 维度注入 `WANDB_API_KEY`。 +**不在配置文件中存明文 API KEY**(避免泄露)。 + +### 2.2 项目/命名规范(共享账号 + user project) + +由于 W&B local license 限制 “最多 1 user”,v3.6 采用: + +- **同一个 W&B 账号**(同一个 `WANDB_API_KEY`) +- 每个 MVP user 使用不同 project: + - `project_name = + project_suffix` + - 示例:`alice_project` +- 每个 Ray job attempt 对应一个 run: + - `experiment_name = `(保证 attempt 唯一;也便于从 dashboard 反查) + +verL 内部 `wandb.init(project=project_name, name=experiment_name, entity=$WANDB_ENTITY)`(见 `verl/utils/tracking.py`)。 + +### 2.3 Ray Job 注入(runtime_env env_vars) + +当 `tracking.wandb.enabled=true` 时,在 scheduler 提交 ray job 时,统一注入: + +- `WANDB_BASE_URL`(来自配置) +- `WANDB_API_KEY`(来自 env `tracking.wandb.api_key_env`) +- `WANDB_ENTITY`(可选) +- `WANDB_MODE=online`(默认在线;可在 dev/离线时切换) +- `WANDB_DIR=/private/users//jobs//wandb`(保证每个 job 的本地 run 文件落到对应 job 目录;便于随 job 一起被 janitor 清理) + +> 对 Advanced TaskSpec:平台无法替用户改 command,但仍可注入上述 env,让用户在 command 中自行启用 wandb。 + +### 2.4 verL 训练任务自动开启 wandb logger + +对平台内置 workload(PPO/GRPO/SFT),平台将 hydra overrides 改为: + +- `trainer.logger=[console,wandb]`(替代 v3.5 的 `trainer.logger=console`) +- `trainer.project_name=_project` +- `trainer.experiment_name=` +- 可选:如果配置了 `tracking.wandb.proxy`,注入 `trainer.wandb_proxy=...` + +兼容性说明: +- `trainer.logger` 在 verL 的 ppo/sft config 中本身是 list(示例为 `["console","wandb"]`),因此不会破坏 verL 配置解析。 +- 现有 v3.5 的 checkpoint/log dir 仍按 job_dir 注入,不依赖 `trainer.default_local_dir`。 + +### 2.5 数据库存储与 API 输出(最小闭环) + +v3.6 需要让用户能在 WebUI/Task 详情中 “点一下跳转到 W&B”: + +建议在 DB(sqlite)里新增 attempt 级字段(或 metadata JSON): + +- `wandb_project`:如 `alice_project` +- `wandb_run_name`:如 `` +- `wandb_base_url`:如 `http://:8090` +- `wandb_url`:拼出来的最终链接(若 W&B local 的 URL 结构不稳定,可只存前 3 项,由前端拼接) + +API 侧在: +- `GET /api/v2/tasks/` 的 `latest_attempt` 增加 `wandb` 字段(或顶层增加 `tracking` 字段) +- `GET /api/v2/me` 增加 `wandb` 信息(base_url、project_name),便于页面展示 “Open W&B” + +> W&B local 的 URL 路径结构需要在接入时确认;若不确定,先只提供 base_url + project/run 名称,用户可在 W&B UI 搜索。 + +--- + +## 3. WebUI 变更(v3.6) + +### 3.1 Data / Login 页 + +- 在 Data 或 Login 页新增: + - “Open W&B” 链接(跳转到 `tracking.wandb.base_url` 的 Web UI) + - 展示当前用户的 project 名称(例如 `alice_project`),并提供 Copy 按钮 + +### 3.2 Tasks / Task Detail + +- Task list 无需大改;Task detail 页面增加: + - W&B run 信息(project / run name / link) + - 若任务失败,W&B 仍可用于查看已上报的中间日志(对训练类任务有价值) + +### 3.3 New Task 增加 Evaluation 模板 + +New Task 页面新增一个 “Evaluation example”: + +#### 方案 A(推荐,最小改动):作为 Advanced TaskSpec 模板 + +- 直接提供 `kind: advanced` 的模板,command 运行 verL 自带评估入口: + - `python3 -m verl.trainer.main_eval data.path=... custom_reward_function.path=... +ray_kwargs.ray_init.address=auto` +- 优点:不需要扩展 TaskSpec schema / scheduler 逻辑 +- 缺点:Evaluation 在平台侧不可结构化(仍属于 advanced) + +#### 方案 B(更产品化):新增内置 workload: evaluation(后续可选) + +若希望在任务分类/队列中把 evaluation 作为一类“内置任务”,可新增: + +```yaml +workload: evaluation +code_path: /private/common/code/verl/verl_repo +nnodes: 1 +n_gpus_per_node: 0 +data_path: $HOME/common/datasets/<...>.parquet +response_key: responses +data_source_key: data_source +reward_model_key: reward_model +custom_reward_path: $HOME/code/reward.py # 可选 +custom_reward_name: compute_score # 可选 +``` + +平台把它编译成 `verl.trainer.main_eval` 的 hydra overrides + ray init address;并可选择把结果解析后上报 W&B。 + +v3.6 建议先落地 **方案 A**(模板即可),方案 B 作为 v3.7+ 的演进。 + +--- + +## 4. 验收标准(v3.6) + +### 4.1 W&B(训练任务) + +- 提交 PPO/GRPO/SFT 任一任务: + - W&B local server 能看到对应 project(如 `alice_project`) + - 能看到 run 名称为该任务 attempt 的 `ray_submission_id` + - run 内能持续刷新 metrics(至少包含 loss/step 等 verL 默认上报) +- WebUI: + - 能打开 W&B UI 链接 + - Task detail 能展示 project/run(或至少可检索信息) + +### 4.2 Evaluation 模板 + +- New Task 中出现 “Evaluation example” +- 复制模板提交后: + - 任务能在 Ray 上运行(CPU 即可,`+ray_kwargs.ray_init.address=auto` 连接集群) + - 输出 metrics(`main_eval.py` 默认 print dict) + - (可选)若用户在 command 里启用 wandb,则能在对应 project 下看到评估 run + +--- + +## 5. 兼容性影响评估 + +- 对现有 v3.5 功能: + - 默认行为改变:PPO/GRPO/SFT 会默认多一个 logger(wandb),并对外发起 HTTP 请求到 W&B server。 + - 若 W&B server 不可用/配置缺失: + - 建议行为:平台自动降级为 `trainer.logger=[console]` 并在 task 状态中给出 warning(避免训练直接失败)。 + - 初版也可选择 fail-fast:缺少 `WANDB_API_KEY` 时拒绝开启 wandb(由配置开关控制)。 +- 对资源/存储: + - W&B server 自身会写入一定量数据(license 限制 10GB);需配合 retention 策略做清理(v3.6 先手动,后续可自动)。 + - job 目录下的 `WANDB_DIR` 会随 jobs retention 被清理;不会无限增长。 + +--- + +## 6. 已确认的落地约定 + +- W&B server 对外端口:`8090` +- Project 命名:`_project`(不使用 `WANDB_ENTITY`) +- Evaluation:先只提供 **Advanced 模板**(New Task 页面提供示例即可) + +--- + +## 7. 运维与验收流程(dev/h1) + +### 7.1 启动服务(docker compose) + +1) 启动/重启 compose(Ray head/worker + SFTPGo + W&B): + +```bash +cd /home2/argus/infra/mvp/src/mvp +docker compose up -d +``` + +2) 访问 UI: +- MVP WebUI:`http://:8080/ui` +- Ray Dashboard:`http://:8265` +- SFTPGo Web:`http://:8081/web/` +- W&B Web:`http://:8090` + +> W&B 容器数据目录已挂载到共享盘:`/private/common/wandb`(容器内 `/vol`)。 + +### 7.2 初始化 W&B(管理员一次性操作) + +1) 打开 `http://:8090/system-admin` 粘贴 license(详见 `specs/mvp/v3.6/wandb.md`)。 +2) 进入 W&B UI 创建/登录到共享账号(license 只支持 1 user)。 +3) 在 W&B UI 的用户设置页面生成 API Key(通常位于 “User Settings / API Keys”)。 + +### 7.3 启动 API server(需要注入 WANDB_API_KEY) + +平台不会把 `WANDB_API_KEY` 写入配置文件;必须在启动 API server 时通过环境变量提供。 + +示例(在宿主机): + +```bash +export MVP_INTERNAL_TOKEN="my-dev-token" +export WANDB_API_KEY="...从 W&B UI 复制..." +cd /home2/argus/infra/mvp/src/mvp/scripts +./60_start_api.sh +``` + +> 说明:`./60_start_api.sh` 会把 `WANDB_API_KEY` 透传给 head 容器内运行的 API server。 + +### 7.4 验收(最小闭环) + +1) 在 WebUI Login 页面能看到 W&B 区块(Open W&B + project copy)。 +2) 提交一个 PPO/GRPO/SFT 任务(任意一个即可): + - W&B project 为 `_project`(如 `alice_project`) + - run name 为该 attempt 的 `ray_submission_id` +3) 提交 Evaluation 模板(Advanced)能在 Ray 上运行并输出评估结果(stdout / logs)。 diff --git a/specs/mvp/v3.6/v3.6_dev_plan.md b/specs/mvp/v3.6/v3.6_dev_plan.md new file mode 100644 index 0000000..d0fa1e3 --- /dev/null +++ b/specs/mvp/v3.6/v3.6_dev_plan.md @@ -0,0 +1,194 @@ +# MVP v3.6(基于 v3.5)开发计划(TDD) + +> 设计依据:`specs/mvp/v3.6/v3.6_design.md` +> 本计划默认已确认: +> 1) W&B host 端口:`8090`;2) project:`_project`;3) evaluation 先做 Advanced 模板;4) 不使用 `WANDB_ENTITY`。 + +## 总体原则 + +- **TDD**:每个里程碑先补齐单测(或契约测试)再实现功能;保证覆盖率门槛不回退。 +- **最小闭环**:先做到“可用+可验证”,再做体验优化;不做超出 v3.6 scope 的扩展。 +- **配置不落盘敏感信息**:`WANDB_API_KEY` 只能来自运行环境变量,不写入仓库配置文件。 + +--- + +## Milestones + +### M1:配置层(tracking.wandb)与解析 + +**目标** +- 在服务配置中新增 `tracking.wandb`,支持开关、base_url、api_key_env。 +- 不引入 `WANDB_ENTITY`(保持为空即可)。 + +**开发任务** +- 在 `src/mvp/py/argus/service/config.py`: + - 新增 `TrackingConfig/WandbConfig` dataclass(或等价结构)。 + - `V2Config.from_root_dict()` 解析 `tracking.wandb.*`(缺省为 disabled)。 + - 校验:`enabled=true` 时 `base_url` 不能为空;`api_key_env` 默认 `WANDB_API_KEY`。 + +**测试(先写)** +- `test_config_parses_wandb_defaults`:没有 tracking 字段时,默认 disabled。 +- `test_config_parses_wandb_enabled`:enabled=true 能读到 base_url/api_key_env。 +- `test_config_rejects_empty_base_url_when_enabled`:enabled=true 且 base_url 空时报错(或记录 warning,取决于实现选择)。 + +**验收** +- 仅通过 config 即能决定是否启用 W&B,且不会破坏 v3.5 现有配置解析。 + +--- + +### M2:Ray Job runtime_env 注入(WANDB_* env) + +**目标** +- 当 `tracking.wandb.enabled=true` 时:平台在 job 粒度注入 `WANDB_BASE_URL/WANDB_API_KEY/WANDB_MODE/WANDB_DIR` 等 env。 +- `WANDB_API_KEY` 从 API server 进程环境变量中读取:`os.environ[api_key_env]`。 + +**开发任务** +- 在 scheduler / ray job builder(`src/mvp/py/argus/service/scheduler.py` 或 `src/mvp/py/argus/ray/builders.py`): + - 构造 job runtime_env.env_vars 的 merge 逻辑: + - 现有 `ray.runtime_env.env_vars` 为基础; + - 追加 W&B env(不覆盖用户显式指定的同名变量,或按“平台优先”策略二选一并写清楚)。 + - 注入: + - `WANDB_BASE_URL=` + - `WANDB_API_KEY=` + - `WANDB_MODE=online` + - `WANDB_DIR=/private/users//jobs//wandb`(本地 run 文件随 job 一起由 janitor 清理) + +**测试(先写)** +- `test_scheduler_injects_wandb_env_when_enabled`: + - mock env 中存在 `WANDB_API_KEY`; + - 提交一个内置任务(ppo/sft 任意),断言构造出来的 runtime_env 含以上 env_vars。 +- `test_scheduler_sets_wandb_dir_under_job_dir`: + - 断言 `WANDB_DIR` 位于该 attempt 的 job 目录下(而不是 common 目录),避免无法跟随 job retention 清理。 +- `test_scheduler_does_not_inject_wandb_env_when_disabled`。 +- `test_scheduler_wandb_missing_api_key_behaviour`: + - enabled=true 但缺少 env 时的行为: + - 方案 A(推荐):**自动降级**为 console(不注入 wandb),并在 task/attempt message 记录 warning; + - 或方案 B:fail-fast(返回 500/400)。 + - 需在实现前确认采用哪种策略;建议 v3.6 选 A 提升可用性。 + +**验收** +- 任意内置任务提交后,在 Ray job runtime_env 中能看到 `WANDB_*`。 + +--- + +### M3:内置训练任务自动开启 wandb logger(PPO/GRPO/SFT) + +**目标** +- 当 W&B enabled 时,平台默认把内置训练任务改成 `trainer.logger=["console","wandb"]`,并设置 project/run 命名。 + +**开发任务** +- 在 job 构建(PPO/GRPO/SFT 的 overrides 生成处): + - 将 `trainer.logger` 从 `console` 改为 list:`[console,wandb]`(hydra 语法按现有实现方式拼接)。 + - `trainer.project_name=_project` + - `trainer.experiment_name=` + - 保持 v3.5 的 job_dir/checkpoint/log dir 注入方式不变。 + +**测试(先写)** +- `test_job_overrides_include_wandb_logger_when_enabled`: + - 断言 entrypoint/overrides 包含 `trainer.logger=[console,wandb]`(或等价写法)。 + - 断言包含 `trainer.project_name=_project`、`trainer.experiment_name=`。 +- `test_job_overrides_keep_console_only_when_wandb_disabled_or_missing_key`。 + +**验收** +- 训练任务 run 会自动出现在 W&B 对应 project 下(E2E 验证在 M6)。 + +--- + +### M4:API 输出与 WebUI 链接(最小闭环) + +**目标** +- 用户可以在 UI 里“知道去哪看 W&B”,以及知道本 task 对应哪个 project/run。 + +**开发任务** +- API: + - `GET /api/v2/me` 增加 `wandb` 信息(仅当 enabled 时返回): + - `base_url` + - `project_name`(`_project`) + - `GET /api/v2/tasks/{task_id}`(或 attempt 结构)增加 `wandb_project` / `wandb_run_name`(run_name=ray_submission_id)。 +- WebUI: + - Login/Data 页增加 “Open W&B” 链接(跳 `base_url`),展示 project_name + Copy。 + - Task detail 增加 wandb 字段展示(project/run/可点击链接或可复制文本)。 + +**测试(先写)** +- `test_me_includes_wandb_when_enabled`(mock config + env)。 +- `test_task_detail_contains_wandb_fields_when_enabled`(mock task/attempt)。 +- `test_ui_contains_wandb_link`(渲染 HTML 断言包含 base_url/project_name 字样)。 + +**验收** +- WebUI 能一键跳转 W&B;Task detail 能定位到 run。 + +--- + +### M5:New Task 增加 Evaluation 模板(Advanced) + +**目标** +- New Task 页面增加一个 Evaluation 模板按钮/示例(先按 Advanced TaskSpec 提供)。 + +**开发任务** +- 在 `src/mvp/py/argus/service/ui.py`: + - YAML 模式增加 “Evaluation example”。 + - 表单模式本轮可选(不要求): + - 如果要支持:把 evaluation 作为 advanced 模板的一种预填 command(仍 `kind: advanced`)。 +- 模板建议使用 verL 自带入口: + - `python3 -m verl.trainer.main_eval ... +ray_kwargs.ray_init.address=auto` + - `data.path=$HOME/common/datasets/...`(按 v3.5 的宏规则) + +**测试(先写)** +- `test_ui_new_task_contains_evaluation_example`:断言页面包含 `main_eval` 与关键字段。 + +**验收** +- 用户复制 evaluation 模板可提交成功并在 Ray 上运行(E2E 在 M6)。 + +--- + +### M6:端到端(dev/h1)部署与验收流程 + +> 里程碑 M6 以脚本/手工步骤为主;不强制写 e2e 自动化测试。 + +**部署任务** +- compose 增加 `wandb` 服务: + - `wandb/local:latest` + - host 端口 `8090:8080` + - 数据挂载到 `/private/common/wandb:/vol` 持久化(W&B 元数据/账号/API key/历史 runs) +- API 启动方式: + - 在宿主机 export:`WANDB_API_KEY=<从 W&B UI 生成的 key>` + - 启动 API(确保 env 透传到容器内) +- 首次初始化: + - 打开 `http://:8090/system-admin` 粘贴 license(管理员操作) + +**验收用例** +1) **训练类任务自动打点** + - 用 alice 提交一个 SFT(或 PPO)任务(内置 workload) + - 在 W&B UI 中看到 project:`alice_project` + - run name 为 `ray_submission_id`,metrics 可见 +2) **Advanced task 可手动打点** + - 提交一个 Advanced(用户自己写 command)并在 command 中启用 `trainer.logger=["console","wandb"]`(如需) + - 确认 env 注入生效(W&B 记录出现) +3) **Evaluation 模板** + - 用 New Task 的 Evaluation example 提交 + - 任务成功运行并输出 metrics(stdout/logs) + - (可选)如果 evaluation 也启用 wandb,则能出现在对应 project 下 + +**回归** +- v3.5 的三类任务(ppo/grpo/sft)在 W&B disabled 或缺少 key 时仍可跑通(至少 console 输出不受影响)。 + +**Retention 联动检查** +- 提交一个短任务生成 `WANDB_DIR`,结束后确认: + - `WANDB_DIR` 位于 `/private/users//jobs//wandb` + - janitor 运行后该目录会随 job 一起进入 trash / 被 purge(与 jobs retention 一致) + +--- + +## 交付物清单(v3.6) + +- 文档: + - `specs/mvp/v3.6/v3.6_design.md`(已存在,必要时补充操作流程) + - `specs/mvp/v3.6/v3.6_dev_plan.md`(本文) +- 代码(预期变更点): + - `src/mvp/py/argus/service/config.py` + - `src/mvp/py/argus/service/scheduler.py` / `src/mvp/py/argus/ray/builders.py` / `src/mvp/py/argus/ray/ray_job_tool.py` + - `src/mvp/py/argus/service/app.py`(/me 与 task detail 输出) + - `src/mvp/py/argus/service/ui.py`(Open W&B + Evaluation template) + - `src/mvp/docker-compose.yaml`(wandb service) + - `src/mvp/configs/dev.yaml`(tracking.wandb 配置) + - `src/mvp/scripts/*`(API 启动时 env 透传,必要时补充) diff --git a/specs/mvp/v3.6/v3.6_progress.md b/specs/mvp/v3.6/v3.6_progress.md new file mode 100644 index 0000000..7f681c8 --- /dev/null +++ b/specs/mvp/v3.6/v3.6_progress.md @@ -0,0 +1,42 @@ +# MVP v3.6 进度记录 + +> 基线:v3.5 已完成(Advanced TaskSpec + Custom reward(方式A)+ WebUI + SFTPGo + stateless ray node pool)。 +> 本文件用于记录 v3.6 每个 milestone 的完成情况与关键改动点。 + +## M1(完成) + +- 新增 `tracking.wandb` 配置解析与校验(enabled/base_url/api_key_env)。 + +## M2(完成) + +- Ray job 维度注入 `WANDB_*` env(含 `WANDB_BASE_URL/WANDB_API_KEY/WANDB_MODE/WANDB_DIR`),缺少 key 时降级并记录 warning。 + +## M3(完成) + +- PPO/GRPO/SFT 内置训练任务在 wandb 可用时自动追加 overrides: + - `trainer.logger=[console,wandb]` + - `trainer.project_name=_project` + - `trainer.experiment_name=` + +## M4(完成) + +- API 输出增加 W&B 定位信息: + - `/api/v2/me` 返回 `wandb.{enabled,base_url,project_name}` + - `/api/v2/tasks/{task_id}` 在 `latest_attempt.wandb` 返回 `{base_url,project_name,run_name}` +- WebUI: + - Login 页面增加 W&B 区块(跳转 8090、copy project) + - Task detail 页面增加 W&B 区块(copy run) + +## M5(完成) + +- WebUI New Task 增加 Evaluation 模板(Advanced): + - 使用 `python3 -m verl.trainer.main_eval ... +ray_kwargs.ray_init.address=auto` + - 以占位符路径示例(用户替换 `/`) + +## M6(完成) + +- `docker-compose.yaml` 集成 W&B local server: + - host 端口 `8090` + - 持久化目录 `/private/common/wandb`(容器内 `/vol`) +- dev 配置新增 `tracking.wandb` 默认开启(缺 key 自动降级并记录 warning)。 +- API 启动脚本支持把 `WANDB_API_KEY` 从宿主机透传到 head 容器中的 API server。 diff --git a/specs/mvp/v3.6/v3.6_summary.md b/specs/mvp/v3.6/v3.6_summary.md new file mode 100644 index 0000000..818bb4d --- /dev/null +++ b/specs/mvp/v3.6/v3.6_summary.md @@ -0,0 +1,126 @@ +# MVP v3.6 迭代研发总结(基于 v3.5) + +> 时间基线:2026-01(H20 dev 环境:`argus@h1:/home2/argus/infra/mvp`) +> v3.6 架构草图:`specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png` + +## 1. 迭代目标回顾 + +v3.6 在 v3.5(WebUI + API server + Ray stateless node pool + SFTPGo + Advanced TaskSpec)基础上,新增两块能力: + +1) **Weights & Biases(W&B)local server 集成** +- 训练任务(PPO/GRPO/SFT)默认可写入 W&B。 +- 采用“共享 W&B 账号 + 按用户拆分 project(`_project`)”的隔离策略。 + +2) **New Task 增加 Evaluation 示例** +- New Task 页面新增一个最小可用的 evaluation 模板(以 Advanced command 方式运行 `verl.trainer.main_eval`)。 + +## 2. 交付内容(代码/配置/脚本) + +### 2.1 部署形态(docker compose) + +v3.6 在 `src/mvp/docker-compose.yaml` 新增 W&B 服务: + +- 服务名:`wandb`(容器名:`argus-wandb`) +- 宿主机端口:`8090:8080` +- 持久化:`../../shared/common/wandb:/vol` +- 同 network:`argus-ray-net`(便于 Ray 容器内访问) + +### 2.2 平台配置(YAML) + +在 `src/mvp/configs/dev.yaml` 增加/启用 W&B 配置: + +```yaml +tracking: + wandb: + enabled: true + base_url: "http://172.22.0.1:8090" + api_key_env: "WANDB_API_KEY" + project_suffix: "_project" +``` + +说明: +- `base_url` 采用 docker bridge 网关 + 宿主机映射端口的方式,规避容器内 DNS 偶发解析失败问题。 +- 不在 config 中写明文 key,统一通过启动 API server 时注入 `WANDB_API_KEY`。 + +### 2.3 Ray Job runtime_env 注入(核心) + +v3.6 在**每个 Ray job attempt**提交时注入两类环境变量: + +1) **始终注入(无论是否启用 W&B)**:便于 Advanced command 在不改模板的情况下能运行 +- `MVP_TRAINER_LOGGER`:`console` 或 `[console,wandb]` +- `MVP_WANDB_PROJECT`:`_project`(例如 `alice_project`) +- `MVP_WANDB_RUN`:``(每次 attempt 唯一) + +2) **当 W&B 有效启用时注入** +- `WANDB_BASE_URL` +- `WANDB_API_KEY` +- `WANDB_MODE=online` +- `WANDB_DIR=/wandb`(例如 `/private/users/alice/jobs//wandb`) + +降级策略: +- 当 `tracking.wandb.enabled=true` 但缺少 `WANDB_API_KEY` 时,平台会**降级为 console**(并在 attempt.message 中记录 warning),避免训练失败。 + +### 2.4 WebUI 变更 + +1) **Login 页面** +- 增加 “Open W&B” 跳转(指向 `tracking.wandb.base_url`) + +2) **New Task 页面** +- 新增 **Evaluation example** +- Advanced example 更新为 v3.6: + - `command: |` 内不再包含任何注释(避免 YAML/命令解析报错) + - W&B 参数不再让用户手填,改为引用平台注入的 `${MVP_*}` env: + - `trainer.logger=${MVP_TRAINER_LOGGER}` + - `trainer.project_name=${MVP_WANDB_PROJECT}` + - `trainer.experiment_name=${MVP_WANDB_RUN}` + +> 备注:driver 日志里会打印 `MVP_DRIVER_EXEC: bash -lc '...'`,此处看到 `${MVP_*}` 仍是“未替换”的字符串是正常现象;变量替换发生在 `bash` 执行阶段,而不是打印 argv 阶段。 + +### 2.5 启动脚本 + +`src/mvp/scripts/60_start_api.sh` 支持将宿主机的 `WANDB_API_KEY` 透传进 head 容器内启动的 API server: + +- 宿主机设置:`export WANDB_API_KEY=...` +- 启动 API:脚本会 `docker exec -e WANDB_API_KEY=...` 进入 head 容器启动 `python3 /workspace/mvp/py/server.py` + +## 3. 用户侧操作流程(v3.6) + +### 3.1 一次性初始化(只在首次启用/清空 /vol 时需要) + +1) 打开 W&B UI:`http://:8090` +2) 在 System Admin 页面粘贴 license 完成初始化 +3) 生成并记录 `WANDB_API_KEY`(local key) +4) 以后启动 API server 时注入该 key(`WANDB_API_KEY=...`) + +只要保留 `shared/common/wandb`(即 `/vol` 持久化目录),重建容器无需再次进入 8090 配置。 + +### 3.2 日常使用 + +1) WebUI 登录:`http://:8080/ui/login`(输入 user token) +2) New Task 提交任务:`http://:8080/ui/tasks/new` +3) 到 Tasks 查看状态/日志:`/ui/tasks` 与 task detail +4) 打开 W&B:`http://:8090`,在 `_project` 下查看 runs/metrics + +## 4. 验收结果(本迭代应达成) + +1) PPO/GRPO/SFT 任一任务运行后: +- W&B local server 可见对应 project(如 `alice_project`) +- run name 与 `ray_submission_id` 对齐(便于追踪每次 attempt) + +2) Evaluation 示例: +- 可作为 Advanced 任务提交并在 Ray 上执行 `verl.trainer.main_eval` +- 支持用户在 command 内自行加入 reward overrides(平台不做封装) + +## 5. 已知限制与后续建议 + +1) **W&B 初始化自动化** +- 当前:首次仍需在 8090 页面粘贴 license、生成 key(更稳、侵入最小)。 +- 若需要“从零部署也完全免页面操作”,可进一步调研 W&B local 的可用管理 API/启动参数(自动注入 license + 自动创建 key)。 + +2) **Advanced command 的自由度** +- 平台只负责: + - `$HOME` 宏替换 + - runtime_env env_vars 注入 + - 任务队列与 Ray job 提交 +- command 的语义正确性仍由用户负责(例如 PPO 必需的 micro batch 等参数)。 + diff --git a/specs/mvp/v3.6/wandb.md b/specs/mvp/v3.6/wandb.md new file mode 100644 index 0000000..c7ddeda --- /dev/null +++ b/specs/mvp/v3.6/wandb.md @@ -0,0 +1,70 @@ + +# License + +License: +eyJhbGciOiJSUzI1NiIsImtpZCI6InUzaHgyQjQyQWhEUXM1M0xQY09yNnZhaTdoSlduYnF1bTRZTlZWd1VwSWM9In0.eyJjb25jdXJyZW50QWdlbnRzIjoxLCJ0cmlhbCI6ZmFsc2UsIm1heFN0b3JhZ2VHYiI6MTAsIm1heFRlYW1zIjowLCJtYXhVc2VycyI6MSwibWF4Vmlld09ubHlVc2VycyI6MCwibWF4UmVnaXN0ZXJlZE1vZGVscyI6MiwiZXhwaXJlc0F0IjoiMjAyNy0wMS0wNVQwMjoxMjo1MC4zMjRaIiwiZGVwbG95bWVudElkIjoiYzNmN2Y5N2ItMzAxOS00Nzk2LTkxYTgtZDUyMjc1NDBiMTI1IiwiZmxhZ3MiOltdLCJjb250cmFjdFN0YXJ0RGF0ZSI6IjIwMjYtMDEtMDVUMDI6MTI6NTAuMzI0WiIsImFjY2Vzc0tleSI6IjYxMGM5NjliLTk4ZWEtNGRhNS1iYzU1LWM2MzVlZWNhNzc0OCIsInNlYXRzIjoxLCJ2aWV3T25seVNlYXRzIjowLCJ0ZWFtcyI6MCwicmVnaXN0ZXJlZE1vZGVscyI6Miwic3RvcmFnZUdpZ3MiOjEwLCJleHAiOjE3OTkxMTUxNzAsIndlYXZlTGltaXRzIjp7IndlYXZlTGltaXRCeXRlcyI6bnVsbCwid2VhdmVPdmVyYWdlQ29zdENlbnRzIjowLCJ3ZWF2ZU92ZXJhZ2VVbml0IjoiTUIifX0.VADnc0PExWhGDAxMIbu0vlmPN423B398of4HFl6BMJ1vqGA9H1ESElOZfk0VQ0YnYgwZc_CZF9k0HRyfCBgRhtRKyB1PpGnaKT_kKNVQryykWRpNhnpDqhmTa-wfTUBXNxhu1ktNPKBFNaEbaYuPsLN_aXPGW0dDwp6coGnGEXEqdRmuvekE6ytu7t6IA6flYs35WqCojvvjAmfBdovo2zPTfmlqKeaz7GPrApMo9JBpmb1a6bZEjCoRhhUx_k-v2rbvE3hd9ix9_UMZ6siJ5IKtNuXy_cprcCXXIFVUMcfTnt78RRXY0jCRMQqWkNq9ZGF0Mgcjsh3ts9xSxPgWnw + +# License 限制 +Add License to your Local Instance +Create up to 0 teams +Create up to 1 users +Store up to 10 GB of data +Create up to 2 Registered Models + +Quickstart +On a machine with Docker and Python installed, run: +1 pip install wandb --upgrade +2 wandb server start +Generate a free license from the Deployer. +Add it to your W&B Server's localhost's settings. +Paste the license in the /system-admin page on your localhost + +# docker 部署 + +deployment: +version: "3.8" + +services: + wandb: + image: wandb/local:latest + container_name: wandb-local + ports: + - "8080:8080" + volumes: + - wandb_data:/vol + restart: unless-stopped + +volumes: + wandb_data: + + + +# 连接方式: +方式 B:环境变量(适合容器/批处理/CI) + +通过 ray job的runtime_env来设置环境变量 + +export WANDB_BASE_URL=http://<服务器IP或域名>:8080 +export WANDB_API_KEY=<你的API_KEY> + + +官方文档说明可以用 WANDB_BASE_URL + WANDB_API_KEY 代替 wandb login --host .. + + +# verl配置: +在 verl 里打开 wandb(你只需要配 trainer) + +verl 的配置里,最关键是这三个字段:trainer.logger、trainer.project_name、trainer.experiment_name。文档里也写了 logger 用于 console + tracking(tracking 会初始化 wandb)。 +veRL Documentation ++1 + +推荐写法(新版本): + +trainer: + logger: ["console", "wandb"] + project_name: my_project # 用argus的用户名_project ,譬如 alice_project + experiment_name: exp_001 # 用 task id 作为实验名 + + + + diff --git a/src/mvp/configs/dev.yaml b/src/mvp/configs/dev.yaml index 4f79fe6..de11c65 100644 --- a/src/mvp/configs/dev.yaml +++ b/src/mvp/configs/dev.yaml @@ -32,6 +32,16 @@ service: retry_interval_s: 60 max_running_tasks: 1 +tracking: + wandb: + # v3.6: enable Weights & Biases integration (best-effort). + # - If WANDB_API_KEY is missing, the platform degrades to console logging and records a warning. + enabled: true + # For dev compose, use docker bridge gateway + published port for stability. + base_url: "http://172.22.0.1:8090" + api_key_env: "WANDB_API_KEY" + project_suffix: "_project" + # v3.0: user data management (filesystem + SFTPGo) data: # All user writable data is placed under this root: diff --git a/src/mvp/configs/dev_v30.yaml b/src/mvp/configs/dev_v30.yaml index 3c2649d..131dd7c 100644 --- a/src/mvp/configs/dev_v30.yaml +++ b/src/mvp/configs/dev_v30.yaml @@ -32,6 +32,14 @@ service: retry_interval_s: 60 max_running_tasks: 1 +tracking: + wandb: + enabled: true + # For dev compose, recommend docker bridge gateway + host published port for stability. + base_url: "http://172.22.0.1:8090" + api_key_env: "WANDB_API_KEY" + project_suffix: "_project" + data: user_root: "/private/users" sftpgo: @@ -48,4 +56,3 @@ data: jobs_trash_after_days: 3 jobs_purge_after_days: 7 janitor_interval_s: 3600 - diff --git a/src/mvp/docker-compose.yaml b/src/mvp/docker-compose.yaml index f7d1991..1b8c86a 100644 --- a/src/mvp/docker-compose.yaml +++ b/src/mvp/docker-compose.yaml @@ -74,6 +74,27 @@ services: SFTPGO_HTTPD__BINDINGS__0__PORT: "8080" SFTPGO_SFTPD__BINDINGS__0__PORT: "2022" + # v3.6: Weights & Biases local server (shared single account; per-user projects). + # + # - UI: 8080 in container, mapped to host 8090 + # - Data: persist under /private/common/wandb (NFS/shared) + # + # NOTE: + # - The license/initial setup is done via the W&B UI. + # - Ray jobs use WANDB_BASE_URL from config (recommended: docker bridge gateway + host published port). + wandb: + image: wandb/local:latest + container_name: argus-wandb + ports: + - "8090:8080" + volumes: + - ../../shared/common/wandb:/vol + networks: + argus-ray-net: + aliases: + - wandb + - argus-wandb + ray_worker_0: image: argus/argus-ray-node:v2.5 container_name: argus-ray-worker-0 diff --git a/src/mvp/py/argus/ray/ray_job_tool.py b/src/mvp/py/argus/ray/ray_job_tool.py index a0077a2..52ce223 100644 --- a/src/mvp/py/argus/ray/ray_job_tool.py +++ b/src/mvp/py/argus/ray/ray_job_tool.py @@ -10,7 +10,7 @@ from typing import Any import ray from ray.job_submission import JobSubmissionClient -from .builders import build_advanced_argv, build_training_argv +from .builders import BuiltCommand, build_advanced_argv, build_training_argv from .models import AdvancedTaskSpec, JobSpec, RayConfig from .yaml_io import dump_yaml @@ -44,10 +44,17 @@ class RayJobTool: def _job_dir(self, submission_id: str) -> str: return f"{self.cfg.shared_root}/jobs/{submission_id}" - def _runtime_env(self, spec: JobSpec) -> dict[str, Any]: - return self._runtime_env_for(code_path=spec.code_path, workload=spec.workload) + def _runtime_env(self, spec: JobSpec, *, extra_env_vars: dict[str, str] | None = None) -> dict[str, Any]: + return self._runtime_env_for(code_path=spec.code_path, workload=spec.workload, extra_env_vars=extra_env_vars) - def _runtime_env_for(self, *, code_path: str, workload: str, extra_pythonpath: list[str] | None = None) -> dict[str, Any]: + def _runtime_env_for( + self, + *, + code_path: str, + workload: str, + extra_pythonpath: list[str] | None = None, + extra_env_vars: dict[str, str] | None = None, + ) -> dict[str, Any]: env_vars = dict(self.cfg.runtime_env_env_vars) # Default HF cache @@ -74,13 +81,29 @@ class RayJobTool: if workload == "sft": env_vars.setdefault("RAY_ADDRESS", "auto") + # Per-job extra env vars (e.g. W&B). Do not override existing keys. + if extra_env_vars: + for k, v in dict(extra_env_vars).items(): + if k not in env_vars: + env_vars[k] = str(v) + return {"env_vars": env_vars} - def submit(self, spec: JobSpec, no_wait: bool, job_dir: str | None = None) -> str: + def submit( + self, + spec: JobSpec, + no_wait: bool, + job_dir: str | None = None, + *, + extra_env_vars: dict[str, str] | None = None, + extra_overrides: list[str] | None = None, + ) -> str: submission_id = spec.submission_id or f"mvp11_{spec.workload}_{_ts()}_{os.getpid()}" job_dir = job_dir or self._job_dir(submission_id) built = build_training_argv(spec, submission_id=submission_id, job_dir=job_dir) + if extra_overrides: + built = BuiltCommand(argv=[*built.argv, *list(extra_overrides)]) entrypoint_argv = [ "python3", "-m", @@ -91,7 +114,7 @@ class RayJobTool: ] entrypoint = " ".join(shlex.quote(x) for x in entrypoint_argv) - runtime_env = self._runtime_env(spec) + runtime_env = self._runtime_env(spec, extra_env_vars=extra_env_vars) # Prepare job artifacts directory job_root = Path(job_dir) @@ -155,6 +178,8 @@ class RayJobTool: no_wait: bool, job_dir: str | None = None, user_id: str | None = None, + *, + extra_env_vars: dict[str, str] | None = None, ) -> str: submission_id = spec.submission_id or f"mvp11_{spec.workload}_{_ts()}_{os.getpid()}" job_dir = job_dir or self._job_dir(submission_id) @@ -174,7 +199,12 @@ class RayJobTool: if user_id: extra_pythonpath.append(f"{self.cfg.shared_root}/users/{user_id}/code") - runtime_env = self._runtime_env_for(code_path=self.cfg.verl_code_path, workload=spec.workload, extra_pythonpath=extra_pythonpath) + runtime_env = self._runtime_env_for( + code_path=self.cfg.verl_code_path, + workload=spec.workload, + extra_pythonpath=extra_pythonpath, + extra_env_vars=extra_env_vars, + ) # Prepare job artifacts directory job_root = Path(job_dir) diff --git a/src/mvp/py/argus/service/app.py b/src/mvp/py/argus/service/app.py index 7bcb2f0..faa7942 100644 --- a/src/mvp/py/argus/service/app.py +++ b/src/mvp/py/argus/service/app.py @@ -276,6 +276,14 @@ def create_app(config_path: str) -> FastAPI: "jobs_purge_after_days": int(v2_cfg.data.retention.jobs_purge_after_days), }, } + if v2_cfg.tracking.wandb.enabled: + suffix = v2_cfg.tracking.wandb.project_suffix or "_project" + out["wandb"] = { + "enabled": True, + # Training uses base_url; UI can also open the host port directly. + "base_url": v2_cfg.tracking.wandb.base_url, + "project_name": f"{user_id}{suffix}", + } if _sftpgo_enabled(): out["sftp"] = { "host": v2_cfg.data.sftpgo.host, @@ -429,7 +437,7 @@ def create_app(config_path: str) -> FastAPI: "error_summary": row.get("error_summary"), } if latest_attempt: - out["latest_attempt"] = { + latest_out: dict[str, Any] = { "attempt_no": latest_attempt["attempt_no"], "ray_submission_id": latest_attempt["ray_submission_id"], "ray_status": latest_attempt.get("ray_status"), @@ -438,6 +446,16 @@ def create_app(config_path: str) -> FastAPI: "failure_kind": latest_attempt.get("failure_kind"), "message": latest_attempt.get("message"), } + if v2_cfg.tracking.wandb.enabled: + suffix = v2_cfg.tracking.wandb.project_suffix or "_project" + # For v3.6: shared W&B account, user-level projects. + # Use attempt's ray_submission_id as run name for stable mapping. + latest_out["wandb"] = { + "base_url": v2_cfg.tracking.wandb.base_url, + "project_name": f"{str(row.get('user_id') or subject.get('user_id'))}{suffix}", + "run_name": str(latest_attempt.get("ray_submission_id") or ""), + } + out["latest_attempt"] = latest_out return out @app.get("/api/v2/tasks/{task_id}/spec") diff --git a/src/mvp/py/argus/service/config.py b/src/mvp/py/argus/service/config.py index 3ece213..193aef2 100644 --- a/src/mvp/py/argus/service/config.py +++ b/src/mvp/py/argus/service/config.py @@ -34,6 +34,19 @@ class V2RetentionConfig: janitor_interval_s: int = 3600 +@dataclass(frozen=True) +class V2WandbConfig: + enabled: bool = False + base_url: str = "" + api_key_env: str = "WANDB_API_KEY" + project_suffix: str = "_project" + + +@dataclass(frozen=True) +class V2TrackingConfig: + wandb: V2WandbConfig + + @dataclass(frozen=True) class V2SFTPGoConfig: enabled: bool = False @@ -57,6 +70,7 @@ class V2Config: auth: V2AuthConfig sqlite: V2SqliteConfig scheduler: V2SchedulerConfig + tracking: V2TrackingConfig data: V2DataConfig @staticmethod @@ -83,6 +97,13 @@ class V2Config: else: shared_root = str(root.get("shared_root") or "/private") + tracking = root.get("tracking") or {} + if not isinstance(tracking, dict): + raise ValueError("config.tracking must be a mapping") + wandb = tracking.get("wandb") or {} + if not isinstance(wandb, dict): + raise ValueError("config.tracking.wandb must be a mapping") + data = root.get("data") or {} if not isinstance(data, dict): raise ValueError("config.data must be a mapping") @@ -96,6 +117,11 @@ class V2Config: user_root = str(data.get("user_root") or f"{shared_root}/users") + wandb_enabled = bool(wandb.get("enabled") or False) + wandb_base_url = str(wandb.get("base_url") or "") + if wandb_enabled and not wandb_base_url: + raise ValueError("tracking.wandb.base_url is required when tracking.wandb.enabled=true") + return V2Config( api=V2ApiConfig( host=str(api.get("host") or "0.0.0.0"), @@ -108,6 +134,14 @@ class V2Config: retry_interval_s=int(scheduler.get("retry_interval_s") or 60), max_running_tasks=int(scheduler.get("max_running_tasks") or 1), ), + tracking=V2TrackingConfig( + wandb=V2WandbConfig( + enabled=wandb_enabled, + base_url=wandb_base_url, + api_key_env=str(wandb.get("api_key_env") or "WANDB_API_KEY"), + project_suffix=str(wandb.get("project_suffix") or "_project"), + ) + ), data=V2DataConfig( user_root=user_root, sftpgo=V2SFTPGoConfig( diff --git a/src/mvp/py/argus/service/scheduler.py b/src/mvp/py/argus/service/scheduler.py index c9b975e..4fb3fc1 100644 --- a/src/mvp/py/argus/service/scheduler.py +++ b/src/mvp/py/argus/service/scheduler.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os import re import time from dataclasses import dataclass @@ -48,6 +49,74 @@ class Scheduler: required = float(nnodes * n_gpus_per_node) return avail.total_available_gpus >= required + def _wandb_env_vars(self, *, ray_submission_id: str, job_dir: str) -> tuple[dict[str, str], str | None]: + """ + Returns (env_vars, warn_message). + + env_vars is always non-empty so that AdvancedTaskSpec examples can safely + reference injected env vars without requiring the user to edit their command: + - MVP_TRAINER_LOGGER: "console" or "[console,wandb]" + - MVP_WANDB_PROJECT: "_project" + - MVP_WANDB_RUN: "" + + When W&B is effectively enabled (config enabled + API key present), + WANDB_* env vars are included as well. + """ + env, warn, _enabled = self._tracking_env_vars(user_id=None, ray_submission_id=ray_submission_id, job_dir=job_dir) + return env, warn + + def _tracking_env_vars( + self, *, user_id: str | None, ray_submission_id: str, job_dir: str + ) -> tuple[dict[str, str], str | None, bool]: + """ + Returns (env_vars, warn_message, wandb_enabled_effective). + + - env_vars always includes MVP_* vars so advanced commands can use them. + - wandb_enabled_effective is True only when tracking.wandb.enabled AND api key exists. + """ + cfg = self.v2_cfg.tracking.wandb + project_suffix = cfg.project_suffix or "_project" + project_name = f"{user_id}{project_suffix}" if user_id else f"mvp{project_suffix}" + + api_key = os.environ.get(cfg.api_key_env, "").strip() + wandb_enabled_effective = bool(cfg.enabled and api_key) + warn: str | None = None + if cfg.enabled and not api_key: + warn = f"WARN_WANDB_DISABLED_MISSING_ENV:{cfg.api_key_env}" + + env: dict[str, str] = { + "MVP_TRAINER_LOGGER": ("[console,wandb]" if wandb_enabled_effective else "console"), + "MVP_WANDB_PROJECT": project_name, + "MVP_WANDB_RUN": ray_submission_id, + } + + if wandb_enabled_effective: + env.update( + { + "WANDB_BASE_URL": cfg.base_url, + "WANDB_API_KEY": api_key, + "WANDB_MODE": "online", + "WANDB_DIR": f"{job_dir.rstrip('/')}/wandb", + } + ) + + return env, warn, wandb_enabled_effective + + def _wandb_training_overrides(self, *, user_id: str | None, ray_submission_id: str) -> list[str] | None: + """ + Returns hydra overrides to enable W&B logging for built-in training workloads. + + Only call this when W&B is effectively enabled for the job (i.e. API key exists). + """ + cfg = self.v2_cfg.tracking.wandb + project_suffix = cfg.project_suffix or "_project" + project_name = f"{user_id}{project_suffix}" if user_id else f"mvp{project_suffix}" + return [ + "trainer.logger=[console,wandb]", + f"trainer.project_name={project_name}", + f"trainer.experiment_name={ray_submission_id}", + ] + def _parse_taskspec(self, jobspec_yaml: str) -> JobSpec | AdvancedTaskSpec: obj = yaml.safe_load(jobspec_yaml) or {} if not isinstance(obj, dict): @@ -70,21 +139,38 @@ class Scheduler: self.db.set_task_state(task_id=task_id, state="SUBMITTING", latest_attempt_no=attempt_no) # Override submission_id in taskspec (v1.1 compatible) + tracking_env, wandb_warn, wandb_enabled = self._tracking_env_vars( + user_id=user_id_s, ray_submission_id=ray_sid, job_dir=job_dir + ) if isinstance(spec, JobSpec): d = spec.to_public_dict() d["submission_id"] = ray_sid spec2 = JobSpec.from_dict(d) - submit = lambda: self.tool.submit(spec2, no_wait=True, job_dir=job_dir) + wandb_overrides = self._wandb_training_overrides(user_id=user_id_s, ray_submission_id=ray_sid) if wandb_enabled else None + submit = lambda: self.tool.submit( + spec2, + no_wait=True, + job_dir=job_dir, + extra_env_vars=tracking_env, + extra_overrides=wandb_overrides, + ) else: d = spec.to_public_dict() d["submission_id"] = ray_sid spec2 = AdvancedTaskSpec.from_dict(d) - submit = lambda: self.tool.submit_advanced(spec2, no_wait=True, job_dir=job_dir, user_id=user_id_s) + submit = lambda: self.tool.submit_advanced( + spec2, no_wait=True, job_dir=job_dir, user_id=user_id_s, extra_env_vars=tracking_env + ) try: submitted = submit() # submitted should equal ray_sid; keep as source of truth. - self.db.update_attempt(task_id=task_id, attempt_no=attempt_no, ray_status="SUBMITTED") + self.db.update_attempt( + task_id=task_id, + attempt_no=attempt_no, + ray_status="SUBMITTED", + message=wandb_warn, + ) self.db.set_task_state(task_id=task_id, state="SUBMITTED") if submitted != ray_sid: self.db.set_task_state(task_id=task_id, state="SUBMITTED", event_type="WARN_SUBMISSION_ID_MISMATCH") diff --git a/src/mvp/py/argus/service/ui.py b/src/mvp/py/argus/service/ui.py index 8a41ef4..5da48d7 100644 --- a/src/mvp/py/argus/service/ui.py +++ b/src/mvp/py/argus/service/ui.py @@ -188,11 +188,29 @@ def register_ui_routes(app: FastAPI) -> None:
(not loaded)
+
+
+

W&B

+
Weights & Biases local server (v3.6). Metrics are written by training jobs; this UI is for viewing.
+
+
+ Open W&B (:8090) + +
+
+
project: (unknown)
+
base_url (job runtime): (unknown)
+
""".strip() script = """ const tokEl = document.getElementById("tok"); const msg = document.getElementById("msg"); const me = document.getElementById("me"); +const wandbOpen = document.getElementById("wandb-open"); +const wandbProject = document.getElementById("wandb-project"); +const wandbBaseUrl = document.getElementById("wandb-base-url"); +document.getElementById("wandb-copy-project").onclick = async () => { await copyText(wandbProject.textContent || ""); }; +wandbOpen.href = curOriginWithPort(8090); tokEl.value = mvpTokenGet(); async function refreshMe() { @@ -200,8 +218,17 @@ async function refreshMe() { try { const obj = await apiJson("/api/v2/me"); me.textContent = fmtJson(obj); + if (obj.wandb && obj.wandb.enabled) { + wandbProject.textContent = obj.wandb.project_name || "(unknown)"; + wandbBaseUrl.textContent = obj.wandb.base_url || "(unknown)"; + } else { + wandbProject.textContent = "(disabled)"; + wandbBaseUrl.textContent = "(disabled)"; + } } catch (e) { me.textContent = "Error: " + (e.status || "") + "\\n" + (e.body || String(e)); + wandbProject.textContent = "(error)"; + wandbBaseUrl.textContent = "(error)"; } } @@ -358,19 +385,26 @@ val_file: /private/common/datasets/gsm8k_sft/test.parquet # 验证数据(必 # trainer_device: cpu # 仅 SFT 生效:driver 侧 device(可选,默认:cpu) # submission_id: "" # Ray submission_id(可选,默认空;通常由服务自动生成,无需填写) """.strip() - adv = """# Advanced TaskSpec (YAML) - v3.5 + adv = """# Advanced TaskSpec (YAML) - v3.6 kind: advanced # 任务类型(必填):advanced(自定义 command) -# 说明:v3.5 中 Advanced 任务不会按 ppo/grpo/sft 分类;平台统一按 "advanced" 做任务分类与 task_id 命名。 - -nnodes: 2 # 训练节点数(必填):用于平台队列调度与资源预检查 -n_gpus_per_node: 4 # 每节点 GPU 数(必填):用于平台队列调度与资源预检查 - -# 自定义训练命令(必填):平台会做 $HOME 宏替换: +# 说明:平台统一按 "advanced" 做任务分类与 task_id 命名(不按 ppo/grpo/sft 细分)。 +# +# 自定义训练命令:平台会做 $HOME 宏替换: # - $HOME -> /private/users/ # - $HOME/common/datasets -> /private/datasets(共享只读数据) # - $HOME/common/hf -> /private/hf(共享只读 HF cache) +# +# W&B(v3.6): +# - 平台会在 runtime_env 注入 WANDB_BASE_URL/WANDB_API_KEY/WANDB_DIR +# - 以及注入以下 env,供 Advanced command 使用(无需用户手动修改 project): +# - MVP_TRAINER_LOGGER: "console" 或 "[console,wandb]" +# - MVP_WANDB_PROJECT: "_project" +# - MVP_WANDB_RUN: "" +# +nnodes: 2 # 训练节点数(必填):用于平台队列调度与资源预检查 +n_gpus_per_node: 4 # 每节点 GPU 数(必填):用于平台队列调度与资源预检查 + command: | - # 注意:PPO 需要一些关键参数,否则 VERL 会在启动前 fail-fast(例如 actor 的 micro batch)。 PYTHONUNBUFFERED=1 \ python3 -m verl.trainer.main_ppo \ data.train_files=$HOME/common/datasets/gsm8k/train.parquet \ @@ -391,7 +425,9 @@ command: | critic.model.path=Qwen/Qwen2.5-0.5B-Instruct \ critic.ppo_micro_batch_size_per_gpu=4 \ algorithm.kl_ctrl.kl_coef=0.001 \ - trainer.logger=console \ + trainer.logger=${MVP_TRAINER_LOGGER} \ + trainer.project_name=${MVP_WANDB_PROJECT} \ + trainer.experiment_name=${MVP_WANDB_RUN} \ trainer.val_before_train=False \ trainer.nnodes=2 \ trainer.n_gpus_per_node=4 \ @@ -426,6 +462,32 @@ command: | --backend fsdp \ --local_dir $HOME/jobs//checkpoints//actor \ --target_dir $HOME/jobs//checkpoints//actor/huggingface +""".strip() + evaluation = """# Evaluation (YAML) - v3.6 (Advanced command) +# 用途:对“已生成的结果 parquet”做离线评估(基于 custom reward function),示例使用 VERL 内置 main_eval。 +# +# 说明: +# - 你需要准备一个包含生成 responses 的 parquet,并替换 (示例放在某个 job 目录下)。 +# - main_eval 会在 Ray 上并发计算,因此这里也用 +ray_kwargs 连接已有 Ray 集群。 +# +kind: advanced +nnodes: 1 +n_gpus_per_node: 0 + +command: | + PYTHONUNBUFFERED=1 \ + python3 -m verl.trainer.main_eval \ + data.path=$HOME/jobs//outputs/.parquet \ + +ray_kwargs.ray_init.address=auto + +# 可选:指定 parquet schema(按你的 parquet 列名调整) +# data.response_key=responses +# data.data_source_key=data_source +# data.reward_model_key=reward_model +# +# 可选:自定义 reward(方式 A:用户自行提供 reward.py) +# custom_reward_function.path=$HOME/code/reward.py +# custom_reward_function.name=compute_score """.strip() body = f"""

New Task

@@ -447,6 +509,7 @@ command: | +
@@ -603,21 +666,24 @@ command: | tpl_grpo = json.dumps(grpo) tpl_sft = json.dumps(sft) tpl_adv = json.dumps(adv) + tpl_eval = json.dumps(evaluation) tpl_merge = json.dumps(merge) script = ( """ -const msg = document.getElementById("msg"); -const yamlEl = document.getElementById("yaml"); -const TPL_PPO = __TPL_PPO__; -const TPL_GRPO = __TPL_GRPO__; -const TPL_SFT = __TPL_SFT__; -const TPL_ADV = __TPL_ADV__; -const TPL_MERGE = __TPL_MERGE__; -document.getElementById("tpl-ppo").onclick = () => { yamlEl.value = TPL_PPO; msg.textContent = ""; }; -document.getElementById("tpl-grpo").onclick = () => { yamlEl.value = TPL_GRPO; msg.textContent = ""; }; -document.getElementById("tpl-sft").onclick = () => { yamlEl.value = TPL_SFT; msg.textContent = ""; }; -document.getElementById("tpl-adv").onclick = () => { yamlEl.value = TPL_ADV; msg.textContent = ""; }; -document.getElementById("tpl-merge").onclick = () => { yamlEl.value = TPL_MERGE; msg.textContent = ""; }; + const msg = document.getElementById("msg"); + const yamlEl = document.getElementById("yaml"); + const TPL_PPO = __TPL_PPO__; + const TPL_GRPO = __TPL_GRPO__; + const TPL_SFT = __TPL_SFT__; + const TPL_ADV = __TPL_ADV__; + const TPL_EVAL = __TPL_EVAL__; + const TPL_MERGE = __TPL_MERGE__; + document.getElementById("tpl-ppo").onclick = () => { yamlEl.value = TPL_PPO; msg.textContent = ""; }; + document.getElementById("tpl-grpo").onclick = () => { yamlEl.value = TPL_GRPO; msg.textContent = ""; }; + document.getElementById("tpl-sft").onclick = () => { yamlEl.value = TPL_SFT; msg.textContent = ""; }; + document.getElementById("tpl-adv").onclick = () => { yamlEl.value = TPL_ADV; msg.textContent = ""; }; + document.getElementById("tpl-eval").onclick = () => { yamlEl.value = TPL_EVAL; msg.textContent = ""; }; + document.getElementById("tpl-merge").onclick = () => { yamlEl.value = TPL_MERGE; msg.textContent = ""; }; function yamlQuote(s) { s = String(s ?? ""); @@ -802,11 +868,12 @@ document.getElementById("submit").onclick = async () => { msg.textContent = "OK: " + fmtJson(obj); if (obj.task_id) window.location.href = "/ui/tasks/" + obj.task_id; }; -""".strip() + """.strip() .replace("__TPL_PPO__", tpl_ppo) .replace("__TPL_GRPO__", tpl_grpo) .replace("__TPL_SFT__", tpl_sft) .replace("__TPL_ADV__", tpl_adv) + .replace("__TPL_EVAL__", tpl_eval) .replace("__TPL_MERGE__", tpl_merge) ) return HTMLResponse(content=_page("New Task", "new", body, script)) @@ -827,6 +894,19 @@ document.getElementById("submit").onclick = async () => {
Loading...
+
+

W&B

+
This is a best-effort hint. Run name maps to ray_submission_id (attempt).
+
+
+ Open W&B (:8090) + +
+
+
project: (unknown)
+
run: (unknown)
+
+

TaskSpec (YAML)

Resolved TaskSpec (includes default values; submission_id reflects latest attempt when available).
@@ -836,6 +916,8 @@ document.getElementById("submit").onclick = async () => { """.strip() script = f""" document.getElementById("nav-ray-dashboard").href = curOriginWithPort(8265); +document.getElementById("wandb-open").href = curOriginWithPort(8090); +document.getElementById("wandb-copy-run").onclick = async () => {{ await copyText((document.getElementById("wandb-run").textContent || \"\").trim()); }}; const out = document.getElementById("out"); const spec = document.getElementById("spec"); async function refresh() {{ @@ -844,7 +926,18 @@ async function refresh() {{ const resp = await apiFetch("/api/v2/tasks/{task_id}"); const text = await resp.text(); if (!resp.ok) {{ out.textContent = "Error: " + resp.status + "\\n" + text; return; }} - out.textContent = fmtJson(JSON.parse(text)); + const obj = JSON.parse(text); + out.textContent = fmtJson(obj); + const p = document.getElementById("wandb-project"); + const r = document.getElementById("wandb-run"); + const w = (obj.latest_attempt && obj.latest_attempt.wandb) ? obj.latest_attempt.wandb : null; + if (w) {{ + p.textContent = w.project_name || "(unknown)"; + r.textContent = w.run_name || "(unknown)"; + }} else {{ + p.textContent = "(not available)"; + r.textContent = "(not available)"; + }} const resp2 = await apiFetch("/api/v2/tasks/{task_id}/spec"); const text2 = await resp2.text(); diff --git a/src/mvp/py/tests/test_app.py b/src/mvp/py/tests/test_app.py index fd97d19..9b4b566 100644 --- a/src/mvp/py/tests/test_app.py +++ b/src/mvp/py/tests/test_app.py @@ -164,6 +164,37 @@ def test_task_submit_get_cancel_logs_queue(tmp_path: Path, monkeypatch): assert r5.text.strip() == "c" +def test_me_includes_wandb_when_enabled(tmp_path: Path, monkeypatch): + from argus.service import app as app_mod + + cfg_path = _write_config(tmp_path) + # Enable tracking.wandb + cfg = yaml.safe_load(cfg_path.read_text(encoding="utf-8")) + cfg["tracking"] = {"wandb": {"enabled": True, "base_url": "http://172.22.0.1:8090"}} + cfg_path.write_text(yaml.safe_dump(cfg), encoding="utf-8") + + monkeypatch.setenv("MVP_INTERNAL_TOKEN", "token1") + + class _Scheduler: + def __init__(self, **kwargs): + self.tool = object() + + def run_forever(self, stop_flag): + return None + + monkeypatch.setattr(app_mod, "Scheduler", _Scheduler) + app = app_mod.create_app(str(cfg_path)) + + with TestClient(app) as c: + r = c.get("/api/v2/me", headers={"authorization": "Bearer token1"}) + assert r.status_code == 200 + obj = r.json() + assert obj["user_id"] == "admin" + assert obj.get("wandb", {}).get("enabled") is True + assert obj["wandb"]["base_url"] == "http://172.22.0.1:8090" + assert obj["wandb"]["project_name"] == "admin_project" + + def test_submit_rejects_non_mapping_jobspec(tmp_path: Path, monkeypatch): from argus.service import app as app_mod diff --git a/src/mvp/py/tests/test_scheduler.py b/src/mvp/py/tests/test_scheduler.py index b6c929a..1502f02 100644 --- a/src/mvp/py/tests/test_scheduler.py +++ b/src/mvp/py/tests/test_scheduler.py @@ -60,10 +60,21 @@ def test_tick_submits_one_task(monkeypatch, tmp_path: Path): def __init__(self, cfg): self.submitted = [] self.job_dirs = [] + self.extra_env = [] + self.extra_overrides = [] - def submit(self, spec, no_wait: bool, job_dir: str | None = None): + def submit( + self, + spec, + no_wait: bool, + job_dir: str | None = None, + extra_env_vars: dict | None = None, + extra_overrides: list[str] | None = None, + ): self.submitted.append(spec.submission_id) self.job_dirs.append(job_dir) + self.extra_env.append(extra_env_vars) + self.extra_overrides.append(extra_overrides) return str(spec.submission_id) def status(self, submission_id: str): @@ -83,6 +94,11 @@ def test_tick_submits_one_task(monkeypatch, tmp_path: Path): assert len(attempts) == 1 assert attempts[0]["ray_submission_id"] == "t1--a01" assert s.tool.job_dirs[-1] == "/private/users/alice/jobs/t1--a01" + env = s.tool.extra_env[-1] + assert env and env["MVP_WANDB_PROJECT"] == "alice_project" + assert env["MVP_WANDB_RUN"] == "t1--a01" + assert env["MVP_TRAINER_LOGGER"] == "console" + assert s.tool.extra_overrides[-1] is None def test_tick_submits_one_task_advanced(monkeypatch, tmp_path: Path): @@ -118,13 +134,23 @@ def test_tick_submits_one_task_advanced(monkeypatch, tmp_path: Path): def __init__(self, cfg): self.submitted = [] self.job_dirs = [] + self.extra_env = [] def submit(self, spec, no_wait: bool, job_dir: str | None = None): raise AssertionError("should not call submit() for advanced") - def submit_advanced(self, spec, no_wait: bool, job_dir: str | None = None, user_id: str | None = None): + def submit_advanced( + self, + spec, + no_wait: bool, + job_dir: str | None = None, + user_id: str | None = None, + extra_env_vars: dict | None = None, + extra_overrides: list[str] | None = None, + ): self.submitted.append(spec.submission_id) self.job_dirs.append(job_dir) + self.extra_env.append(extra_env_vars) return str(spec.submission_id) def status(self, submission_id: str): @@ -144,6 +170,252 @@ def test_tick_submits_one_task_advanced(monkeypatch, tmp_path: Path): assert len(attempts) == 1 assert attempts[0]["ray_submission_id"] == "t1--a01" assert s.tool.job_dirs[-1] == "/private/users/alice/jobs/t1--a01" + env = s.tool.extra_env[-1] + assert env and env["MVP_WANDB_PROJECT"] == "alice_project" + assert env["MVP_WANDB_RUN"] == "t1--a01" + assert env["MVP_TRAINER_LOGGER"] == "console" + + +def test_tick_injects_wandb_env_when_enabled(monkeypatch, tmp_path: Path): + from argus.service import scheduler as sched_mod + + root = { + "ray": { + "address": "http://127.0.0.1:8265", + "shared_root": "/private", + "entrypoint_resources": {"worker_node": 1}, + "runtime_env": {"env_vars": {}}, + }, + "service": { + "sqlite": {"db_path": str(tmp_path / "mvp.sqlite3")}, + "scheduler": {"tick_s": 1, "retry_interval_s": 1, "max_running_tasks": 1}, + }, + "tracking": {"wandb": {"enabled": True, "base_url": "http://172.22.0.1:8090"}}, + } + ray_cfg, v2_cfg = RayConfig.from_dict(root), V2Config.from_root_dict(root) + db = Db(v2_cfg.sqlite.db_path) + db.init() + db.create_task_v25( + task_id="t1", + user_id="alice", + workload="ppo", + jobspec_yaml=yaml.safe_dump( + { + "workload": "ppo", + "code_path": "/private/common/code/verl", + "model_id": "m", + "train_file": "/private/common/datasets/t", + "val_file": "/private/common/datasets/v", + } + ), + nnodes=2, + n_gpus_per_node=4, + ) + + monkeypatch.setenv("WANDB_API_KEY", "k") + monkeypatch.setattr(sched_mod, "ensure_ray_connected", lambda: None) + monkeypatch.setattr( + sched_mod, + "get_cluster_available", + lambda: SimpleNamespace(total_available_gpus=999.0, total_available_npus=0.0), + ) + + class _Tool: + def __init__(self, cfg): + self.extra_env = [] + self.job_dirs = [] + + def submit( + self, + spec, + no_wait: bool, + job_dir: str | None = None, + extra_env_vars: dict | None = None, + extra_overrides: list[str] | None = None, + ): + self.job_dirs.append(job_dir) + self.extra_env.append(extra_env_vars) + return str(spec.submission_id) + + def status(self, submission_id: str): + return "RUNNING" + + def logs(self, submission_id: str): + return "" + + monkeypatch.setattr(sched_mod, "RayJobTool", _Tool) + + s = sched_mod.Scheduler(db=db, ray_cfg=ray_cfg, v2_cfg=v2_cfg) + s.tick() + + assert s.tool.job_dirs[-1] == "/private/users/alice/jobs/t1--a01" + env = s.tool.extra_env[-1] + assert env and env["WANDB_API_KEY"] == "k" + assert env["WANDB_BASE_URL"] == "http://172.22.0.1:8090" + assert env["WANDB_MODE"] == "online" + assert env["WANDB_DIR"] == "/private/users/alice/jobs/t1--a01/wandb" + assert env["MVP_WANDB_PROJECT"] == "alice_project" + assert env["MVP_WANDB_RUN"] == "t1--a01" + assert env["MVP_TRAINER_LOGGER"] == "[console,wandb]" + + +def test_tick_wandb_enabled_missing_key_degrades(monkeypatch, tmp_path: Path): + from argus.service import scheduler as sched_mod + + root = { + "ray": { + "address": "http://127.0.0.1:8265", + "shared_root": "/private", + "entrypoint_resources": {"worker_node": 1}, + "runtime_env": {"env_vars": {}}, + }, + "service": { + "sqlite": {"db_path": str(tmp_path / "mvp.sqlite3")}, + "scheduler": {"tick_s": 1, "retry_interval_s": 1, "max_running_tasks": 1}, + }, + "tracking": {"wandb": {"enabled": True, "base_url": "http://172.22.0.1:8090"}}, + } + ray_cfg, v2_cfg = RayConfig.from_dict(root), V2Config.from_root_dict(root) + db = Db(v2_cfg.sqlite.db_path) + db.init() + db.create_task_v25( + task_id="t1", + user_id="alice", + workload="ppo", + jobspec_yaml=yaml.safe_dump( + { + "workload": "ppo", + "code_path": "/private/common/code/verl", + "model_id": "m", + "train_file": "/private/common/datasets/t", + "val_file": "/private/common/datasets/v", + } + ), + nnodes=2, + n_gpus_per_node=4, + ) + + monkeypatch.delenv("WANDB_API_KEY", raising=False) + monkeypatch.setattr(sched_mod, "ensure_ray_connected", lambda: None) + monkeypatch.setattr( + sched_mod, + "get_cluster_available", + lambda: SimpleNamespace(total_available_gpus=999.0, total_available_npus=0.0), + ) + + class _Tool: + def __init__(self, cfg): + self.extra_env = [] + + def submit( + self, + spec, + no_wait: bool, + job_dir: str | None = None, + extra_env_vars: dict | None = None, + extra_overrides: list[str] | None = None, + ): + self.extra_env.append(extra_env_vars) + return str(spec.submission_id) + + def status(self, submission_id: str): + return "RUNNING" + + def logs(self, submission_id: str): + return "" + + monkeypatch.setattr(sched_mod, "RayJobTool", _Tool) + + s = sched_mod.Scheduler(db=db, ray_cfg=ray_cfg, v2_cfg=v2_cfg) + s.tick() + + env = s.tool.extra_env[-1] + assert env and env["MVP_WANDB_PROJECT"] == "alice_project" + assert env["MVP_WANDB_RUN"] == "t1--a01" + assert env["MVP_TRAINER_LOGGER"] == "console" + attempts = db.list_attempts("t1") + assert attempts and "WANDB_API_KEY" in str(attempts[0].get("message") or "") + + +def test_tick_wandb_enabled_updates_jobspec_logger(monkeypatch, tmp_path: Path): + from argus.service import scheduler as sched_mod + + root = { + "ray": { + "address": "http://127.0.0.1:8265", + "shared_root": "/private", + "entrypoint_resources": {"worker_node": 1}, + "runtime_env": {"env_vars": {}}, + }, + "service": { + "sqlite": {"db_path": str(tmp_path / "mvp.sqlite3")}, + "scheduler": {"tick_s": 1, "retry_interval_s": 1, "max_running_tasks": 1}, + }, + "tracking": {"wandb": {"enabled": True, "base_url": "http://172.22.0.1:8090"}}, + } + ray_cfg, v2_cfg = RayConfig.from_dict(root), V2Config.from_root_dict(root) + db = Db(v2_cfg.sqlite.db_path) + db.init() + db.create_task_v25( + task_id="t1", + user_id="alice", + workload="ppo", + jobspec_yaml=yaml.safe_dump( + { + "workload": "ppo", + "code_path": "/private/common/code/verl", + "model_id": "m", + "train_file": "/private/common/datasets/t", + "val_file": "/private/common/datasets/v", + } + ), + nnodes=2, + n_gpus_per_node=4, + ) + + monkeypatch.setenv("WANDB_API_KEY", "k") + monkeypatch.setattr(sched_mod, "ensure_ray_connected", lambda: None) + monkeypatch.setattr( + sched_mod, + "get_cluster_available", + lambda: SimpleNamespace(total_available_gpus=999.0, total_available_npus=0.0), + ) + + class _Tool: + def __init__(self, cfg): + self.specs = [] + self.extra_overrides = [] + + def submit( + self, + spec, + no_wait: bool, + job_dir: str | None = None, + extra_env_vars: dict | None = None, + extra_overrides: list[str] | None = None, + ): + self.specs.append(spec) + self.extra_overrides.append(extra_overrides) + return str(spec.submission_id) + + def status(self, submission_id: str): + return "RUNNING" + + def logs(self, submission_id: str): + return "" + + monkeypatch.setattr(sched_mod, "RayJobTool", _Tool) + + s = sched_mod.Scheduler(db=db, ray_cfg=ray_cfg, v2_cfg=v2_cfg) + s.tick() + + spec = s.tool.specs[-1] + # v3.6: built-in training should be configured to use wandb when enabled and API key exists. + assert spec.workload == "ppo" + ov = s.tool.extra_overrides[-1] + assert ov and "trainer.logger=[console,wandb]" in ov + assert ov and "trainer.project_name=alice_project" in ov + assert ov and "trainer.experiment_name=t1--a01" in ov def test_tick_marks_pending_resources(monkeypatch, tmp_path: Path): diff --git a/src/mvp/py/tests/test_service_config.py b/src/mvp/py/tests/test_service_config.py index 9fe7226..d75b93f 100644 --- a/src/mvp/py/tests/test_service_config.py +++ b/src/mvp/py/tests/test_service_config.py @@ -22,6 +22,7 @@ def test_v2_config_from_root_dict_new_format_defaults(): assert cfg.auth.token_env == "X" assert cfg.sqlite.db_path.endswith(".sqlite3") assert cfg.scheduler.max_running_tasks == 3 + assert cfg.tracking.wandb.enabled is False def test_v2_config_backward_compat_v2_section_and_default_db_path(): @@ -29,6 +30,7 @@ def test_v2_config_backward_compat_v2_section_and_default_db_path(): cfg = V2Config.from_root_dict({"shared_root": "/private", "v2": {"sqlite": {}}}) assert cfg.sqlite.db_path == "/private/common/db/mvp.sqlite3" + assert cfg.tracking.wandb.enabled is False def test_v2_config_requires_mappings(): @@ -53,3 +55,49 @@ def test_v2_config_requires_data_mappings(): with pytest.raises(ValueError, match="config\\.data\\.\\{sftpgo,retention\\} must be mappings"): V2Config.from_root_dict({**base, "data": {"sftpgo": ["x"], "retention": {}}}) + + +def test_tracking_wandb_defaults_disabled(): + from argus.service.config import V2Config + + cfg = V2Config.from_root_dict( + { + "ray": {"shared_root": "/private"}, + "service": {"api": {}, "auth": {}, "sqlite": {}, "scheduler": {}}, + "data": {"sftpgo": {}, "retention": {}}, + } + ) + assert cfg.tracking.wandb.enabled is False + assert cfg.tracking.wandb.base_url == "" + assert cfg.tracking.wandb.api_key_env == "WANDB_API_KEY" + assert cfg.tracking.wandb.project_suffix == "_project" + + +def test_tracking_wandb_enabled_parses(): + from argus.service.config import V2Config + + cfg = V2Config.from_root_dict( + { + "ray": {"shared_root": "/private"}, + "service": {"api": {}, "auth": {}, "sqlite": {}, "scheduler": {}}, + "tracking": {"wandb": {"enabled": True, "base_url": "http://127.0.0.1:8090", "api_key_env": "X"}}, + "data": {"sftpgo": {}, "retention": {}}, + } + ) + assert cfg.tracking.wandb.enabled is True + assert cfg.tracking.wandb.base_url == "http://127.0.0.1:8090" + assert cfg.tracking.wandb.api_key_env == "X" + + +def test_tracking_wandb_enabled_requires_base_url(): + from argus.service.config import V2Config + + with pytest.raises(ValueError, match="tracking\\.wandb\\.base_url is required"): + V2Config.from_root_dict( + { + "ray": {"shared_root": "/private"}, + "service": {"api": {}, "auth": {}, "sqlite": {}, "scheduler": {}}, + "tracking": {"wandb": {"enabled": True, "base_url": ""}}, + "data": {"sftpgo": {}, "retention": {}}, + } + ) diff --git a/src/mvp/py/tests/test_ui.py b/src/mvp/py/tests/test_ui.py index 8255fbf..d110c9e 100644 --- a/src/mvp/py/tests/test_ui.py +++ b/src/mvp/py/tests/test_ui.py @@ -93,5 +93,35 @@ def test_ui_new_task_contains_advanced_example_snippet(tmp_path, monkeypatch): # workload is not needed for advanced in v3.5. assert "# workload:" not in r.text assert "actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu" in r.text + # v3.6: Advanced example uses platform-injected env vars so users don't need to edit W&B project/run. + assert "trainer.logger=${MVP_TRAINER_LOGGER}" in r.text + assert "trainer.project_name=${MVP_WANDB_PROJECT}" in r.text + assert "trainer.experiment_name=${MVP_WANDB_RUN}" in r.text assert "Model merge example" in r.text assert "verl.model_merger" in r.text + + +def test_ui_new_task_contains_evaluation_example(tmp_path, monkeypatch): + cfg = _write_config(tmp_path) + monkeypatch.setenv("MVP_INTERNAL_TOKEN", "admin-token") + app = create_app(str(cfg)) + c = TestClient(app) + + r = c.get("/ui/tasks/new") + assert r.status_code == 200 + assert "Evaluation example" in r.text + assert "verl.trainer.main_eval" in r.text + assert "data.path=$HOME/jobs//outputs/.parquet" in r.text + assert "+ray_kwargs.ray_init.address=auto" in r.text + + +def test_ui_login_contains_wandb_section(tmp_path, monkeypatch): + cfg = _write_config(tmp_path) + monkeypatch.setenv("MVP_INTERNAL_TOKEN", "admin-token") + app = create_app(str(cfg)) + c = TestClient(app) + + r = c.get("/ui/login") + assert r.status_code == 200 + assert "W&B" in r.text + assert "Open W&B" in r.text diff --git a/src/mvp/scripts/00_prereq_check.sh b/src/mvp/scripts/00_prereq_check.sh index c6335df..af85e02 100755 --- a/src/mvp/scripts/00_prereq_check.sh +++ b/src/mvp/scripts/00_prereq_check.sh @@ -31,6 +31,10 @@ echo "[host] ensure shared dirs exist under ../../shared" mkdir -p "${ROOT_DIR}/../../shared"/{datasets,hf,jobs,outputs,ray,common,user} mkdir -p "${ROOT_DIR}/../../shared/common"/{code,datasets,models} mkdir -p "${ROOT_DIR}/../../shared/user"/{code} +# v3.6: W&B local server persists metadata under /private/common/wandb (mounted as /vol). +# The wandb container runs as a non-root user; ensure the bind mount is writable. +mkdir -p "${ROOT_DIR}/../../shared/common/wandb" +chmod 777 "${ROOT_DIR}/../../shared/common/wandb" 2>/dev/null || true echo "[host] ensure verl repo exists under ../../verl (required by prepare scripts)" if [[ ! -d "${ROOT_DIR}/../../verl" ]]; then diff --git a/src/mvp/scripts/60_start_api.sh b/src/mvp/scripts/60_start_api.sh index 3c18ae6..ab04e12 100755 --- a/src/mvp/scripts/60_start_api.sh +++ b/src/mvp/scripts/60_start_api.sh @@ -25,6 +25,9 @@ fi env_args=(-e "MVP_INTERNAL_TOKEN=${MVP_INTERNAL_TOKEN}") # If host does not provide it, fall back to the dev default used by docker-compose (kept in sync). env_args+=(-e "SFTPGO_ADMIN_PASSWORD=${SFTPGO_ADMIN_PASSWORD:-my-dev-sftpgo-admin}") +if [[ -n "${WANDB_API_KEY:-}" ]]; then + env_args+=(-e "WANDB_API_KEY=${WANDB_API_KEY}") +fi docker exec -d "${env_args[@]}" "${HEAD_CONTAINER}" bash -lc "nohup python3 /workspace/mvp/py/server.py --config '${CONFIG_IN_CONTAINER}' >>'${LOG_PATH}' 2>&1 & echo \$! >'${PID_PATH}'"