can you elaborate on the side effects you know?
when is it good idea to still use data?
sometimes changing in place will cause raising auto-grad errors
seems to me like tensor.data.clone() is slightly more efficient than tensor.detach().clone(), when we explicitly want  cloning just the data.
similarly, when we want to send just the data to a device
a = tensor.data.to(device)
# vs
a = tensor.detach().to(device)
# vs*
with torch.no_grad():
    a = tensor.to(device)  # doesn't it send the grad too?