As far as I can tell, CuPy is only intended to hold CUDA data, but in this case it’s actually holding CPU data (pinned memory). You can check with something like:
cupy.cuda.runtime.pointerGetAttributes(gadgetCPU.CUPYcorpus.data.ptr).memoryType

This will print 1 (= cudaMemoryTypeHost). On gadgetGPU it’ll print 2 (=cudaMemoryTypeDevice).  (cudaMemoryType  reference)
You can do something similar in PyTorch  from the C++ API using torch::from_blob. Here’s an example 9. Note there’s a check 3 in from_blob that tries to prevent this sort of thing, but the check is broken (what luck!).