-
Notifications
You must be signed in to change notification settings - Fork 884
feat: support for Flux Framework as HPC manager #3064
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This pull request adds support for Flux Framework as an HPC workload manager plugin for the Kubeflow Trainer. Flux Framework provides sophisticated resource management, supports multiple MPI variants, and enables distributed HPC workloads in Kubernetes environments.
Key Changes
- Implements a new Flux plugin that integrates with the Kubeflow Trainer runtime framework
- Adds automatic Flux installation via init containers and configuration management through ConfigMaps and Secrets
- Provides support for both batch execution and interactive HPC cluster modes
Reviewed changes
Copilot reviewed 33 out of 33 changed files in this pull request and generated 14 comments.
Show a summary per file
| File | Description |
|---|---|
| pkg/runtime/framework/plugins/flux/*.go | Core plugin implementation including broker configuration, curve certificate generation, hostlist management, and command extraction |
| pkg/runtime/framework/plugins/flux/*_test.go | Comprehensive test coverage for plugin functionality |
| pkg/runtime/framework/plugins/registry.go | Registers the Flux plugin in the framework |
| pkg/runtime/runtime.go | Extends RuntimePolicy to include FluxPolicySource |
| pkg/apis/trainer/v1alpha1/trainingruntime_types.go | Adds FluxMLPolicySource type definition with numProcPerNode parameter |
| pkg/apis/trainer/v1alpha1/zz_generated.* | Generated code for deepcopy, openapi specs, and API types |
| pkg/client/applyconfiguration/**/*.go | Generated apply configurations for Flux types |
| manifests/base/crds/*.yaml | Updated CRDs to include Flux policy configuration |
| charts/kubeflow-trainer/crds/*.yaml | Updated Helm chart CRDs |
| examples/flux/*.yaml | Example runtime and TrainJob configurations demonstrating LAMMPS workload |
| examples/flux/README.md | Comprehensive documentation for using the Flux plugin |
| api/python_api/**/*.py | Python API updates to support Flux policy types |
| api/openapi-spec/swagger.json | OpenAPI specification updates |
| build.sh | Development helper script (should be removed per PR description) |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
api/python_api/kubeflow_trainer_api/models/trainer_v1alpha1_flux_ml_policy_source.py
Show resolved
Hide resolved
api/python_api/kubeflow_trainer_api/models/trainer_v1alpha1_hpcml_policy_source.py
Show resolved
Hide resolved
Pull Request Test Coverage Report for Build 21196269867Details
💛 - Coveralls |
3b23be6 to
022656a
Compare
andreyvelich
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for this effort @vsoch!
I left my initial comments.
/assign @akshaychitneni @astefanutti @Electronic-Waste @tenzen-y
Appreciate your review too!
| // Generate hostlists. The hostname (prefix) is the trainJob Name | ||
| // We need the initial jobset size, and container command | ||
| size := getJobSetSize(trainJob) | ||
| hosts := generateHostlist(trainJob.Name, size) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Check this how we get the host list:
| hostFile.WriteString(fmt.Sprintf("%s slots=%d\n", e, slots)) |
You can extract the address of the Pods by using Endpoint from PodSet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you show me what one of those addresses look like? Generally we don't want the entire address, but a pattern (and range) that describes it. The code there appears to be generating a massive list of host, which won't scale nicely for a config file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like this: trainjob-node-1-0.trainjob.
We use this in our hostfile configuration for the default MPI plugin.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
okay - sounds like the fully qualified name isn't enabled (the bit with the cluster.local). We will need that for flux.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you need cluster.local since it tries to reach the pods inside the cluster?
For MPI hostfile it works well. Do you want to try to use the same hostnames in Flux config?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the broker setup, I was never able to get it to work without the full name. I don't remember the details (this was many years ago), but I am sure about that. We also can't assume that we will always be connecting to only local nodes, or even Kubernetes. For context, this is built into the bootstrap config. Here is an example:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking at this again - is there any reason we cannot use the method that we currently have to generate the hosts? It's fairly simple and seems to work OK.
|
Thank you @andreyvelich - I will get started on these changes right away. I wanted to get a GPU example in and was testing with AWS Trainium - the CPU example worked beautifully but I couldn't get the Trainium devices to work (in any context, even with their tutorials, etc). I think we will get there (we have a great collaborator there!), but in the meantime I'm going to try a small example on Google Cloud, likely with any small GPU I can get. I will keep you in the loop to my progress, update the PR, and we will be attending the next Kubeflow meeting to discuss any details that come up. |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
a35f80f to
278cd0e
Compare
Flux supports the majority of MPI flavors/variants, and can be used to bootstrap MPI as a plugin. It adds other features for scheduling and topology that can be used for simulations and ai/ml jobs. This changeset adds the plugin implementation, including the plugin module, tests, and an example with a small README to serve as documentation for the time being. Signed-off-by: vsoch <vsoch@users.noreply.github.com>
Signed-off-by: vsoch <vsoch@users.noreply.github.com>
| // Ensure we don't have an initContainer named flux-installer | ||
| js, ok := runtime.TemplateSpecApply[v1alpha2.JobSetSpecApplyConfiguration](runtimeInfo) | ||
| if !ok || js == nil { | ||
| return nil, allErrs |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing specific error message for this case?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What would the error look like if it isn't in reference to a specific field on a spec? This is a general "There is no runtime info and there should be" error.
|
OK - one of the changes above actually seems to have broken the entire setup, because we don't have a view and are running lammps independently on each pod. I need to revert everything and start over. |
|
Still no go. The lesson here is not to rebase until the end - one of the changes (maybe to move between files, etc) completely broke the setup, and I don't have the original version that I spent a long time on. There is no longer an init container, even when I move back to what is here. I don't know this will be done by mid- February @andreyvelich. Update: I was able to restore back to (mostly) what (I think) I had, and the configmap and secret are generating again. I think there is still one bug to work through before I start this new work, but I'm relieved that it's partially back. This week is going to be busy so I'll set expectations for next weekend or after for another update. |
Sounds good, thank you for your work! Let us know if you have any additional questions for the runtime extension framework. |
This pull request adds Flux Framework as a plugin to the Kubeflow Trainer. 🌀
Overview
Flux supports the majority of MPI flavors/variants, and can be used to bootstrap MPI as a plugin. It adds other features for scheduling and topology that can be used for simulations and ai/ml jobs. This changeset adds the plugin implementation, including the plugin module, tests, and an example with a small README to serve as documentation for the example.
What this PR does / why we need it:
See https://github.com/kubeflow/trainer/tree/master/docs/proposals/2841-flux-hpc. To summarize, Flux Framework supports more MPI variants out of the box than the current MPI plugin. It brings more scheduling features, topology awareness, higher throughput, and dynamism / elasticity of the scheduler and jobs. See https://github.com/kubeflow/trainer/tree/master/docs/proposals/2841-flux-hpc#motivation. For full provenance / history, here is the initial discussion in the Kubeflow Trainer meeting.
Which issue(s) this PR fixes
Fixes #2841 (and note here, we should follow up with discussion on next steps for scoped issues)
Checklist:
See kubeflow/website#4283
@andreyvelich some notes for you.
ApplyConfiguration. If I made a mistake in design or process please tell me directly, and give a pointer to a correct way to go about it.Here is the first completion of LAMMPS. When you remove the command it turns into an interactive minicluster (fairly simple / straight-forward I think).
Thanks in advance for the review! I won't be able to finish the PR work tonight (figuring out the linting still) but I'll pick up tomorrow after some sleep. Really excited about this.
cc @milroy