我正在开发一个用java完成的业务项目,需要巨大的计算能力来计算业务市场.简单的数学,但有大量的数据.
我们订购了一些cuda gpu来尝试,因为cuda不支持Java,我想知道从哪里开始.我应该构建一个JNI接口吗?我应该使用JCUDA还是有其他方法?
我没有这方面的经验,我想如果有人可以指导我,我可以开始研究和学习.
如何使用两个设备来改善例如以下代码的性能(向量之和)?是否可以"同时"使用更多设备?如果是,我如何管理不同设备的全局内存上的向量分配?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <cuda.h>
#define NB 32
#define NT 500
#define N NB*NT
__global__ void add( double *a, double *b, double *c);
//===========================================
__global__ void add( double *a, double *b, double *c){
int tid = threadIdx.x + blockIdx.x * blockDim.x;
while(tid < N){
c[tid] = a[tid] + b[tid];
tid += blockDim.x * gridDim.x;
}
}
//============================================
//BEGIN
//===========================================
int main( void ) {
double *a, *b, *c;
double *dev_a, *dev_b, *dev_c;
// allocate …
Run Code Online (Sandbox Code Playgroud) 我有一个OpenGL应用程序,可以在具有多种多GPU配置的机器上运行(可能还有不同的Windows版本,从XP到7).是否有一般方法可以选择独立于GPU组合的OpenGL渲染器的特定GPU(例如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等)?它必须是可以从应用程序代码应用的解决方案,即直接在C++或将从应用程序调用的脚本,而无需最终用户干预.
以下是我尝试寻找解决方案的几项测试的详细信息,从非常具体的案例开始,但也许有一个解决方案可以在所有或大多数情况下工作.
是否有任何可靠的方法来强制哪些GPU进行OpenGL渲染?
任何提示都将非常感激.提前致谢!
使用两个Quadro卡组合进行测试
在Windows XP 64位下使用相同的驱动程序(版本275.36),我在各种方法上取得了相对成功,例如:
让司机决定.
只要两张卡使用相同的驱动程序并决定使用所需的卡,此解决方案就是好的.所以它太具体,可能无法预测.
在让司机决定之前,使用NVAPI更改代码中的驱动程序设置.
有了这个解决方案,理论上可以让驱动程序按我的意愿决定,但很难,需要两张卡使用相同的驱动程序而且并不总是有效(使用FX 1700 + NVS 285它不起作用).
更改主屏幕.
这具有默认情况下应用程序在所选主屏幕中打开的效果.该解决方案仅与FX 1700 + FX 570组合一起使用.使用FX 1700 + FX 540,渲染器取决于驱动程序设置,独立于主屏幕,而FX 1700 + NVS 285渲染器始终为FX 1700.
当窗口在特定屏幕中时创建OpenGL上下文.
窗口可以在所需的屏幕中创建,独立于主屏幕,但它具有与上述解决方案相同的问题.
创建OpenGL上下文,仅启用所需图形卡中的屏幕,然后启用其他/ s.
这是我发现使用NVS 285作为渲染器的唯一方法,但它很难看,我不知道它是否可自动化,或者它是否适用于所有情况.
尝试使用WGL_NV_gpu_affinity扩展名选择渲染GPU .
通过FX 1700和FX 570的组合,扩展程序将两个GPU报告为兼容,并且我可以将渲染仅限制为其中一个.使用FX 1700 …
在Vulkan中使用多GPU会不会像制作许多命令队列那样在它们之间划分命令缓冲区?
有两个问题:
我想知道在使用多GPU进行训练时,通过同步批量统计来实现批量规范化层的可能方法.
Caffe也许有一些caffe可以做的变种,比如链接.但是对于BN层,我的理解是它仍然只同步层的输出,而不是平均值和变量.也许MPI可以同步手段和变量,但我认为MPI有点难以实现.
火炬我在这里和这里看到了一些评论,它们显示了running_mean和running_var可以同步,但我认为批量平均值和批量变量不能或难以同步.
Tensorflow通常,它与caffe和torch相同.BN的实施是指这一点.我知道tensorflow可以将操作分配给指定的任何设备tf.device()
.但是平均值和变量的计算是在BN层的中间,所以如果我在cpu中收集平均值和变量,我的代码将是这样的:
cpu_gather = []
label_batches = []
for i in range(num_gpu):
with tf.device('/gpu:%d' % i):
with tf.variable_scope('block1', reuse=i > 0):
image_batch, label_batch = cifar_input.build_input('cifar10', train_data_path, batch_size, 'train')
label_batches.append(label_batch)
x = _conv('weights', image_batch, 3, 3, 16, _stride_arr(1))
block1_gather.append(x)
with tf.device('/cpu:0'):
print block1_gather[0].get_shape()
x1 = tf.concat(block1_gather, 0)
# print x1.get_shape()
mean, variance = tf.nn.moments(x1, [0, 1, 2], name='moments')
for i in range(num_gpu):
with tf.device('/gpu:%d' % i): …
Run Code Online (Sandbox Code Playgroud) 我有一个标准的tensorflow Estimator和一些模型,并希望在多个GPU而不是一个GPU上运行它.如何使用数据并行来完成?
我搜索了Tensorflow文档,但没有找到示例; 只有句子说Estimator会很容易.
有没有人使用tf.learn.Estimator有一个很好的例子?或指向教程的链接?
我有一个具有多个GPU的服务器,并希望在Java应用程序内的模型推理期间充分利用它们.默认情况下,tensorflow会占用所有可用的GPU,但仅使用第一个GPU.
我可以想出三个选项来克服这个问题:
限制设备在流程级别上的可见性,即使用CUDA_VISIBLE_DEVICES
环境变量.
这将要求我运行java应用程序的几个实例并在它们之间分配流量.不是那个诱人的想法.
在单个应用程序中启动多个会话,并尝试通过ConfigProto
以下方式为每个会话分配一个设备:
public class DistributedPredictor {
private Predictor[] nested;
private int[] counters;
// ...
public DistributedPredictor(String modelPath, int numDevices, int numThreadsPerDevice) {
nested = new Predictor[numDevices];
counters = new int[numDevices];
for (int i = 0; i < nested.length; i++) {
nested[i] = new Predictor(modelPath, i, numDevices, numThreadsPerDevice);
}
}
public Prediction predict(Data data) {
int i = acquirePredictorIndex();
Prediction result = nested[i].predict(data);
releasePredictorIndex(i);
return result;
}
private synchronized int acquirePredictorIndex() {
int i …
Run Code Online (Sandbox Code Playgroud)当我使用 ddp 模式(2 个 GPU)在集群上启动主脚本时,Pytorch Lightning 会复制主脚本中执行的任何内容,例如打印或其他逻辑。我需要一些扩展的训练逻辑,我想自己处理。例如,在之后做某事(一次!)Trainer.fit()
。但随着主脚本的重复,这并不能按我的预期工作。我也尝试将其包装在 中if __name__ == "__main__"
,但它不会改变行为。如何解决这个问题呢?或者,如何在 Trainer 对象周围使用一些逻辑,而无需重复?
我希望我的模型在多个GPU上运行,共享参数但具有不同批量的数据.
我可以这样做model.fit()
吗?还有其他选择吗?
我正在尝试在多个 GPU 上运行子类 Keras 模型。代码按预期运行,但是,在代码执行过程中会出现以下“警告”:
“2 个 IndexedSlices 不支持高效的 allreduce”
这是什么意思?我遵循了 Tensorflow 2.0 Beta 指南上的多 GPU 教程。我也在我的输入管道中使用数据集 API。