本文へ移動
cccskills
無料GitHub で公開

tir-test

Run TVM's in-tree TIRx tests and tirx-kernels import and correctness checks.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md8.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Run the compiler suite in tirx/tests/python/tirx/, using the tvm_tirx package in tirx/python/, together with the downstream correctness test in tests/python/tirx/test_tirx_kernels_registry_correctness.py.

Both tirx-kernels import gates and its correctness coverage are enabled by default. Use TIR_TEST_WITH_KERNELS=0 only for an explicitly requested compiler-only run, and report that reduced coverage.

Steps

Run all commands below in the same Bash shell from the TVM repository root.

  1. Point Python at this worktree and select every Blackwell GPU. TIR_TEST_GPUS may explicitly provide physical GPU IDs, and TIR_TEST_NUM_GPUS may optionally cap the automatically selected count. Otherwise, selection uses all Blackwell GPUs, ordered by least memory in use.

    export TIR_TEST_TVM_ROOT="$(pwd -P)"
    export TIR_TEST_NUM_GPUS="${TIR_TEST_NUM_GPUS:-}"
    export TIR_TEST_XDIST_WORKERS="${TIR_TEST_XDIST_WORKERS:-16}"
    export TIR_TEST_WITH_KERNELS="${TIR_TEST_WITH_KERNELS:-1}"
    
    [[ -d "$TIR_TEST_TVM_ROOT/tirx/python/tvm_tirx" &&
       -d "$TIR_TEST_TVM_ROOT/tirx/tests/python/tirx" ]] || {
      echo "run from the TVM repository root containing tirx/" >&2
      exit 2
    }
    [[ "$TIR_TEST_WITH_KERNELS" == 0 || "$TIR_TEST_WITH_KERNELS" == 1 ]] || {
      echo "TIR_TEST_WITH_KERNELS must be 0 or 1" >&2
      exit 2
    }
    
    [[ -z "$TIR_TEST_NUM_GPUS" || "$TIR_TEST_NUM_GPUS" =~ ^[1-9][0-9]*$ ]] || {
      echo "TIR_TEST_NUM_GPUS must be empty or a positive integer" >&2
      exit 2
    }
    [[ "$TIR_TEST_XDIST_WORKERS" =~ ^[1-9][0-9]*$ ]] || {
      echo "TIR_TEST_XDIST_WORKERS must be a positive integer" >&2
      exit 2
    }
    
    if [[ -n "${TIR_TEST_GPUS:-}" ]]; then
      IFS=, read -r -a TIR_TEST_SELECTED_GPUS <<< "${TIR_TEST_GPUS// /}"
    else
      mapfile -t TIR_TEST_SELECTED_GPUS < <(
        nvidia-smi \
          --query-gpu=index,memory.used,compute_cap \
          --format=csv,noheader,nounits \
        | awk -F, '
            {
              for (i = 1; i <= 3; ++i) {
                gsub(/^[[:space:]]+|[[:space:]]+$/, "", $i)
              }
              if (($3 + 0) >= 10) {
                print $1, $2
              }
            }' \
        | sort -k2,2n -k1,1n \
        | awk '{print $1}'
      )
      if [[ -n "$TIR_TEST_NUM_GPUS" ]] && \
         (( ${#TIR_TEST_SELECTED_GPUS[@]} > TIR_TEST_NUM_GPUS )); then
        TIR_TEST_SELECTED_GPUS=(
          "${TIR_TEST_SELECTED_GPUS[@]:0:TIR_TEST_NUM_GPUS}"
        )
      fi
    fi
    
    (( ${#TIR_TEST_SELECTED_GPUS[@]} > 0 )) || {
      echo "no CUDA compute capability >= 10 GPU is available" >&2
      exit 1
    }
    for gpu in "${TIR_TEST_SELECTED_GPUS[@]}"; do
      [[ "$gpu" =~ ^[0-9]+$ ]] || {
        echo "invalid physical GPU ID: $gpu" >&2
        exit 2
      }
    done
    if [[ -z "${TIR_TEST_GPUS:-}" && -n "$TIR_TEST_NUM_GPUS" ]] && \
       (( ${#TIR_TEST_SELECTED_GPUS[@]} < TIR_TEST_NUM_GPUS )); then
      echo "warning: requested $TIR_TEST_NUM_GPUS GPUs, using ${#TIR_TEST_SELECTED_GPUS[@]}"
    fi
    
    export CUDA_VISIBLE_DEVICES
    CUDA_VISIBLE_DEVICES="$(IFS=,; printf '%s' "${TIR_TEST_SELECTED_GPUS[*]}")"
    # Preserve reference packages and other paths supplied by branch-shell.
    export PYTHONPATH="${TIR_TEST_TVM_ROOT}/.local/python:${TIR_TEST_TVM_ROOT}/tirx/python:${TIR_TEST_TVM_ROOT}/python:${PYTHONPATH:-}"
    export TVM_LIBRARY_PATH="${TIR_TEST_TVM_ROOT}/build/lib"
    export TVM_TIRX_LIBRARY_PATH="${TIR_TEST_TVM_ROOT}/build/lib"
    
    PYTHON_BIN="${PYTHON_BIN:-$(command -v python || true)}"
    [[ -n "$PYTHON_BIN" && -x "$PYTHON_BIN" ]] || {
      echo "set PYTHON_BIN to the test environment's Python executable" >&2
      exit 1
    }
    export PATH="$(dirname "$PYTHON_BIN"):$PATH"
    "$PYTHON_BIN" - <<'PY'
    import os
    from pathlib import Path
    
    import pytest
    import torch
    import tvm_ffi
    import tvm_tirx
    import xdist
    from tvm_tirx.base import _LOADED_LIBS, _RUNTIME_ONLY
    
    root = Path(os.environ["TIR_TEST_TVM_ROOT"])
    assert Path(tvm_tirx.__file__).resolve().is_relative_to(root / "tirx/python"), (
        f"imported another TIRx worktree: {tvm_tirx.__file__}"
    )
    assert not _RUNTIME_ONLY, "build the TIRx compiler before running its tests"
    for name, library in _LOADED_LIBS.items():
        assert Path(library._name).resolve().is_relative_to(root / "build/lib"), (
            f"loaded another worktree's {name}: {library._name}"
        )
    print(f"tvm_tirx: {tvm_tirx.__file__}")
    print(f"tvm_ffi: {tvm_ffi.__file__}")
    PY
    if [[ $? -ne 0 ]]; then
      echo "PYTHON_BIN must provide pytest, xdist, torch and this worktree's TIRx build" >&2
      exit 1
    fi
    if ! command -v ninja >/dev/null; then
      NINJA_BIN_DIR="$("$PYTHON_BIN" -c 'import ninja; print(ninja.BIN_DIR)' 2>/dev/null || true)"
      if [[ -n "$NINJA_BIN_DIR" && -x "$NINJA_BIN_DIR/ninja" ]]; then
        export PATH="$NINJA_BIN_DIR:$PATH"
      fi
    fi
    command -v ninja >/dev/null || {
      echo "ninja is required by kernel JIT setup but is not on PATH" >&2
      exit 1
    }
    
    echo "selected physical GPUs: $CUDA_VISIBLE_DEVICES"
    for logical_id in "${!TIR_TEST_SELECTED_GPUS[@]}"; do
      echo "  cuda:$logical_id -> physical GPU ${TIR_TEST_SELECTED_GPUS[$logical_id]}"
    done
    

    Automatic selection uses every Blackwell device. Set TIR_TEST_NUM_GPUS=4 to cap the count or TIR_TEST_GPUS=3,4,5,6 to override selection with exact physical IDs.

    Use dependencies compatible with tirx/pyproject.toml. A non-editable FFI installation in .local/python/ takes priority over the inherited environment. If native libraries are missing or stale, build this worktree with the same PYTHONPATH before testing.

  2. Run downstream import gates and select the full test coverage:

    TIR_TEST_PATHS=(tirx/tests/python/tirx/)
    if [[ "$TIR_TEST_WITH_KERNELS" == 1 ]]; then
      TIR_TEST_KERNELS_ROOT="${TIR_TEST_KERNELS_ROOT:-$(dirname "$TIR_TEST_TVM_ROOT")/tirx-kernels}"
      [[ -d "$TIR_TEST_KERNELS_ROOT/tirx_kernels" ]] || {
        echo "set TIR_TEST_KERNELS_ROOT to the tirx-kernels repository" >&2
        exit 2
      }
      export PYTHONPATH="${TIR_TEST_KERNELS_ROOT}:${PYTHONPATH:-}"
      "$PYTHON_BIN" -m tirx_kernels.bench_suite --check-imports || exit 1
      "$PYTHON_BIN" -m tirx_kernels.registry --strict || exit 1
      TIR_TEST_PATHS+=(tests/python/tirx/test_tirx_kernels_registry_correctness.py)
      export TIRX_KERNEL_TEST_MIN_FREE_GB="${TIRX_KERNEL_TEST_MIN_FREE_GB:-0}"
    else
      echo "compiler-only run: tirx-kernels import and correctness checks disabled"
    fi
    
  3. Run the selected test suites with xdist parallelism and save the full log:

    export TIR_TEST_LOG="${TIR_TEST_LOG:-/tmp/tir-test-$(date +%Y%m%d-%H%M%S).log}"
    set -o pipefail
    "$PYTHON_BIN" -m pytest "${TIR_TEST_PATHS[@]}" -n "$TIR_TEST_XDIST_WORKERS" 2>&1 | tee "$TIR_TEST_LOG"
    

    tirx/tests/python/tirx/conftest.py uses tvm_tirx.testing._pytest to assign each xdist worker's PyTorch current device round-robin across the visible GPUs. Tests that explicitly use tvm_tirx.cuda(0) still run on the first selected physical GPU.

    Registry correctness tests take a per-device lock to serialize large workloads on each GPU. MegaMoE remains skipped because it requires its dedicated multi-process scheduler.

  4. Report results: selected physical GPUs, elapsed time, total passed, failed, skipped, and errors, plus the full log path. Report both downstream gates as passed, failed, or explicitly disabled; disabled integration checks are not passes.

Failure triage rules

CRITICAL: Never pipe test output to tail or grep when diagnosing failures. Always capture and read full logs.

Classify every failure into one of these categories:

  • A - Environment/import error: Module not found, missing dependency, collection error. Check the source and native-library paths, FFI dependency, and old tvm versus tvm_tirx namespaces before assigning a cause.
  • B - Real kernel correctness regression: Assertion failures (cosine_sim, numerical diff), CUDA: unspecified launch failure, or wrong results. These MUST be investigated and fixed if caused by current changes.
  • C - Secondary xdist crash: KeyError: <WorkerController gwXX> after a worker abort. The KeyError itself is noise; find the underlying cause (usually category B in another worker).

Never dismiss a failure as pre-existing without evidence. If a test fails:

  1. Check whether the test touches code you changed.
  2. If unclear, verify on the parent commit before claiming it is pre-existing.
  3. Fix every failure caused by current changes; do not defer it.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Register, extend, or audit instructions in the table-driven T.ptx dialect (python/tvm/backend/cuda/ptx/table.py), and move the table to a newer PTX ISA version. Use when adding a PTX instruction or qualifier, widening an operand domain, fixing a ptxas certification failure, or checking the table's comments against the PTX ISA document.

日本語の概要は準備中です。原文の説明を表示しています。

apache/tvm1.4万2026年10月17日 更新

apache のスキルをすべて見る

このスキルの問題を報告する