我有一个运行Ubuntu Precise的Dell Precision Rack,配备两个Tesla C2075和一个显示设备Quadro 600.我最近在我的桌面计算机上完成了一些测试,现在尝试将东西移植到工作站.
由于CUDA不存在,我根据本指南安装了它,并根据这个建议调整了SDK Makefile .
我现在面临的是,没有一个样本(我测试了10个不同的样本)正在运行.这些是我得到的错误:
[deviceQuery] starting...
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 10
-> invalid device ordinal
[deviceQuery] test results...
FAILED
> exiting in 3 seconds: 3...2...1...done!
Run Code Online (Sandbox Code Playgroud)
[MonteCarloMultiGPU] starting...
CUDA error at MonteCarloMultiGPU.cpp:235 code=23510 (cudaErrorInvalidDevice) "cudaGetDeviceCount(&GPU_N)"MonteCarloMultiGPU
==================
Parallelization method = threaded
Problem scaling = weak
Number of GPUs = 0
Total number of options = 0
Number of paths = 262144
main(): generating …
Run Code Online (Sandbox Code Playgroud) 我有一个 CUDA 流,有人递给我 - 一个cudaStream_t
值。CUDA运行时 API似乎没有指示我如何获取与该流关联的设备的索引。
现在,我知道这cudaStream_t
只是一个指向驱动程序级流结构的指针,但我不太愿意深入研究驱动程序。有一个惯用的方法来做到这一点吗?或者有什么好的理由不想这样做?
编辑:这个问题的另一个方面是流是否确实与设备相关联,在这种方式中,CUDA 驱动程序本身可以根据给定的指向结构确定设备的标识。
当我们在PC上创建OpenGL上下文时,有没有办法选择使用哪个物理设备或使用了多少设备?最新的OpenGL(4.5)API是否支持多GPU架构?如果我有两个相同的显卡(例如,两个Nvidia GeForce显卡),我如何正确编程OpenGL API以获得我有两张卡的好处?如何以最小的努力将OpenGL程序从单GPU版本转移到多GPU版本?
我在使用 GPU (CUDA) 进行 ffmpeg 视频编码时遇到问题。
我有 2 个 nVidia GTX 1050 Ti
当我尝试进行多个并行编码时,问题就出现了。超过 2 个进程和 ffmpeg 像这样死亡:
[h264_nvenc @ 0xcc1cc0] OpenEncodeSessionEx failed: out of memory (10)
Run Code Online (Sandbox Code Playgroud)
问题是 nvidia-smi 显示 gpu 上有很多可用资源:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.66 Driver Version: 384.66 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 105... Off | 00000000:41:00.0 Off | N/A |
| 40% 37C P0 …
Run Code Online (Sandbox Code Playgroud) 我想使用两个python源代码,第一个是使用开发的,tensorflow
另一个是使用开发的pythorch
。我想使用单独的GPU在线程中运行这些代码。两个代码的输入是相同的,并且当两个代码的结果准备好时,会有一些后处理。
我无法使用tf.device,因为它在初始化时会获取所有可用的GPU,并且我必须使用CUDA_VISIBLE_DEVICES环境变量。可通过在python中设置CUDA_VISIBLE_DEVICES来选择GPU访问。
os.environ["CUDA_VISIBLE_DEVICES"] = "Accessible_GPUs"
Run Code Online (Sandbox Code Playgroud)
但不幸的是,似乎CUDA_VISIBLE_DEVICES不能与线程一起使用:
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
Thread(target = method_from_code1).start()
os.environ["CUDA_VISIBLE_DEVICES"] = "3"
Thread(target = method_from_code2).start()
Run Code Online (Sandbox Code Playgroud)
现在的问题是为每个线程的环境变量设置不同的值。这个问题有解决方案吗?
我想使用 TensorFlow 2.0 在多个 GPU 上训练模型。在分布式训练的tensorflow教程(https://www.tensorflow.org/guide/distributed_training)中,tf.data
数据生成器转换为分布式数据集,如下所示:
dist_dataset = mirrored_strategy.experimental_distribute_dataset(dataset)
Run Code Online (Sandbox Code Playgroud)
但是,我想改用我自己的自定义数据生成器(例如,keras.utils.Sequence
数据生成器以及keras.utils.data_utils.OrderedEnqueuer
异步批量生成)。但该mirrored_strategy.experimental_distribute_dataset
方法仅支持tf.data
数据生成器。如何改用 keras 数据生成器?
谢谢你!
所以我在 Windows 10 上,现在使用多个 GPU 来运行一些机器学习模型的训练,这个模型是关于 GAN 算法的,你可以在这里查看完整的代码:
在这里,我需要减少不同 GPU 设备的总和,如下所示:
if len(devices) > 1:
with tf.name_scope('SumAcrossGPUs'), tf.device(None):
for var_idx, grad_shape in enumerate(self._grad_shapes):
g = [dev_grads[dev][var_idx][0] for dev in devices]
if np.prod(grad_shape): # nccl does not support zero-sized tensors
g = tf.contrib.nccl.all_sum(g)
for dev, gg in zip(devices, g):
dev_grads[dev][var_idx] = (gg, dev_grads[dev][var_idx][1])
Run Code Online (Sandbox Code Playgroud)
现在在这部分我收到一个关于 NCCL 的错误,我注意到它在 Windows 上不受支持,它需要 linux,因此我被困在这里......这里的“解决方案”是什么??..我怎样才能设法在 Windows 上使用 NCCL 或上面代码的替代方案..有什么简单的方法可以做到这一点吗?...提前致谢。
注意:我已经检查了一些 stackoverflow 问题。但是,没有答案可以解决我的问题。
我有多个 GPU 设备,想在它们上运行 Pytorch。我已经在我的代码中尝试了多 GPU 示例和数据并行
device = torch.device("cuda:0,1,2")
model = torch.nn.DataParallel(model, device_ids=[0, 1, 2])
model.to(device)
Run Code Online (Sandbox Code Playgroud)
在我的代码中。但训练仍然在一个 GPU 上进行(cuda:0)。在 shell 中,我还在export CUDA_VISIBLE_DEVICES=0,1,2
运行代码之前选择了使用的 GPU。
有人可以帮我解决这个问题吗?
我的服务器有两个GPU,如何同时使用两个GPU进行训练,以最大限度地发挥其计算能力?我下面的代码正确吗?它能让我的模型得到正确的训练吗?
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.bert = pretrained_model
# for param in self.bert.parameters():
# param.requires_grad = True
self.linear = nn.Linear(2048, 4)
#def forward(self, input_ids, token_type_ids, attention_mask):
def forward(self, input_ids, attention_mask):
batch = input_ids.size(0)
#output = self.bert(input_ids, token_type_ids, attention_mask).pooler_output
output = self.bert(input_ids, attention_mask).last_hidden_state
print('last_hidden_state',output.shape) # torch.Size([1, 768])
#output = output.view(batch, -1) #
output = output[:,-1,:]#(batch_size, hidden_size*2)(batch_size,1024)
output = self.linear(output)
return output
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
if torch.cuda.device_count() > 1:
print("Use", torch.cuda.device_count(), 'gpus')
model = MyModel()
model …
Run Code Online (Sandbox Code Playgroud) multi-gpu ×10
gpu ×3
cuda ×2
keras ×2
python ×2
pytorch ×2
tensorflow ×2
cuda-streams ×1
ffmpeg ×1
nvidia ×1
opengl ×1
sli ×1
ubuntu-12.04 ×1
x264 ×1