HIP (ROCm) 語義¶
ROCm™ 是 AMD 的開源軟體平台,用於 GPU 加速的高效能運算和機器學習。HIP 是 ROCm 的 C++ 方言,旨在簡化 CUDA 應用程式到可移植 C++ 程式碼的轉換。HIP 用於將現有的 CUDA 應用程式(如 PyTorch)轉換為可移植的 C++,以及需要在 AMD 和 NVIDIA 之間進行移植的新專案。
HIP 介面重複使用 CUDA 介面¶
HIP 的 PyTorch 故意重複使用現有的 torch.cuda 介面。這有助於加速現有 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¶
無論您使用的是 CUDA 的 PyTorch 還是 HIP 的 PyTorch,呼叫 is_available() 的結果都相同。如果您使用的是已建置 GPU 支援的 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 使用快取記憶體配置器來加速記憶體配置。這允許在沒有裝置同步的情況下快速釋放記憶體。但是,配置器管理的未使用記憶體在 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 上僅支援 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 相同的值。在進行版本檢查時,請勿交替使用它們。
例如:不要使用
#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)
啟用核心斷言¶
ROCm 上支援核心斷言,但由於效能負擔而被停用。可以透過從原始碼重新編譯 PyTorch 來啟用它。
請將以下行作為參數添加到 cmake 命令中
-DROCM_FORCE_ENABLE_GPU_ASSERTS:BOOL=ON