据我了解,内置的 PyTorch 操作都通过隐式矢量化自动处理批处理,允许跨多个 GPU 进行并行处理。
但是,当根据文档在 CUDA 中编写自定义操作时,给出的 LLTM 示例执行批量不变的操作,例如逐元素计算 Sigmoid 函数的梯度。
但是,我有一个不是批处理元素不变且不可矢量化的用例。在单个 GPU 上运行,我目前(效率低下)循环遍历批处理中的每个元素,为每个元素执行内核启动,如下所示(在浏览器中编写,只是为了演示):
std::vector<at::Tensor> op_cuda_forward(at::Tensor input,
at::Tensor elementSpecificParam) {
auto output = at::zeros(torch::CUDA(/* TYPE */), {/* DIMENSIONS */});
const size_t blockDim = //
const size_t gridDim = //
const size_t = numBatches = //
for (size_t i = 0; i < numBatches; i++) {
op_cuda_forward_kernel<T><<<gridDim, blockDim>>>(input[i],
elementSpecificParam[i],
output[i]);
}
return {output};
}
但是,我希望通过批处理元素将此操作拆分到多个 GPU 上。
output
在多 GPU 场景中,张量的分配如何工作?
当然,可以在启动适当的内核之前在每个 GPU 上创建中间张量,但是,将输入数据复制到每个 GPU 并再次返回的开销将是有问题的。
有没有一种更简单的方法来启动内核而无需先探测环境以获取 GPU 信息(# GPU 等)?
最终目标是让 CUDA 操作与torch.nn.DataParallel一起使用。