DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Edited on

Device conversion with to() and from_numpy() and numpy() in PyTorch

Buy Me a Coffee

*My post explains how to create and acceess a tensor.

to() can do device conversion as shown below:

*Memos:

  • to() can be used with a tensor but not with torch.
  • The 1st argument with a tensor is device(Optional-Defalut:None-Type:str, int or device()): *Memos:
    • If it's None, the device of a tensor is not converted.
    • cpu, cuda, ipu, xpu, mkldnn, opengl, opencl, ideep, hip, ve, fpga, ort, xla, lazy, vulkan, mps, meta, hpu, mtia or privateuseone can be set to device.
    • Setting 0 to device uses cuda(GPU). *The number must be zero or positive.
    • My post explains device().
  • A copied tensor can be created.
import torch cpu_tensor = torch.tensor([0, 1, 2]) cpu_tensor.device # device(type='cpu')  cpu_tensor.to().device # device(type='cpu')  gpu_tensor = cpu_tensor.to(device='cuda:0') gpu_tensor = cpu_tensor.to(device='cuda') gpu_tensor = cpu_tensor.to(device=0) gpu_tensor = cpu_tensor.to(device=torch.device(device='cuda:0')) gpu_tensor = cpu_tensor.to(device=torch.device(device='cuda')) gpu_tensor = cpu_tensor.to(device=torch.device(device=0)) gpu_tensor = cpu_tensor.to(device=torch.device(type='cuda', index=0)) gpu_tensor = cpu_tensor.to(device=torch.device(type='cuda')) gpu_tensor.device # device(type='cuda', index=0)  gpu_tensor.to().device # device(type='cuda', index=0)  cpu_tensor = gpu_tensor.to(device='cpu') cpu_tensor.device # device(type='cpu') 
Enter fullscreen mode Exit fullscreen mode

cuda() and cpu() can change the device of a tensor to GPU(CUDA) and CPU respectively as shwon below:

*Memos:

  • cuda() or cpu() can be used with a tensor but not with torch.
  • For cuda(), the 1st argument with a tensor is device(Optional-Default:None-Type:str, int or device()). *Memos:
    • The default is the current GPU(CUDA).
    • cpu, cuda, ipu, xpu, mkldnn, opengl, opencl, ideep, hip, ve, fpga, ort, xla, lazy, vulkan, mps, meta, hpu, mtia or privateuseone can be set to device.
    • Setting 0 to device uses cuda(GPU). *The number must be zero or positive.
    • My post explains device().
  • A copied tensor is created.
import torch cpu_tensor = torch.tensor([0, 1, 2]) cpu_tensor.device # device(type='cpu')  gpu_tensor = cpu_tensor.cuda() gpu_tensor = cpu_tensor.cuda(device='cuda:0') gpu_tensor = cpu_tensor.cuda(device='cuda') gpu_tensor = cpu_tensor.cuda(device=0) gpu_tensor = cpu_tensor.cuda(device=torch.device(device='cuda:0')) gpu_tensor = cpu_tensor.cuda(device=torch.device(device='cuda')) gpu_tensor = cpu_tensor.cuda(device=torch.device(device=0)) gpu_tensor = cpu_tensor.cuda(device=torch.device(type='cuda', index=0)) gpu_tensor = cpu_tensor.cuda(device=torch.device(type='cuda')) gpu_tensor.device # device(type='cuda', index=0)  cpu_tensor = gpu_tensor.cpu() cpu_tensor.device # device(type='cpu') 
Enter fullscreen mode Exit fullscreen mode

from_numpy() can convert a NumPy array to a PyTorch tensor as shown below:

*Memos:

  • from_numpy() can be used with torch but not with a tensor.
  • The 1st argument with torch(Required-Type:ndarray). *There is no keyword argument.
  • The type of a NumPy array is also inherited to a PyTorch tensor.
import torch my_array = np.array([0., 1., 2.]) my_array.dtype # dtype('float64')  my_tensor = torch.from_numpy(my_array) my_tensor # tensor([0., 1., 2.], dtype=torch.float64) 
Enter fullscreen mode Exit fullscreen mode

numpy() can convert a PyTorch tensor to a NumPy array as shown below:

*Memos:

  • numpy() can be used with a tensor but not with torch.
  • There is force argument with a tensor(Optional-Default:False-Type:bool). *Memos:
    • If it's True, a GPU(CUDA) PyTorch tensor can be converted to a NumPy array which may be a copy.
    • force= must be used.
  • The type of a PyTorch tensor is also inherited to a NumPy array.
import torch my_tensor = torch.tensor([0., 1., 2.]) my_tensor.dtype # torch.float32  my_array = my_tensor.numpy() my_array # array([0., 1., 2.], dtype=float32)  my_tensor = torch.tensor([0., 1., 2.], device='cuda:0') my_tensor.numpy(force=True) # array([0., 1., 2.], dtype=float32)  my_tensor = torch.tensor([0., 1., 2.], device='cuda:0') my_tensor.numpy() my_tensor.numpy(force=False) # Error 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)