The assumption FedAvg quietly makes
FedAvg works well in one condition and degrades outside it. Naming the condition precisely is the whole of this lesson.
Write the global objective as the average of client objectives, each being the loss on that client's own data. Under IID data, every client's local objective is an unbiased estimate of the global one. So a step that improves a client's local loss improves the global loss in expectation, every client is pulling in roughly the same direction, and averaging their endpoints is sound.
Under non-IID data this fails at the root. Each client's local objective has a different minimiser from the global objective. Local training does not approximate global training with noise; it optimises a genuinely different function.
The consequence has a name: client drift. As a client takes more local steps, it moves further toward its own optimum and further from where the global model should go. The very mechanism that made FedAvg communication-efficient, many local steps, is what causes it.

