 Tervetuloa, Norbeck. Joten... No, nyt on yksi uudelleen. Ja 3 asioita, jotka voimme sanoa. Tämä on paljon asioita. Mutta jos... Olemme aloittaneet aloittaneet, ja nyt olemme vain asioita. Joten, ensimmäisenä, on paremmin, ja paremmin on kutenkin ar-Ajobs. Ja Richard, näin yksinkertaisen takaisin... OBS. Joten, joten, nähdään näin ar-Ajobs. Tämä asio on paljon paremmin, jos olemme jääneet eri simulatioita. Tänään on aisprakeria. Olemme paljon ihmisiä, kuten, he tuntuvat eri simulatioita ja eri asioita, eri asioita, ja niin on. Ja niitä asioita, käyttävät tämän asioiden ympäristö, paremmin asioiden, on paljon paremmin. Joten, kuten, asioiden, asioiden, jos on tämän asioiden ympäristö, jota olet, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten, joten ja baistumista näitä leikkuja, niin kun sinulla on kokemassa tämä leikku, niin miten haluatko odottaa leikkuja, mutta jos leikkuja on pari asia, että sinulla on kaikkua ja baistumista, niin sinulla on erilainen data set, baistumista, niin sinulla on erilainen parameter tai jotain asia, niin sinulla voi vain olla kilpailua huolta, miettiälaa erilaiset tekemään. basically creatures as copied here is the average of example on our page so can you remove the highlighting from the documentation so it's easier to describe so the only differences or only changes to this script like this is normal like C skill script that you run for 1 on the only changes that you specify this array and then voidaan käyttää yksinkertaisuudesta, ja ehkä yksinkertaisuudesta voidaan käyttää yksinkertaisuudesta, joten esimerkiksi täällä on tämä %a, joka yksinkertaisuudesta on yksinkertaisuudesta. Ja mitä se tehdään? Kun sinulla on tämä yksinkertaisuudesta, se pitäisi saada 16 yksinkertaisuudesta, jotka yksinkertaisuudesta yksinkertaisuudesta, ja kaikki ovat the same requirements. So the same requirements aren't multiplied or anything like that. They all get the same requirements, so they all run basically the same stuff, but the only thing that is different is that each one of these jobs gets this different environment variable, or this different value for this environment variable slurme agai task ID, when the job is running. So basically when the job is running, each one gets its own like number, and it does something based on that number. So if you submit the job, then let's look at the output and how it looks in the slurme queue. So you see it's currently waiting, and you see these brackets, so you see that there's instead of one job, like you get the job ID on the left side, you get also these brackets, and it says that basically there's an array job going with 15 jobs there. So now you see that the first one already started, it got started, and you still have numbers 1 to 15 in the queue pending. Okay, the first one finished, and then you still have the others pending. So each of these jobs runs independently, and each of these gets a different array task ID. So you can, with this kind of structure, you can basically run, usually we recommend that you don't run more than like maybe a few thousand array IDs in one job, but usually, okay, so now we go. Okay, some of them already finished, and some of them are still running. Yeah, but you can run like a huge number of independent jobs here, and they are all running independently, and they all produce independent output files. So let's look at one of them. Let's look at zero. So there's a task number zero. And five. Yeah, so these are, this is separate, like this is not the same as like MPI tasks, or anything like that. So these are array tasks. So these are like MPI tasks, you have like multiple tasks in the same job communicating with each other. Here we don't have any communication between this. So each of them are running independently whatever they're doing, whatever they're doing. And the only change is that they, all of them get this different number that they can then decide what they want to do with. And if you look at the documentation a bit below, there are some examples of how you can do this kind of a mapping. So for example here, like this, like Swimple example. So let's say we want to, if we would want to run the Pi example that we, lower the Pi code that we had, but with different seed numbers, we could have this kind of a like vast case, case statement. So basically, depending on the array task ID, we will run, like if the case is zero, then use different seed. And if one use different seed, and it will run like with five different seed numbers in one single job. So you only need one SBAT script, and the SBAT script contains information on what to do, like with the array ID. And this is why we emphasize the bash scripting so much, I guess. Because once you can do the bash scripting, you can do a whole lot here and automate basically anything. Yeah. So basically, like if you think about, like, let's say you have a, yeah, let's say you have like one guy moving, like, yeah, what could be a good example. So basically this means that like, if you have a, like, yeah, well basically here we have independent jobs that all do whatever they do. Yeah. It's like maybe instead of everyone trying to coordinate to get in the cars and drive to the mocha, you say, okay, everyone do it yourself, we meet here when we're done. And then sort of leave it at that. Yeah. You can also use like below, there's this also this kind of structure that you can use to, for example, read parameters from a file. Here we go. Basically over here, we use this kind of a bash magic. You don't need to necessarily know how it works. But basically it reads a line from a file. If you look a bit above, you can see the file. Here we go. Yeah. Yeah. So basically if we put parameters into a file, so let's say here we specify how many iterations we run to run. And then in the array job, we basically get that line for that specific array job. So this way you can like, let's say, like some of our users, for example, they have a code where they run with different parameters. And then they have this kind of iterations file. And then when they want to run a new run or something, they add like a new bunch of parameters there. And then they just tell the array job to run like, let's say lines from 110 to 120 or something like that. And then it will run those lines of the parameters file. The array jobs don't have to start at C. They don't have to be like, they don't have to be like, you can specify whatever range you want. You can even put like strides so that it jumps every second number or third number, whatever. But basically you can then like, let's say, upgrade parameters from this file and then run these independent jobs. It's also like, if you're running jobs that are very fast, like something like, you want to do an analysis for thousands of times and each of these analysis takes only like, let's say a minute, then it's usually a good idea to group these different simulations together so that you have like, let's say an array task that runs. So in this example, if we want to try 50 different seed values, we could run them 10 seed values per script for five array jobs. So basically like, you have a four, like you can think of the array job as like a big four loop in a sense. Like you can have like outer loop is this array job and it submits individual jobs and you can have an inner loop there that runs even more jobs. So if you have really small jobs, you can use this kind of structure to run like lots of individual jobs. So you can get a lot of these individual tasks done. And this is usually like, it's called embarrassingly parallel because it's so easy to parallelize because like you just like, basically if you need to like, if you need to do one thing and you need to do it 100 times and all of the 100 things are independent of each other, you can just get help you and tell everybody to do the same thing but for different like, well with a different thing. So let's say like the devoting in Finland, that's embarrassingly parallel problem. You instead of having one voting booth somewhere where people look you up to, you have, you split the voting booths in all across the country and people can go to whatever booth they want. And you have like, you split the problem embarrassingly, like you parallelize the problem like and make it much easier so that this is identical in the queue. Yeah, so we have 40 minutes left. Should we, would you like to maybe try to go through GPU and then we can have a combined exercise session and people can look at all the different things and also we don't have to leave right at four. So I guess some people can hang around and continue helping with these exercises and well you can also come to our garages or other times and we can work together on it. I'll quickly mention like this question. So are these run in serial or in parallel? They are running parallel. So basically this wouldn't be the same as you would like write the slurmscript, set parameters there, submit it, open another slurmscript, write parameters there, submit it, write another slurmscript, write parameters there and submit it. So many people have like some sort of like a for loop that they like submit to huge amount of submissions but it's better to have like an aggregate job where you basically do one submission and the aggregate job basically just like everybody does their own stuff. And there's another question. Can you do something where the parameter sets are defined in the Python code? Yes, I mean you get this environment variable that has one value and you can use that however. So if you're doing something complex enough. As long as you have like a enumerable set, so for example like let's say you can enumerate like if you do like the contour routing, you can enumerate rational numbers to whole numbers. So basically like similar kind of thing if you have something that you can enumerate with numbers, you can do it with aggregate jobs if they independent tasks. Like if you want to run real numbers, then it's a different thing. Yeah, okay. Should we go to what next? What's the next GPU? Or? Yeah, yeah, I think yeah we are unfortunately quite low on time with these. But basically like agri-parallism is basically like if you have managed to run one like usually it's recommended that you run one serial job and if serial job runs you can then think about okay well how can I do this mapping of agri-parallism to different parameters and then you can just like once you get this mapping done you can just push the agri button and like submit 100 of the same job. But if you're getting at the point you're submitting tens of thousands you might want to think a bit about it and if you're submitting hundreds of thousands then talk to us first please. It's easy to make a bash script that will submit all these different things but okay so what's next?