ubc-cirrus-lab / caribou

Caribou is a framework for running and deploying complex serverless workflows multi-constraint and multi-objective aware on hyper-scalers over multiple regions.
Other
6 stars 0 forks source link

Caribou-Go: Moving Monte-Carlo Simulation to Go #282

Closed pjavanrood closed 1 month ago

pjavanrood commented 1 month ago

Moving Monte-Carlo Simulation to Go, closes:

This PR has two main components:

caribou-go/ mirrors the functionality of the SimpleDeploymentMetricsCalculator.

The Go source code is compiled into a shared library, allowing it to be called from Python. The integration between Go and Python is managed through the GoDeploymentMetricsCalculator.

Data is passed between the Python and Go components using named pipes. On the Python side, this communication is handled by GoDeploymentMetricsCalculator, while on the Go side, it's managed in main/deploymentcalculator.go.

github-actions[bot] commented 1 month ago

Coverage

Coverage Report
FileStmtsMissCoverMissing
caribou/common
   utils.py37878%43–58
caribou/common/models
   endpoints.py34391%18–19, 50
caribou/common/models/remote_client
   aws_remote_client.py4786686%42, 65, 105, 151, 216, 252, 269–270, 298–299, 338, 349, 359, 392–394, 402–403, 422–424, 443, 467, 480–481, 484, 490, 530–532, 570–572, 590–591, 632, 638, 648, 652, 663–664, 672–673, 682, 686, 697, 707–709, 729, 740–742, 762, 777–779, 794–799, 827–828, 832, 848–852, 858–859
   remote_client_factory.py21386%21–23
caribou/data_collector/components
   data_collector.py18194%23
   data_exporter.py34294%49, 56
caribou/data_collector/components/carbon
   carbon_collector.py21290%34–35
   carbon_retriever.py1341887%25, 59, 93, 135–144, 148, 153, 160, 168–169, 215, 246, 249, 256
caribou/data_collector/components/performance
   performance_retriever.py38684%44, 50–51, 56–59
caribou/data_collector/components/provider
   provider_collector.py24292%43–44
   provider_retriever.py2945083%24, 32, 34, 47, 59, 77, 84, 100, 132–152, 183–281, 299–304, 336, 344, 346, 348, 350, 352, 354, 356, 432, 446, 556, 649
caribou/data_collector/components/workflow
   workflow_collector.py25196%34
   workflow_retriever.py30510964%216–257, 280, 330–337, 339, 371–414, 436, 467–526, 533–563, 566–583, 587–604, 615, 676, 698
caribou/data_collector/utils/latency_retriever
   aws_latency_retriever.py74988%59, 63, 65, 67, 70, 74, 76, 78, 81
   latency_retriever.py6183%8
caribou/deployment/client
   caribou.py16194%22
   caribou_workflow.py46513571%54, 70–71, 80–83, 129, 201–223, 267–268, 282, 315–326, 347–354, 380–391, 434–454, 562, 578, 581, 636–662, 667–683, 705–715, 793, 796, 798, 800, 802, 804, 831, 866–881, 916–917, 927–931, 961, 996, 1004, 1016–1096, 1109–1138, 1172–1181, 1212, 1245, 1273–1282, 1302–1320, 1340, 1353–1359, 1365
caribou/deployment/common/config
   config.py83199%104
caribou/deployment/common/deploy
   deployer.py1381688%43, 94–101, 187, 228–230, 237, 244, 255
   deployment_packager.py1924577%31, 34, 39, 63–70, 73–84, 90, 96, 101, 106, 128, 156, 169, 182, 190, 251–253, 259–274, 284, 286, 288, 291
   executor.py53492%32–33, 66, 68
   workflow_builder.py1711392%43, 59, 146, 178, 186, 189, 191, 196, 205, 208, 210, 324, 330
caribou/deployment/common/deploy/models
   function.py41295%40, 51
   function_instance.py12283%16, 22
   iam_role.py34391%19–21
   instructions.py18289%17, 26
   resource.py18194%25
   workflow.py1923283%37, 42, 64, 74, 96, 117, 163, 168, 203, 216–228, 269, 278, 286, 290, 295–324
caribou/deployment/common/deploy_instructions
   aws_deploy_instructions.py23291%35, 81
   deploy_instructions.py52983%57, 93, 143, 149, 162, 166, 170, 174, 180
caribou/deployment/common/factories
   deploy_instruction_factory.py18383%20–22
   deployer_factory.py1071685%24–27, 41, 52–53, 82, 90, 99, 108, 119, 126–129
caribou/deployment/server
   re_deployment_server.py61592%36, 48, 51, 58, 107
caribou/deployment_solver
   workflow_config.py751185%24, 26, 32–33, 54–56, 61, 79, 82, 107
caribou/deployment_solver/deployment_algorithms
   coarse_grained_deployment_algorithm.py25292%27, 32
   deployment_algorithm.py981189%52, 91, 105, 118, 132, 149, 184–190, 219
   fine_grained_deployment_algorithm.py25292%38, 43
   stochastic_heuristic_deployment_algorithm.py921485%18–25, 49, 59, 71, 92, 95, 100, 106–109, 119, 136, 163, 170
caribou/deployment_solver/deployment_input
   input_manager.py1995572%126, 132, 135, 194, 200, 246–254, 276–282, 291–294, 304–307, 320–339, 352–373, 379–387, 441–442, 476–487, 493–495, 501
caribou/deployment_solver/deployment_input/components/calculators
   carbon_calculator.py96496%124–128, 214, 261
   cost_calculator.py70199%163
   runtime_calculator.py1091190%130–145, 152, 201, 209, 262, 295
caribou/deployment_solver/deployment_input/components/loaders
   carbon_loader.py21386%22, 43, 46
   datacenter_loader.py49590%106–111, 114
   performance_loader.py18194%38
   region_viability_loader.py17288%15, 32
   workflow_loader.py1472682%86, 102–112, 122, 145, 165, 183, 193, 210, 264–276, 292, 364–369, 392, 430–432, 437
caribou/deployment_solver/deployment_metrics_calculator
   deployment_metrics_calculator.py40198%49
   go_deployment_metrics_calculator.py513139%18–21, 25–27, 41–50, 53, 64–73, 76–80, 83–85, 88–89
   simple_deployment_metrics_calculator.py1291787%125–142, 170–171, 203–204, 220–223, 235–236, 251
caribou/deployment_solver/deployment_metrics_calculator/models
   workflow_instance.py1948258%84–95, 107, 141–144, 183–186, 194–196, 203–227, 238–269, 275–289, 308–441, 520
caribou/deployment_solver/models
   indexer.py17194%25
caribou/deployment_solver/ranker
   ranker.py62494%14, 26–27, 95
caribou/endpoint
   client.py1312085%46, 56, 104, 126–129, 140, 167, 183, 185, 222–226, 231–232, 236–239
caribou/monitors
   deployment_manager.py1341887%64, 70, 81, 100, 122–127, 164–169, 184, 207, 222, 228, 263, 283
   monitor.py8188%12
caribou/syncers
   log_sync_workflow.py52129044%108, 163–173, 178, 186, 193, 203, 210, 248–254, 256, 258, 260, 262, 264, 268, 272, 274, 276, 279–285, 288, 292, 302–369, 378–385, 395–463, 472–475, 480–495, 506–597, 610–664, 674–700, 705–722, 727–744, 758, 765–788, 797–798, 808, 813–819, 846–847, 849–850, 855–856, 890–897, 901, 938, 940, 945, 979, 983–986, 994–1004, 1007–1013, 1016–1027, 1030
   log_syncer.py42198%46
caribou/syncers/components
   execution_data.py74495%76, 86, 129, 137
   workflow_run_sample.py83693%136, 145–149
TOTAL6367119781% 

Tests Skipped Failures Errors Time
640 0 :zzz: 0 :x: 0 :fire: 19.903s :stopwatch:
engshahrad commented 1 month ago

I agree with Viktor. Let's merge the code to have just one repo. Having a separate repo and using it as a submodule adds unnecessary complexity. I was always under the impression that using a separate repo was for easy testing, but that we'll be integrating all code inside the main caribou repo.

pjavanrood commented 1 month ago

Thank you both @vGsteiger and @engshahrad for your comments, as you both mentioned, I have added the Go source code as well, and we will keep everything in the same repo. I'm sorry for the confusion.

pjavanrood commented 1 month ago

I am not very familiar with the Go language, so my review primarily focuses on the overall structure and its similarity to the Python implementation. I was able to successfully run the Go solver on my end, and I can confirm that the results are very similar to those of the Python solver. However, I did spot some minor issues, including one potential mistranslation in the carbon calculator.

Additionally, I was wondering if it's possible to modify the constant variables to load directly from constants.py. This would help avoid the need to update both the constants file and the individual Go file separately, improving maintainability. If you believe this is feasible and worthwhile, could you create an issue for this? There's no need to include this change in the current PR.

I also noticed that almost every Go function has a corresponding unit test, except for inputmanager.go. This might have been overlooked.

Overall, great work!

Thanks for your review, Daniel! I addressed the changes you mentioned and also created an issue for automatically syncing constants between Python and Go (#291 )