i, is a 1-tuple whose sole element is i, just like i, j is a 2-tuple (obviously, can't just write i because that's not a tuple, but just i). When on the right side of an assignment, such syntax is used to construct a tuple; when on the left side, the assignment will deconstruct a tuple (or another sequence) into components. See this example:
# construction
scalar = 5 # => 5
two_tuple = 6, 7 # => (6, 7)
one_tuple = 8, # => (8)
# deconstruction
five = scalar
six, seven = two_tuple
eight, = one_tuple
So, if ctx.saved_tensor is a 1-tuple, your code will assign the content of ctx.saved_tensor to i.
(Note that you will often read that the tuple syntax includes parentheses — (6, 7) instead of 6, 7. This is half-correct; tuple syntax does not include the parentheses, but they are necessary in many contexts because the comma has a very low priority, or because you want to delimit the commas inside a tuple and those outside of it, like in a function parameter list, or within another sequence. That said, the extra parentheses do not hurt.)
ctx.saved_tensorsis a sequence of exactly one value, andiis being assigned to the first value.