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)
启用内核断言¶
内核断言在ROCm上受支持,但由于性能开销,它们被禁用。可以通过从源代码重新编译PyTorch来启用它们。
请将以下行作为cmake命令参数的参数添加:
-DROCM_FORCE_ENABLE_GPU_ASSERTS:BOOL=ON