zoukankan      html  css  js  c++  java
  • pytorch 之cuda语义

    torch.cuda 会记录当前选择的GPU,并且分配的所有CUDA张量将在上面创建。可以使用torch.cuda.device 上下文管理器更改所选设备。
    但是,一旦张量被分配,您可以直接对其进行操作,而不考虑所选择的设备,结果将始终放在与张量相同的设备上

    默认情况下,不支持跨GPU操作,唯一的例外是 copy_() 。 除非启用对等存储器访问,否则对分布不同设备上的张量任何启动操作的尝试都将会引发错误

    import torch
    
    x = torch.cuda.FloatTensor(1)
    y = torch.FloatTensor(1).cuda()
    # print(x) #tensor([0.], device='cuda:0')
    # print(x.get_device())  #0
    # print(y)  #tensor([2.3332e-40], device='cuda:0')
    # print(y.get_device())  #0
    
    with torch.cuda.device(1):
        a = torch.cuda.FloatTensor(1) #分配一个张量到 GPU 1
        b = torch.FloatTensor(1).cuda() 把cpu上的张量转化到gpu上
        c = a+b #a.get_device==1 and b.get_device==1 >>c.get_device==1
        print(c.get_device()) #1 ,因为a.gpu=1,b.gpu=1,所以a+b的结果存放在gpu1上
        z = x+y
        print(z.get_device()) #0,同上
    
    
    d = torch.randn(2).cuda(1) #even within a context, you can give a GPU id to the .cuda call #对于一个变量,可以指定gpu
    print(d.get_device())#1

    使用固定的内存缓冲区当副本来自固定(页锁)内存时,主机到GPU的复制速度要快很多。CPU张量和存储开放了一个 pin_memory() 方法,它返回该对象的副本,而它的数据放在固定区域中。另外,一旦固定了张量存储,就可以使用异步的GPU副本。只需传递一个额外的async=True 参数到 cuda() 的调用。这可以用于将数据传输与计算重叠。
    通过将 pin_memory=True 传递给其构造函数,可以使 DataLoader batch返回到固定内存中 。

    单GPU的使用

    import os
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"

    多GPU的使用

    device_ids = [0,1,2,3]
    model = model.cuda(device_ids[0])
    model = nn.DataParallel(model, device_ids=device_ids)
  • 相关阅读:
    WPF游戏摘记地图编辑器(1)
    图片和视频操作核心代码
    WPF游戏摘记地图编辑器(2)
    序言
    Asp.Net 请求处理机制
    C#正则表达式
    ActiveX控件打包成Cab实现浏览器自动下载安装
    ios数据存储
    ARC 学习
    Ray's Learn Cocos2d 笔记(一)
  • 原文地址:https://www.cnblogs.com/come-on-baby/p/11041764.html
Copyright © 2011-2022 走看看