Submind YouTube summaries
Thumbnail for RCE 117: PMIx

RCE 117: PMIx

Watch on YouTube

Video summary

PMIx, which stands for PMI Exascale Process Management Interface, has evolved from an initial sub-project into a comprehensive community dedicated to standardizing how applications interact with system management stacks. Originally designed to help MPI applications exchange addressing information and wire themselves up efficiently, PMIx now serves as a flexible framework allowing applications to request various services from resource managers like Slurm or Torque without being locked into specific proprietary implementations. The core philosophy of the project is that it acts purely as a communication channel; it does not execute logic itself but rather transmits requests made by an application's client library to the local system management stack and returns responses, thereby preserving the right for resource managers to decline unsupported features gracefully. The primary motivation behind PMIx was to address scaling limitations inherent in older methods that relied on command-line arguments or out-of-band broadcasts, which became impractical as job sizes grew into the millions of processes required for exascale computing. By shifting much of the necessary endpoint discovery and resource information directly from the resource manager to the application at launch time via a standardized interface, PMIx significantly reduces startup latency while maintaining backward compatibility through simple key-value attribute extensions rather than changing APIs. This architecture allows applications to receive critical network address details upfront without needing to broadcast them among peers after starting up, resulting in compact launch messages that remain under one megabyte even for massive clusters with millions of processes due to efficient compression techniques used by the resource managers. Beyond high-performance computing and MPI workloads, PMIx enables a wide range of advanced use cases including cloud-native applications that can negotiate preemption policies or request additional resources dynamically based on billing models. The interface also supports heterogeneous environments where applications can query available hardware accelerators like GPUs across different nodes to optimize task distribution through handshake mechanisms. Furthermore, the ecosystem includes robust debugging capabilities and logging features that allow developers to insert custom messages into job records or report system-wide issues back to schedulers using binary payloads, effectively turning the resource manager into an intelligent partner rather than just a passive scheduler. The PMIx community is driven by collaboration among major industry players such as Intel, IBM, Mellanox, and various national laboratories like Los Alamos and Livermore, alongside contributors from Slurm developers and other middleware projects. The standardization process follows the IETF model involving weekly teleconferences where proposals are reviewed against prototype implementations before acceptance into the specification. This open-source initiative utilizes a permissive three-clause BSD license to ensure broad adoption across both proprietary and free software environments, fostering an unprecedented level of coordination between fabric providers, file system teams, library developers, and resource managers who all contribute code or shape standards together to create a unified environment for scientific computing at scale.
Read the full video transcript
[Music] welcome to another edition of rce again this is brock palin you can find us online at rce-cast.com where you can find over 100 episodes about research computing scientific computing and other topics i have again here jeff squires from cisco systems and one of the authors of openmpi jeff what's going on hey brock today we actually have one of my colleagues from the openmpi community here today to talk about what kind of started as a sub project but has grown into an entire community and project uh unto itself so i think i'm just gonna jump right in here and say ralph i wonder if you could introduce yourself yeah sure my name is ralph castain i'm a principal engineer from intel corporation uh been working on openmpi with jeff for a long time now and we are we started this pmix community that jeff asked me to come here and talk about today all right so ralph uh you you said the keyword right there pmix uh why don't you give us the two minute version what what is it yeah so it pmi x stands for pmi exascale process management interface exascale and basically what it is is a it's a standardized way for applications to interact with the system management stack like the resource manager and things like that you know to request services of various types and uh and be able to get a response back so what is a uh history of pmix because i think there's some other pmis out there yeah there are um pmi uh originally started you know quite a while back now as a way of having the uh providing a way for applications to wire themselves up so they'd be able to exchange addressing information basically to say how do i talk to you um but over time what happened was that the uh the needs grew to where the application needed to be able to interact over broader topics and so uh pmix kind of grew from that as a response to that to say let's give you more ways to interact okay so you said a second ago that this is dealing with resource managers i assume you're talking about like torque and slurm and lsf and all the others that are out there but what exactly does that mean what what does an application need to get from resource managers so there's there's really two things or two types of things that they do first off when you're launching a resource manager can provide you with all kinds of information about your job that's really helpful when you're trying to optimize communications and collective operations so they can tell you uh you know where all the your your peers are located uh what addresses they have etc that's information you can have at the very beginning so you don't have to exchange it afterwards then the other things that you you know that you want to do is for example you might want to ask for additional allocations of resources or uh or maybe you want to spawn additional processes so there are these kinds of services uh you know what is what's the status of cues and things like that that applications as they're evolving really want to be able to do and so in my limited world view here i i think of this is applicable to mpi applications and so when you talk about wire up and communications and things like that you're referring to mpi applications of any scale honestly from you know two processes to two million processes that when they start up they need to exchange mpi addressing stuff to get their ethernet addresses or their infiniband addresses or their whatever type of networking addresses so that if i mpi send to you then i know how to open a network channel to you that's the kind of stuff you're talking about yeah in part that certainly is is in there but it's also applicable to non-mpi processes so um let me give you an example say i'm in a cloud and uh and i'm running an application it doesn't have to be an mpi application any application in the cloud well there are things like for example when i get started i can use pmix to communicate to the cloud manager that i'm willing to be preempted and that now can be a service kind of thing you know where hey if you're willing to be preempted you get a different rate on your charges so i can now announce to the to the uh to the cloud manager that i'm willing to be preempted and i can use the pmix mechanisms that the cloud manager can tell me hey i need to preempt you now and wait for me to say back that i'm ready so i go ahead and checkpoint my job or do whatever i need to do to prepare for it then i get to tell the cloud manager back you know i'm ready to be preempted now so there's a whole bunch of things like that that you can do that's got nothing to do with mpi [Music] so is this almost like a operating kind of like a message bus where different clients can basically say this is what i'm able or willing to do exactly right uh one of the uh mantras we have in the pmix world is that pmix does nothing all it does is it communicates your request to the local system management stack and returns the response back so that that management stack always has the right to say you know nice i'm glad you asked that but i don't support it and you have to have your in your application some you know mechanism for dealing with a not supported response but but all the things you know people talk about with flexible workflows and the ability you know to manage their own environment better stuff we just provided the the hooks by which you can do that so is this done like a core plus extensions like if my client doesn't know about something like how it seems like you could keep adding more and more information that you could be announcing that you're capable of doing or communicating with how do you make sure that things can remain compatible between adding more and more things being mentioned or announced well we uh we adopted an architecture that says uh we have very very simple apis and select job controls where you announce for example that i am preemptable there's just one job control api and then you can provide a an array of key value attributes to that to that api that actually you know describe what the uh the operation that you want to do so you know if we want to extend the kind of things that you can do like for a job control i want to add something beyond just you know announcing that i'm preemptable or whatever we don't change the api we don't add another api we just give you a new key value attribute that you can pass and so that that's how we maintain backward compatibility uh we just we don't we have just a policy we do not add apis unless there simply is nothing that fits and then we'll add one so what exactly is the big deal here because way back at the beginning and again i'm i'm admittedly taking a limited world view of mpi applications but i understand this applies well beyond that as well but we used to just do ssh and pass things on the command line like if i want to start a 32 process or 128 process mpi job we could just do ssh and maybe do that a little smartly maybe via tree or something so that it wasn't linear why why do we need all this extra control stuff um of what used to be a relatively straightforward process well okay so there's there's two different parts to that well one is you know if you're looking at an mpi job which i know is is your your focus jeff the uh the problem is there's only so much you can pass on on a command line and so as your job gets bigger or as the amount of information that you want to pass gets larger you just can't fit it on the command line anymore and so you need some secondary mechanism for for making that uh for passing that information around what we used to do was uh was the pmi approach right which was to say well we'll take you know everybody will since we have a limit on on the command line we only use the command line for what we have to and then everybody simply broadcasts that and there's some out of band mechanism by which it gets exchanged and that has all the scaling issues and so that's why we went this way is saying well let's let's get back to that basic thing give a mechanism by which the resource manager can convey that information to you outside of the command line limitations okay so this is a way for applications to talk to the resource manager but how does that address that i'm process a and i want to communicate with process b and i therefore i need to know some kind of network address for process b how does that work so uh yeah so the way we did that in the past right was that process a would discover a network address he would broadcast it to everybody and process b would then receive that broadcast say oh okay i could communicate to you what we've done is that when the resource manager is getting ready to start the job we've given them an api a function they can call that will talk to the network and find out what are the addresses that are going to be used by the different processes what nodes are they going to be on and what addresses are they going to be assigned to and then we include that in the information that's given every process when it first starts up and so when the when the process first starts up process a starts up it can ask what's the address for process b and it already has that information there so is this something for end users or is this just something for like creators of mpi libraries like openmpi and other types of higher level tools that users interact with it's just between the creators of those middleware projects and the resource managers or is this something that a user can directly interact with yeah it's really both i i this so the libraries uh you know open in mpi libraries the openshm libraries etc uh they embed interactions uh that that use these pmix uh interfaces to do their basic you know wire up and and other operations that they do but then the application developers themselves are using it because they're the ones who know how they want you know their application has certain workflow requirements you know they want to be able to allocate more new resources or whatever they want to do they use it directly themselves and then you are seeing people embed it in tools so you know for example if i might have write this tool that allows me to launch jobs it says certain command line options and everything that i really like in the past you'd write that but it would be specific to the resource manager that you were locally using now you can write it with pmi x instead and take that same software and simply move it from one resource manager environment to another without having to change any of the code okay so this is really talking about just having a portable standard api that multiple resource managers and middleware developers can develop to correct okay so this does not necessarily replace something like let's say the task manager you know tm spawn inside something like one of the pbs derivatives out there because pmi x doesn't actually again do anything but now openmpi doesn't develop to tm spawn and all the other different interfaces out there they just developed a pmix that's exactly correct yeah openmpi calls pmix spawn and pmix takes care of the abstraction for it so just to nail this down then you're saying pmix is a library is that right it's actually three pieces uh first there's a there's an actual standard and uh and that just defines the apis and and uh and defines a set of attributes you know key value attributes uh that we all agreed that we would support or at least recognize but that says nothing in it at all about implementation and people are always free to implement it themselves the second piece is an actual reference implementation that's a complete library both client and server and that fully implements all the all the pmix function calls so again all it does is communicate so the client function calls communicate to the server function calls that then call the relevant backend resource manager functions uh to actually do something then the third piece is we actually have a reference server it's uh it's it's a runtime if you will it looks just like a resource manager that supports pmix with the exception that doesn't have a scheduler in it and so if somebody wants for example to develop some stuff pmix-based code in an environment that doesn't yet support pmix itself they can run this reference server in that environment and it operates just as if it was sitting in a pmix uh resource manager except for like i said it doesn't do scheduling so those three elements are what we mean when we talk about the pmix community okay so you're then also implying here that the resource managers out there are also supporting pimx directly is that a correct inference they are um some of them already do uh slurm for example has been doing it for uh for a year and a half now and uh ibm has been developing their job step manager uh and that that is you know really based on pimx uh our pmix all across the board and others are coming along at various stages so yeah eventually we we do hope that uh that most of the if not all of the resource managers out there will in fact provide that support directly now that's actually a a pretty fascinating place then that if applications have um one you know a standard that they can write to to do their large scale applications like mpi is one of the biggest but there are others out there and then also the runtimes have a standard to talk to the backend schedulers well that would also be fantastic because as you and i both know maintaining um you know the mpi implementation to talk to all these different resource managers who have different abstractions and different apis and whatnot it was kind of a nightmare so since this is a a fairly large disruption in this community how did you manage to pull this off well um the you know being having some role in openmpi obviously put me in contact with a lot of these people to begin with like you said we had to talk to them because of the infra interfaces we had to provide so there was some personal contact uh involved in that as well but the uh you know the real thing was that this was a need that all of us that were involved in these communities you know the resource manager folks etc we all knew we needed to do something and some of the resource manager folks had already been starting to write proprietary responses to it which was what was causing a lot of consternation in the user community because you kind of had to lock your application then into that environment which is you know something people really don't like to do so it was a recognized need out there and the real key thing i believe in that that led us get the adoption by the resource manager guys uh was the the stipulation that that the resource manager always has the right to say not supported so uh so you know if you don't want to for example say you don't want to support a particular backend capability you just provide a null in that function pointer and the pimx server if it gets a request for that will see the null on the back again and just return and not support it for you so you don't have to do anything uh if you if you want to support that cape that that function but maybe you don't support every option that somebody could pass well you have the right to be able to look at those options and say you know i'm sorry i don't support that and reply back so i think that not supported ability uh was the thing it was one of the key things so a second part of this inference uh of you know the the resource managers supporting pimx natively are they writing their own code uh their own implementation from scratch or are they using your reference implementation and then as a consequence of that is there a standardized network protocol that you use because then you can divorce the software implementation from what is communicated across the network so uh they're all free to write their own code so far nobody has done that and there's no indications that somebody wants to do that um the we did not we did not standardize the protocol between the client and the server so if somebody writes their own and it it's incompatible well that's you know you just have to make sure that you link against this the the same client library that they used you know they have to provide both a server and a client library but the apis would be the same to be compatible like i say so far nobody has gone that route it's a lot of code to write and nobody has seen a proprietary or a competitive advantage i should say in implementing their own the competitive what's happened is the competitive basis between the resource environments has shifted from the apis to what level you know which apis they support on the back end and which ones they don't okay so one of the goals of pmix is you know you've got exascale right in the name of it um what exactly does pmix bring to the table if it doesn't actually do anything that gets you that extreme scale well the it's really again in in two pieces if you will um the exascale uh requires uh that you be able to you know be first off you have to be able to launch the job in a reasonable amount of time if you if you just took the current method of broadcasting and sharing things you know next scale machine might take you know tens of minutes to start up a job that size and that's obviously that's something you really don't we would not like to see so um part of that is is the ability to then have the resource manager share the information that it already has i mean when we went back and looked at what was actually being broadcast around it turned out that more than 90 percent of that information the resource manager already knew but it didn't have a mechanism a standardized mechanism by which it could share it to the application so either the application had to come up with a you know a resource manager specific way of dealing with that communication or we had to standardize it so the library could be portable and so we took the approach of saying look the resource manager already knows a lot of this stuff let's go ahead and just give them a standardized way of communicating it then the second half of that was we had to go to the resource manager guys and say there's an additional 10 percent of the information that we would need and if we had that we wouldn't have to broadcast anything and we had to get them to agree to provide that ten percent and and uh that's we were able to do finally is to get get a a commitment from them and so we created a list it's on the web uh that has here's a list of all the stuff we need and the resource manager guys are going through and filling that list in so aren't you just moving like all the startup time from the mpi you know like runtime you know wire up whatever you guys call that very first step to get everything going aren't you just shifting that problem to the resource manager how you know normally it's not the individual nodes on you know resource whatever the resource manager has run into individual nodes it has a lot of this information right like how i i'm not seeing yet quite how this actually benefits if if all the information still just kind of held in one place on one part is just now into resource manager okay well let's let's take the uh the endpoint information as an example so uh the way it works today all right in the past has been that uh the application process starts it it it discovers a resource let's just let's use sockets as an example it opens a socket and gets a socket id uh socket number and then it has to broadcast that because none of its peers know what socket it's listening on so one way you could address that was be to assign static sockets to your processes and then you don't need to exchange the socket information anymore because you can compute what socket they're on but the problem is you might not be the only application running on that node and so you don't know what sockets you can actually take so what we now do is we say okay resource manager you use the pmix plug-in for the for fabric that plug-in will manage a pool of sockets based on its knowledge of what's being run across across the different jobs across different nodes and it will use that to assign static uh socket numbers for this app for this application those numbers then are included when the resource manager sends its launch message out to the to the compute nodes that information goes along with it so instead of having an exchange the daemons are given before they even start the political processes they are given all that endpoint information and they just simply convey it down to their local clients and that eliminates the need for each client to broadcast that information so if you go through and you look at what what pieces of information the different libraries are asking for you make that laundry list up and and then you ask the resource manager the workload manager when it sends the launch message out to the individual nodes you ask it to include all that information for every node in that message and so now you just use tcp sockets as an example and that's kind of a baseline but uh many more high-end hpc environments for example use other types of networking and there are several available so this i just want to clarify that tcp was just an example you can do the same thing regardless of the backend type of network right that's correct and we already do um support those at least at least all of the uh the most popular ones uh but basically yeah that's right you you know the the uh the network interface support in pmix and the server side is just a set of plugins so there are plugins you know for all your favorite flavors of fabric and we in those plug-ins we've worked with the network manufacturers to get those plug-ins available and those plug-ins are all now capable of creating those addresses for you and so just to drill down on this a little bit more so not only are you making the data available let me just provide one thing that was kind of an inference there was that when you say it's sent out to the daemons you mean it sent once to each uh let's just say node or server on the network even though that's kind of an amorphous term but like once and then if you've got 20 or 30 or 40 or more cores on that server that damon receives the information once and can locally give that information to all of the processes that start up whether it's 20 30 or 40 using local ipc not networking ipc right that's one of the wins that is one of the wins that's correct all right and then additionally on top of that you also do some compression types of techniques in the launch message that's sent via pimx right well the pimx doesn't send the launch message the resource manager does we just provide the information for them that we say look this information needs to go along uh here's a payload that has all the information that we need you to take along you'd be surprised the information is not as big as you might think our typical launch message uh our pmix-enabled launch message from like slurm for example is less than a megabyte because there's so much uh you know we compress obviously anything we're going to provide up to slurm slur just gets it as a as a blob and just sends it along but you know slurm use you know other and all the resource managers do they use like regular expressions to describe where the processes are located and things to try and keep the the launch message down so it really is only about a megabyte in size or so even for an exascale size machine ah that was that was my next question so a megabyte for how many like what what scale how many processes are you talking there well we've been launching uh in our in our biggest test cases uh a million processes on like 30 000 nodes and that that's about you know about one one and a half megabyte launch message so it's not very big [Music] so what about use cases besides mpi i know that's where this kind of started but you also talked about you know on cloud how you could say you're preemptable has there been any implementations um that kind of touch on one of those other examples uh yeah uh there are the um and i i apologize that i cannot i'm not at liberty to give you you know names and details but because those companies haven't taken it you know public yet but but there are people working on uh you know cloud uh interactions like we talked about earlier there are also people working on uh different kinds of tools you know that can take advantage of it you know debugger tools etc that can use these kind of interfaces to do more than they do today for example on a debugger today you get a a node level representation of where everything is and there's a limited amount of you know of information that you can provide because the interface is limited so but with a pmi x interface you could ask for example to show the nodes in a network-based layout where are they on the network relative to each other the processes i should say where they are relative on the network to each other you could ask the fabric for traffic reports and show where choke points are because the interfaces allow you to be able to make that query to the system management stack and be able to get that kind of information back now you said something a minute ago that i kind of want to dive into a little bit you said you were testing at a million processes how do you test at that scale well we have uh friendly users at uh who at facilities that have these kind of big machines and they will generally take a little bit of time out and run some tests for us which has been very much appreciated we also have ways to simulate scale so for example we can launch multiple processes on a given node and make them look like they're sitting on different nodes and so one of our our collaborators was kind enough to do that on amazon where he in fact takes a small number of amazon nodes but makes it look from a pmix standpoint like a much much bigger cluster and we can do some scaling tests on that that may not be you know fully uh realistic in terms of a cluster but gives some pretty good scaling law measurements um so we have ways of getting that information even when we can't get a hold of the big clusters so could pmix help in heterogeneous environments by this i mean what if i have you know hybrid systems are popping up all over the place where you have sometimes you have accelerators and nodes you might have fpgas are coming back on the market as alternative types and you know like for me at the university of michigan our cluster has different machines of different architecture types with different accelerators is this a way that a given application could basically optimize for whatever machine it landed on by asking the system do you have these things i know about yeah you could query what you know what resources are available to me there are there are coordination mechanisms in pmix that might allow you for example to say well if i i don't see or i have only four gpus on my machine how many of you got on yours oh well maybe then we use a coordinate we handshake and play you go ahead and run something over there so there are these mechanisms in place i i don't think that everybody that we have really fully understood everything we can do with pmix the community has been trying to come up with you know just trying to enable people to experiment with it and then the expectation is that people are going to do things with it that are beyond anything we had in mind but that feedback will come in and then we'll be able to perhaps offer better mechanisms for them to do some of those things but i i think this is we've never had this kind of capability before to be honest with you and we're kind of feeling our way at the moment to say well you know is this is this useful to you and how might you use it uh and and hopefully you know the community have a chance to try and test those things out so you had mentioned earlier too that you know you could ask the fabric you know how congested you are in different places and with more complex fabrics especially on the bigger system that's definitely useful but even on regular systems we might have you know in you know fabric islands or you might have a dual fat tree or something like that is there a way or is anybody doing anything where you could effectively choose say an optimized collective operation between hosts based on you know effectively the fabric architecture which again the application can find out about by asking through one of these standard interfaces i i don't think anybody has done that yet again i think that's one of those things that what we're looking to see is you know given the given people these tools that they can do that we expect researchers in particular to start asking those kind of questions and i believe that there are groups in fact that are starting to ask exactly that kind of a question about the collective optimization uh but i don't think they have published anything yet and this really only goes one direction right now and by that i mean if an application encounters an error condition that is could be system related uh think of like the pbs health check i can't use the pmi interface to send information back to the resource manager or to some sort of metric system or something like that uh well you can there's there's two ways that you can do that uh one is you could just raise an event and uh and we support complete binary uh payloads and we actually take care of heterogeneity for you so you can put binary numbers in there whatever you want to do and then the event when you raise it you have the ability to pass however much information you want in there so you could raise an event to the resource manager saying hey i saw something here's a complete blob of information about it um and then the resource manager can do something with that obviously you have to have some kind of a of a agreement with the resource manager that hey you're going to listen for that event and b you have some idea what you're going to do with it but uh but you also have the ability to uh to log so one of these people asked for was they said well you know if i see something or if i just want to even log that i have a certain amount of progress and i want to stick that in my job record so every resource manager keeps a record of the job that you could go back and look at see what happened you can actually insert messages into that log from the application and that way you know there's a when you get the official uh job record of what the job did you how much resources it used etc those messages will be there for you so you can record them for yourself or you can try and communicate them to the resource manager now one thing you've been very consistent about uh through this whole discussion is you've been saying a lot of we and the community this and the community that who is involved in the community well uh you know intel obviously through me and then there's uh melanox is with us on ibm uh those three are probably the biggest uh code contributors at the moment but you know we have a list of others you know fujitsu is involved folks from wrist we have livermore and los alamos from the national lab community that have been involved uh and then there's been you know slurm the sket md guys the altair pbs guys have been there so there's there's a and i'm probably leaving some folks out that i'll have to apologize to afterwards because there's about about 12 to 15 active members at this point in time and these are members who like you you mentioned uh the first several of them were code contributors to the the open source pimx code base itself but these other members are helping to shape the standard right i mean it's not just about contributing code right that's right that's right the uh every everybody participates all of those people participate in the uh in the standards process which is based on the ietf mechanism so there's always an rfc that that has to be you know backed up by a prototype implementation which is usually in the reference library it doesn't have to be but it has to be visible and then it goes through review it goes through uh uh comments and then uh we have weekly teleconferences and uh at those weekly teleconferences we schedule and and have a a review of those those proposals and then those things get accepted or rejected usually accepted into the standard so all those groups participate in that okay so this really is quite a bit more than just ralph's little toy this is a full-on community that is full of all the interested parties across this vertical right yeah yeah you know it really is a lot more than that than me and uh and i should give credit to everybody that's involved is it's a lot of work from everybody's standpoint you know part of it what you have to understand is that you know it's you can create this channel by which these two parties can communicate but there's a lot of work behind the scenes that has to happen that the resource manager guys have to agree they're going to provide and then like for example you have to go to the fabric people and say hey guys we need you to provide this this endpoint information blob etc that's work on their part that they have to do to provide that information or if you're going to talk to the file system guys and you say well you know we need you to be able to pre-cache files for us when we tell you or tell us how long it's going to take them to retreat to be retrieved that's work they have to do so it's really a collaboration across all these different elements that makes it possible so it seems very flexible what's the strangest or probably in this case more unexpected use of pmix you've seen so far uh the one that surprised me the most was a request really from the uh from the cloud some people working in the cloud world where they wanted to be able to loan i think i missed this earlier they want to be able to loan resources back so uh they actually have workflows where they they you know they need a an envelope of resources uh eventually at some points in their computation or their work but there are times when they don't need it don't need all of it and you know so i i had never anticipated somebody actually loaning resources back to the system and getting them back later that that to me was a surprise that last point was one i really wanted to get across it really involves all these different parties actively collaborating because that's what's really different in my mind with pimx versus before is it's the first time i'm aware at least of you know the resource manager the fabric the file system the library guys language library guys all getting on a weekly telecon collaborating on how they're going to orchestrate this application environment all right so there's a lot of open source code here um you must have a fairly permissive license that you distribute this under because some of these resource managers are closed source and proprietary what what license are you using we use the three clause bsd so it's uh it's absorbable by people using you know gnu license as as well as you know proprietary people they're all welcome to use it so uh ralph thanks a lot for your time where can people find out more about pmix and get involved the probably the first place to start would be going to github everything's on github for pmi x so the uh the reference page for for pmx itself is pmix.github.io pmix or you can go to the code repository itself uh there's a group because we have both the uh implementation as well as the uh reference server there and that's at github.com pmix okay ralph thanks a lot for your time thanks ralph yeah thank you very much for having me you