Skip to content

Machine learning inference #4

Machine learning inference

Machine learning inference #4

Workflow file for this run

# SPDX-FileCopyrightText: 2026 Holochip Inc.
# SPDX-License-Identifier: CC-BY-4.0
name: ML Inference CI
on:
push:
paths:
- 'attachments/ml_inference/**'
- '.github/workflows/ml_inference_ci.yml'
pull_request:
paths:
- 'attachments/ml_inference/**'
- '.github/workflows/ml_inference_ci.yml'
workflow_dispatch:
jobs:
desktop:
name: Build (ubuntu-latest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: attachments/ml_inference
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Clang + Ninja + ccache
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y clang ninja-build ccache
- name: Select Clang toolchain
shell: bash
run: |
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
- name: ccache
uses: actions/cache@v4
with:
path: ~/.cache/ccache
key: ${{ runner.os }}-ml-inference-ccache-${{ github.sha }}
restore-keys: ${{ runner.os }}-ml-inference-ccache-
- name: Cache Vulkan SDK
id: cache-vulkan
uses: actions/cache@v4
with:
path: ${{ runner.temp }}/VulkanSDK
key: ${{ runner.os }}-vulkan-sdk
- name: Install Vulkan SDK
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y curl ca-certificates xz-utils spirv-tools
SDK_DIR="${RUNNER_TEMP}/VulkanSDK"
if [ "${{ steps.cache-vulkan.outputs.cache-hit }}" != "true" ]; then
echo "Downloading Vulkan SDK from LunarG..."
SDK_TGZ="${RUNNER_TEMP}/vulkansdk-linux.tar.xz"
download_ok=0
for url in \
"https://sdk.lunarg.com/sdk/download/latest/linux/vulkan-sdk.tar.xz" \
"https://sdk.lunarg.com/sdk/download/latest/linux/vulkansdk-linux-x86_64.tar.xz" \
"https://sdk.lunarg.com/sdk/download/latest/linux/vulkan-sdk.tar.xz?Human=true" \
"https://sdk.lunarg.com/sdk/download/latest/linux/vulkansdk-linux-x86_64.tar.xz?Human=true"
do
echo "Attempting: $url"
if curl -L --fail -o "$SDK_TGZ" "$url"; then
download_ok=1
break
fi
done
if [ "$download_ok" -ne 1 ]; then
echo "Failed to download Vulkan SDK from LunarG (all endpoints returned non-200)." >&2
exit 1
fi
rm -rf "$SDK_DIR"
mkdir -p "$SDK_DIR"
tar -xJf "$SDK_TGZ" -C "$SDK_DIR"
else
echo "Using cached Vulkan SDK from $SDK_DIR"
fi
VULKAN_SDK_PATH="$(find "$SDK_DIR" -maxdepth 1 -type d -name '1.*' | sort -r | head -n 1)"
if [ -z "${VULKAN_SDK_PATH:-}" ]; then
echo "Failed to locate extracted Vulkan SDK directory under $SDK_DIR" >&2
exit 1
fi
SDK_SYSROOT="$VULKAN_SDK_PATH"
if [ -d "$VULKAN_SDK_PATH/x86_64" ]; then
SDK_SYSROOT="$VULKAN_SDK_PATH/x86_64"
fi
echo "VULKAN_SDK=$VULKAN_SDK_PATH" >> "$GITHUB_ENV"
echo "VULKAN_SDK_SYSROOT=$SDK_SYSROOT" >> "$GITHUB_ENV"
if [ -d "$VULKAN_SDK_PATH/bin" ]; then
echo "$VULKAN_SDK_PATH/bin" >> "$GITHUB_PATH"
fi
if [ -d "$SDK_SYSROOT/bin" ]; then
echo "$SDK_SYSROOT/bin" >> "$GITHUB_PATH"
fi
echo "CMAKE_PREFIX_PATH=$SDK_SYSROOT" >> "$GITHUB_ENV"
echo "Vulkan_INCLUDE_DIR=$SDK_SYSROOT/include" >> "$GITHUB_ENV"
if [ -f "$SDK_SYSROOT/lib/libvulkan.so" ]; then
echo "Vulkan_LIBRARY=$SDK_SYSROOT/lib/libvulkan.so" >> "$GITHUB_ENV"
elif [ -f "$SDK_SYSROOT/lib/libvulkan.so.1" ]; then
echo "Vulkan_LIBRARY=$SDK_SYSROOT/lib/libvulkan.so.1" >> "$GITHUB_ENV"
fi
if command -v slangc >/dev/null 2>&1; then
echo "SLANGC_EXECUTABLE=$(command -v slangc)" >> "$GITHUB_ENV"
fi
compat_dir="${RUNNER_TEMP}/slang-compat"
mkdir -p "$compat_dir"
pthread_path="$(ldconfig -p | awk '/libpthread\.so\.0/{print $NF; exit 0}' || true)"
if [ -n "${pthread_path:-}" ] && [ -f "$pthread_path" ]; then
ln -sf "$pthread_path" "$compat_dir/libpthread.so"
fi
echo "LD_LIBRARY_PATH=$compat_dir:${SDK_SYSROOT}/lib:${VULKAN_SDK_PATH}/lib:${LD_LIBRARY_PATH:-}" >> "$GITHUB_ENV"
- name: Vulkan SDK diagnostics
shell: bash
run: |
echo "VULKAN_SDK=$VULKAN_SDK"
echo "VULKAN_SDK_SYSROOT=${VULKAN_SDK_SYSROOT:-}"
echo "Vulkan_INCLUDE_DIR=${Vulkan_INCLUDE_DIR:-}"
echo "Vulkan_LIBRARY=${Vulkan_LIBRARY:-}"
echo "SLANGC_EXECUTABLE=${SLANGC_EXECUTABLE:-}"
echo "which slangc: $(command -v slangc || echo 'NOT FOUND')"
- name: Install system dependencies
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y \
build-essential cmake git pkg-config \
ca-certificates curl zip unzip \
libglfw3-dev libglm-dev \
libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev
- name: Clone NNEF parser
shell: bash
run: |
set -euo pipefail
NNEF_DIR="third_party/nnef-parser"
if [ ! -f "${NNEF_DIR}/src/nnef.cpp" ]; then
WORK="${RUNNER_TEMP}/NNEF-Tools"
git clone --depth 1 https://github.com/KhronosGroup/NNEF-Tools.git "$WORK"
mkdir -p "${NNEF_DIR}/src" "${NNEF_DIR}/include"
cp "$WORK/nnef-pyproject/nnef/cpp/src/nnef.cpp" "${NNEF_DIR}/src/"
cp -r "$WORK/nnef-pyproject/nnef/cpp/include/." "${NNEF_DIR}/include/"
else
echo "NNEF parser already present"
fi
- name: Create placeholder resource directories
shell: bash
run: |
# These directories are not tracked by git but are referenced in post-build
# copy_directory commands. Create them so the build does not fail.
mkdir -p models data sample_images
touch mnist_model.onnx mnist_model.onnx.data
- name: Configure
shell: bash
run: |
set -euo pipefail
extra_args=()
if [ -n "${Vulkan_INCLUDE_DIR:-}" ]; then
extra_args+=("-DVulkan_INCLUDE_DIR=${Vulkan_INCLUDE_DIR}")
fi
if [ -n "${Vulkan_LIBRARY:-}" ]; then
extra_args+=("-DVulkan_LIBRARY=${Vulkan_LIBRARY}")
fi
if [ -n "${SLANGC_EXECUTABLE:-}" ]; then
extra_args+=("-DSLANGC_EXECUTABLE=${SLANGC_EXECUTABLE}")
fi
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_PREFIX_PATH="${VULKAN_SDK_SYSROOT}" \
-DML_SETUP_PYTHON_ENV=OFF \
-DML_TRAIN_MODELS=OFF \
"${extra_args[@]}"
- name: Build
shell: bash
run: cmake --build build --parallel 4
- name: ccache stats
shell: bash
run: ccache -s