What I like to do is to get the dog to realize he's gone to far before he starts to pull. To start, don't have the leash all out, have it short so he's close. Don't pull or tug on him, let him keep the short leash slack. Instead of waiting for him to hit the end of the leash, the moment he moves ahead of you or puts the slightest tension on the leash, drop all the slack releasing the excess leash and quickly turn off into the opposite direction. While you're doing this walk quickly backwards, calling him, making kissy noises, and encouraging him to come to you. Praise lavishly him the moment he gets to you. Repeat repeat repeat. This is one way to get the dog to pay attention to where you are and builds up the responds of automatically coming to you.
Another one is to train him to follow you, starting indoors. When you're at home, have a treat in your hand and put it at your side or behind you. Lure your puppy to your side or behind you, and treat and reward for staying behind you. Step forward and have him follow the treat in your hand behind you or at your side. Treat and praise when he takes a step forward, but stays in position. As long as he stays behind the "invisible line" and close to you, he gets treats and lots of praise. Keep walking further and reward for the increases in distances he follows. You can slowly fade out the lure and have him follow your hand, and the next step follow you. You can pair a command with him follow you once he has it down, like "follow" or something like that. This is different from heel because he won't be glued to your side, but just close to you behind the "invisible line". When he has follow down you can put the leash on him and let him drag it. Next you can try picking up the leash, and then move on outside when he's good inside.
My last piece of advice would be to train him that "tension = come in my direction". Inside, put the leash on him and get him to pull but tossing a treat or toy just out of him reach. Once you got him pulling, call him and encourage him to you. The moment he breaks the tension, treat and praise. You can say "let's go" or something for that action.
Also what I find helps is putting structure in the walk. The puppy wants to sniff and explore, but he can only do it under your terms. You give the permission "go sniff" to explore with you following him, and you end the activity "let's go". Even if he doesn't want to go, just keep walking and get him to come with you to let him know "let's go" ends the activity no matter what and it is his turn to follow you. The reward for walking nicely is access to the environment. Make him sit before sniffing around so he learns to be polite and learns to be patient.
Goodluck, I hope this helps
My puppy took a few good months before she finally started walking nicely. Even now, she is still learning, lol.