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

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more