目录

HIP (ROCm) 语义

ROCm™ 是 AMD 的开源软件平台,适用于 GPU 加速的 High 性能计算和机器学习。HIP 是 ROCm 的 C++ 方言设计 简化 CUDA 应用程序到可移植 C++ 代码的转换。在以下情况下使用 HIP 将现有的 CUDA 应用程序(如 PyTorch)转换为可移植的 C++,并将新的 需要在 AMD 和 NVIDIA 之间移植的项目。

HIP 接口重用 CUDA 接口

PyTorch for HIP 有意重用现有接口。 这有助于加速现有 PyTorch 代码和模型的移植,因为 只需更改很少的代码(如果有)。

CUDA 语义中的示例对 HIP 的工作方式完全相同:

cuda = torch.device('cuda')     # Default HIP device
cuda0 = torch.device('cuda:0')  # 'rocm' or 'hip' are not valid, use 'cuda'
cuda2 = torch.device('cuda:2')  # GPU 2 (these are 0-indexed)

x = torch.tensor([1., 2.], device=cuda0)
# x.device is device(type='cuda', index=0)
y = torch.tensor([1., 2.]).cuda()
# y.device is device(type='cuda', index=0)

with torch.cuda.device(1):
    # allocates a tensor on GPU 1
    a = torch.tensor([1., 2.], device=cuda)

    # transfers a tensor from CPU to GPU 1
    b = torch.tensor([1., 2.]).cuda()
    # a.device and b.device are device(type='cuda', index=1)

    # You can also use ``Tensor.to`` to transfer a tensor:
    b2 = torch.tensor([1., 2.]).to(device=cuda)
    # b.device and b2.device are device(type='cuda', index=1)

    c = a + b
    # c.device is device(type='cuda', index=1)

    z = x + y
    # z.device is device(type='cuda', index=0)

    # even within a context, you can specify the device
    # (or give a GPU index to the .cuda call)
    d = torch.randn(2, device=cuda2)
    e = torch.randn(2).to(cuda2)
    f = torch.randn(2).cuda(cuda2)
    # d.device, e.device, and f.device are all device(type='cuda', index=2)

检查 HIP

无论您将 PyTorch 用于 CUDA 还是 HIP,调用的结果都是相同的。如果您使用的是 PyTorch ,它将返回 True。如果您必须检查 您使用的是哪个版本的 PyTorch,请参阅下面的示例:

if torch.cuda.is_available() and torch.version.hip:
    # do something specific for HIP
elif torch.cuda.is_available() and torch.version.cuda:
    # do something specific for CUDA

ROCm 上的 TensorFloat-32(TF32)

ROCm 不支持 TF32。

内存管理

PyTorch 使用缓存内存分配器来加快内存分配速度。这 允许在不同步设备的情况下快速释放内存。但是, 分配器管理的未使用内存仍将显示为 ,就像在 中使用一样。您可以使用 来监控 tensors,并使用 来监控内存总量 由 Caching 分配器管理。调用 从 PyTorch 中释放所有未使用的缓存内存,以便可以使用这些内存 通过其他 GPU 应用程序。但是,张量占用的 GPU 内存不会 ,因此它不会增加可用于 PyTorch 的 GPU 内存量。rocm-smi

对于更高级的用户,我们通过 提供更全面的内存基准测试。我们还提供捕获 通过 完成内存分配器状态的快照,这可以帮助您了解 您的代码生成的底层分配模式。

要调试内存错误,请在您的环境中设置为禁用缓存。PYTORCH_NO_CUDA_MEMORY_CACHING=1

hipFFT/rocFFT 计划缓存

不支持为 hipFFT/rocFFT 计划设置缓存大小。

torch.distributed 后端

目前,ROCm 仅支持 torch.distributed 的 “nccl” 和 “gloo” 后端。

C++ 中的 CUDA API 到 HIP API 的映射

请参考:https://rocmdocs.amd.com/en/latest/Programming_Guides/HIP_API_Guide.html

注意:CUDA_VERSION 宏、cudaRuntimeGetVersion 和 cudaDriverGetVersion API 没有 语义映射到与宏相同的值HIP_VERSION hipRuntimeGetVersion 和 hipDriverGetVersion API 的 API 获取。在进行版本检查时,请不要互换使用它们。

例如:而不是使用

#if defined(CUDA_VERSION) && CUDA_VERSION >= 11000隐式排除 ROCm/HIP,

使用以下命令不采用 ROCm/HIP 的代码路径:

#if defined(CUDA_VERSION) && CUDA_VERSION >= 11000 && !defined(USE_ROCM)

或者,如果需要采用 ROCm/HIP 的代码路径:

#if (defined(CUDA_VERSION) && CUDA_VERSION >= 11000) || defined(USE_ROCM)

或者,如果希望仅对特定 HIP 版本采用 ROCm/HIP 的代码路径:

#if (defined(CUDA_VERSION) && CUDA_VERSION >= 11000) || (defined(USE_ROCM) && ROCM_VERSION >= 40300)

请参阅 CUDA 语义文档

对于此处未列出的任何部分,请参阅 CUDA 语义文档: CUDA 语义

启用内核断言

ROCm 支持内核断言,但由于性能开销,它们被禁用。可以启用 通过从源码重新编译 PyTorch 来获取。

请将以下行添加为 cmake 命令参数的参数:

-DROCM_FORCE_ENABLE_GPU_ASSERTS:BOOL=ON

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源