1 00:00:12,960 --> 00:00:18,320 and now we welcome to the science data 2 00:00:15,679 --> 00:00:21,119 and analytics track of pycon australia 3 00:00:18,320 --> 00:00:24,000 2021 marlene mangami 4 00:00:21,119 --> 00:00:24,960 malin is a zimbabwean software engineer 5 00:00:24,000 --> 00:00:26,960 and 6 00:00:24,960 --> 00:00:29,359 engineer exploring speaker based on the 7 00:00:26,960 --> 00:00:31,279 city of harare an advocate for using 8 00:00:29,359 --> 00:00:32,960 science and technology for social good 9 00:00:31,279 --> 00:00:34,880 she's a director and the vice chair for 10 00:00:32,960 --> 00:00:36,800 the python software foundation and is 11 00:00:34,880 --> 00:00:39,440 currently working as a software engineer 12 00:00:36,800 --> 00:00:42,480 with the rapids team at nvidia 13 00:00:39,440 --> 00:00:44,160 in 2017 chico founded zimbo pi a 14 00:00:42,480 --> 00:00:45,920 non-profit organization that gives 15 00:00:44,160 --> 00:00:48,000 zimbabwean young women access to 16 00:00:45,920 --> 00:00:49,840 resources in the field of technology she 17 00:00:48,000 --> 00:00:51,520 is currently pursuing a computer science 18 00:00:49,840 --> 00:00:53,600 degree with a concentration in machine 19 00:00:51,520 --> 00:00:54,800 learning and ai at the university of 20 00:00:53,600 --> 00:00:56,960 london 21 00:00:54,800 --> 00:00:59,520 her her talk is recorded so there won't 22 00:00:56,960 --> 00:01:01,199 be an introduction or q a but you can 23 00:00:59,520 --> 00:01:04,080 find her at home on the web 24 00:01:01,199 --> 00:01:06,880 marlenemangami.com 25 00:01:04,080 --> 00:01:09,119 the talk is about python and gpus maleen 26 00:01:06,880 --> 00:01:10,560 will give us a brief history of python 27 00:01:09,119 --> 00:01:12,400 and parallel computing including 28 00:01:10,560 --> 00:01:14,240 python's infamous gill 29 00:01:12,400 --> 00:01:16,320 and she'll also share how and why 30 00:01:14,240 --> 00:01:19,520 pythonistas can get started with using 31 00:01:16,320 --> 00:01:22,159 gpus to do more work and faster welcome 32 00:01:19,520 --> 00:01:24,240 to python australia marlene mangami and 33 00:01:22,159 --> 00:01:28,640 with all of you a beginner's guide to 34 00:01:24,240 --> 00:01:28,640 gpu for by gpus for pythonistas 35 00:01:31,840 --> 00:01:39,280 i'm so excited to be here with you today 36 00:01:34,240 --> 00:01:42,399 for the virtual version of pycon line 37 00:01:39,280 --> 00:01:45,520 for pycon australia um the title of my 38 00:01:42,399 --> 00:01:48,240 talk today is a beginner's guide to gpus 39 00:01:45,520 --> 00:01:49,680 for python easters i'm very excited 40 00:01:48,240 --> 00:01:52,159 about this talk if you have any 41 00:01:49,680 --> 00:01:53,360 questions after i give my talk feel free 42 00:01:52,159 --> 00:01:56,320 to 43 00:01:53,360 --> 00:01:57,920 find me on twitter and just send me a dm 44 00:01:56,320 --> 00:02:00,240 i think i might be 45 00:01:57,920 --> 00:02:03,200 around after this talk as well just to 46 00:02:00,240 --> 00:02:06,079 answer any questions too 47 00:02:03,200 --> 00:02:06,960 first thing something about me is that i 48 00:02:06,079 --> 00:02:09,599 am 49 00:02:06,960 --> 00:02:11,840 the current vice chair and a director at 50 00:02:09,599 --> 00:02:13,920 the python software foundation with the 51 00:02:11,840 --> 00:02:15,040 which is the non-profit organization 52 00:02:13,920 --> 00:02:16,800 behind 53 00:02:15,040 --> 00:02:19,200 python programming language it's a very 54 00:02:16,800 --> 00:02:20,800 cool organization that i encourage you 55 00:02:19,200 --> 00:02:23,120 to look into 56 00:02:20,800 --> 00:02:24,959 something else about myself is that i am 57 00:02:23,120 --> 00:02:27,599 a co-founder of a non-profit 58 00:02:24,959 --> 00:02:29,760 organization here in zimbabwe which is 59 00:02:27,599 --> 00:02:32,239 actually where i'm calling you from 60 00:02:29,760 --> 00:02:34,720 i'm called zimbo-pai and this 61 00:02:32,239 --> 00:02:38,239 organization just tries to get girls 62 00:02:34,720 --> 00:02:39,519 excited about programming in python and 63 00:02:38,239 --> 00:02:41,519 then uh 64 00:02:39,519 --> 00:02:43,599 something else about myself is that 65 00:02:41,519 --> 00:02:46,160 a final thing about myself actually 66 00:02:43,599 --> 00:02:48,160 so that this isn't too long is that i'm 67 00:02:46,160 --> 00:02:51,440 currently interning as a software 68 00:02:48,160 --> 00:02:55,920 engineer with the rapids team at nvidia 69 00:02:51,440 --> 00:02:58,000 and i am working on a python um gpu 70 00:02:55,920 --> 00:03:00,400 based data frame library that i will 71 00:02:58,000 --> 00:03:02,239 talk a little bit about um 72 00:03:00,400 --> 00:03:05,280 some of the work that i'm doing in this 73 00:03:02,239 --> 00:03:06,959 talk as well and the library i work on 74 00:03:05,280 --> 00:03:08,800 is open source so you can also check out 75 00:03:06,959 --> 00:03:11,760 the code after if you'd like 76 00:03:08,800 --> 00:03:13,519 so let's go ahead and dive right in i 77 00:03:11,760 --> 00:03:15,840 think a good place to start is 78 00:03:13,519 --> 00:03:20,400 understanding why python easter should 79 00:03:15,840 --> 00:03:23,440 be interested in gpus in the first place 80 00:03:20,400 --> 00:03:26,799 typically when people think about gpus 81 00:03:23,440 --> 00:03:30,400 they immediately their mind goes to 82 00:03:26,799 --> 00:03:33,040 graphics cards or gaming and i know for 83 00:03:30,400 --> 00:03:35,519 myself i was really surprised when i 84 00:03:33,040 --> 00:03:37,920 started reading about this that 85 00:03:35,519 --> 00:03:40,959 gpus were being used for anything else 86 00:03:37,920 --> 00:03:43,519 outside of the gaming world and this 87 00:03:40,959 --> 00:03:44,400 assumption is actually not too far off 88 00:03:43,519 --> 00:03:47,440 base 89 00:03:44,400 --> 00:03:49,760 in fact if we did a quick search on 90 00:03:47,440 --> 00:03:52,480 wikipedia which as many of us know is 91 00:03:49,760 --> 00:03:55,840 the source of all truth 92 00:03:52,480 --> 00:03:58,720 we find that gpu is actually an acronym 93 00:03:55,840 --> 00:04:01,040 for graphics processing unit and so the 94 00:03:58,720 --> 00:04:04,239 original purpose of the gpu was to 95 00:04:01,040 --> 00:04:05,760 create images for computer graphics and 96 00:04:04,239 --> 00:04:08,000 gaming consoles 97 00:04:05,760 --> 00:04:10,000 so that assumption that i had and i 98 00:04:08,000 --> 00:04:12,319 think many people around the world have 99 00:04:10,000 --> 00:04:15,200 is is actually fairly accurate since the 100 00:04:12,319 --> 00:04:19,440 early 2010s we saw a sharp rise in the 101 00:04:15,200 --> 00:04:21,759 use of gp gbus or general purpose 102 00:04:19,440 --> 00:04:25,199 graphic processing units 103 00:04:21,759 --> 00:04:28,639 and as one can imagine general purpose 104 00:04:25,199 --> 00:04:30,960 gpus are gpus that can be used 105 00:04:28,639 --> 00:04:32,720 for more general purposes 106 00:04:30,960 --> 00:04:34,800 and typically 107 00:04:32,720 --> 00:04:37,440 these sorts of gpus are used instead of 108 00:04:34,800 --> 00:04:40,960 a cpu for executing tasks that can be 109 00:04:37,440 --> 00:04:43,120 run in parallel so i think i have a 110 00:04:40,960 --> 00:04:45,280 pretty good example uh to just 111 00:04:43,120 --> 00:04:47,759 demonstrate what this means so one of 112 00:04:45,280 --> 00:04:50,560 the things that i absolutely love about 113 00:04:47,759 --> 00:04:51,360 conferences being remote these days is 114 00:04:50,560 --> 00:04:54,479 that 115 00:04:51,360 --> 00:04:56,880 i don't have to wait in line for a cup 116 00:04:54,479 --> 00:04:59,120 of coffee like if i if i would like 117 00:04:56,880 --> 00:05:01,199 coffee right now i just can get up and 118 00:04:59,120 --> 00:05:02,880 go to my kitchen and have some coffee 119 00:05:01,199 --> 00:05:05,440 but sometimes 120 00:05:02,880 --> 00:05:08,000 you'll attend these conferences that are 121 00:05:05,440 --> 00:05:09,680 great and and not all the time as well 122 00:05:08,000 --> 00:05:11,440 but you can find yourself in these 123 00:05:09,680 --> 00:05:13,759 really long lines 124 00:05:11,440 --> 00:05:16,240 waiting to use a coffee machine and 125 00:05:13,759 --> 00:05:18,240 sometimes it's a single coffee machine 126 00:05:16,240 --> 00:05:20,400 and now you're standing in line and 127 00:05:18,240 --> 00:05:23,120 you're debating whether you should go 128 00:05:20,400 --> 00:05:26,560 and give your talk like a mature adult 129 00:05:23,120 --> 00:05:28,560 or just stay and wait for a precious cup 130 00:05:26,560 --> 00:05:30,960 of coffee goodness 131 00:05:28,560 --> 00:05:32,240 but there are a number of solutions to 132 00:05:30,960 --> 00:05:33,360 this problem 133 00:05:32,240 --> 00:05:35,120 and 134 00:05:33,360 --> 00:05:37,039 one solution that a conference 135 00:05:35,120 --> 00:05:39,600 organizers if they can afford it can 136 00:05:37,039 --> 00:05:42,240 consider is to add a 137 00:05:39,600 --> 00:05:44,320 an extra coffee machine into the mix 138 00:05:42,240 --> 00:05:46,720 and this is great because it allows 139 00:05:44,320 --> 00:05:48,080 things to move much faster because the 140 00:05:46,720 --> 00:05:50,560 cues 141 00:05:48,080 --> 00:05:53,360 like generally become shorter and and 142 00:05:50,560 --> 00:05:56,319 maybe are even cut in half or even into 143 00:05:53,360 --> 00:05:59,199 a third and people are able to access 144 00:05:56,319 --> 00:06:01,680 their coffee grab it and go and get on 145 00:05:59,199 --> 00:06:03,759 with their day and be more productive so 146 00:06:01,680 --> 00:06:05,759 we can think of the cores in our 147 00:06:03,759 --> 00:06:07,759 computers in the same way we would think 148 00:06:05,759 --> 00:06:11,039 about these coffee machines in many 149 00:06:07,759 --> 00:06:13,680 cases utilizing more cores can make us 150 00:06:11,039 --> 00:06:16,720 more productive in the work that we do 151 00:06:13,680 --> 00:06:19,680 so a typical cpu contains anywhere from 152 00:06:16,720 --> 00:06:23,759 between four to eight cores whereas a 153 00:06:19,680 --> 00:06:28,000 gpu can contain thousands of them 154 00:06:23,759 --> 00:06:30,319 so having a higher number of cores 155 00:06:28,000 --> 00:06:33,600 increases the computational power that 156 00:06:30,319 --> 00:06:35,120 we have and allows us to do more work 157 00:06:33,600 --> 00:06:36,240 faster 158 00:06:35,120 --> 00:06:39,759 so 159 00:06:36,240 --> 00:06:40,960 just before i get a slew 160 00:06:39,759 --> 00:06:43,919 of 161 00:06:40,960 --> 00:06:46,840 emails from people who love cpus this is 162 00:06:43,919 --> 00:06:49,919 not me throwing cpus under the bus i use 163 00:06:46,840 --> 00:06:52,960 cpus actually there are some tasks that 164 00:06:49,919 --> 00:06:56,000 are much better suited to using a cpu as 165 00:06:52,960 --> 00:06:58,080 compared to a gpu so for example if you 166 00:06:56,000 --> 00:07:00,720 have a task that requires a lot of 167 00:06:58,080 --> 00:07:03,599 serial processing where you need to 168 00:07:00,720 --> 00:07:07,120 purchase things one by one in a sequence 169 00:07:03,599 --> 00:07:11,039 it would definitely be best to use a cpu 170 00:07:07,120 --> 00:07:13,440 in that case um gpus are great but they 171 00:07:11,039 --> 00:07:16,160 expect to run things simultaneously and 172 00:07:13,440 --> 00:07:18,080 so if your computations cannot be done 173 00:07:16,160 --> 00:07:21,919 simultaneously then it's abyss to stick 174 00:07:18,080 --> 00:07:23,840 to a cpu and by the way you actually can 175 00:07:21,919 --> 00:07:26,960 take advantage of 176 00:07:23,840 --> 00:07:29,199 more cores in your cpu 177 00:07:26,960 --> 00:07:31,840 by using things like multi-threading or 178 00:07:29,199 --> 00:07:33,759 async io among other things to boost 179 00:07:31,840 --> 00:07:35,840 your performance 180 00:07:33,759 --> 00:07:38,080 locally with the cpu so from what we've 181 00:07:35,840 --> 00:07:40,080 talked about so far we've established 182 00:07:38,080 --> 00:07:40,880 that if you're a pythony style who needs 183 00:07:40,080 --> 00:07:43,039 to 184 00:07:40,880 --> 00:07:44,400 do some computations that can be run 185 00:07:43,039 --> 00:07:46,639 simultaneously 186 00:07:44,400 --> 00:07:50,240 gpus are a really great option for you 187 00:07:46,639 --> 00:07:51,919 to consider because uh ultimately your 188 00:07:50,240 --> 00:07:54,000 work will be done much faster because 189 00:07:51,919 --> 00:07:56,560 your code will be running much faster 190 00:07:54,000 --> 00:07:58,400 and since this is a beginner's guide 191 00:07:56,560 --> 00:08:00,720 some people watching someone watching 192 00:07:58,400 --> 00:08:03,120 might be uh thinking to themselves 193 00:08:00,720 --> 00:08:04,319 marlene i have been using python for a 194 00:08:03,120 --> 00:08:07,599 long time 195 00:08:04,319 --> 00:08:10,240 and i don't understand why i would need 196 00:08:07,599 --> 00:08:11,120 to speak python up it seems pretty fast 197 00:08:10,240 --> 00:08:13,599 to me 198 00:08:11,120 --> 00:08:14,800 and that's you know i think a good 199 00:08:13,599 --> 00:08:18,560 question 200 00:08:14,800 --> 00:08:19,919 uh to to to pose to to that question as 201 00:08:18,560 --> 00:08:23,120 well is 202 00:08:19,919 --> 00:08:25,199 um is python slow 203 00:08:23,120 --> 00:08:27,840 and uh believe it or not this is 204 00:08:25,199 --> 00:08:30,240 actually quite a contentious question 205 00:08:27,840 --> 00:08:32,800 and when i looked online for answers to 206 00:08:30,240 --> 00:08:34,000 this question i found some opinions that 207 00:08:32,800 --> 00:08:36,800 were helpful 208 00:08:34,000 --> 00:08:39,200 but others that were to be honest 209 00:08:36,800 --> 00:08:41,440 probably borderline slander 210 00:08:39,200 --> 00:08:43,919 and i personally came to the conclusion 211 00:08:41,440 --> 00:08:46,240 that the slowness of python is actually 212 00:08:43,919 --> 00:08:49,120 fairly relative and many developers will 213 00:08:46,240 --> 00:08:52,959 likely never encounter this slowness 214 00:08:49,120 --> 00:08:54,399 that people talk about um but to be fair 215 00:08:52,959 --> 00:08:57,600 there is 216 00:08:54,399 --> 00:08:59,440 some level of truth to that statement 217 00:08:57,600 --> 00:09:02,320 and i do think that it's important that 218 00:08:59,440 --> 00:09:04,560 when we are talking about python um 219 00:09:02,320 --> 00:09:06,720 potentially being so that we give some 220 00:09:04,560 --> 00:09:10,800 context and explain what we're comparing 221 00:09:06,720 --> 00:09:12,959 python to so last year in 2020 anthony 222 00:09:10,800 --> 00:09:16,720 shaw gave a really great talk at python 223 00:09:12,959 --> 00:09:19,279 us and the talk was titled why is python 224 00:09:16,720 --> 00:09:20,560 slow and in that talk 225 00:09:19,279 --> 00:09:22,480 he 226 00:09:20,560 --> 00:09:25,040 put this this really great graph that's 227 00:09:22,480 --> 00:09:27,360 on the screen right now um and this is a 228 00:09:25,040 --> 00:09:29,360 graph that shows the in body algorithm 229 00:09:27,360 --> 00:09:32,800 and it shows how long different 230 00:09:29,360 --> 00:09:35,680 languages take to run this algorithm and 231 00:09:32,800 --> 00:09:38,160 uh the program models the orbits of 232 00:09:35,680 --> 00:09:41,519 jupiter saturn uranus and neptune and is 233 00:09:38,160 --> 00:09:43,200 pretty uh sort of intense python for 234 00:09:41,519 --> 00:09:46,000 some of you some of you may know that 235 00:09:43,200 --> 00:09:48,720 python is a an interpreted language that 236 00:09:46,000 --> 00:09:51,360 is written and compiled in c 237 00:09:48,720 --> 00:09:52,480 but if you look at the chart and you 238 00:09:51,360 --> 00:09:56,160 compare 239 00:09:52,480 --> 00:09:59,920 the time it takes for c to 240 00:09:56,160 --> 00:10:03,200 run this algorithm c takes seven seconds 241 00:09:59,920 --> 00:10:05,519 while python takes 14 minutes 242 00:10:03,200 --> 00:10:08,000 i don't even know how many times 243 00:10:05,519 --> 00:10:10,880 slower that is and you know someone 244 00:10:08,000 --> 00:10:13,440 might be thinking okay but c is actually 245 00:10:10,880 --> 00:10:15,279 a strongly typed and compiled language 246 00:10:13,440 --> 00:10:18,560 while we know that python is dynamically 247 00:10:15,279 --> 00:10:20,800 typed and interpreted so you know that's 248 00:10:18,560 --> 00:10:23,839 not really a fair comparison but if we 249 00:10:20,800 --> 00:10:25,360 look at another language like node.js 250 00:10:23,839 --> 00:10:27,200 which is also 251 00:10:25,360 --> 00:10:30,800 dynamically typed 252 00:10:27,200 --> 00:10:33,760 uh similarly to python we still see that 253 00:10:30,800 --> 00:10:34,800 python is much slower than node.js 254 00:10:33,760 --> 00:10:36,959 so 255 00:10:34,800 --> 00:10:38,240 if you'd if you're really interested in 256 00:10:36,959 --> 00:10:41,120 this specific 257 00:10:38,240 --> 00:10:43,120 example and would want to find out some 258 00:10:41,120 --> 00:10:45,760 specific reasons about why this is the 259 00:10:43,120 --> 00:10:48,240 case i definitely recommend you watching 260 00:10:45,760 --> 00:10:49,040 anthony's talk it's a fantastic talk 261 00:10:48,240 --> 00:10:51,440 but 262 00:10:49,040 --> 00:10:53,680 something to note is that even though 263 00:10:51,440 --> 00:10:56,320 this might be the case according to 264 00:10:53,680 --> 00:10:58,079 stackoverflow's developer survey python 265 00:10:56,320 --> 00:11:00,399 beats out almost every single other 266 00:10:58,079 --> 00:11:04,000 language in this chart in terms of 267 00:11:00,399 --> 00:11:05,680 popularity and the truth is python to me 268 00:11:04,000 --> 00:11:06,560 at least i think to a lot of other 269 00:11:05,680 --> 00:11:09,360 people 270 00:11:06,560 --> 00:11:12,800 is a really good and fun language to 271 00:11:09,360 --> 00:11:16,480 program in python is such a joy to use 272 00:11:12,800 --> 00:11:19,200 and so if you really need that um if you 273 00:11:16,480 --> 00:11:21,839 would want that speed up and making sure 274 00:11:19,200 --> 00:11:24,640 that you have uh your code running as 275 00:11:21,839 --> 00:11:28,000 fast as possible but also want to 276 00:11:24,640 --> 00:11:30,800 continue enjoying coding in python there 277 00:11:28,000 --> 00:11:33,120 are lots of ways to be able to do that 278 00:11:30,800 --> 00:11:34,959 earlier today i talked about how 279 00:11:33,120 --> 00:11:37,279 utilizing more cores through things like 280 00:11:34,959 --> 00:11:39,120 multi-threading and concurrency can help 281 00:11:37,279 --> 00:11:41,839 us get better performance from our 282 00:11:39,120 --> 00:11:43,760 python code and in the past python 283 00:11:41,839 --> 00:11:45,760 hasn't actually had a very friendly 284 00:11:43,760 --> 00:11:49,440 reputation with things like 285 00:11:45,760 --> 00:11:52,399 multi-threading and parallelism because 286 00:11:49,440 --> 00:11:54,079 of uh something called 287 00:11:52,399 --> 00:11:54,959 the guild 288 00:11:54,079 --> 00:11:56,399 so 289 00:11:54,959 --> 00:11:59,920 you know i wouldn't 290 00:11:56,399 --> 00:12:02,639 really have talked about python and 291 00:11:59,920 --> 00:12:04,639 concurrency python and speed even 292 00:12:02,639 --> 00:12:07,440 if i don't at least 293 00:12:04,639 --> 00:12:10,800 mention the gill exactly is going on 294 00:12:07,440 --> 00:12:14,079 with python skill and if you search 295 00:12:10,800 --> 00:12:17,440 online for python talks on the gill you 296 00:12:14,079 --> 00:12:18,480 get this very strange mix of suggestions 297 00:12:17,440 --> 00:12:20,320 um 298 00:12:18,480 --> 00:12:23,200 as you can see you know some people are 299 00:12:20,320 --> 00:12:25,680 talking about removing it completely 300 00:12:23,200 --> 00:12:27,360 um others are talking about 301 00:12:25,680 --> 00:12:29,360 understanding it more trying to help 302 00:12:27,360 --> 00:12:32,240 others understand it i think 303 00:12:29,360 --> 00:12:35,040 and even even more you know recently 304 00:12:32,240 --> 00:12:36,959 eric snow gave a talk asking whether to 305 00:12:35,040 --> 00:12:39,680 kill or not to kill 306 00:12:36,959 --> 00:12:41,040 so generally it seems like it has this 307 00:12:39,680 --> 00:12:44,240 really big 308 00:12:41,040 --> 00:12:47,120 reputation so so what is the gill 309 00:12:44,240 --> 00:12:51,120 um well the girl is python's global 310 00:12:47,120 --> 00:12:53,360 interpreter lock and this is a lock in c 311 00:12:51,120 --> 00:12:55,680 python that preserves its internal 312 00:12:53,360 --> 00:12:57,200 shared global state and what 313 00:12:55,680 --> 00:12:59,760 occasionally makes the gill 314 00:12:57,200 --> 00:13:03,680 controversial is that because of it no 315 00:12:59,760 --> 00:13:06,000 more than one thread can run at a time 316 00:13:03,680 --> 00:13:08,959 and for people that are wanting to 317 00:13:06,000 --> 00:13:10,480 utilize things like multi-threading um 318 00:13:08,959 --> 00:13:12,320 you know which is running many different 319 00:13:10,480 --> 00:13:14,880 threads at the same time to speed up 320 00:13:12,320 --> 00:13:17,519 their work the girl can stand in their 321 00:13:14,880 --> 00:13:19,519 way potentially however 322 00:13:17,519 --> 00:13:22,399 in recent years the girl has become less 323 00:13:19,519 --> 00:13:24,560 and less of a barrier for people who 324 00:13:22,399 --> 00:13:25,839 want to speed up their python code in 325 00:13:24,560 --> 00:13:29,200 this respect 326 00:13:25,839 --> 00:13:31,680 and gpus are only one of a number of 327 00:13:29,200 --> 00:13:32,880 different ways to get around it and i 328 00:13:31,680 --> 00:13:35,519 thought 329 00:13:32,880 --> 00:13:37,760 this uh this next clip that i have on 330 00:13:35,519 --> 00:13:41,760 the screen is a clip from raymond 331 00:13:37,760 --> 00:13:44,079 hittinger's 2017 keynote at pi bay and i 332 00:13:41,760 --> 00:13:46,399 thought it was really helpful in terms 333 00:13:44,079 --> 00:13:48,320 of helping understand why the gill is 334 00:13:46,399 --> 00:13:49,760 important and some ways that you can 335 00:13:48,320 --> 00:13:51,519 actually get around it 336 00:13:49,760 --> 00:13:53,360 our friend larry hastings is working on 337 00:13:51,519 --> 00:13:55,040 a project called the gillectomy to 338 00:13:53,360 --> 00:13:56,880 remove the global interpreter lock from 339 00:13:55,040 --> 00:13:58,320 python do you think that's a difficult 340 00:13:56,880 --> 00:14:01,120 project 341 00:13:58,320 --> 00:14:03,680 that is an incorrect hypothesis 342 00:14:01,120 --> 00:14:05,120 uh takes about a day of work 343 00:14:03,680 --> 00:14:07,600 to remove the gill 344 00:14:05,120 --> 00:14:09,920 he removed the gill on the first day it 345 00:14:07,600 --> 00:14:12,000 was no problem taking it out 346 00:14:09,920 --> 00:14:13,760 the problem then becomes all of the 347 00:14:12,000 --> 00:14:16,320 locks that you have to put in everywhere 348 00:14:13,760 --> 00:14:18,320 else in order to get python uh to 349 00:14:16,320 --> 00:14:20,560 function it turns out that's not 350 00:14:18,320 --> 00:14:22,639 particularly hard either and a few days 351 00:14:20,560 --> 00:14:26,399 later he had that done 352 00:14:22,639 --> 00:14:28,320 so the gill is gone and replaced by uh 353 00:14:26,399 --> 00:14:30,800 lots of other little locks on smaller 354 00:14:28,320 --> 00:14:33,120 data structures problem solved any 355 00:14:30,800 --> 00:14:33,120 questions 356 00:14:34,240 --> 00:14:36,720 oh 357 00:14:35,120 --> 00:14:38,000 are locks expensive to acquire in 358 00:14:36,720 --> 00:14:40,480 release 359 00:14:38,000 --> 00:14:43,279 in fact they are and so the good news is 360 00:14:40,480 --> 00:14:45,360 the gill is gone it's free threaded and 361 00:14:43,279 --> 00:14:47,279 it's uh dozens of times slower than 362 00:14:45,360 --> 00:14:49,199 regular uh python 363 00:14:47,279 --> 00:14:52,000 so you actually get a payoff for the 364 00:14:49,199 --> 00:14:53,760 guild and the payoff is you don't pay 365 00:14:52,000 --> 00:14:56,480 all of the performance cost of all of 366 00:14:53,760 --> 00:14:58,959 these individual lock acquires and our 367 00:14:56,480 --> 00:15:02,000 releases is actually a really nice thing 368 00:14:58,959 --> 00:15:03,839 uh to have it gets in the way of us free 369 00:15:02,000 --> 00:15:06,000 threading but we have ways of solving 370 00:15:03,839 --> 00:15:08,639 that problem if you can't fully free 371 00:15:06,000 --> 00:15:10,880 thread one python why don't i run eight 372 00:15:08,639 --> 00:15:12,720 pythons in parallel each with their own 373 00:15:10,880 --> 00:15:14,160 threads 374 00:15:12,720 --> 00:15:16,880 and then it's no problem i'm taking 375 00:15:14,160 --> 00:15:18,000 advantage of all of other cores or you 376 00:15:16,880 --> 00:15:20,240 can combine threading and 377 00:15:18,000 --> 00:15:24,160 multi-processing uh there's a number of 378 00:15:20,240 --> 00:15:26,160 ways to go in fact at some point most 379 00:15:24,160 --> 00:15:28,480 folks just get over the python has a 380 00:15:26,160 --> 00:15:30,720 global interpreter lock go ahead and 381 00:15:28,480 --> 00:15:32,320 saturate all eight cores to a hundred 382 00:15:30,720 --> 00:15:34,000 percent and get full advantage of the 383 00:15:32,320 --> 00:15:35,759 other machine and just simply ignore the 384 00:15:34,000 --> 00:15:37,839 problem there's lots of ways to ignore 385 00:15:35,759 --> 00:15:40,240 the global interpreter lock it is not 386 00:15:37,839 --> 00:15:44,000 that big of deep okay so like raymond 387 00:15:40,240 --> 00:15:45,920 said when we utilize all of our cores we 388 00:15:44,000 --> 00:15:49,199 don't really need to worry about the 389 00:15:45,920 --> 00:15:51,600 guilt and with gpus we have thousands of 390 00:15:49,199 --> 00:15:54,959 cores so if we decide we wanted to even 391 00:15:51,600 --> 00:15:57,759 just run one thread on each core we 392 00:15:54,959 --> 00:16:00,399 would still have a really significant 393 00:15:57,759 --> 00:16:03,040 speed up okay so 394 00:16:00,399 --> 00:16:05,839 great now that we've looked at some of 395 00:16:03,040 --> 00:16:08,959 the big performance issues that would 396 00:16:05,839 --> 00:16:11,360 lead us to possibly using a gpu when 397 00:16:08,959 --> 00:16:13,759 we're running python let's go ahead and 398 00:16:11,360 --> 00:16:15,680 look at some practical examples of how 399 00:16:13,759 --> 00:16:18,800 we can do this 400 00:16:15,680 --> 00:16:21,279 so modern datasets can have as much as 401 00:16:18,800 --> 00:16:24,880 millions even billions of data points 402 00:16:21,279 --> 00:16:26,800 that need processing and for the average 403 00:16:24,880 --> 00:16:29,199 data scientist that is working with 404 00:16:26,800 --> 00:16:31,279 these large data sets just using 405 00:16:29,199 --> 00:16:34,560 ordinary python for processing this 406 00:16:31,279 --> 00:16:36,079 information is not very efficient and 407 00:16:34,560 --> 00:16:38,720 most of the time you know they would 408 00:16:36,079 --> 00:16:41,519 spend if they chose to to run python 409 00:16:38,720 --> 00:16:43,920 only they could spend a lot of time just 410 00:16:41,519 --> 00:16:46,160 waiting around and not being productive 411 00:16:43,920 --> 00:16:48,880 but these days data scientists wanting 412 00:16:46,160 --> 00:16:51,120 to perform larger computations on 413 00:16:48,880 --> 00:16:54,160 datasets or wanting to filter through 414 00:16:51,120 --> 00:16:55,839 information in larger quantities 415 00:16:54,160 --> 00:16:58,079 there are a number of different 416 00:16:55,839 --> 00:17:01,519 libraries available so pandas is 417 00:16:58,079 --> 00:17:02,639 probably the most popular solution for 418 00:17:01,519 --> 00:17:04,480 this 419 00:17:02,639 --> 00:17:06,880 it's a data science library written in 420 00:17:04,480 --> 00:17:09,520 python c and cython 421 00:17:06,880 --> 00:17:12,559 that uses vectorized operations in order 422 00:17:09,520 --> 00:17:15,039 to run functions at very high speeds and 423 00:17:12,559 --> 00:17:16,880 although it doesn't use gpus 424 00:17:15,039 --> 00:17:19,439 let's quickly take a look at how much of 425 00:17:16,880 --> 00:17:22,160 a speed up we get when we try to create 426 00:17:19,439 --> 00:17:23,120 a data table with pandas versus with 427 00:17:22,160 --> 00:17:25,439 python 428 00:17:23,120 --> 00:17:28,480 at the moment we are starting off on 429 00:17:25,439 --> 00:17:30,080 google colab and this specifically for 430 00:17:28,480 --> 00:17:32,480 context is 431 00:17:30,080 --> 00:17:33,760 the rapids notebook rapids has a really 432 00:17:32,480 --> 00:17:37,039 great um 433 00:17:33,760 --> 00:17:39,200 free notebook on um if you just go to 434 00:17:37,039 --> 00:17:41,039 the get started page 435 00:17:39,200 --> 00:17:43,840 you can have access to this notebook and 436 00:17:41,039 --> 00:17:47,280 basically it allows you to test out a 437 00:17:43,840 --> 00:17:49,679 gpu and the different rapids 438 00:17:47,280 --> 00:17:51,200 libraries very quickly and 439 00:17:49,679 --> 00:17:53,280 we'll just walk you through some of the 440 00:17:51,200 --> 00:17:55,840 basics of that 441 00:17:53,280 --> 00:17:58,720 we are not yet starting off with our gpu 442 00:17:55,840 --> 00:18:01,039 but just to give you some extra context 443 00:17:58,720 --> 00:18:02,720 at the moment we are going to we are 444 00:18:01,039 --> 00:18:06,320 importing our libraries and then we're 445 00:18:02,720 --> 00:18:08,720 creating um some data using uh numpy 446 00:18:06,320 --> 00:18:10,080 some random data and then 447 00:18:08,720 --> 00:18:13,360 we're going to start off by creating a 448 00:18:10,080 --> 00:18:16,160 pandas data frame and this is you know a 449 00:18:13,360 --> 00:18:18,240 very simple way to do it and then after 450 00:18:16,160 --> 00:18:21,120 we create this data frame we're going to 451 00:18:18,240 --> 00:18:22,480 see how long it takes using 452 00:18:21,120 --> 00:18:24,320 the time module we're going to see how 453 00:18:22,480 --> 00:18:27,120 long it takes for 454 00:18:24,320 --> 00:18:29,760 pandas to calculate the mean 455 00:18:27,120 --> 00:18:31,200 of the data in this column 456 00:18:29,760 --> 00:18:34,160 okay so 457 00:18:31,200 --> 00:18:36,480 i'm just going to go ahead and do that 458 00:18:34,160 --> 00:18:40,160 i'm going to create a 459 00:18:36,480 --> 00:18:43,679 separate column in the pandas data frame 460 00:18:40,160 --> 00:18:47,440 and i'm going to go ahead and 461 00:18:43,679 --> 00:18:49,760 use the pandas rolling method um to 462 00:18:47,440 --> 00:18:52,559 calculate the mean and this is a great 463 00:18:49,760 --> 00:18:53,520 method that really speeds things up 464 00:18:52,559 --> 00:18:56,880 um 465 00:18:53,520 --> 00:18:58,240 yeah so let's go ahead and see how long 466 00:18:56,880 --> 00:19:00,960 it takes for 467 00:18:58,240 --> 00:19:02,160 um pandas to calculate the mean oh that 468 00:19:00,960 --> 00:19:04,720 was really quick 469 00:19:02,160 --> 00:19:07,520 and it takes about 0.03 470 00:19:04,720 --> 00:19:09,600 seconds as you can see there which is 471 00:19:07,520 --> 00:19:11,679 really fast um 472 00:19:09,600 --> 00:19:13,760 now the next thing we're going to do is 473 00:19:11,679 --> 00:19:15,520 we're going to figure out how long it's 474 00:19:13,760 --> 00:19:18,799 going to take for 475 00:19:15,520 --> 00:19:21,520 python to do the same thing and instead 476 00:19:18,799 --> 00:19:24,480 of using the python rolling method we're 477 00:19:21,520 --> 00:19:28,240 going to create as i'm doing now 478 00:19:24,480 --> 00:19:30,559 we are going to create a for loop and 479 00:19:28,240 --> 00:19:33,120 basically what this for loop is going to 480 00:19:30,559 --> 00:19:36,880 do is it's uh we're going to use the 481 00:19:33,120 --> 00:19:39,039 mean loop column in the data frame and 482 00:19:36,880 --> 00:19:40,400 we are going to just loop through all of 483 00:19:39,039 --> 00:19:43,120 the values 484 00:19:40,400 --> 00:19:44,960 and calculate their means 485 00:19:43,120 --> 00:19:45,760 and add them to 486 00:19:44,960 --> 00:19:48,960 the 487 00:19:45,760 --> 00:19:51,440 uh to the data frame as well um but this 488 00:19:48,960 --> 00:19:52,559 time of course using python and not 489 00:19:51,440 --> 00:19:54,799 pandas 490 00:19:52,559 --> 00:19:58,480 so as you can guess this is probably 491 00:19:54,799 --> 00:20:00,000 going to be longer we're going to um 492 00:19:58,480 --> 00:20:01,520 just going to fill this up but we're 493 00:20:00,000 --> 00:20:02,799 going to 494 00:20:01,520 --> 00:20:04,400 um 495 00:20:02,799 --> 00:20:06,799 yeah we're just going to we're going to 496 00:20:04,400 --> 00:20:09,360 calculate this and also time it and see 497 00:20:06,799 --> 00:20:11,919 how long it's going to take 498 00:20:09,360 --> 00:20:14,640 for all of these loops to run let's just 499 00:20:11,919 --> 00:20:17,039 comment out that code 500 00:20:14,640 --> 00:20:20,280 and let's run it to see how long that's 501 00:20:17,039 --> 00:20:20,280 going to take 502 00:20:21,840 --> 00:20:25,440 so 503 00:20:23,440 --> 00:20:26,880 the loop here 504 00:20:25,440 --> 00:20:30,640 using 505 00:20:26,880 --> 00:20:32,720 python looping over took a full one 506 00:20:30,640 --> 00:20:35,039 second 507 00:20:32,720 --> 00:20:37,679 and 16 seconds it's just 508 00:20:35,039 --> 00:20:39,039 do with both that's a lot that's a big 509 00:20:37,679 --> 00:20:41,039 difference 510 00:20:39,039 --> 00:20:42,000 um that's a really significant 511 00:20:41,039 --> 00:20:43,840 difference 512 00:20:42,000 --> 00:20:47,679 so as you can see 513 00:20:43,840 --> 00:20:51,440 it's possible to get a speed up of about 514 00:20:47,679 --> 00:20:54,000 500 times just by switching to this 515 00:20:51,440 --> 00:20:55,520 library this probably explains why most 516 00:20:54,000 --> 00:20:57,520 data scientists choose to work with 517 00:20:55,520 --> 00:20:59,520 pandas as compared to writing their code 518 00:20:57,520 --> 00:21:01,520 in pure python 519 00:20:59,520 --> 00:21:04,640 now even though you'll get a significant 520 00:21:01,520 --> 00:21:06,080 speed up just by switching to this sort 521 00:21:04,640 --> 00:21:09,200 of workflow 522 00:21:06,080 --> 00:21:12,960 from python to pandas making use of a 523 00:21:09,200 --> 00:21:15,679 gpu especially for larger datasets can 524 00:21:12,960 --> 00:21:18,240 take things even further than earlier i 525 00:21:15,679 --> 00:21:20,880 have been interning as a software 526 00:21:18,240 --> 00:21:23,600 engineer with the rapids team at nvidia 527 00:21:20,880 --> 00:21:25,360 and i've really enjoyed working uh with 528 00:21:23,600 --> 00:21:28,240 the team there i've enjoyed working on 529 00:21:25,360 --> 00:21:33,440 this project um qdf is an open source 530 00:21:28,240 --> 00:21:34,400 python based gpu data frame library and 531 00:21:33,440 --> 00:21:36,400 for 532 00:21:34,400 --> 00:21:38,080 data scientists pythonistas that are 533 00:21:36,400 --> 00:21:40,159 wanting to work with data 534 00:21:38,080 --> 00:21:42,480 it allows you to do a lot of those 535 00:21:40,159 --> 00:21:44,000 operations like loading or joining 536 00:21:42,480 --> 00:21:45,760 aggregating and filtering and different 537 00:21:44,000 --> 00:21:48,000 things like that 538 00:21:45,760 --> 00:21:50,640 but it makes it possible for you to do 539 00:21:48,000 --> 00:21:51,600 those computations on the gpu 540 00:21:50,640 --> 00:21:52,559 and 541 00:21:51,600 --> 00:21:54,720 how 542 00:21:52,559 --> 00:21:58,640 the team has designed this 543 00:21:54,720 --> 00:22:00,960 qdf is to really mirror the panda's api 544 00:21:58,640 --> 00:22:02,400 so a lot of the things that if you can 545 00:22:00,960 --> 00:22:05,039 do something 546 00:22:02,400 --> 00:22:08,159 in pandas you should be able to do that 547 00:22:05,039 --> 00:22:11,039 same thing in korea so 548 00:22:08,159 --> 00:22:14,159 i think as well because the apis are so 549 00:22:11,039 --> 00:22:16,400 similar in how they've been written um 550 00:22:14,159 --> 00:22:18,640 it's really intuitive to make a switch 551 00:22:16,400 --> 00:22:21,840 so i'm going to go ahead and show you an 552 00:22:18,640 --> 00:22:22,640 example of what it looks like 553 00:22:21,840 --> 00:22:23,520 right 554 00:22:22,640 --> 00:22:26,720 so 555 00:22:23,520 --> 00:22:29,840 here we would like to compare pandas and 556 00:22:26,720 --> 00:22:31,760 qdf and see the difference in 557 00:22:29,840 --> 00:22:33,520 speed for this we're going to be using 558 00:22:31,760 --> 00:22:35,679 time it 559 00:22:33,520 --> 00:22:37,840 to just see how 560 00:22:35,679 --> 00:22:40,000 how long it takes for pandas to do some 561 00:22:37,840 --> 00:22:43,440 calculations and how long it takes for 562 00:22:40,000 --> 00:22:44,799 qdf to do calculations so as you can see 563 00:22:43,440 --> 00:22:46,880 um 564 00:22:44,799 --> 00:22:49,039 right now at the top we are creating a 565 00:22:46,880 --> 00:22:51,760 pandas data frame and this data frame 566 00:22:49,039 --> 00:22:54,159 has significantly more data than last 567 00:22:51,760 --> 00:22:56,960 time and then i want to show just how 568 00:22:54,159 --> 00:22:59,120 easy it is to convert a pandas data 569 00:22:56,960 --> 00:23:01,840 frame to qdf 570 00:22:59,120 --> 00:23:04,080 and uh it's it's a very similar 571 00:23:01,840 --> 00:23:06,240 instruction and then 572 00:23:04,080 --> 00:23:09,440 you're using the method from pandas and 573 00:23:06,240 --> 00:23:12,080 just putting in um your original pandas 574 00:23:09,440 --> 00:23:13,120 data frame you can also create your own 575 00:23:12,080 --> 00:23:15,520 um 576 00:23:13,120 --> 00:23:18,320 you can also create your own 577 00:23:15,520 --> 00:23:20,080 qdf data frames from scratch if you uh 578 00:23:18,320 --> 00:23:24,720 if you'd like to as well 579 00:23:20,080 --> 00:23:27,200 and so we are going to start off by 580 00:23:24,720 --> 00:23:28,080 you know using pandas to calculate the 581 00:23:27,200 --> 00:23:31,440 mean 582 00:23:28,080 --> 00:23:33,280 of the data that is in our pandas data 583 00:23:31,440 --> 00:23:35,600 frame and we're going to do the same 584 00:23:33,280 --> 00:23:38,080 thing as well with qdf and we're going 585 00:23:35,600 --> 00:23:40,960 to time both of these 586 00:23:38,080 --> 00:23:44,000 operations and see how long it takes um 587 00:23:40,960 --> 00:23:47,840 to do this with pandas and then to see 588 00:23:44,000 --> 00:23:48,799 how long it takes to do this with kudith 589 00:23:47,840 --> 00:23:50,400 so 590 00:23:48,799 --> 00:23:52,159 go ahead and run this 591 00:23:50,400 --> 00:23:55,279 and see 592 00:23:52,159 --> 00:23:55,279 what the time takes 593 00:23:56,720 --> 00:24:01,400 so it takes um 594 00:23:59,039 --> 00:24:05,880 that's great it takes about 595 00:24:01,400 --> 00:24:09,840 156 milliseconds per loop for pandas and 596 00:24:05,880 --> 00:24:13,840 3.56 milliseconds per loop for 597 00:24:09,840 --> 00:24:16,840 qdf which is really significant 598 00:24:13,840 --> 00:24:21,039 so i did want to also show you a second 599 00:24:16,840 --> 00:24:22,480 calculation um which is just merging um 600 00:24:21,039 --> 00:24:23,760 data together 601 00:24:22,480 --> 00:24:25,840 and 602 00:24:23,760 --> 00:24:28,240 i ran out of ram 603 00:24:25,840 --> 00:24:32,720 to do this on google collab because it 604 00:24:28,240 --> 00:24:33,440 is a much larger computation to do and 605 00:24:32,720 --> 00:24:35,120 so 606 00:24:33,440 --> 00:24:37,039 instead of trying to do it here we're 607 00:24:35,120 --> 00:24:38,240 just going to move over to 608 00:24:37,039 --> 00:24:39,120 um 609 00:24:38,240 --> 00:24:41,360 to 610 00:24:39,120 --> 00:24:44,640 a jupiter notebook that 611 00:24:41,360 --> 00:24:47,679 is using my own local gpu 612 00:24:44,640 --> 00:24:50,400 so here we are in our jeep to notebook 613 00:24:47,679 --> 00:24:51,279 and uh behind the scenes we are running 614 00:24:50,400 --> 00:24:52,559 a 615 00:24:51,279 --> 00:24:55,840 gpu 616 00:24:52,559 --> 00:24:58,320 and so we are still able to access our 617 00:24:55,840 --> 00:25:00,320 cdf gpu data frame 618 00:24:58,320 --> 00:25:02,080 we have a similar setup from what we had 619 00:25:00,320 --> 00:25:04,159 last time we're importing our libraries 620 00:25:02,080 --> 00:25:05,200 and creating the same data frame with 621 00:25:04,159 --> 00:25:07,120 pandas 622 00:25:05,200 --> 00:25:10,159 this time we're trying to merge the data 623 00:25:07,120 --> 00:25:13,440 together at first with pandas and then 624 00:25:10,159 --> 00:25:15,360 um with qdf so i'm just running that 625 00:25:13,440 --> 00:25:17,840 and 626 00:25:15,360 --> 00:25:19,919 yeah so i had to this was this took 627 00:25:17,840 --> 00:25:23,440 quite a long time to run 628 00:25:19,919 --> 00:25:24,799 particularly with pandas so i had to 629 00:25:23,440 --> 00:25:26,480 speed things up 630 00:25:24,799 --> 00:25:28,559 so i'm just going to jump forward a 631 00:25:26,480 --> 00:25:31,120 little bit 632 00:25:28,559 --> 00:25:32,720 all right so it did take quite a long 633 00:25:31,120 --> 00:25:35,360 time to 634 00:25:32,720 --> 00:25:37,679 get through the calculation 635 00:25:35,360 --> 00:25:39,120 with pandas i actually cut out a whole 636 00:25:37,679 --> 00:25:40,960 section of time 637 00:25:39,120 --> 00:25:44,080 and and 638 00:25:40,960 --> 00:25:47,679 here pandas to go through all of it took 639 00:25:44,080 --> 00:25:49,559 about um one minute 10 seconds 640 00:25:47,679 --> 00:25:53,120 plus or minus 641 00:25:49,559 --> 00:25:55,440 486 milliseconds per loop 642 00:25:53,120 --> 00:25:58,000 which is quite a lot of time 643 00:25:55,440 --> 00:26:00,960 to go through all of those loops 644 00:25:58,000 --> 00:26:03,039 it was it was a lot of data so it you 645 00:26:00,960 --> 00:26:05,840 know pandas was quite slow 646 00:26:03,039 --> 00:26:09,120 but next we can just let it go through 647 00:26:05,840 --> 00:26:12,400 and calculate and as you can see 648 00:26:09,120 --> 00:26:14,320 for um kudif it was much faster it took 649 00:26:12,400 --> 00:26:17,440 about 367 650 00:26:14,320 --> 00:26:19,840 milliseconds um to calculate to 651 00:26:17,440 --> 00:26:23,200 calculate that for per loop 652 00:26:19,840 --> 00:26:25,919 um which is a lot faster so definitely 653 00:26:23,200 --> 00:26:30,480 that's a fantastic way to get speed ups 654 00:26:25,919 --> 00:26:32,480 and from your python code but qdf is not 655 00:26:30,480 --> 00:26:35,600 the only way that 656 00:26:32,480 --> 00:26:38,559 python easters are using or can use gpus 657 00:26:35,600 --> 00:26:41,360 there are lots of fields where 658 00:26:38,559 --> 00:26:43,600 people using python can get speed ups in 659 00:26:41,360 --> 00:26:45,960 their python code one of those fields is 660 00:26:43,600 --> 00:26:49,039 mathematics you know we have in data 661 00:26:45,960 --> 00:26:51,679 visualization machine learning and ai 662 00:26:49,039 --> 00:26:54,320 gaming and graphics just lots of ways 663 00:26:51,679 --> 00:26:55,679 that python is can utilize gpus to get 664 00:26:54,320 --> 00:26:57,120 speed ups 665 00:26:55,679 --> 00:26:58,960 you might be watching this and thinking 666 00:26:57,120 --> 00:27:01,440 to yourself you know marlene 667 00:26:58,960 --> 00:27:03,200 i can't afford a gpu or i don't know 668 00:27:01,440 --> 00:27:06,159 where to get a gpu 669 00:27:03,200 --> 00:27:10,000 um you can definitely google it but um 670 00:27:06,159 --> 00:27:10,960 there are some great um resources online 671 00:27:10,000 --> 00:27:13,440 and 672 00:27:10,960 --> 00:27:15,840 right now i would say gpus are quite 673 00:27:13,440 --> 00:27:17,919 accessible online 674 00:27:15,840 --> 00:27:21,279 and in some cases you can actually get 675 00:27:17,919 --> 00:27:23,760 them for free or use them at a really 676 00:27:21,279 --> 00:27:24,880 good sort of cost rate 677 00:27:23,760 --> 00:27:27,200 and 678 00:27:24,880 --> 00:27:29,760 here on the screen i have some examples 679 00:27:27,200 --> 00:27:32,480 of places that you could access a gpu 680 00:27:29,760 --> 00:27:34,960 even right away i know for the rapids 681 00:27:32,480 --> 00:27:37,760 team we actually have a 682 00:27:34,960 --> 00:27:40,399 a google collab notebook on the website 683 00:27:37,760 --> 00:27:42,880 i'll put a link to the website there 684 00:27:40,399 --> 00:27:43,919 that you can actually take a look at and 685 00:27:42,880 --> 00:27:46,159 you can 686 00:27:43,919 --> 00:27:47,600 go to the colab notebook and actually 687 00:27:46,159 --> 00:27:50,559 try out the 688 00:27:47,600 --> 00:27:52,080 um the different libraries for free 689 00:27:50,559 --> 00:27:53,760 so definitely would encourage you to do 690 00:27:52,080 --> 00:27:56,720 that if you would like to 691 00:27:53,760 --> 00:27:59,200 um that is actually the end of my talk i 692 00:27:56,720 --> 00:28:02,960 hope you enjoyed listening to it 693 00:27:59,200 --> 00:28:05,440 if you have any questions feel free to 694 00:28:02,960 --> 00:28:07,120 let me know after this talk or 695 00:28:05,440 --> 00:28:10,640 feel free to also reach out to me on 696 00:28:07,120 --> 00:28:14,559 twitter i'm marlene underscores dmw 697 00:28:10,640 --> 00:28:14,559 thank you so much for for listening 698 00:28:15,440 --> 00:28:19,360 hello again uh reminder that the 699 00:28:17,679 --> 00:28:21,039 previous talk was recorded so there 700 00:28:19,360 --> 00:28:23,279 would be no questions 701 00:28:21,039 --> 00:28:25,520 but thank you marlene mangami anyway i 702 00:28:23,279 --> 00:28:26,880 mean thank you for presenting at 703 00:28:25,520 --> 00:28:28,559 pyconeyou 704 00:28:26,880 --> 00:28:31,440 uh there's a rest now there's a bit of a 705 00:28:28,559 --> 00:28:34,880 break for 45 minutes 706 00:28:31,440 --> 00:28:38,320 last block of the day will begin at 707 00:28:34,880 --> 00:28:40,640 4 15 australian eastern time 708 00:28:38,320 --> 00:28:44,520 so take a break maybe hydrate maybe 709 00:28:40,640 --> 00:28:44,520 stretch your legs see you then 710 00:28:46,640 --> 00:28:48,720 you