标签: multi-gpu

同时使用2个GPU调用cudaMalloc时性能不佳

我有一个应用程序,我在用户系统上的GPU之间分配处理负载.基本上,每个GPU都有CPU线程,当主应用程序线程定期触发时,它会启动GPU处理间隔.

考虑以下图像(使用NVIDIA的CUDA探查器工具生成)作为GPU处理间隔的示例- 此处应用程序使用单个GPU.

在此输入图像描述

正如您所看到的,两个排序操作消耗了大部分GPU处理时间,而我正在使用Thrust库(thrust :: sort_by_key).此外,看起来push :: sort_by_key会在启动实际排序之前调用几个cudaMallocs.

现在考虑应用程序在两个GPU上分散处理负载的相同处理间隔:

在此输入图像描述

在完美的世界中,您可以预期2 GPU处理间隔恰好是单GPU的一半(因为每个GPU的工作量只有一半).正如你所看到的,部分原因并非如此,因为cudaMallocs由于某种争用问题而被同时调用(有时长2-3倍)时似乎需要更长的时间.我不明白为什么会出现这种情况,因为2个GPU的内存分配空间是完全独立的,因此cudaMalloc上不应该有系统范围的锁定 - 每GPU锁定会更合理.

为了证明我的假设问题是同时使用cudaMalloc调用,我创建了一个非常简单的程序,它有两个CPU线程(每个GPU),每个线程多次调用cudaMalloc.我首先运行此程序,以便单独的线程不会同时调用cudaMalloc:

在此输入图像描述

你看,每次分配需要大约175微秒.接下来,我用同时调用cudaMalloc的线程运行程序:

在此输入图像描述

在这里,每个呼叫比前一个案例花了大约538微秒或3倍!毋庸置疑,这极大地减慢了我的应用程序,并且理所当然,只有2个以上的GPU才会使问题变得更糟.

我在Linux和Windows上注意到了这种行为.在Linux上,我使用的是Nvidia驱动程序版本319.60,而在Windows上我使用的是327.23版本.我正在使用CUDA工具包5.5.

可能的原因: 我在这些测试中使用的是GTX 690.这张卡基本上是2 680个GPU,安装在同一个单元中.这是我运行的唯一"多GPU"设置,所以cudaMalloc问题可能与690的2 GPU之间的硬件依赖性有关吗?

parallel-processing cuda gpu-programming multi-gpu thrust

6
推荐指数
2
解决办法
1514
查看次数

MPI接收/收集动态矢量长度

我有一个存储结构矢量的应用程序.这些结构包含有关内存和giga-flop/s等系统上每个GPU的信息.每个系统上有不同数量的GPU.

我有一个程序可以同时在多台机器上运行,我需要收集这些数据.我对MPI很新,但我能够MPI_Gather()在大多数情况下使用,但是我想知道如何收集/接收这些动态大小的向量.

class MachineData
{
    unsigned long hostMemory;
    long cpuCores;
    int cudaDevices;
    public:
    std::vector<NviInfo> nviVec; 
    std::vector<AmdInfo> amdVec;
    ...
};

struct AmdInfo
{
    int platformID;
    int deviceID;
    cl_device_id device;
    long gpuMem;
    float sgflops;
    double dgflops;
};
Run Code Online (Sandbox Code Playgroud)

群集中的每台计算机都会填充其实例MachineData.我想收集这些实例中的每一个,但我不确定如何进行收集nviVec,amdVec因为它们的长度因机器而异.

gpgpu mpi multi-gpu

5
推荐指数
1
解决办法
1491
查看次数

如何使用正确配置的参数服务器在SLURM群集上运行Tensorflow?

我很幸运能够访问我大学的SLURM动力GPU集群.我一直试图让Tensorflow在集群节点中运行,但到目前为止我找不到任何文档.(我在大学里与之交谈的每个人都在使用CPU节点之前或使用单个GPU节点运行它.

我在这里找到了上一个问题的一些优秀文档.不幸的是,它相当不完整.我发现的所有其他分布式示例(例如示例)都依赖于显式指定参数服务器.

当我尝试使用SO问题中的代码运行它时,我似乎工作得很好,直到它无法连接到不存在的参数服务器,或者在调用server.join时挂起并且没有向sbatch outfile提供打印输出(我明白应该发生).

简而言之,我的问题是如何在SLURM集群上启动Tensorflow?从sbatch阶段开始.这是我第一次在AWS上处理SPARK之外的分布式计算框架,我很想了解更多关于如何正确配置Tensorflow的信息.如何指定tf_hostlist中的哪个项目作为参数服务器?另外,我可以使用sbatch向每个worker发送稍微不同的命令,正如我在其他示例中看到的那样?

distributed-computing multi-gpu slurm sbatch tensorflow

5
推荐指数
0
解决办法
774
查看次数

无法使用Keras中的multi_gpu_model之后的model.save保存模型

升级到Keras 2.0.9之后,我一直在使用该multi_gpu_model实用程序,但我无法保存我的模型或最佳权重

model.save('path')
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

TypeError:无法pickle模块对象

我怀疑获取模型对象的访问权存在一些问题.有没有解决这个问题的工作?

distributed-computing multi-gpu keras tensorflow keras-2

5
推荐指数
2
解决办法
5510
查看次数

tensorflow 多 GPU 并行使用

我想并行使用 8 gpus,而不是按顺序使用。

例如,当我执行这段代码时,

import tensorflow as tf

with tf.device('/gpu:0'):
    for i in range(10):
        print(i)

with tf.device('/gpu:1'):
    for i in range(10, 20):
        print(i)
Run Code Online (Sandbox Code Playgroud)

我试过 cmd 命令 'CUDA_VISIBLE_DEVICE='0,1' 但结果是一样的。

我想看到结果“0 10 1 11 2 3 12 ....等”

但实际结果依次为“0 1 2 3 4 5 ..... 10 11 12 13..”

我怎样才能得到想要的结果?

python multi-gpu tensorflow

5
推荐指数
1
解决办法
7428
查看次数

在 tensorflow 的 C++ 版本上使用多个 gpu

先说明一下我的运行环境:

win10x64  
cuda9.1  and cudnn7  
gtx1080Ti x2  
i7-6850k  
Run Code Online (Sandbox Code Playgroud)

我用tensorflow的c++版本写了一个程序,读取pb文件,然后输入图像进行预测。我的目标是在一个线程或一个线程一个 gpu 中使用 tensorflow 时可以调用所有 gpu。

首先使用windows下的python调用tensorflow slim训练,然后使用freeze_graph.py将保存的模型文件转换为freeze文件。

但是,我发现在使用 session->Run() 函数时只调用了一个 gpu。无论是创建多线程还是单线程,我都是用下面的方法来调用多个gpu:

tensorflow::graph::SetDefaultDevice("0", &graphdef);
Run Code Online (Sandbox Code Playgroud)

或者

GraphDef graphdef; //Graph Definition for current model
Status status_load = ReadBinaryProto(Env::Default(), model_path, &graphdef); //read graph from pb_file
if (!status_load.ok()) {
        std::cout << " ERROR: Loading model failed...\n"
        << model_path
        << std::endl;
    std::cout << status_load.ToString() << "\n";
    system("pause");
    return;
}
tensorflow::SessionOptions options;
tensorflow::ConfigProto &config = options.config;
config.set_log_device_placement(true);
config.mutable_gpu_options()->set_allow_growth(true);
//config.mutable_gpu_options()->set_allocator_type(std::string("BFC"));
//config.mutable_gpu_options()->set_visible_device_list("");//this no error,but still can only call one gpu …
Run Code Online (Sandbox Code Playgroud)

c++ machine-learning multi-gpu deep-learning tensorflow

5
推荐指数
1
解决办法
1283
查看次数

Tensorflow estimator 多 GPU 预测

我有一个估算器,可以通过指定train_distributeeval_distribute在配置中使用多个 GPU 进行训练和评估。但predict_distributetf.estimator.RunConfig. 如何使用多个 GPU 进行预测?

multi-gpu tensorflow tensorflow-estimator

5
推荐指数
0
解决办法
418
查看次数

Tensorflow:多 GPU 训练比单 GPU 训练慢

我正在尝试使用 tf.distribute.MirroredStrategy() 使用 Tensorflow 2(nightly) 和 Keras 运行多 GPU 训练。

问题是,通过使用 2 倍大的总批量大小和 2 个 GPU (16),每个时期的训练时间会慢 3 倍。有人知道我在哪里可以找到问题吗?tf.distribute.MirroredStrategy 已经为我们完成了所有工作,并在单个 GPU 上快速进行模型训练。

它是单输入、2 输出模型。造成这种情况的更有可能的原因是什么。

以下是模型摘要:

Model: "Joined_Model_2"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
inp (InputLayer)                [(None, None, 257)]  0                                            
__________________________________________________________________________________________________
time_distributed_2 (TimeDistrib (None, None, 512)    131584      inp[0][0]                        
__________________________________________________________________________________________________
layer_normalization_1 (LayerNor (None, None, 512)    1024        time_distributed_2[0][0]         
__________________________________________________________________________________________________
re_lu_1 (ReLU)                  (None, None, 512)    0           layer_normalization_1[0][0]      
__________________________________________________________________________________________________
lstm_5 (LSTM)                   (None, 512)          2099200     re_lu_1[0][0]                    
__________________________________________________________________________________________________
add_5 (Add)                     (None, None, 512) …
Run Code Online (Sandbox Code Playgroud)

python multi-gpu keras tensorflow

5
推荐指数
0
解决办法
734
查看次数

如何使用 tf.strategy 修改 Keras CycleGAN 示例代码以在 GPU 上并行运行

以下是使用 Keras 的 Keras CycleGAN 示例中的 CycleGAN 示例

这是我修改后的使用多个 GPU 的实现。为了实现自定义训练,我使用了带有 tf.distribute.Strategy 的参考自定义训练

我想要一个来自 Keras 的 CycleGAN 示例,以便使用 GPU 快速运行。此外,我需要处理和训练大量数据。CycleGAN 使用多个损失函数train_step会返回 4 种损失,目前我只返回一种以便于理解。尽管如此,GPU 上的训练还是非常慢。我无法找到这背后的原因。

难道是我用tf.distribute.Strategy错了?

"""
Title: CycleGAN
Author: [A_K_Nain](https://twitter.com/A_K_Nain)
Date created: 2020/08/12
Last modified: 2020/08/12
Description: Implementation of CycleGAN.
"""

"""
## CycleGAN
CycleGAN is a model that aims to solve the image-to-image translation
problem. The goal of the image-to-image translation problem is to learn the
mapping between an input image and an …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multi-gpu keras tensorflow generative-adversarial-network

5
推荐指数
0
解决办法
610
查看次数

Tensorflow - 多 GPU 不适用于模型(输入)或计算梯度

当使用多个 GPU 对模型进行推理(例如调用方法:model(inputs))并计算其梯度时,机器只使用一个 GPU,其余空闲。

例如在下面的代码片段中:

import tensorflow as tf
import numpy as np
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "0,1"

# Make the tf-data
path_filename_records = 'your_path_to_records'
bs = 128

dataset = tf.data.TFRecordDataset(path_filename_records)
dataset = (dataset
           .map(parse_record, num_parallel_calls=tf.data.experimental.AUTOTUNE)
           .batch(bs)
           .prefetch(tf.data.experimental.AUTOTUNE)
          )

# Load model trained using MirroredStrategy
path_to_resnet = 'your_path_to_resnet'
mirrored_strategy = tf.distribute.MirroredStrategy()
with mirrored_strategy.scope():
    resnet50 = tf.keras.models.load_model(path_to_resnet)

for pre_images, true_label in dataset:
    with tf.GradientTape() as tape:
       tape.watch(pre_images)
       outputs = resnet50(pre_images)
       grads = tape.gradient(outputs, pre_images)
Run Code Online (Sandbox Code Playgroud)

仅使用一个 GPU。您可以使用 nvidia-smi 分析 GPU 的行为。我不知道它是否应该像这样,model(inputs) …

multi-gpu keras tensorflow

5
推荐指数
1
解决办法
275
查看次数