Issue 1:
x.numpy()

clearly means I want to convert something to numpy, which is always on the CPU. It is redundant to have to say .cpu().numpy(). The conversion should be automatic rather than throwing an exception.

In my specific case I have set default tensor type to CUDA because that is what I am using by default - and because it makes it really easy to switch everything to CPU in one line of code without cluttering up the rest of it with passing a device around. However when I call third party software they create a tensor without an explicit type; then try to numpy() it expecting it to be CPU based. I have suggested they add a .cpu() but would be better to fix in pytorch.

Issue 2:
Both following native tensor factory function entries generate same descriptor ("bernoulli-5"):

- func: bernoulli(IntList size, Tensor p, *, TensorOptions options={}) -> Tensor
variants: function

- func: bernoulli(IntList size, double p, *, TensorOptions options={}) -> Tensor
variants: function

The corresponding decls are

{'abstract': False,
'api_name': 'bernoulli',
'args': ['size', 'p', 'options'],
'arguments': [{'dynamic_type': 'IntList',
'is_nullable': False,
'name': 'size',
'simple_type': 'IntList',
'type': 'IntList'},
{'dynamic_type': 'Tensor',
'is_nullable': False,
'name': 'p',
'simple_type': 'Tensor',
'type': 'const Tensor &'},
{'default': 'static_cast<int64_t>(at::kFloat)',
'name': 'dtype',
'simple_type': 'int64_t'},
{'default': '{static_cast<int64_t>(at::Device::Type::CPU), -1}',
'name': 'device',
'simple_type': 'IntList'},
{'default': 'static_cast<int64_t>(at::kStrided)',
'name': 'layout',
'simple_type': 'int64_t'}],
'base_name': 'bernoulli',
'deprecated': False,
'device_guard': True,
'formals': ['IntList size',
'const Tensor & p',
'const TensorOptions & options'],
'has_tensor_options': True,
'inplace': False,
'method_of': ['Type', 'namespace'],
'method_prefix_derived': '',
'mode': 'native',
'name': 'bernoulli',
'return_type': 'Tensor',
'returns': [{'dynamic_type': 'Tensor', 'name': 'result', 'type': 'Tensor'}],
'type_method_args': ['size', 'p', 'options'],
'type_method_formals': ['IntList size',
'const Tensor & p',
'const TensorOptions & options'],
'with_gil': False}

and

{'abstract': False,
'api_name': 'bernoulli',
'args': ['size', 'p', 'options'],
'arguments': [{'dynamic_type': 'IntList',
'is_nullable': False,
'name': 'size',
'simple_type': 'IntList',
'type': 'IntList'},
{'dynamic_type': 'double',
'is_nullable': False,
'name': 'p',
'simple_type': 'double',
'type': 'double'},
{'default': 'static_cast<int64_t>(at::kFloat)',
'name': 'dtype',
'simple_type': 'int64_t'},
{'default': '{static_cast<int64_t>(at::Device::Type::CPU), -1}',
'name': 'device',
'simple_type': 'IntList'},
{'default': 'static_cast<int64_t>(at::kStrided)',
'name': 'layout',
'simple_type': 'int64_t'}],
'base_name': 'bernoulli',
'deprecated': False,
'device_guard': True,
'formals': ['IntList size', 'double p', 'const TensorOptions & options'],
'has_tensor_options': True,
'inplace': False,
'method_of': ['Type', 'namespace'],
'method_prefix_derived': '',
'mode': 'native',
'name': 'bernoulli',
'return_type': 'Tensor',
'returns': [{'dynamic_type': 'Tensor', 'name': 'result', 'type': 'Tensor'}],
'type_method_args': ['size', 'p', 'options'],
'type_method_formals': ['IntList size',
'double p',
'const TensorOptions & options'],
'with_gil': False}