Heat a skillet over medium heat. When it's hot add ground beef, diced onions, salt, and pepper. Cook over medium heat until fully cooked, about 8 minutes. Break beef into small chunks while it cooks.
When the beef is fully cooked, place into a bowl BUT leave the grease behind in the pan (we're using it to make a roux for thickening).
Turn heat to low and add butter to the beef grease in the pan.
When butter is melted, add flour. Whisk the roux continually for 1 minute over low heat to cook out the flour flavor. It will clump up, that's okay!
Add milk and whisk until combined. No lumps should be left.
When the mixture is smooth, turn the heat to a low-medium and add in garlic powder, chili powder, and fire-roasted tomatoes. Whisk to combine.
Add in shredded cheese and whisk until combined (it's okay if it's not melted all the way yet).
Add cooked ground beef back into the pan and stir to combine.
Let dip simmer on low heat for 10 minutes, uncovered. Stirring occasionally.
Take off heat and enjoy right away or place in a slow cooker on the warm setting to keep warm for up to 4 hours. Add an additional 1/4-1/2 tsp of sea salt to taste, if desired.