GPU deployment using ROCmlink
IREE can accelerate model execution on AMD GPUs using ROCm.
Prerequisiteslink
In order to use ROCm to drive the GPU, you need to have a functional ROCm environment. It can be verified by the following steps:
rocm-smi | grep rocm
If rocm-smi
does not exist, you will need to install the latest ROCm Toolkit
SDK for
Windows
or Linux.
Get the IREE compilerlink
Download the compiler from a releaselink
Python packages are distributed through multiple channels. See the
Python Bindings page for more details.
The core iree-base-compiler
package includes the ROCm compiler:
Stable release packages are published to PyPI.
python -m pip install iree-base-compiler
Nightly pre-releases are published on GitHub releases.
python -m pip install \
--find-links https://iree.dev/pip-release-links.html \
--upgrade --pre iree-base-compiler
Development packages are built at every commit and on pull requests, for limited configurations.
On Linux with Python 3.11, development packages can be installed
into a Python venv
using
the
build_tools/pkgci/setup_venv.py
script:
# Install packages from a specific commit ref.
# See also the `--fetch-latest-main` and `--fetch-gh-workflow` options.
python ./build_tools/pkgci/setup_venv.py /tmp/.venv --fetch-git-ref=8230f41d
source /tmp/.venv/bin/activate
Tip
iree-compile
and other tools are installed to your python module
installation path. If you pip install with the user mode, it is under
${HOME}/.local/bin
, or %APPDATA%Python
on Windows. You may want to
include the path in your system's PATH
environment variable:
export PATH=${HOME}/.local/bin:${PATH}
Build the compiler from sourcelink
Please make sure you have followed the
Getting started page to build
the IREE compiler, then enable the ROCm compiler target with the
IREE_TARGET_BACKEND_ROCM
option.
Tip
iree-compile
will be built under the iree-build/tools/
directory. You
may want to include this path in your system's PATH
environment variable.
Get the IREE runtimelink
Next you will need to get an IREE runtime that includes the HIP HAL driver.
You can check for HIP support by looking for a matching driver and device:
$ iree-run-module --list_drivers
cuda: NVIDIA CUDA HAL driver (via dylib)
hip: HIP HAL driver (via dylib)
local-sync: Local execution using a lightweight inline synchronous queue
local-task: Local execution using the IREE multithreading task system
vulkan: Vulkan 1.x (dynamic)
$ iree-run-module --list_devices
hip://GPU-00000000-1111-2222-3333-444444444444
local-sync://
local-task://
Download the runtime from a releaselink
Python packages are distributed through multiple channels. See the
Python Bindings page for more details.
The core iree-base-runtime
package includes the HIP HAL driver:
Stable release packages are published to PyPI.
python -m pip install iree-base-runtime
Nightly pre-releases are published on GitHub releases.
python -m pip install \
--find-links https://iree.dev/pip-release-links.html \
--upgrade --pre iree-base-runtime
Development packages are built at every commit and on pull requests, for limited configurations.
On Linux with Python 3.11, development packages can be installed
into a Python venv
using
the
build_tools/pkgci/setup_venv.py
script:
# Install packages from a specific commit ref.
# See also the `--fetch-latest-main` and `--fetch-gh-workflow` options.
python ./build_tools/pkgci/setup_venv.py /tmp/.venv --fetch-git-ref=8230f41d
source /tmp/.venv/bin/activate
Build the runtime from sourcelink
Please make sure you have followed the
Getting started page to build
IREE from source, then enable the HIP HAL driver with the IREE_HAL_DRIVER_HIP
option.
Compile and run a program modellink
With the compiler and runtime ready, we can now compile programs and run them on GPUs.
Compile a programlink
The IREE compiler transforms a model into its final deployable format in many sequential steps. A model authored with Python in an ML framework should use the corresponding framework's import tool to convert into a format (i.e., MLIR) expected by the IREE compiler first.
Using MobileNet v2 as an example, you can download the SavedModel with trained weights from TensorFlow Hub and convert it using IREE's TensorFlow importer. Then run one of the following commands to compile:
iree-compile \
--iree-hal-target-backends=rocm \
--iree-hip-target=<...> \
mobilenet_iree_input.mlir -o mobilenet_rocm.vmfb
Note that IREE comes with bundled bitcode files, which are used for linking
certain intrinsics on AMD GPUs. These will be used automatically or if the
--iree-hip-bc-dir
is empty. As additional support may be needed for
different chips, users can use this flag to point to an explicit directory.
For example, in ROCm installations on Linux, this is often found under
/opt/rocm/amdgcn/bitcode
.
Canonically a HIP target (iree-hip-target
) matching the LLVM AMDGPU backend
of the form gfx<arch_number>
is needed to compile towards each GPU chip.
If no target is specified then we will default to gfx908
.
Here is a table of commonly used architectures:
AMD GPU | Target Chip | Architecture Code Name |
---|---|---|
AMD MI100 | gfx908 |
cdna1 |
AMD MI210 | gfx90a |
cdna2 |
AMD MI250 | gfx90a |
cdna2 |
AMD MI300X (early units) | gfx940 |
cdna3 |
AMD MI300A (early units) | gfx941 |
cdna3 |
AMD MI300A | gfx942 |
cdna3 |
AMD MI300X | gfx942 |
cdna3 |
AMD RX7900XTX | gfx1100 |
rdna3 |
AMD RX7900XT | gfx1100 |
rdna3 |
AMD RX7800XT | gfx1101 |
rdna3 |
AMD RX7700XT | gfx1101 |
rdna3 |
For a more comprehensive list of prior GPU generations, you can refer to the LLVM AMDGPU backend.
In addition to the canonical gfx<arch_number>
scheme, iree-hip-target
also
supports two additonal schemes to make a better developer experience:
- Architecture code names like
cdna3
orrdna3
- GPU product names like
mi300x
orrx7900xtx
These two schemes are translated into the canonical form under the hood. We add support for common code/product names without aiming to be exhaustive. If the ones you want are missing, please use the canonical form.
Run a compiled programlink
Run the following command:
iree-run-module \
--device=hip \
--module=mobilenet_rocm.vmfb \
--function=predict \
--input="1x224x224x3xf32=0"
The above assumes the exported function in the model is named as predict
and
it expects one 224x224 RGB image. We are feeding in an image with all 0 values
here for brevity, see iree-run-module --help
for the format to specify
concrete values.