标签: multi-gpu

如何解决CGDirectDisplayID更改Core Foundation/IO Kit中较新的多GPU Apple笔记本电脑的问题?

在Mac OS X中,每个显示都会CGDirectDisplayID分配一个唯一的编号.您可以使用CGGetActiveDisplayList()或[NSScreen screens]访问它们等.根据Apple的文档:

显示ID可以在进程和系统重新引导之间持续存在,并且只要某些显示参数不变,通常保持不变.

在2010年年中的MacBook Pro上,Apple开始使用自动切换Intel/nVidia显卡.笔记本电脑有两个GPU,一个低功耗的英特尔和一个高性能的nVidia.以前的双GPU笔记本电脑(2009型号)没有自动GPU切换,需要用户进行设置更改,注销,然后再次登录以进行GPU切换.即使是较旧的系统也只有一个GPU.

2010年中期的模型存在一个问题,当显示器从一个GPU切换到另一个GPU时,CGDirectDisplayID不会保持不变.例如:

  1. 笔记本电脑启动.
  2. 内置LCD屏幕由Intel芯片组驱动.显示ID: 30002
  3. 外接显示器已插入.
  4. 内置 LCD屏幕切换到nVidia芯片组.它的显示ID更改: 30004
  5. 外部显示器由nVidia芯片组驱动.
  6. ......此时,英特尔芯片组处于休眠状态......
  7. 用户拔出外部显示器.
  8. 内置LCD屏幕切换回英特尔芯片组.它的显示ID更改回原始版本:30002

我的问题是,如果由于GPU更改而改变时,如何将旧显示ID与新显示ID匹配?


想到:

我注意到显示ID只改变了2,但我没有足够的测试Mac可用来确定这是否适用于所有新MacBook Pro,或者只是我的.无论如何,如果"仅检查彼此+/- 2的显示ID",那就是一种kludge.


尝试:

CGDisplayRegisterReconfigurationCallback(),当显示器要改变时通知前后,没有匹配的逻辑.在这个注册的方法中放置这样的东西是行不通的:

// Run before display settings change:
CGDirectDisplayID directDisplayID = ...;
io_service_t    servicePort = CGDisplayIOServicePort(directDisplayID);
CFDictionaryRef oldInfoDict = IODisplayCreateInfoDictionary(servicePort, kIODisplayMatchingInfo);

// ...display settings change...

// Run after display settings change:
CGDirectDisplayID directDisplayID = ...;
io_service_t    servicePort …
Run Code Online (Sandbox Code Playgroud)

core-graphics objective-c iokit core-foundation multi-gpu

10
推荐指数
2
解决办法
3072
查看次数

具有多个GPU的OpenCL/OpenGL Interop

我在使用OpenCL/OpenGL互操作的多个GPU时遇到了麻烦.我正在尝试编写一个呈现密集计算结果的应用程序.最后它会运行一个优化问题,然后根据结果向屏幕渲染一些东西.作为测试用例,我将从本课程的粒子模拟示例代码开始:http://web.engr.oregonstate.edu/~mjb/sig13/

示例代码创建和OpenGL上下文,然后使用cl_khr_gl_sharing扩展创建一个共享状态的OpenCL上下文.当我使用单个GPU时,一切正常.创建上下文如下所示:

3. create an opencl context based on the opengl context:
  cl_context_properties props[ ] =
  {
      CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext( ),
      CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay( ),
      CL_CONTEXT_PLATFORM, (cl_context_properties) Platform,
      0
  };

  cl_context Context = clCreateContext( props, 1, Device, NULL, NULL, &status );
  if( status != CL_SUCCESS) 
  {
      PrintCLError( status, "clCreateContext: " );
      exit(1);
  }
Run Code Online (Sandbox Code Playgroud)

稍后,该示例使用clCreateFromGLBuffer创建共享CL/GL缓冲区.

现在,我想从两个GPU设备创建一个上下文:

cl_context Context = clCreateContext( props, 2, Device, NULL, NULL, &status );
Run Code Online (Sandbox Code Playgroud)

我已成功打开设备,并且可以查询它们是否都支持cl_khr_gl_sharing,并且两者都可以单独工作.但是,当我尝试创建上面的上下文时,我得到了

CL_INVALID_OPERATION 
Run Code Online (Sandbox Code Playgroud)

这是cl_khr_gl_sharing扩展名添加的错误代码.在扩展描述(上面链接)中说

  • CL_INVALID_OPERATION如果为CGL,EGL,GLX或WGL之一指定了上下文或共享组对象,并且满足以下任一条件:

    • OpenGL实现不支持为其指定了上下文或共享组对象的窗口系统绑定API.
    • CL_CGL_SHAREGROUP_KHR,CL_EGL_DISPLAY_KHR,CL_GLX_DISPLAY_KHR和CL_WGL_HDC_KHR中的多个属性设置为非默认值.
    • CL_CGL_SHAREGROUP_KHR和CL_GL_CONTEXT_KHR这两个属性都设置为非默认值.
    • 参数中指定的任何设备都不支持共享OpenGL对象的数据存储的OpenCL对象,如第9.12节所述."

这个描述似乎并不适合我的任何案例.是否不可能使用多个GPU进行OpenCL/OpenGL互操作?还是我有异构硬件?我从枚举设备中打印出一些参数.我刚拿了两个随机的GPU,我可以动手了.

PlatformID: 18483216 …
Run Code Online (Sandbox Code Playgroud)

opengl interop opencl multi-gpu

10
推荐指数
1
解决办法
2685
查看次数

使用模型并行性在多个 GPU 上加载 HuggingFace 模型进行推理

我可以使用 6 个 24GB GPU。当我尝试加载一些 HuggingFace 模型时,例如以下

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("google/ul2")
model = AutoModelForSeq2SeqLM.from_pretrained("google/ul2")
Run Code Online (Sandbox Code Playgroud)

我收到内存不足错误,因为该模型似乎只能在单个 GPU 上加载。然而,虽然整个模型无法装入单个 24GB GPU 卡,但我有 6 个 GPU 卡,并且想知道是否有一种方法可以将模型加载分布到多个卡上,以执行推理。

HuggingFace 似乎有一个网页,他们解释了如何执行此操作,但截至目前还没有任何有用的内容。

python multi-gpu deep-learning torch huggingface-transformers

9
推荐指数
1
解决办法
2万
查看次数

如何解决 dist.init_process_group 挂起(或死锁)?

我本来想在 DGX A100 上设置 DDP(分布式数据并行),但它不起作用。每当我尝试运行它时,它就会挂起。我的代码非常简单,只需为 4 个 GPU 生成 4 个进程(为了调试,我只是立即销毁该组,但它甚至没有到达那里):

def find_free_port():
    """ /sf/ask/95568581/ """
    import socket
    from contextlib import closing

    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        s.bind(('', 0))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return str(s.getsockname()[1])

def setup_process(rank, world_size, backend='gloo'):
    """
    Initialize the distributed environment (for each process).

    gloo: is a collective communications library (https://github.com/facebookincubator/gloo). My understanding is that
    it's a library/API for process to communicate/coordinate with each other/master. It's a backend library.

    export NCCL_SOCKET_IFNAME=eth0
    export NCCL_IB_DISABLE=1

    /sf/ask/4275277331/

    https://pytorch.org/docs/stable/distributed.html#common-environment-variables
    """
    if rank …
Run Code Online (Sandbox Code Playgroud)

python gpu machine-learning multi-gpu pytorch

8
推荐指数
1
解决办法
2万
查看次数

.NET中的多个监视器

Screen.AllScreens无论硬件配置如何,是否都从.NET返回所有显示?例如,在一台PC上,您可以:

  1. 视频卡输出两个显示=总共2个显示
  2. 视频卡每个显示1个显示=总共2个显示,
  3. 视频卡每个显示2个显示= 6个显示,
  4. Eyefinity卡可显示6个显示屏(在显示端口上)

在所有这些情况下,如果我使用,我Screen.AllScreens可以单独访问每个显示器吗?

另外,如果我有一张扩展模式的卡,这意味着2个显示器插入一张卡,但它只是一个大桌面(我在工作中使用的)?我还可以指定要在一个屏幕上显示的内容吗?

.net c# multi-gpu

7
推荐指数
1
解决办法
2701
查看次数

nnGraph多GPU Torch

这个问题是关于使任何nnGraph网络在多个GPU上运行而不是特定于以下网络实例

我正在尝试训练一个用nnGraph构建的网络.后面的图表是附上的.我试图在多GPU设置中运行parallelModel(请参阅代码或图9).如果我将并行模型附加到nn.Sequential容器然后创建DataParallelTable,它将在多GPU设置中工作(没有nnGraph).但是,在将它附加到nnGraph后,我收到一个错误.如果我在单个GPU上训练(在if语句中将true设置为false),则向后传递有效,但在多GPU设置中,我得到一个错误"gmodule.lua:418:尝试索引本地'gradInput'(一个零值)".我认为后向传递中的节点9应该在多GPU上运行,但是这种情况并没有发生.在nnGraph上创建DataParallelTable并不适合我,但我认为至少将内部顺序网络放在DataParallelTable中会起作用.有没有其他方法来分割传递给nnGraph的初始数据,以便它在多GPU上运行?

require 'torch'
require 'nn'
require 'cudnn'
require 'cunn'
require 'cutorch'
require 'nngraph'

data1 = torch.ones(4,20):cuda()
data2 = torch.ones(4,10):cuda()

tmodel = nn.Sequential()
tmodel:add(nn.Linear(20,10))
tmodel:add(nn.Linear(10,10))
parallelModel = nn.ParallelTable()
parallelModel:add(tmodel)
parallelModel:add(nn.Identity())
parallelModel:add(nn.Identity())

model = parallelModel
if true then
  local function sharingKey(m)
     local key = torch.type(m)
     if m.__shareGradInputKey then
        key = key .. ':' .. m.__shareGradInputKey
     end
     return key
  end

  -- Share gradInput for memory efficient backprop
  local cache = {}
  model:apply(function(m)
     local moduleType = torch.type(m)
     if torch.isTensor(m.gradInput) and moduleType ~= 'nn.ConcatTable' …
Run Code Online (Sandbox Code Playgroud)

multi-gpu deep-learning torch

7
推荐指数
0
解决办法
707
查看次数

多GPU /塔设置Tensorflow 1.2 Estimator

我希望把我_model_fnEstimator成多GPU解决方案.

有没有办法在Esitmator API中执行此操作,或者是否必须显式编写设备放置和同步代码.

我知道我可以用tf.device('gpu:X')我的模型在GPU上X.我也知道我可以循环使用可用的GPU名称来跨多个GPU复制我的模型.我也知道我可以为多个GPU使用单个输入队列.

我不知道的是哪些部分(优化器,损耗计算),我实际上可以移动到GPU以及我必须同步计算的地方.

Cifar10示例中我可以看出,我只需要同步渐变.

特别是在使用时

train_op = tf.contrib.layers.optimize_loss(
        loss=loss,
        global_step=tf.contrib.framework.get_global_step(),
        learning_rate=learning_rate,
        learning_rate_decay_fn=_learning_rate_decay_fn,
        optimizer=optimizer)
Run Code Online (Sandbox Code Playgroud)

我不能再打电话optimizer.compute_gradients()optimizer.apply_gradients()手动打电话,因为这是由内部处理的.optimize_loss(..)

我想知道如何在cifar10示例Cifar10-MultiGPU中完成平均渐变,或者这是否是正确的方法Estimator.

python multi-gpu tensorflow

7
推荐指数
1
解决办法
2136
查看次数

当Ray worker调用时,Tensorflow无法检测GPU

当我尝试以下代码示例使用Tensorflow和Ray时,Tensorflow在"远程"工作程序调用时无法检测到我的机器上的GPU,但它在"本地"调用时确实找到了GPU.我把"远程"和"本地"放在恐慌报价中因为一切都在我的桌面上运行,它有两个GPU并运行Ubuntu 16.04并且我使用tensorflow-gpuAnaconda软件包安装了Tensorflow .

local_network似乎是负责在日志中的这些信息:

2018-01-26 17:24:33.149634: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Quadro M5000, pci bus id: 0000:03:00.0)
2018-01-26 17:24:33.149642: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Quadro M5000, pci bus id: 0000:04:00.0)
Run Code Online (Sandbox Code Playgroud)

并且remote_network似乎对此消息负责:

2018-01-26 17:24:34.309270: E tensorflow/stream_executor/cuda/cuda_driver.cc:406] failed call to cuInit: CUDA_ERROR_NO_DEVICE
Run Code Online (Sandbox Code Playgroud)

为什么Tensorflow能够在一种情况下检测GPU而不能检测另一种情况?

import tensorflow as tf
import numpy as np
import ray

ray.init()

BATCH_SIZE = 100
NUM_BATCHES = 1
NUM_ITERS = 201

class Network(object):
    def …
Run Code Online (Sandbox Code Playgroud)

machine-learning distributed-computing neural-network multi-gpu tensorflow

7
推荐指数
1
解决办法
364
查看次数

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?

让我们从我刚开始接触 TensorFlow 和深度学习的前提开始。

我有使用tf.Model.train()两个可用 GPU训练的 TF 2.0 Keras 样式模型,我希望缩短推理时间。

我使用极其方便的tf.distribute.MirroredStrategy().scope()上下文管理器训练了分布在 GPU 上的模型

mirrored_strategy = tf.distribute.MirroredStrategy()

with mirrored_strategy.scope():
  model.compile(...)
  model.train(...)

Run Code Online (Sandbox Code Playgroud)

两个 GPU 都得到了有效利用(即使我对结果的准确性不太满意)。

我似乎无法找到一种类似的策略来使用该tf.Model.predict()方法在 GPU 之间分配推理:当我运行时,model.predict()我(显然)仅从两个 GPU 中的一个获得使用。

是否可以在两个 GPU 上实例化相同的模型并并行提供不同的数据块?

有些帖子建议如何在 TF 1.x 中执行此操作,但我似乎无法在 TF2.0 中复制结果

https://medium.com/@sbp3624/tensorflow-multi-gpu-for-inferencing-test-time-58e952a2ed95

Tensorflow:同时预测 GPU 和 CPU

我对这个问题的心理斗争主要是

  • TF 1.xtf.Session()基于 TF2.0 中隐含的会话,如果我理解正确,我阅读的解决方案对每个 GPU 使用单独的会话,我真的不知道如何在 TF2.0 中复制它
  • 我不知道如何在model.predict()特定会话中使用该方法。

我知道这个问题可能没有很好地表述,但我总结为:

有没有人知道如何model.predict()在 TF2.0 中在多个 GPU 上运行 Keras 风格(以并行方式对每个 GPU 上的不同批次数据进行推理)?

在此先感谢您的帮助。

predict multi-gpu keras tensorflow tensorflow2.0

7
推荐指数
1
解决办法
1421
查看次数

多 GPU 训练比 Tensorflow 上的单 GPU 慢

我创建了 3 个虚拟 GPU(有 1 个 GPU)并尝试加速图像的矢量化。但是,使用下面提供的代码并从文档(这里)中手动放置我得到了奇怪的结果:在所有 GPU 上的训练比在单个 GPU 上慢两倍。还要在具有 3 个物理 GPU 的机器上检查此代码(并删除虚拟设备初始化) - 工作方式相同。

环境:Python 3.6、Ubuntu 18.04.3、tensorflow-gpu 1.14.0。

代码(此示例创建 3 个虚拟设备,您可以在具有一个 GPU 的 PC 上对其进行测试):

import os
import time
import numpy as np
import tensorflow as tf

start = time.time()

def load_graph(frozen_graph_filename):
    # We load the protobuf file from the disk and parse it to retrieve the
    # unserialized graph_def
    with tf.gfile.GFile(frozen_graph_filename, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())

    # Then, we import the graph_def …
Run Code Online (Sandbox Code Playgroud)

python multi-gpu python-3.x tensorflow

7
推荐指数
1
解决办法
1937
查看次数