Repository: pykeen/pykeen
Issue: SubsetRepresentationModule default indices are always on CPU
Root cause: Validation Gap

### Describe the bug

When running `InductiveNodePieceGNN` or any other model with SubsetRepresentationModule on a GPU, there is a CUDA error:
```
return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument index in method wrapper__index_select)
```

I found the reason is that default `indices` created in the `None` case are kept always on a CPU: 
https://github.com/pykeen/pykeen/blob/09f8b49637bab55c14febb16f29eebe81eeedb73/src/pykeen/nn/emb.py#L169-L171

### How to reproduce

Running a inductive LP baseline from the tutorial on a GPU

### Environment

| Key             | Value                    |
|-----------------|--------------------------|
| OS              | posix                    |
| Platform        | Darwin                   |
| Release         | 21.2.0                   |
| Time            | Fri Feb 18 16:17:24 2022 |
| Python          | 3.8.5                    |
| PyKEEN          | 1.7.1-dev                |
| PyKEEN Hash     | 09f8b496                 |
| PyKEEN Branch   | master                   |
| PyTorch         | 1.10.0                   |
| CUDA Available? | false                    |
| CUDA Version    | N/A                      |
| cuDNN Version   | N/A                      |

### Additional information

I managed to solve it via explicit device assignment from the `base` module, although it looks a bit ugly:

```python
indices = torch.arange(self.max_id, device=self.base._embeddings.weight.device)
```

Not relevant to this issue, but ideally we'd need a GPU-enabled CI/CD pipeline for catching all those device issues 🤔 

> I managed to solve it via explicit device assignment from the base module, although it looks a bit ugly:
> ```python
> indices = torch.arange(self.max_id, device=self.base._embeddings.weight.device)
> ```

This would only work, if we have `Embedding` as base representations, right? Maybe we should add a device property to `RepresentationModule` similar to what we have in `Model`
https://github.com/pykeen/pykeen/blob/09f8b49637bab55c14febb16f29eebe81eeedb73/src/pykeen/models/base.py#L151-L173

> This would only work, if we have Embedding as base representations, right?

Right, `base` should have some `_embedding` with known device

We could also fix that by letting `Embedding` move the indices to its device 🤔 

When I tried to set negative_sampler_kwargs=dict(filtered=True), the same bug appear.
```
[File ~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py:321, in BloomFilterer.probe(self, batch)
    ]()[312](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=311)[ """
    ]()[313](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=312)[ Iterate over indices from the probes.
    ]()[314](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=313)[ 
   (...)
    ]()[318](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=317)[ :yields: Indices of the k-th round, shape: (batch_size,).
    ]()[319](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=318)[ """
    ]()[320](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=319)[ # pre-hash
--> ]()[321](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=320)[ x = (self.mersenne * batch).sum(dim=-1)
    ]()[322](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=321)[ for _ in range(self.rounds):
    ]()[323](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=322)[     # cf. https://github.com/skeeto/hash-prospector#two-round-functions
    ]()[324](file:///~/miniconda3/envs/torch/lib/python3.9/site-packages/pykeen/sampling/filtering.py?line=323)[     x = x ^ (x >> 16)

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!]()
```

Hi @lovefxyo ,

this seems to be a different (yet similar) issue. Would you mind opening a separate bug report for that please?

My pleasure. I'll do it right away.