Zero Bubble Pipeline Parallelism is a crucial component of large-scale distributed training, and its efficiency is affected by pipeline bubbles. We introduce a scheduling strategy that successfully achieves zero pipeline bubbles under synchronous training semantics. The core idea behind this improvement is to divide backward calculation into two parts: one part calculates the gradients of the input, and the other part calculates the gradients of the parameters. Based on this idea, we manually designed novel pipeline scheduling, which significantly outperforms benchmark methods. We further developed an algorithm that automatically finds the optimal scheduling based on specific model configuration and memory constraints. Furthermore, to truly achieve zero bubbles, we introduce a novel technique that bypasses synchronization during optimizer steps. Experimental evaluation demonstrates that our method achieves up to 23% higher throughput than the 1F1B schedule under similar memory constraints. This number can further increase to 31% when memory constraints are relaxed. We believe our results mark an important step towards realizing the potential of pipeline parallelism.