Man City got off to the ideal start when Gabriel Jesus scored early on, but Mohamed Salah’s second-half equaliser left Pep Guardiola's side with too much to do even before Roberto Firmino struck.
The hosts had cause for hope when Raheem Sterling broke down the right and squared for Jesus to finish from close range with only two minutes played.
City laid siege to Liverpool’s goal in an eventful first half, with Bernardo Silva hitting the post and Sane’s effort disallowed for offside.
But Liverpool weathered the storm and levelled on 56 minutes after Sadio Mane wriggled into the area, Ederson dived at his feet and Salah lifted the loose ball into the net from a tight angle.
Firmino ended the contest on 77 minutes, pouncing on a mistake by Nicolas Otamendi before stroking a shot in off the far post.
Liverpool's victory means their Premier League fixture at West Bromwich Albion will be moved from Sunday, 22 April to Saturday, 21 April, with a 12:30 BST kick-off.
Man City: 14 Apr v Tottenham Hotspur (A) PL
Liverpool: 14 Apr v AFC Bournemouth (H) PL