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¶
無論您是使用 PyTorch for CUDA 還是 HIP,呼叫 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)¶
TF32 在 ROCm 上不受支援。
記憶體管理¶
PyTorch 使用快取記憶體配置器來加速記憶體配置。 這允許快速記憶體釋放,而無需裝置同步。 但是,配置器管理的未使用記憶體仍會在 rocm-smi
中顯示為已使用。 您可以使用 memory_allocated()
和 max_memory_allocated()
來監視 tensors 佔用的記憶體,並使用 memory_reserved()
和 max_memory_reserved()
來監視快取配置器管理的記憶體總量。 呼叫 empty_cache()
會從 PyTorch 釋放所有未使用的快取記憶體,以便其他 GPU 應用程式可以使用。 但是,tensors 佔用的 GPU 記憶體將不會被釋放,因此無法增加 PyTorch 可用的 GPU 記憶體量。
對於更進階的使用者,我們透過 memory_stats()
提供更全面的記憶體基準測試。 我們還提供透過 memory_snapshot()
擷取記憶體配置器狀態的完整快照的功能,這可以幫助您了解程式碼產生的底層配置模式。
若要偵錯記憶體錯誤,請在您的環境中設定 PYTORCH_NO_HIP_MEMORY_CACHING=1
以停用快取。 為了方便移植,也接受 PYTORCH_NO_CUDA_MEMORY_CACHING=1
。
hipBLAS 工作區¶
對於 hipBLAS handle 和 HIP stream 的每個組合,如果該 handle 和 stream 組合執行需要工作區的 hipBLAS 核心,則會配置一個 hipBLAS 工作區。 為了避免重複配置工作區,除非呼叫 torch._C._cuda_clearCublasWorkspaces()
,否則不會釋放這些工作區; 請注意,CUDA 或 HIP 使用的是同一個函式。 每次分配的工作區大小可以透過環境變數 HIPBLAS_WORKSPACE_CONFIG
指定,格式為 :[SIZE]:[COUNT]
。 例如,環境變數 HIPBLAS_WORKSPACE_CONFIG=:4096:2:16:8
指定的總大小為 2 * 4096 + 8 * 16 KiB
或 8 MIB。 預設工作區大小為 32 MiB; MI300 及更新版本預設為 128 MiB。 若要強制 hipBLAS 避免使用工作區,請設定 HIPBLAS_WORKSPACE_CONFIG=:0:0
。 為方便起見,也接受 CUBLAS_WORKSPACE_CONFIG
。
hipFFT/rocFFT 計畫快取¶
不支援設定 hipFFT/rocFFT 計畫的快取大小。
torch.distributed 後端¶
目前,torch.distributed 僅在 ROCm 上支援 “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 上支援核心斷言 (Kernel asserts),但由於效能開銷,它們預設為停用。可以從原始碼重新編譯 PyTorch 來啟用。
請將以下行作為引數新增到 cmake 命令參數中
-DROCM_FORCE_ENABLE_GPU_ASSERTS:BOOL=ON