Sharding vs. Partitioning: Key Differences | NanoGPT