name: Setup Python & Install description: Sets up Python and installs project dependencies. inputs: python-version: description: 'Python version to use' required: false default: '' # if you don't set a version, the native python version will be used key: description: 'Key for the python cache' required: false default: '' # if you don't set a key, it doesn't cache deps: description: 'Extra dependency groups (comma separated)' required: false default: '' pydeps: description: 'Extra Python dependency groups (space separated)' required: false default: '' opencl: description: "Install OpenCL?" required: false default: 'false' amd: description: "Install AMD?" required: false default: 'false' cuda: description: "Install CUDA?" required: false default: 'false' ocelot: description: "Install gpuocelot?" required: false default: 'false' webgpu: description: "Install webgpu?" required: false default: 'false' llvm: description: "Install LLVM?" required: false default: 'false' mesa: description: "Install mesa (true, false, cpu)" required: false default: 'false' tinydreno: description: "Install tinydreno" required: false default: 'false' qemu: description: "Install qemu" required: false default: 'false' runs: using: "composite" steps: - name: Setup environment shell: bash run: | echo "UV_CACHE_DIR=/tmp/.uv-cache" >> "$GITHUB_ENV" echo "OMP_NUM_THREADS=1" >> "$GITHUB_ENV" # no buffers should be over 300MB in CI echo "MAX_BUFFER_SIZE=300000000" >> "$GITHUB_ENV" - name: Set up uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b with: enable-cache: 'false' # see below for manual caching - name: Set up Python ${{ inputs.python-version }} uses: actions/setup-python@v6 if: inputs.python-version != '' with: python-version: ${{ inputs.python-version }} # **** Caching packages **** - name: Cache Python packages (PR) if: github.event_name == 'pull_request' id: restore-venv-pr uses: actions/cache/restore@v4 with: path: /tmp/.uv-cache key: uv-${{ runner.os }}-${{ runner.arch }}-python-${{ inputs.python-version }}-${{ inputs.deps }}-${{ inputs.pydeps }}-${{ env.CACHE_VERSION }} - name: Cache Python packages if: github.event_name != 'pull_request' id: restore-venv uses: actions/cache@v5 with: path: /tmp/.uv-cache key: uv-${{ runner.os }}-${{ runner.arch }}-python-${{ inputs.python-version }}-${{ inputs.deps }}-${{ inputs.pydeps }}-${{ env.CACHE_VERSION }} # **** Caching downloads **** - name: Cache downloads (PR) if: inputs.key != '' && github.event_name == 'pull_request' uses: actions/cache/restore@v4 with: path: ${{ runner.os == 'Linux' && '~/.cache/tinygrad/downloads/' || '~/Library/Caches/tinygrad/downloads/' }} key: downloads-${{ github.job }}-${{ inputs.key }}-${{ env.CACHE_VERSION }} - name: Cache downloads if: inputs.key != '' && github.event_name != 'pull_request' uses: actions/cache@v5 with: path: ${{ runner.os == 'Linux' && '~/.cache/tinygrad/downloads/' || '~/Library/Caches/tinygrad/downloads/' }} key: downloads-${{ github.job }}-${{ inputs.key }}-${{ env.CACHE_VERSION }} # **** Python deps **** - name: Install dependencies in venv (with extra) if: inputs.deps != '' shell: bash run: | uv venv .venv uv pip install --python .venv -e ".[${{ inputs.deps }}]" ${{ inputs.pydeps }} --torch-backend cpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ - name: Install dependencies in venv (without extra) if: inputs.deps == '' shell: bash run: | uv venv .venv uv pip install --python .venv -e . ${{ inputs.pydeps }} - name: Prune uv cache if: github.event_name != 'pull_request' shell: bash run: uv cache prune --ci - name: Configure venv shell: bash run: | echo "VIRTUAL_ENV=${{ github.workspace }}/.venv" >> "$GITHUB_ENV" if [[ "$RUNNER_OS" == "Windows" ]]; then echo "${{ github.workspace }}/.venv/Scripts" >> "$GITHUB_PATH" else echo "${{ github.workspace }}/.venv/bin" >> "$GITHUB_PATH" fi # ******************* apt ******************* - name: Setup apt if: runner.os == 'Linux' && (inputs.opencl == 'true' || inputs.amd == 'true' || inputs.webgpu == 'true' || inputs.llvm == 'true' || inputs.qemu == 'true') shell: bash run: | sudo chown -R $USER:$USER /var/cache/apt/archives echo 'Acquire::GzipIndexes "true";' | sudo tee /etc/apt/apt.conf.d/gzip echo 'Acquire::http::Pipeline-Depth "5";' | sudo tee -a /etc/apt/apt.conf.d/99parallel echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' | sudo tee -a /etc/apt/apt.conf.d/99keep-debs - name: Add OpenCL Repo if: inputs.opencl == 'true' && runner.os == 'Linux' shell: bash run: echo "deb [ allow-insecure=yes ] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list - name: Add AMD Repo (Linux) if: inputs.amd == 'true' && runner.os == 'Linux' shell: bash run: | wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null sudo tee /etc/apt/sources.list.d/rocm.list <> "$GITHUB_OUTPUT" echo "hash=$(echo -n "$pkgs" | sha256sum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" - name: Cache apt (PR) if: runner.os == 'Linux' && (inputs.opencl == 'true' || inputs.amd == 'true' || inputs.webgpu == 'true' || inputs.llvm == 'true' || inputs.qemu == 'true') && github.event_name == 'pull_request' uses: actions/cache/restore@v4 with: path: /var/cache/apt/archives/ key: ${{ runner.os }}-${{ runner.arch }}-apt-${{ steps.apt-pkgs.outputs.hash }}-${{ env.CACHE_VERSION }} - name: Cache apt if: runner.os == 'Linux' && (inputs.opencl == 'true' || inputs.amd == 'true' || inputs.webgpu == 'true' || inputs.llvm == 'true' || inputs.qemu == 'true') && github.event_name != 'pull_request' uses: actions/cache@v5 with: path: /var/cache/apt/archives/ key: ${{ runner.os }}-${{ runner.arch }}-apt-${{ steps.apt-pkgs.outputs.hash }}-${{ env.CACHE_VERSION }} - name: Run apt Update + Install if: runner.os == 'Linux' && (inputs.opencl == 'true' || inputs.amd == 'true' || inputs.webgpu == 'true' || inputs.llvm == 'true' || inputs.qemu == 'true') shell: bash run: | sudo apt -qq update || true # ******** do install ******** if [[ -n "${{ steps.apt-pkgs.outputs.pkgs }}" ]]; then sudo apt-get -y --allow-unauthenticated --no-install-recommends install ${{ steps.apt-pkgs.outputs.pkgs }} fi sudo chown -R $USER:$USER /var/cache/apt/archives/ - name: Add clang to PATH (Linux) if: inputs.llvm == 'true' && runner.os == 'Linux' shell: bash run: echo "/usr/lib/llvm-20/bin" >> "$GITHUB_PATH" # **** AMD **** - name: Setup AMD (Linux) if: inputs.amd == 'true' && runner.os == 'Linux' shell: bash run: | sudo tee --append /etc/ld.so.conf.d/rocm.conf <<'EOF' /opt/rocm/lib /opt/rocm/lib64 EOF sudo ldconfig - name: Setup AMD comgr (macOS) if: inputs.amd == 'true' && runner.os == 'macOS' shell: bash run: | sudo mkdir -p /usr/local/lib curl -s -H "Authorization: token $GH_TOKEN" curl -s https://api.github.com/repos/tinygrad/amdcomgr_dylib/releases/latest | \ jq -r '.assets[] | select(.name == "libamd_comgr.dylib").browser_download_url' | \ sudo xargs curl -fL -o /usr/local/lib/libamd_comgr.dylib # **** CUDA **** - name: Install CUDA if: inputs.cuda == 'true' shell: bash run: | sudo mkdir -p /usr/local/cuda/targets/x86_64-linux curl -fL https://developer.download.nvidia.com/compute/cuda/redist/cuda_nvrtc/linux-x86_64/cuda_nvrtc-linux-x86_64-11.5.119-archive.tar.xz \ | sudo tar -xJ -C /usr/local/cuda/targets/x86_64-linux --strip-components=1 echo /usr/local/cuda/targets/x86_64-linux/lib | sudo tee /etc/ld.so.conf.d/cuda-nvrtc.conf sudo ldconfig # **** gpuocelot **** - name: Install gpuocelot if: inputs.ocelot == 'true' shell: bash run: | sudo mkdir -p /usr/local/lib sudo curl --output-dir /usr/local/lib -fLO https://github.com/tinygrad/gpuocelot/releases/download/v0.1.0/libgpuocelot.${{ runner.os == 'Linux' && 'so' || 'dylib' }} # **** WebGPU **** - name: Install WebGPU dawn if: inputs.webgpu == 'true' shell: bash run: | sudo mkdir -p /usr/local/lib sudo curl --output-dir /usr/local/lib -fLO https://github.com/wpmed92/pydawn/releases/download/v0.1.6/libwebgpu_dawn.${{ runner.os == 'Linux' && 'so' || 'dylib' }} # **** LLVM **** - name: Install LLVM (macOS) if: inputs.llvm == 'true' && runner.os == 'macOS' shell: bash run: brew install llvm@20 # **** mesa **** - name: Install mesa (linux) if: inputs.mesa != 'false' && runner.os == 'Linux' shell: bash run: sudo curl -fL https://github.com/sirhcm/tinymesa/releases/download/v1/libtinymesa${{ inputs.mesa == 'cpu' && '_cpu' || '' }}-mesa-25.2.7-linux-amd64.so -o /usr/lib/libtinymesa${{ inputs.mesa == 'cpu' && '_cpu' || '' }}.so - name: Install mesa (macOS) if: inputs.mesa != 'false' && runner.os == 'macOS' shell: bash run: brew install sirhcm/tinymesa/tinymesa${{ inputs.mesa == 'cpu' && '_cpu' || '' }} # *** tinydreno *** - name: Install tinydreno (linux) if: inputs.tinydreno == 'true' && runner.os == 'Linux' shell: bash run: sudo curl -fL https://github.com/sirhcm/tinydreno/raw/refs/heads/master/libllvm-qcom.so -o /usr/lib/libllvm-qcom.so