TT-BUDA Installation

Overview

The TT-BUDA software stack can compile models from several different frameworks and execute them in many different ways on Tenstorrent hardware.

This user guide is intended to help you setup your system with the appropriate device drivers, firmware, system dependencies, and compiler / runtime software.

Note on terminology:

While TT-BUDA is the official Tenstorrent AI/ML compiler stack, PyBUDA is the Python interface for TT-BUDA. TT-BUDA is the core technology; however, PyBUDA allows users to access and utilize TT-BUDA’s features directly from Python. This includes directly importing model architectures and weights from PyTorch, TensorFlow, ONNX, and TFLite.

Prerequisites

OS Compatibility

Presently, Tenstorrent software is only supported on the Ubuntu 20.04 LTS (Focal Fossa) operating system.

Download

To access the PyBUDA software and associated files, please navigate to https://github.com/tenstorrent/tt-buda.

To install a release, please go to https://github.com/tenstorrent/tt-buda/releases. Once you have identified the release version you would like to install, you can download the individual files by clicking on their name.

Install

PyBUDA releases can be installed using two methods: Python virtualenv or Docker. PyBUDA can be installed from source following the Python virtualenv method.

Python Environment Installation

It is strongly recommended to use virtual environments for each project utilizing PyBUDA and Python dependencies. Creating a new virtual environment with PyBUDA and libraries is very easy.

Prerequisites (detailed sections below) for python envirnment installation are listed here:

To install a PyBUDA release, follow these steps:

python3 -m venv env
  • Step 3. Activate environment

source env/bin/activate
  • Step 4. Pip install PyBuda and TVM

If you have downloaded the latest release wheel files, you can install them directly with pip.

pip install pybuda-<version>.whl tvm-<version>.whl

To compile PyBUDA from source, follow these steps:

cd tt-buda
git submodule update --init --recursive
  • Step 3. Compile. PyBUDA’s make system will automatically create the needed venv

make
source  build/python_env/bin/activate

Docker Container Installation

Alternatively, PyBUDA and its dependencies are provided as Docker images which can run in separate containers.

Prerequisites (detailed sections below) for docker installation are listed here:

  • Step 1. Setup a personal access token (classic)

Create a personal access token from: https://github.com/settings/tokens. Give the token the permissions to read packages from the container registry read:packages.

  • Step 2. Login to Docker Registry

GITHUB_TOKEN=<your token>
echo $GITHUB_TOKEN | sudo docker login ghcr.io -u <your github username> --password-stdin
  • Step 3. Pull the image

sudo docker pull ghcr.io/tenstorrent/tt-buda/<TAG>
  • Step 4. Run the container

sudo docker run --rm -ti --shm-size=4g --device /dev/tenstorrent -v /dev/hugepages-1G:/dev/hugepages-1G -v `pwd`/:/home/ ghcr.io/tenstorrent/tt-buda/<TAG> bash
  • Step 5. Change root directory

cd home/

Installation Prerequisites

Setup HugePages

NUM_DEVICES=$(lspci -d 1e52: | wc -l)
sudo sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=.*$/GRUB_CMDLINE_LINUX_DEFAULT=\"hugepagesz=1G hugepages=${NUM_DEVICES} nr_hugepages=${NUM_DEVICES} iommu=pt\"/g" /etc/default/grub
sudo update-grub
sudo sed -i "/\s\/dev\/hugepages-1G\s/d" /etc/fstab; echo "hugetlbfs /dev/hugepages-1G hugetlbfs pagesize=1G,rw,mode=777 0 0" | sudo tee -a /etc/fstab
sudo reboot

PCI Driver Installation

Please navigate to https://github.com/tenstorrent/tt-kmd and follow the readme to install the kernel mode PCI driver.

Device Firmware Update

Please navigate to https://github.com/tenstorrent/tt-flash and https://github.com/tenstorrent/tt-firmware-gs to download a utility for flashing device firmwares and the firmware itself. Follow respective readmes for setup and installation.

Backend Compiler Dependencies

Instructions to install the Tenstorrent backend compiler dependencies on a fresh install of Ubuntu Server.

You may need to append each apt-get command with sudo if you do not have root permissions.

apt-get update -y && apt-get upgrade -y --no-install-recommends
apt-get install -y software-properties-common
apt-get install -y python3.8-venv libboost-all-dev libgoogle-glog-dev libgl1-mesa-glx ruby
apt-get install -y build-essential clang-6.0 libhdf5-serial-dev libzmq3-dev

Additional PyBUDA Compile Dependencies

OS Level Dependencies

Additional dependencies to compile PyBUDA from source after running Backend Compiler Dependencies

You may need to append each apt-get command with sudo if you do not have root permissions.

apt-get install -y libyaml-cpp-dev python3-pip sudo git git-lfs
apt-get install -y wget cmake cmake-data
pip3 install pyyaml

Package Level Dependencies

In addition, if you intend to utilize torchvision for your model development, we strongly recommend installing it using a specific method that ensures optimal compatibility with PyBUDA. This method involves building and installing torchvision from its source code, which allows for the necessary dependencies and configurations to be correctly set up.

To do this, you should use the following commands:

export TORCH_VISION_INSTALL=1
make torchvision

The export TORCH_VISION_INSTALL=1 command sets an environment variable that our Makefile script uses to determine whether to install torchvision. By setting this variable to 1, you’re instructing the script to proceed with the torchvision installation.

The make torchvision command then triggers the build and installation process. This process includes cloning the torchvision repository, checking out the desired version, and building torchvision using its setup.py script.

By following these steps, torchvision will be installed in a way that ensures it works effectively with PyBUDA.

NOTE

The TORCH_VISION_INSTALL flag is not limited to the make torchvision command. It can also be used with the standard make build command. When this flag is set to 1, the build process will include the installation of torchvision, regardless of the specific make command used. This allows for flexibility in your build process, enabling you to include or exclude the torchvision installation as needed.

NOTE

For your convenience, the torchvision wheel file is already included in the PyBUDA release bundle. This means that if you’re using the release bundle, you won’t need to build torchvision from source unless you want to use a different version or need to modify the source code. Simply install the provided wheel file using pip to add torchvision to your Python environment.

Here’s an example of how you can install the torchvision wheel file:

pip install /path/to/your/wheel/file/torchvision*.whl

Replace /path/to/your/wheel/file/torchvision*.whl with the actual path to the torchvision wheel file in the PyBUDA release bundle.

NOTE

To run the existing unit tests of PyBUDA components, e.g. after compiling it from source, you need to install the following packages.

apt-get install -y wget libgtest-dev libgmock-dev

TT-SMI

Please navigate to https://github.com/tenstorrent/tt-smi to get Tenstorrent’s System Management Interface tool. A command line utility to interact with all Tenstorrent devices on host.

Tenstorrent Software Package

Acquire pybuda and associated software from the aforementioned Download section.

Relevant files:

pybuda-<version>.whl   <- Latest PyBUDA Release
tvm-<version>.whl      <- Latest TVM Release

Smoke Test

With your Python environment with PyBUDA install activated, run the following Python script:

import pybuda
import torch


# Sample PyTorch module
class PyTorchTestModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.weights1 = torch.nn.Parameter(torch.rand(32, 32), requires_grad=True)
        self.weights2 = torch.nn.Parameter(torch.rand(32, 32), requires_grad=True)
    def forward(self, act1, act2):
        m1 = torch.matmul(act1, self.weights1)
        m2 = torch.matmul(act2, self.weights2)
        return m1 + m2, m1


def test_module_direct_pytorch():
    input1 = torch.rand(4, 32, 32)
    input2 = torch.rand(4, 32, 32)
    # Run single inference pass on a PyTorch module, using a wrapper to convert to PyBUDA first
    output = pybuda.PyTorchModule("direct_pt", PyTorchTestModule()).run(input1, input2)
    print(output)


if __name__ == "__main__":
    test_module_direct_pytorch()