The HPVM Compiler Infrastructure
This repository contains the source code and documentation for the HPVM Compiler Infrastructure.
HPVM is a compiler for heterogeneous parallel system. For more about what HPVM is, see our website and publications: PPoPP'18 paper, OOPSLA'19 paper, PPoPP'21 paper.
Read our online documentation for how to build, install, and use HPVM.
HPVM is currently at version 1.0.
Getting Started
Dependencies
The following components are mandatory for building HPVM:
- GCC (>=5.1)
- CMake (>=3.17)
- GNU Make (>=3.79) or Ninja (>=1.10)
Building HPVM
-
Install Anaconda, a Python package manager. This provides the command
conda
. -
Clone this branch (
hpvm-release-epochs0
) of this repository:git clone -b hpvm-release-epochs0 --single-branch https://gitlab.engr.illinois.edu/llvm/hpvm.git
-
Find
env.yaml
in the repo's root, and use conda to create a virtual environment with Python 3.7 and all required packages installed:cd hpvm/ conda env create -n hpvm -f ./env.yaml conda activate hpvm
-
Change directory to
./hpvm
in the repo and run the installer with recommended options:cd hpvm/; ./install.sh -t "X86"
This will download additional dependencies, configure HPVM and build HPVM.
- If you have
ninja
installed (in the place ofmake
), you may use./install.sh --ninja -t "X86"
to build HPVM with ninja.
- If you have
Generating NVDLA Buffer from PyTorch DNN
Run test/epoch_dnn/main.py
to generate the PyTorch DNN defined at test/epoch_dnn/torch_dnn/miniera.py
into NVDLA,
and evaluate it on real hardware:
cd test/epoch_dnn
# rm -r /tmp/miniera # Do this if you have run main.py before
python main.py
This script will run through the whole code generation (putting everything under /tmp/miniera
) and evaluation, including
- Generate quantization scale
calib.txt
for INT8 quantization; - Export DNN to NVDLA buffer
hpvm-mod.nvdla
; - Select a sample of images from the dataset and put them as JPG files (
images/$idx_$label.jpg
); for example, the 0th image which has label 1 will beimages/0000_1.jpg
; - Copy NVDLA model and images to an NVDLA device via SCP;
- Run the NVDLA model on every image we sampled;
- Display the accuracy of this model.
HPVM Scheduler Backend
We provide the HPVM Backend pass DFG2LLVM_EPOCHS
which converts those Dataflow Graph (DFG) nodes which represent specific
tasks from the scheduler's task library (e.g FFT, Viterbi). To specify that a particular node corresponds to a scheduler
task, users must specify the target hint to node be EPOCHS_TARGET
.
__hpvm__hint(EPOCHS_TARGET)
If a particular node in the DFG is marked as above, the DFG2LLVM_EPOCHS
backend pass would then identify which task from
the scheduler's task library that node corresponds by using the user specified call to __hpvm__task
. For example,
to specify that a node represents a Vitterbi Task in the accelerator, the following call will be used:
__hpvm__task(VIT_TASK)
Using this information, alongside a task library configuration file (which describes the specific scheduler api to set-up
and execute each task), the DFG2LLVM_EPOCHS
pass generates the appropriate task specific api calls while respecting
the task inter-dependency constraints (as denoted by the structure of the HPVM Dataflow Graph).
To add a new task type to this pass, users must simply add a new task type entry to __hpvm__task
and create the
entry for the name of the specific scheduler api calls to the task library configuration file.
Support
All questions can be directed to hpvm-dev@lists.cs.illinois.edu.