我有一个应用程序,我在用户系统上的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之间的硬件依赖性有关吗?
我有一个存储结构矢量的应用程序.这些结构包含有关内存和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因为它们的长度因机器而异.
我很幸运能够访问我大学的SLURM动力GPU集群.我一直试图让Tensorflow在集群节点中运行,但到目前为止我找不到任何文档.(我在大学里与之交谈的每个人都在使用CPU节点之前或使用单个GPU节点运行它.
我在这里找到了上一个问题的一些优秀文档.不幸的是,它相当不完整.我发现的所有其他分布式示例(例如此示例)都依赖于显式指定参数服务器.
当我尝试使用SO问题中的代码运行它时,我似乎工作得很好,直到它无法连接到不存在的参数服务器,或者在调用server.join时挂起并且没有向sbatch outfile提供打印输出(我明白应该发生).
简而言之,我的问题是如何在SLURM集群上启动Tensorflow?从sbatch阶段开始.这是我第一次在AWS上处理SPARK之外的分布式计算框架,我很想了解更多关于如何正确配置Tensorflow的信息.如何指定tf_hostlist中的哪个项目作为参数服务器?另外,我可以使用sbatch向每个worker发送稍微不同的命令,正如我在其他示例中看到的那样?
升级到Keras 2.0.9之后,我一直在使用该multi_gpu_model实用程序,但我无法保存我的模型或最佳权重
model.save('path')
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
TypeError:无法pickle模块对象
我怀疑获取模型对象的访问权存在一些问题.有没有解决这个问题的工作?
我想并行使用 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..”
我怎样才能得到想要的结果?
先说明一下我的运行环境:
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) 我有一个估算器,可以通过指定train_distribute和eval_distribute在配置中使用多个 GPU 进行训练和评估。但predict_distribute在tf.estimator.RunConfig. 如何使用多个 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) 以下是使用 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
当使用多个 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) …