Actually met this problem once again recently and decided to make use of the mp.Queue as @mrshenli suggested, so I used
result_queue = mp.Queue()
for rank in range(args.n_gpu):
        mp.Process(target=get_features, args=(rank, args, eval_dataset, result_queue)).start()

to start the processes instead of mp.spawn and just added the results in my queue with
result_queue.put((preds, labels, ranks))

in those processes.
To later collect the results I did the following:
        for _ in range(args.n_gpu):
            temp_result = result_queue.get()
            preds.append(temp_result[0])
            labels.append(temp_result[1])
            ranks.append(temp_result[2])
            del temp_result