From the source code of LND, payments are split in half and retried if no path for the full amount is found:
func (p *paymentSession) RequestRoute(maxAmt, feeLimit lnwire.MilliSatoshi,
activeShards, height uint32) (*route.Route, error) {
...
// This is where the magic happens. If we can't find a
// route, try it for half the amount.
maxAmt /= 2
...
For normal payments, I understand the algorithm will split the payment until it fits a path, send it, and update the weights in the graph to avoid reusing the same path. Then we can do the same for the remaining amount. This is confirmed in this answer.
However, for MPP, it seems there is a set of parts per round, which are sent concurrently. If this is the case, how does MPP define the amount of each part before sending the parts?