Shortcuts

HIP (ROCm) 语义

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

HIP 接口重用了 CUDA 接口

PyTorch for HIP 有意重用了现有的 torch.cuda 接口。 这有助于加速现有 PyTorch 代码和模型的移植,因为几乎不需要进行任何代码更改,如果有的话。

来自CUDA semantics的示例对于HIP将完全相同地工作:

cuda = torch.device('cuda')     # 默认的HIP设备
cuda0 = torch.device('cuda:0')  # 'rocm' 或 'hip' 是无效的,使用 'cuda'
cuda2 = torch.device('cuda:2')  # GPU 2 (这些是基于0索引的)

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

with torch.cuda.device(1):
    # 在GPU 1上分配一个张量
    a = torch.tensor([1., 2.], device=cuda)

    # 将张量从CPU传输到GPU 1
    b = torch.tensor([1., 2.]).cuda()
    # a.device 和 b.device 是 device(type='cuda', index=1)

    # 你也可以使用 ``Tensor.to`` 来传输张量:
    b2 = torch.tensor([1., 2.]).to(device=cuda)
    # b.device 和 b2.device 是 device(type='cuda', index=1)

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

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

    # 即使在上下文中,你也可以指定设备
    # (或者在 .cuda 调用中给出GPU索引)
    d = torch.randn(2, device=cuda2)
    e = torch.randn(2).to(cuda2)
    f = torch.randn(2).cuda(cuda2)
    # d.device, e.device, 和 f.device 都是 device(type='cuda', index=2)

检查HIP

无论您是使用 PyTorch 进行 CUDA 还是 HIP,调用 is_available() 的结果都将相同。如果您使用的是已构建了 GPU 支持的 PyTorch,它将返回 True。如果您必须检查正在使用的 PyTorch 版本,请参考以下示例:

if torch.cuda.is_available() and torch.version.hip:
    # 对HIP执行特定操作
elif torch.cuda.is_available() and torch.version.cuda:
    # 对CUDA执行特定操作

TensorFloat-32(TF32) on ROCm

TF32 在 ROCm 上不受支持。

内存管理

PyTorch使用缓存内存分配器来加速内存分配。这允许快速内存释放而无需设备同步。然而,分配器管理的未使用内存仍将显示为已使用在rocm-smi中。您可以使用memory_allocated()max_memory_allocated()来监控张量占用的内存,并使用memory_reserved()max_memory_reserved()来监控缓存分配器管理的总内存量。调用empty_cache() 释放PyTorch中所有未使用的缓存内存,以便其他GPU应用程序可以使用这些内存。然而,张量占用的GPU内存不会被释放,因此它不能增加PyTorch可用的GPU内存量。

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

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

hipFFT/rocFFT 计划缓存

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

torch.distributed 后端

目前,仅支持在 ROCm 上使用“nccl”和“gloo”后端进行 torch.distributed。

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

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

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

例如:不使用

#如果 定义了(CUDA_VERSION) && CUDA_VERSION >= 11000 以隐式排除 ROCm/HIP,

使用以下方法以避免采用ROCm/HIP的代码路径:

#如果 定义了(CUDA_VERSION) && CUDA_VERSION >= 11000 && !定义了(USE_ROCM)

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

#如果 (defined(CUDA_VERSION) && CUDA_VERSION >= 11000) || defined(USE_ROCM)

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

#如果 (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