{
  "video_id": "CDnkFbW-uEQ",
  "channel_slug": "huggingface",
  "channel_handle": "huggingface",
  "title": "MoE Token Routing Explained: How Mixture of Experts Works (with Code)",
  "duration_seconds": 2055.0,
  "url": "https://www.youtube.com/watch?v=CDnkFbW-uEQ",
  "upload_date": "",
  "transcript": "Hello everybody, I am Oritra from\nHuggingFace and today we are talking\nabout token routing inside of mixture of\nexperts. But before that I wanted to lay\nsome foundation as to why this topic. As\nyou can see in the hugging face hub\nthere are already 2,813\nmodels which are just mixture of\nexperts. So it's it's right it's the\nright time for us to talk about mixture\nof experts. talk about what the these\narchitectures are, how to train them,\nhow to run inference, what uh the\nhugging face transformers team is\ncooking behind the scenes for us to make\nit more accessible and so on. This video\nuh is the first step towards that. So\nI'm not going to talk about how to\ntrain. I'm not going to talk about how\nto uh run inference on them. What I'm\ngoing to do is talk about one specific\npart of MOS which is called the token\nrouting. And why do I want that and not\nthe others? Because there is this\nwonderful blog post by Dr. Cameron which\ntalks about how we can one can visualize\ndense models and MOAs. So everything\nthat you need to know about are already\nthere inside this blog post. But what I\nthink is the heart of MOS is just the\nrouting uh algorithm which is a little\ncontrived and it needs a video. It's it\nneeds visuals. it needs more of code uh\nwhich I'll be presenting in u in this\nwhatever you call it a tutorial a video\nlecture or whatever and I also see that\nuh in my tweets uh there has been a lot\nof engagement with uh with just the\nrouting uh algorithm I I uh firstly I\nbullied people into uh making this tweet\nfamous wherein I like told them hey why\nare you not sharing it share it with\nother people so that it's easier for\neverybody to follow and and this is kind\nof the diagram that I first created\nwhich I felt like was a big task to do\nbut later on I understood that just\npublishing out out the slides or\npublishing out the diagrams would not\ncut it and um I would do injustice to\nthe community and here we are.\nSo uh without further ado um a little\nbit of what we are going to cover. We\nare going to cover token routing with\nslides and also with a collab notebook u\nhand in hand. We talk about some uh\ntopics in the slide and then we quickly\nmove into uh code run it and kind of see\nwhat goes where and I'll just connect it\nin the meantime.\nHere is what a mixture of expert is. So\nthis part of the diagram is very uh\nintuitive to everybody. I'm pretty sure\nthis is the transformer layer wherein\nyou have normalization you have self\nattention you have the uh skip\nconnections again normalization and here\nwhere you would have uh found a mix uh\nmulti-layer perceptron that is an MLP\nlayer you see a MOE layer that is a\nmixture of expert layer to break it down\ninto a very simple concept if you\nmultiply or if you duplicate these MLPS\ninto more than one and you form experts\nand if you call them experts it's\nessentially an MO layer where wherein\nyou have duplicated MLPS or FFNS for\nthat matter because it's not always MLPS\nit's it can be a different architecture\naltogether it can be a different neural\nnetwork it can be an MO layer itself and\nso on but the essence is that if you\nhave one MLP and then you duplicate it\nto multiple MLPS and each token gets\nrouted to one of these or two of these\nor three of these but not all of them is\nwhen you have a mixture of expert layer.\nNow uh notice how I said that it should\nnot go to every MLP out there. It should\nbe routed based on certain aspect\ncertain criterias. This is the essence\nof a mixture of expert. You you cannot\nuse all the MLPS. you have to activate\nsome and deactivate others to introduce\nsparsity and to help with the computing\nbudget of your training of your\ninference and so on. So what we have at\nthis point in time is a layer with FFN 1\n2 3 4 so four experts and you have two\nuh tokens and each token gets routed to\na different uh different uh feed forward\nnetwork. So x1 gets routed to two, x2\ngets routed to one and so on. And uh the\nthe the talk that I'm going to present\ntoday is only going to um specify how\nthese are routed, what is the routing\nmechanism, what is the criterion and so\non. All right. Uh so let's\nhit run to the inputs and\nconfigurations.\nThis is pretty simple math torch and\nfunctional. I'm pretty sure you all know\nthat. uh and the configurations has\nbatch size of one the tokens per\nsequence as four. So there is this one\nbatch of four uh sequences that we want\nto process. Uh the number of tokens can\nbe found out by multiplying the batch\nsize uh times the token per sequence and\nthis is hardcoded. We want only four\nexperts and uh we want to select only\ntwo experts at one go. that is the top\ntwo experts and the embedding dimensions\nof uh each token has to be three. The\ncapacity factor as we will uh speak\nabout later uh decides how many slots\nthere are to experts right but the this\nis code let me just run it and also\nexplain it in the visuals. So in the\nproblem statement what we have figured\nout right now is that there are four\ntokens in one batch. Uh let's omit the\nbatch dimension uh once and for all just\nfor simplicity. But there are four\ntokens T0, T1, T2 and T3. And there are\ntwo ex uh and there are four experts uh\nE 0, E1, E2 and E3. Each token can at\nonce um choose any two experts. So if T0\nchooses E and E2, T2 can choose E 0 and\nE1 and so on. But there is this another\num configuration for each expert is how\nmany um tokens can one expert process at\none go. And uh the amount that each\nexpert can process at one go is two. So\nwe call the them positions or slots. So\nslot zero and slot one. Why is it\nnecessary? It's necessary because if one\nexpert is overs subscribed or over\nrouted that is uh it already has two\ntokens to process but a third token kind\nof routes to it.\nAs soon as this gets routed or overs\nsubscribed to an expert which has\nalready been subscribed it just drops\nthe token. And this is uh done for the\nsake of efficiency. If you wanted more\nslots, you just have to um increase the\ncapacity factor which adds more slots to\nthe experts. But for the sake of\nsimplicity and also I wanted to talk\nabout how dropping of these tokens work\nuh in uh as you will find later in the\nslides I wanted to do uh one as capacity\nfactor and this capacity factor uh once\nput in the formula gives us two slots.\nSo with that our job is to figure out\nhow this router works. We have tokens,\nwe have experts. We want to route each\ntoken to these experts at one go and\nalso figure out if there is a need to\ndrop these tokens. So we have four\ntokens, four experts, two slots per\nexpert and this routing algorithm which\nwe need to figure out. Now in the collab\nnotebook you will find that I have\nhardcoded these uh tokens. You can just\nuse random normal um token embeddings.\nIt it it should work out of the bat.\nI've done this in order for me to get\nlike really good values as router logits\nand later matrices but it's done just\nfor sake of simplicity. Please feel free\nto play with the collab notebook as this\nis going to get uh published along with\nthe video. So let me hit this uh the\nsize is 143. One is the batch size, four\nis the number of uh sequences in that\nbatch and three is the embedding\ndimensions of each sequence and that is\nthe uh tokens. We now compute router\nlogic. So what is this router? A router\nis essentially a linear projection of\nthese tokens. So it it is a linear layer\nwhich has weights. I have uh exclusively\nturned the biases false for the sake of\nsimplicity but uh you can turn them on\nuh whatever whatever feels right to you\nplease do it but the entire collab\nnotebook is uh built in such a way to\nmake it simple to understand and also\ncompare the different logits afterwards\nso bias is false I've also added like\nhardcoded these weights u as the router\nweights and then what we do is we\nbasically feed forward these tokens\nthrough the router weights or the router\nlayer and get router logits. The\nessential part is how to read the router\nlogits. So as you can see that each uh\nrow starts with this t0, t1, t2, t3\nexplaining that how many tokens we have.\nSo t 0, t1, t2, t3 are four tokens and\nthe columns uh labels are e 0, e1, e2\nand e3. Those signify the experts as you\nmight have guessed. But what is this\nmatrix? The matrix talks about the\nmapping of T0 with E 0, E1, E2 and E3.\nSo what is the probability or what is\nthe likelihood or how likely is one\ntoken going to get routed to anyone or\nany two or any three of these experts.\nSo let's read it al together. P 0 has a\nlikelihood of 0.1 to get routed to E 0.\nE0 has a likelihood of 0.9 which is very\nlikely to go to E1. Uh 0.6 which is\nagain very likely to go to E3 and so on.\nUh can you guess what this number is?\n0.5.\nUh so take a moment um figure out what\nthis is and uh let's come back 2 seconds\nlater. Okay. What is this 0.5? T2 is u\nhas a likelihood of 0.5\nto go to E1 and this is how you read\nthis router logets which is very nice\nand if you want to compare this with\nthis it's exactly the same now comes the\nsparity section wherein uh if you\nremember we said that the the entire\nessence of MOS is to activate and\ndeactivate some experts it's not to\nfully um occupy all the experts by the\ntoken and uh get to it. To do that, what\nwe do is we select the top k expert\nrouter logic. So here we see that 0.9\nand 0.6 is really uh more preferred than\nthe others. 0.8 and 0.5 are preferred\nthan the others.5.8\n7.6. So it essentially means how likely\nor how top uh priorities kind of work\nwith these mappings and we essentially\nextract that\nand we extract that to these two uh\nmatrices. If I run this you will see the\nexact same matrix when 0.9 0.6\nuh E1 E3 0.8 8 0.5 E 0 E2. A little\ninteresting part with this row is that\nE2 that is token 2 has a higher\nlikelihood of going to E3 first because\nit has a likelihood of 0.8. So E3 and\nthen E5 uh and then E1 with 0.5. So\nremember how um a token has formed this\nlikelihood. It has priorities. So it\nselects the top priority first and then\ngoes to the next priority. So 0.8 first\npriority 0.5 next priority. And this\nconcept of priority is going to get more\ninvolved in our entire routing algorithm\na little later but I just wanted to you\nknow say it out loud. And with that what\nwe also do is we uh normalize these\nlogets. So a logit cannot be called a\nprobability because the the logits are\nnot normalized. What we want is we want\na very normalized kind of matrix uh so\nthat we can say that hey this is a\nlikelihood and this is not a logit. So\nwhat we do with our uh top k router\nloits is we also scatter negative\ninfinities to the po to the points which\nwe don't want. We don't want to get uh e\n0 activated e2 activated for t0. Why do\nwe do this? Because softmax as soon as\nit finds that hey this is a negative\ninfinity it turns or transforms negative\ninfinities into zeros and which is\nsomething which we like. Why? Because\nzero signifies that t 0 and e 0 has like\nit it has no chance literally zero\nchances of that getting routed to e 0.\nSo this e 0 is deactivated e2 is\ndeactivated for t0. Similarly, E1 is\ndeactivated for T1. E3 is deactivated\nfor T1. And as soon as you see a zero,\nyou spot a zero, you say, \"Hey, this is\ndeactivated.\" And this is the essence of\nsparsity in mixture of experts. So,\nfirst we had logits. We knew how to read\nlogets. Then we uh sample top k logets\nbecause those are kind of the priorities\nof each token for experts. And then we\ninsert negative infinities and then\nnormalize it. So that we have like\nactivated and deactivated. The activated\nget weights. The deactivated gets just\nzero to signify that they are absolutely\ndeactivated. We have normalized the\nlogits. Uh and the normalized logits are\ncalled router probabilities because\nessentially this talks about uh the\nprobability of a token being routed to\nan expert.\nIn the next half, we talk about slot\nselection. Remember how each expert had\nslot zero and slot one, S0 and S1. And u\nwe don't yet know which token goes to\nwhich slot. And this is exactly what\nwe'll figure out. So first what we have\nis we have the chosen experts\nuh for each token. So orange signifies\ntoken zero, yellow uh signifies token 1,\nred is uh token 2 and purple is t3. So\ntoken 3 and each of these have these\npriorities as we have previously talked\nabout. Uh so t0 first priority is expert\none, t0's second priority is expert 3\nand so on. So what we do with uh this\nmatrix is we one hot encode it to get\nthis entire big matrix which talks about\npriorities with tokens with experts. So\nthis is a this uh is a more dense kind\nof a matrix with uh informations all\nover it. one is which token gets mapped\nto which expert and in in addition to\nthis information we also know which\ntokens um mapping to each expert happens\nat which priority.\nSo let's take this row. What does this\nmean? This means that token 2's first\npriority is expert three and token 2's\nsecond priority is expert one. And\nthat's how you read this matrix. And\nthen you permute it. The permutation is\nreally interesting because now you have\na segregation of priorities. So every\ntoken is mixed but the priorities are\nsegregated. Previously we had segregated\ntokens with priorities being mixed. Now\nwe have priorities being segregated and\ntokens being mixed. So essentially the\nsame matrix just permuted for our\nsimplicity. But why why do we do this?\nWhy do we have priorities uh priority\none segregated on top of priority 2?\nBecause we will do something extra to\nthese matrices to figure out what the\nslots and of uh each of these tokens are\nand which tokens have to be dropped.\nRemember if u an expert is overs\nsubscribed you have to drop uh certain\ntokens. This is exactly where we kind of\nfall into. So first we one hot them we\nget this one hot matrix and then we do a\ncumulative summation and then minus one\nwe do a cumulative summation first. So\nwhat does this mean? We can now read\nthis matrix from uh in the perspective\nof experts. So E 0 gets subscribed first\nwith T1 and then there is no\nsubscription later on. So it's\neverything is one after it. E1 gets\nsubscribed to T0 by T0 first and then\ngets subscribed to T3 second and then\ngets subscribed to T2 as well third and\nEU is subscribed first with T1 E3\nsubscribed to T2 and then to T0 and then\nto T3 and that's how you read it.\nBut the essence of this matrix is not to\nformulate which slot each each token\ngoes to in each expert. It's to\nunderstand whether um an expert has been\nsubscribed more than its capacity and\nremember how we had capacity of two like\ntwo slots 0 s0 and s1. So every three\ngets dropped as you will see a little\nlater. So first we do a cumulative sum\nand then do minus one to these\ncumulative sums to understand that hey\ntwo is the capacity and as soon as we\nsee two or above we just drop it and\neverything else other than two are these\nslot numbers. So if you see this diagram\nuh along with the um output or the\nprinted tensor you will see exactly the\nsame and at these positions you will see\nthe slot numbers and once you see two or\nabove you drop it and that's essentially\nwhat happens in this collab uh in this\ncell as well. So if we go to the next\nslide, we just see that token 2 and\ntoken 3 are overs subscribed. Token 2\nand token 3 are overs subscribed because\nthey form more slot positions than two 0\n1 2 and this needs to get uh dropped and\nthat's where the problem of slot\nselection comes into play. We just need\nto drop it\nand uh how do we drop it? We just form a\nboolean mask which is this in the form\nof uh slot positions being less than the\ncapacity. The capacity is two. Every\nslot position that has a lesser capacity\nis good to go. But as soon as it is\nequal to or more than the capacity, we\nneed to drop it as soon as possible. And\nthat's where this f FF comes into play.\nthat is the false false and false. So\nessentially we need only these two but\nuh due to the fact that it's a\ncumulative sum it also peeps down here\nwhich we can safely ignore. But what we\ndo later is we uh multiply these uh\nmasks so to call that is a drop token\nmask with the prioritized selection. The\nprioritized selection was the selection\nof each token to the mask. And now we\ncan see that uh previously T2 was being\nselected or being routed to E1 which is\nnow dropped. T3 was routed to E3 which\nis now dropped. And uh if we can\nsimplify it into a table, this is how it\nshould look. T2 and T3 are dropped now.\nAnd we also use the same technique to\nupdate our normalized token weights.\nremembered these weights that is the h\nhow uh how much do we weigh a token and\nthen route it to we multiply the same\nwith the mask and uh we see that t2's\nweights and t3's weights are all zeros\nwhich is something which we want we\ndon't want we just want to ignore it we\ndon't want the weights to propagate and\nwe don't want um token two and token 3\ngetting subscribed to an expert which\nhas been overs subscribed we just drop\nSo we are ignoring it.\nLet's also run this. This is essentially\nthe same uh as this diagram. So we are\ngood to go. At this point we already\nhave this drop mask uh which tells of\nwhich tells us or informs us as to what\ntoken uh has to be dropped because of\nover subscription. But uh we have not\nupdated our slot selection with that\ndrop mask which we'll do just now.\nUh so we have this slot positions which\nis which has not been updated yet. We\nalso have this updated prioritized\nselection which uh which is just the\nselections with drop in tokens of t2 and\nt3 and we multiply them to get an\nupdated slot selection. If you see this\nupdated slot selection, it does not mean\num a lot to us. We just have once in t3\nand once in t0. But it has a lot of\nthings to say once we um sum it over the\nexpert dimension. Now what this vector\nso as to say this vector speaks to us is\nthat in priority one t0 has a slot of\nzero. It does not say which experts slot\nzero. It just says that t0 has uh a slot\nzero. T1 has a slot zero. T2 has a slot\nzero. T3 has slot one. Again in priority\ntwo that is the later half of this\nvector. Uh t0 has a slot of one t uh t1\nhas a slot of zero and so on. So if you\nbreak these two vectors in priorities in\nthe terms of priorities we we get the\nsame essence and then we permute it to\nagain speak the same information just in\na better visual and you can break this\ndown break the entire matrix down into\nuh this table wherein these are the\ntokens token 0 1 2 and three so as to\nsay which slot does these do these\ntokens occupy uh in which priority\nBut a niche thing to notice here is that\nwe don't say this token um is going to\ngo to this slot of this expert. The\nexpert condition is not yet uh\nmentioned. We just notice how we uh talk\nabout slots. Right? So with that we will\nuh figure this matrix out which is\nessentially exactly the same as\nextracted slot positions. And with that\nwe also have to now talk about the token\nslots and weigh them. So what we have\ntill now is we have these expert to\ntoken mappings that is the updated uh\nprioritize selection. This says which\ntoken maps to which expert. The other\nmatrix is the updated normalized token\nweights which means uh which expert maps\nto which token in which uh and what is\nthe weight for this mapping. So let's uh\ntake one example of the first row which\nis priority one of t0 gets selected with\nE1 and the weight is 0.5. So we have the\nmapping of expert to token. We have the\nmapping of expert to token with their\nweights and now we have the slots of\neach token without knowing which expert\nuh the slot refers to.\nWhat we want we want is the token with\nthe weight in the slot. So we want a\nmatrix to talk three ways. One is token\nexpert, one is token expert uh slot and\none is token expert slots weight. So we\nhave a three-way uh matrix coming our\nway uh in which we will be able to uh\nposition each token inside these slots\nwith their weights.\nAnd to do that the first thing that we\ndo is we one hot these extracted slot\npositions. So if we go back to our synth\nand we run this, we have exactly this um\ntensor and this tensor talks about which\ntokens, which priority goes to which\nslot. It still does not talk about which\nuh expert. So it's just one hot encoding\nfor something else. What do we have till\nnow? We have these expert to token\nmappings as above, expert to token\nweights, token slots based on priority.\nAnd now the one hot kind of token slots\nto priority uh token to a slot mapping\nbased on the priority. So we have this.\nNow what we do is we uh use these\nupdated normalized token weights that is\nthe weights that we had which are with\nthe uh tokens\nto be dropped as zeros that is t2 and t3\nall are zeros and we multiply it with\nthe slot one part and the and this is uh\nthe heart of the entire video\npresentation.\nThis builds two matrices based on\npriority. So we talk about priority one\nfirst and then priority 2 and how we\ncome to this. So priority one has all\nthese um tensors on itself in terms of\nslots and also experts. But do notice\nthat it's also colorcoded. So the colors\nare these tokens and the rows are\nexperts and the columns are slots. So\ncan you kind of figure out that this\nmatrix is going to talk three ways\nwherein we have the expert slot and\ntoken information gathered in one. So\nlet's simplify it. Let's start reading\nit al together. So in the first priority\nof token zero the first slot that is\nslot zero is subscribed to E1. The\nsecond slot is not subscribed at all.\nAnd in priority 2 for token zero it is\nsubscribed to E3 with a weight of 0.4\nand so on. So what we have here are two\nbig tensors each with priorities\nand each has like tensor 0, tensor one,\ntensor 2, tensor 3 and uh you can also\nfigure out what weight each tensor to\nthat expert slot uh it currently holds.\nAnd once we have these priorities, we\ncan just sum them across the priorities\nto have um what we call as a big matrix,\na final weight matrix\nwith the with entirely the same um\ninformation of slot, expert and tokens\nand weights that we had in a bigger\nmatrix.\nIf you don't understand this part, uh\nwe'll we'll break it down a little\nfurther in the next. So with this slide\nwhat we try to do is let's take for\nexample slot zero and uh slot zero with\nE 0. Does it apply to uh token 0? No.\nToken 1? Yes. What's the weight? 0.5.\nGood. Uh let's go to slot zero with E1.\nSlot zero with E1. Okay. T 0. Good. 0.5.\nAre there any more? Are there any more?\nAre there any more? Yes. T3 with again\n0.5. So this is the first slot that is\ntoken zeros first slot and this is the\nsecond slot with a weight of 0.5. And\nthis is how you read the entire matrix.\nYou go along the column to see which\nslot. Once you have a number hit, you\nfigure out which row it corresponds to\nand this row is the expert. And the\ncolor coding gives you which token are\nwe talking about. And that is how we\nkind of finally build the entire weight\nmatrix.\nThis is this is cool, right? Uh we just\nhave like a two-dimensional uh matrix\ntalk or give us information three or\nfour ways which absolutely blows my\nmind. Uh if you if you kind of did not\nfollow through, I will ask you to stop\nthe video right here. Um, take a walk,\ngo have some coffee. Um, build this\ncollab notebook again like run the\ncollab notebook again to this point.\nRead uh or or follow along the entire\nvideo to to this point and uh kind of be\nwith your thoughts because this is\nreally interesting how a simple\ntwo-dimensional or three-dimensional\nmatrix can give us so much of\ninformation. Enough of me blabbering. Uh\nlet's go to the next slide.\nAnd this is where we bring everything\nhome. What we have here is um our the\nthe big majestic matrix, the final\nweight matrix with the tokens getting um\nmultiplied matrix multiplied and we\nexactly have those experts\nslots getting the position that the\ntokens want and which is very\ninteresting. So let me finally build\nthis out. This is the final routing\nweights and uh we have the permute blah\nblah blah and then we just do a matrix\nmultiply with the tokens and that\nessentially brings me uh to this to the\nend of this video or before that I also\nwanted to mention that uh these are\nweight matrices while here in the collab\nnotebook I have used just a boolean\nmatrix to not give the weights but to\nshow that hey this u token is\nessentially being picked up as it is\nwithout its weights so as to make it\nsimple. So if you see the outputs this\noutput and this output does not match.\nWhat this means is this is expert zero\nslot zero and slot one. So expert zero\nlet me go back to this slide. expert\nzero's slot zero has 0.5 of token one\nand uh as I have mentioned I'm not using\nthe 0.5 I'm just using a boolean matrix\nto just pick up the token one and\nessentially this should be token 1 0.381\nwe will see that 0.3 0.8 update 0.1.\nThis is essentially token 1. Uh, and\nthis 0.5 3 and 5 0.3 5 3 and five. This\nis token 0. Uh, let's match token 0. And\nit essentially just grabs your m your\ntokens in and places them into slots\nthat we\nthat we have. If you want these weights,\njust simply take this away and this is\nthe final weights getting multiplied to\nthe tokens with the permutation and you\nget 0.5 times or 0.4 times of a token.\nBut for\nsimplicity\nchange\nokay this this shows how you can pluck\nthings and then also multiply weights.\nwe we want multiplication of bits but\nfor the sake of simplicity I'm just\nplucking the tokens and placing in the\nslots and uh this should be um enough\nfor you to understand how the routing\nmechanism works in mixture of expert and\nuh with that I'm also going to kind of\nleave you to a conclusion of this uh\nvideo this is the first time that I'm\ntrying to record something so if there\nare problems please let me know uh if\nyou like some if you like me breaking\nuh down these comp complex or\ncomplicated uh structures, papers, blah\nblah blah. Do let me know. I would be\nvery interested in doing something like\nthat. It takes a lot of time but I I\nreally like teaching. So uh do let me\nknow if you have some um aspect that you\nwant me to figure out or you want me to\nteach. I'll be happy to do that. And\nalso on the terms of we are uh we are\nalso going to work on a mixture of\nexpert blog post uh with very uh focused\nkind of writing on transformers where we\nwant to figure out how uh the\ntransformers team in hugging face is\nmaking our lives a lot easier with\nuh good optimization kernels uh how to\ntrain them how to run inference on them.\nUm if you have like a deployment how to\ndeploy them and so on. So we are\nactively writing that. I thought um\nhaving a separate kind of notebook slide\nand u video uh for these uh routing al\nfor this routing uh algorithm might make\nmore sense. So here we are. And with\nthat, um, bye-bye.",
  "transcript_chars": 26475,
  "ingested_at": "2026-05-15T10:41:19.662095+00:00",
  "source": "channel",
  "yt_meta": {
    "view_count": 6556,
    "like_count": 238,
    "channel_id": "UCHlNU7kIZhRgSbhHvFoy72w",
    "categories": [
      "Education"
    ],
    "tags": []
  }
}