mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-10-27 16:43:59 +08:00
700 lines
29 KiB
YAML
700 lines
29 KiB
YAML
name: Unit Tests
|
|
env:
|
|
# increment this when downloads substantially change to avoid the internet
|
|
CACHE_VERSION: '20'
|
|
CAPTURE_PROCESS_REPLAY: ${{ github.event_name == 'pull_request' && contains(github.event.pull_request.title, '[pr]') && '1' || '0' }}
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
PYTHONPATH: ${{ github.workspace }}
|
|
CHECK_OOB: 1
|
|
PYTHONFAULTHANDLER: 1
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- master
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
concurrency:
|
|
group: test-${{ github.event_name }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
jobs:
|
|
docs:
|
|
name: Docs
|
|
runs-on: &linux ${{ github.repository == 'tinygrad/tinygrad' && github.event_name == 'pull_request' && github.event.pull_request.author_association == 'COLLABORATOR' && 'turin' || 'ubuntu-24.04' }}
|
|
timeout-minutes: 10
|
|
env:
|
|
CHECK_OOB: 0
|
|
DEV: CPU
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
deps: "docs testing_minimal"
|
|
- name: Build wheel and show size
|
|
run: |
|
|
uv build --wheel
|
|
ls -lh dist/*.whl
|
|
- name: Use as an external package
|
|
run: |
|
|
mkdir $HOME/test_external_dir
|
|
cd $HOME/test_external_dir
|
|
uv venv venv
|
|
uv pip install --python venv $GITHUB_WORKSPACE mypy
|
|
cp $GITHUB_WORKSPACE/examples/beautiful_mnist.py .
|
|
venv/bin/python -c "from tinygrad.tensor import Tensor; print(Tensor([1,2,3,4,5]))"
|
|
venv/bin/mypy -c "from tinygrad.tensor import Tensor; print(Tensor([1,2,3,4,5]))"
|
|
BS=2 STEPS=10 MAX_BUFFER_SIZE=0 venv/bin/python beautiful_mnist.py
|
|
- name: Test Docs
|
|
run: |
|
|
parallel --link --tagstring '[{1}]' '{2}' \
|
|
::: mkdocs abstractions3 readme quickstart export \
|
|
::: 'mkdocs build --strict' \
|
|
'python docs/abstractions3.py' \
|
|
$'awk \'/```python/{flag=1;next}/```/{flag=0}flag\' README.md | python' \
|
|
$'awk \'/```python/{flag=1;next}/```/{flag=0}flag\' docs/quickstart.md | python' \
|
|
'DEV=CPU python examples/compile_efficientnet.py > recognize.c && clang -O2 recognize.c -lm -o recognize && cat test/models/efficientnet/Chicken.jpg | ./recognize | grep cock'
|
|
- name: Test DEBUG
|
|
run: DEBUG=100 python3 -c "from tinygrad import Tensor; N = 1024; a, b = Tensor.rand(N, N), Tensor.rand(N, N); c = (a.reshape(N, 1, N) * b.T.reshape(1, N, N)).sum(axis=2); print((c.numpy() - (a.numpy() @ b.numpy())).mean())"
|
|
|
|
torchbackend:
|
|
name: Torch Backend Tests
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: torch-backend-pillow-torchvision-et-pt
|
|
deps: testing_unit
|
|
pydeps: "pillow torchvision expecttest"
|
|
llvm: 'true'
|
|
ninja: 'true'
|
|
- name: Test ResNet-18
|
|
run: DEV=CPU DEBUG=2 python3 extra/torch_backend/example.py
|
|
- name: Test one op in torch tests
|
|
run: DEV=CPU DEBUG=2 python3 extra/torch_backend/torch_tests.py TestTinyBackendPRIVATEUSE1.test_unary_log_tiny_float32
|
|
- name: Test Ops with TINY_BACKEND
|
|
run: DEV=CPU:LLVM LLVMOPT=0 TINY_BACKEND=1 python3 -m pytest -n auto test/runtime/test_ops.py --durations=20
|
|
- name: Custom tests
|
|
run: DEV=CPU:LLVM GPUS=4 TINY_BACKEND=1 python3 -m pytest -nauto extra/torch_backend/test.py extra/torch_backend/test_inplace.py extra/torch_backend/test_multigpu.py extra/torch_backend/test_kernel_fusion.py --durations=20
|
|
|
|
torchbackendtrain:
|
|
name: Torch Backend Training
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: torch-backend-pillow-torchvision-et-pt
|
|
deps: testing_unit
|
|
llvm: 'true'
|
|
ninja: 'true'
|
|
- name: Test beautiful_mnist in torch with TINY_BACKEND
|
|
run: STEPS=20 DEV=CPU TARGET_EVAL_ACC_PCT=90.0 MAX_BUFFER_SIZE=0 TINY_BACKEND=1 python3 examples/other_mnist/beautiful_mnist_torch.py
|
|
|
|
bepython:
|
|
name: Python Backend
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: be-minimal
|
|
deps: testing_unit
|
|
- name: Run runtime tests
|
|
run: SKIP_SLOW_TEST=1 DEV=PYTHON python3 -m pytest -n=auto test/runtime/test_dtype.py test/runtime/test_dtype_alu.py test/runtime/test_ops.py test/runtime/test_uops.py test/runtime/test_symbolic_ops.py test/runtime/test_renderer_failures.py::TestRendererFailures test/device/python --durations=20
|
|
- name: Test IMAGE support
|
|
run: IMAGE=1 DEV=PYTHON python3 test/runtime/test_ops.py TestOps.test_gemm TestOps.test_simple_conv2d
|
|
- name: Test emulated tensor cores
|
|
env:
|
|
DEBUG: 2
|
|
N: 64
|
|
CNT: 1
|
|
SHOULD_USE_TC: 1
|
|
run: |
|
|
parallel -k --link --tagstring '[{1}]' '{2} python3 ./extra/gemm/simple_matmul.py' \
|
|
::: metal gfx950 gfx1100 gfx1100_acchalf gfx1201 gfx1201_acchalf sm_75 sm_80_half sm_80_tf32 \
|
|
::: 'DEV=PYTHON::METAL' 'DEV=PYTHON::gfx950 HALF=1 ACC_HALF=0' \
|
|
'DEV=PYTHON::gfx1100 HALF=1 ACC_HALF=0' 'DEV=PYTHON::gfx1100 HALF=1 ACC_HALF=1 ATOL=1e-3' \
|
|
'DEV=PYTHON::gfx1201 HALF=1 ACC_HALF=0' 'DEV=PYTHON::gfx1201 HALF=1 ACC_HALF=1 ATOL=1e-3' \
|
|
'DEV=PYTHON::sm_75 HALF=1' 'DEV=PYTHON::sm_80 HALF=1' 'DEV=PYTHON::sm_80 ALLOW_TF32=1'
|
|
- name: Run additional tensor core tests
|
|
run: |
|
|
DEV=PYTHON::METAL python3 -m pytest -nauto test/runtime/test_tensor_cores.py test/null/test_uops_stats.py::TestUOpsStatsMatmulHalf
|
|
DEV=PYTHON::gfx1100 python3 -m pytest -nauto test/runtime/test_tensor_cores.py test/null/test_uops_stats.py::TestUOpsStatsMatmulHalf
|
|
DEV=PYTHON::gfx942 python3 -m pytest -nauto test/runtime/test_tensor_cores.py
|
|
DEV=PYTHON::gfx950 python3 -m pytest -nauto test/runtime/test_tensor_cores.py
|
|
DEV=PYTHON::gfx1201 python3 -m pytest -nauto test/runtime/test_tensor_cores.py
|
|
ALLOW_TF32=1 DEV=PYTHON::sm_89 python3 -m pytest -nauto test/runtime/test_tensor_cores.py
|
|
DEBUG=2 DEV=PYTHON::sm_80 python3 ./test/null/test_uops_stats.py TestUOpsStatsMatmulHalf
|
|
|
|
linter:
|
|
name: Linters
|
|
runs-on: *linux
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: linting-only
|
|
python-version: '3.11'
|
|
deps: linting
|
|
- name: Lint bad-indentation and trailing-whitespace with pylint
|
|
run: python -m pylint --disable=all -e W0311 -e C0303 --jobs=0 --indent-string=' ' --recursive=y .
|
|
- name: Run pre-commit linting hooks
|
|
run: SKIP=tiny,tests,example,mypy pre-commit run --all-files
|
|
- name: Lint additional files with ruff
|
|
run: |
|
|
python3 -m ruff check examples/mlperf/ --ignore E501
|
|
python3 -m ruff check extra/thunder/tiny/ --ignore E501 --ignore F841 --ignore E722
|
|
python3 -m ruff check extra/torch_backend/backend.py
|
|
- name: Run mypy with lineprecision report
|
|
run: |
|
|
python -m mypy --lineprecision-report .
|
|
grep -v autogen lineprecision.txt | awk 'NR>2 {lines+=$2; precise+=$3; imprecise+=$4; any+=$5; empty+=$6} END {t=lines-empty; printf "TOTAL: %d lines, %d precise (%.1f%%), %d imprecise (%.1f%%), %d any (%.1f%%)\n", t, precise, 100*precise/t, imprecise, 100*imprecise/t, any, 100*any/t}'
|
|
cat lineprecision.txt
|
|
- name: Run TYPED=1
|
|
run: CHECK_OOB=0 DEV=CPU TYPED=1 python test/test_tiny.py
|
|
|
|
nulltest:
|
|
name: Null Tests
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: unittest-13
|
|
python-version: '3.11'
|
|
deps: testing_unit
|
|
llvm: 'true'
|
|
amd: 'true'
|
|
- name: Run NULL backend tests
|
|
run: SPEC=2 DEV=NULL python -m pytest -n=auto test/null/ --durations=20
|
|
- name: Run targeted tests on NULL backend
|
|
run: |
|
|
DEV=NULL python3 -m unittest test.runtime.test_multitensor.TestMultiTensor.test_data_parallel_resnet_train_step
|
|
DEV=NULL VIZ=1 python3 -m pytest -n=auto test/null/test_viz.py
|
|
DEBUG=7 python -m tinygrad.viz.cli --json | jq empty
|
|
# TODO: too slow
|
|
# - name: Run SDXL on NULL backend
|
|
# run: DEV=NULL DEBUG=1 python3 examples/sdxl.py --seed 0 --noshow --timing --fakeweights
|
|
- name: Run Clip tests for SD MLPerf on NULL backend
|
|
run: DEV=NULL python -m pytest -n=auto test/external/mlperf_stable_diffusion/external_test_models.py::TestOpenClip --durations=20
|
|
- name: Run AMD emulated BERT training on NULL backend
|
|
run: DEV=NULL::gfx1201 NULL_ALLOW_COPYOUT=1 DEFAULT_FLOAT=HALF BENCHMARK=10 BS=66 GPUS=1 BERT_LAYERS=2 MODEL=bert python3 examples/mlperf/model_train.py
|
|
# TODO: support fake weights
|
|
#- name: Run LLaMA 7B on 4 fake devices
|
|
# run: DEV=NULL python3 examples/llama.py --gen 1 --size 7B --shard 4 --prompt "Hello." --count 3 --temperature 0 --timing
|
|
|
|
unittest:
|
|
name: Backend Tests (CPU)
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: unittest-13
|
|
python-version: '3.11'
|
|
pydeps: "pre-commit"
|
|
deps: testing_unit
|
|
llvm: 'true'
|
|
- name: Run pre-commit test hooks
|
|
run: SKIP=ruff,mypy,tests pre-commit run --all-files
|
|
- name: Check Device.DEFAULT
|
|
run: python -c "from tinygrad import Device; assert Device.DEFAULT == 'CPU', Device.DEFAULT"
|
|
- name: Run test as module
|
|
run: DEV=CPU python test/null/test_device.py TestRunAsModule.test_module_runs
|
|
- name: Run GC tests
|
|
run: python test/external/external_uop_gc.py
|
|
- name: External Benchmark Schedule
|
|
run: python3 test/external/external_benchmark_schedule.py
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
- name: Repo line count <= 26000 lines
|
|
run: MAX_LINE_COUNT=26500 python sz.py
|
|
|
|
spec:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
group: [1, 2]
|
|
name: SPEC=2 (${{ matrix.group }})
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: spec-unit
|
|
deps: testing_unit
|
|
llvm: 'true'
|
|
- name: Test SPEC=2
|
|
run: DEV=CPU SPEC=2 pytest --maxfail=10 -n auto --durations=30 test/runtime test/device/cpu --splits 2 --group ${{ matrix.group }}
|
|
|
|
fuzzing:
|
|
name: Fuzzing
|
|
runs-on: *linux
|
|
timeout-minutes: 10
|
|
env:
|
|
DEV: CPU
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: fuzzing-unit
|
|
deps: testing_unit
|
|
- name: Fuzz Tests
|
|
run: |
|
|
parallel --tagstring '[{}]' 'python test/external/fuzz_{}.py' ::: symbolic symbolic_div fast_idiv shape_ops
|
|
|
|
testopenclimage:
|
|
name: CL IMAGE Tests
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: gpu-image
|
|
deps: testing_unit
|
|
opencl: 'true'
|
|
- name: Test CL IMAGE=1 ops
|
|
run: |
|
|
DEV=CL IMAGE=1 python -m pytest -n=auto test/runtime/test_ops.py --durations=20
|
|
DEV=CL IMAGE=1 python test/models/test_end2end.py TestEnd2End.test_linear_mnist
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
testopenpilot:
|
|
name: openpilot compile tests
|
|
env:
|
|
LFS_SHA: "51b12d20a25b76fa8a5717c2e5af01f148e469e2"
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: openpilot-compile
|
|
deps: testing
|
|
llvm: 'true'
|
|
opencl: 'true'
|
|
- name: Test models (DEV=CPU:LLVM)
|
|
env:
|
|
DEV: CPU:LLVM
|
|
run: |
|
|
for model in driving_supercombo dmonitoring_model; do
|
|
python examples/openpilot/compile_onnx.py "https://huggingface.co/commaai/openpilot-lfs/resolve/$LFS_SHA/openpilot/selfdrive/modeld/models/$model.onnx" /tmp/openpilot.pkl --benchmark-runs 1
|
|
python examples/openpilot/load_pickle.py --run /tmp/openpilot.pkl --runs 3
|
|
done
|
|
MODEL_PKL=/tmp/openpilot.pkl python -m pytest -n=auto test/external/external_test_compile.py
|
|
- name: Test warps (DEV=CPU:LLVM)
|
|
env:
|
|
DEV: CPU:LLVM
|
|
run: |
|
|
python examples/openpilot/compile_warp.py --output /tmp/warp_driving.pkl --benchmark-runs 1 --frame 1928,1208,2048,1216,608,3735552 --warp-to 512x256 --layout yuv420 --frames 2
|
|
python examples/openpilot/load_pickle.py --run /tmp/warp_driving.pkl --runs 3
|
|
python examples/openpilot/compile_warp.py --output /tmp/warp_monitoring.pkl --benchmark-runs 1 --frame 1928,1208,2048,1216,608,4804608 --warp-to 1440x960 --layout luma --border-fill 16 --transform-device NPY
|
|
python examples/openpilot/load_pickle.py --run /tmp/warp_monitoring.pkl --runs 3
|
|
- name: Test driving_supercombo (DEV=CL::IMAGE_PITCH_ALIGNMENT=64)
|
|
env:
|
|
# IMAGE_PITCH_ALIGNMENT=64 matches adreno 630
|
|
DEV: CL::IMAGE_PITCH_ALIGNMENT=64
|
|
run: |
|
|
VIZ=1 IMAGE=1 FLOAT16=1 python examples/openpilot/compile_onnx.py "https://huggingface.co/commaai/openpilot-lfs/resolve/$LFS_SHA/openpilot/selfdrive/modeld/models/driving_supercombo.onnx" /tmp/openpilot_viz.pkl --benchmark-runs 1
|
|
ALLOWED_KERNEL_COUNT=162 ALLOWED_READ_IMAGE=1530 ALLOWED_GATED_READ_IMAGE=44 python examples/openpilot/check_image_reads.py
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
# ****** ONNX Tests ******
|
|
|
|
testonnxcpu:
|
|
name: ONNX (CPU) Tests
|
|
runs-on: *linux
|
|
timeout-minutes: 20
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: onnxoptc
|
|
deps: testing
|
|
llvm: 'true'
|
|
- name: Test ONNX (CPU)
|
|
run: DEV=CPU python -m pytest -n=auto test/external/external_test_onnx_backend.py test/external/external_test_onnx_runner.py test/external/external_test_onnx_ops.py test/device/cpu/test_quantize_onnx.py --durations=20
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
testoptim:
|
|
name: Optimization Tests
|
|
runs-on: *linux
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: optim
|
|
deps: testing
|
|
opencl: 'true'
|
|
#- name: Test Optimization Helpers
|
|
# run: DEBUG=1 python3 extra/optimization/test_helpers.py
|
|
#- name: Test Action Space
|
|
# run: DEBUG=1 DEV=CL python3 extra/optimization/get_action_space.py
|
|
- name: Test Beam Search
|
|
run: DEV=CL IGNORE_BEAM_CACHE=1 python3 -m pytest extra/optimization/test_beam_search.py
|
|
- name: Test MLPerf stuff
|
|
run: DEV=CL python -m pytest -n=auto test/external/external_test_lr_schedule.py test/external/external_test_losses.py test/external/external_test_metrics.py test/external/external_test_datasets.py --durations=20
|
|
- name: DEV=NULL beautiful_mnist_multigpu
|
|
run: DEV=NULL NULL_ALLOW_COPYOUT=1 python examples/beautiful_mnist_multigpu.py
|
|
- name: Test Bert training
|
|
run: DEV=NULL NULL_ALLOW_COPYOUT=1 DEFAULT_FLOAT=HALF BENCHMARK=10 BS=24 GPUS=4 BERT_LAYERS=2 MODEL=bert python3 examples/mlperf/model_train.py
|
|
- name: Test llama 3 training
|
|
run: DEV=NULL NULL_ALLOW_COPYOUT=1 SAMPLES=300 BS=8 SEQLEN=512 GRADIENT_ACC_STEPS=1 FAKEDATA=1 DEFAULT_FLOAT=bfloat16 OPTIM_DTYPE=bfloat16 LLAMA3_SIZE=1B MODEL=llama3 python3 examples/mlperf/model_train.py
|
|
- name: Test gpt-oss training
|
|
run: DEV=NULL NULL_ALLOW_COPYOUT=1 SAMPLES=32 BS=2 SEQLEN=128 GRADIENT_ACC_STEPS=1 FAKEDATA=1 DEFAULT_FLOAT=bfloat16 OPTIM_DTYPE=bfloat16 MXFP8=1 VOCAB_SIZE=32000 LAYERS=2 EXPERTS=4 MODEL=gptoss PYTHONPATH=. python3 examples/mlperf/model_train.py
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
testllm:
|
|
name: Test LLM
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
env:
|
|
CHECK_OOB: 0
|
|
DEV: CPU
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: apps_llm
|
|
- name: Test LLMs
|
|
env:
|
|
MAX_BUFFER_SIZE: 0
|
|
run: |
|
|
parallel --link --tagstring '[{1}]' '{2}' \
|
|
::: llama 'llama q4' qwen3.5 qwen \
|
|
::: $'echo "What\'s a male chicken called? Answer with only one word." | python3 -m tinygrad.llm --no_chat_template --model llama3.2:1b | tee -a /dev/stderr | grep -i rooster' \
|
|
$'echo "What\'s a male chicken called? Answer with only one word." | python3 -m tinygrad.llm --no_chat_template --model llama3.2:1b-q4 | tee -a /dev/stderr | grep -i rooster' \
|
|
$'echo "What\'s a male chicken called? Answer with only one word." | python3 -m tinygrad.llm --no_chat_template --model qwen3.5:0.8b | tee -a /dev/stderr | grep -i rooster' \
|
|
$'echo "What\'s a female chicken called? Answer with only one word." | python3 -m tinygrad.llm --no_chat_template --model qwen3:0.6b | tee -a /dev/stderr | grep -i hen'
|
|
# NOTE: qwen is dumb and only knows about female chickens
|
|
|
|
# ****** Models Tests ******
|
|
|
|
testmodels:
|
|
name: Models
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: models
|
|
deps: testing
|
|
llvm: 'true'
|
|
- name: Test models (cpu)
|
|
run: DEV=CPU python -m pytest -n=auto test/models --durations=20
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
# ****** Feature Tests ******
|
|
|
|
testdsp:
|
|
name: Linux (DSP)
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: dsp-minimal
|
|
deps: testing
|
|
llvm: "true"
|
|
qemu: "true"
|
|
- name: Run tests
|
|
run: MOCKDSP=1 DEV=DSP python -m pytest -n=auto test/test_tiny.py test/runtime/test_transcendental.py::TestTranscendentalVectorized test/device/dsp
|
|
|
|
testlinux:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
dev:
|
|
- 'CPU:CLANG'
|
|
- 'CPU:LLVM'
|
|
- 'CPU:LVP'
|
|
- 'CPU:X86'
|
|
- 'CL'
|
|
- 'WEBGPU'
|
|
|
|
name: Linux (DEV=${{ matrix.dev }})
|
|
runs-on: *linux
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: linux-${{ matrix.dev }}
|
|
deps: "testing_unit${{ contains(matrix.dev, 'LVP') && ' mesa' || '' }}"
|
|
llvm: ${{ contains(matrix.dev, 'LLVM') || contains(matrix.dev, 'LVP') || contains(matrix.dev, 'CLANG') }}
|
|
webgpu: ${{ matrix.dev == 'WEBGPU' }}
|
|
opencl: ${{ matrix.dev == 'CL' }}
|
|
- name: Set env
|
|
run: printf "DEV=${{ matrix.dev }}${{ matrix.dev == 'CPU:CLANG' && '\nCPU_COUNT=2' || '' }}" >> $GITHUB_ENV
|
|
- name: Check Device.DEFAULT and print some source
|
|
run: |
|
|
python -c "from tinygrad import Device; from tinygrad.helpers import Target; assert Device.DEFAULT == Target.parse('${{ matrix.dev }}').device"
|
|
DEBUG=4 python test/test_tiny.py TestTiny.test_plus
|
|
- name: Run runtime tests
|
|
run: python -m pytest -n=auto test/runtime test/device/$(python -c 'from tinygrad import Device; print(Device.DEFAULT.lower())') --durations=20
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
testamdasm:
|
|
name: AMD ASM IDE
|
|
runs-on: *linux
|
|
timeout-minutes: 20
|
|
env:
|
|
DEV: MOCKKFD+AMD
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: rdna3-emu
|
|
deps: testing_unit
|
|
amd: 'true'
|
|
- name: Verify AMD autogen is up to date
|
|
run: |
|
|
python -m tinygrad.renderer.amd.generate
|
|
git diff --exit-code tinygrad/runtime/autogen/amd/
|
|
- name: Install LLVM 21
|
|
run: |
|
|
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
|
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
|
sudo apt-get update
|
|
sudo apt-get install -y llvm-21 llvm-21-tools cloc
|
|
- name: Install rocprof-trace-decoder
|
|
run: sudo PYTHONPATH="." ./extra/sqtt/install_rocprof_decoder.py
|
|
- name: Run AMD renderer tests
|
|
run: python -m pytest -n=auto test/amd/ --durations 20
|
|
- name: Run AMD renderer tests (AMD:LLVM)
|
|
run: DEV=MOCKKFD+AMD:LLVM python -m pytest -n=auto test/amd/ --durations 20
|
|
- name: Run SQTT profiling tests
|
|
run: SQTT_BUFFER_SIZE=16 VIZ=-2 python3 -m pytest -n=auto test/amd/test_sqtt_profiler.py
|
|
- name: Run AMD emulated tests on NULL backend
|
|
env:
|
|
AMD: 0
|
|
run: |
|
|
PYTHONPATH=. DEV=NULL:HIP:gfx1100 python extra/mmapeak/mmapeak.py
|
|
PYTHONPATH=. DEV=NULL:HIP:gfx950 python3 -m pytest -n=auto test/testextra/test_tk.py
|
|
- name: Run matmul on MOCKKFD
|
|
run: |
|
|
PYTHONPATH="." DEV=MOCKKFD+AMD N=256 python3 extra/gemm/amd_asm_matmul.py
|
|
PYTHONPATH="." DEV=MOCKKFD+AMD N=256 python3 extra/gemm/amd_copy_matmul.py
|
|
- name: Run LLVM test
|
|
run: DEV=MOCKKFD+AMD:LLVM python test/device/amd/test_llvm.py
|
|
|
|
testmockam:
|
|
name: Linux (am)
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
env:
|
|
DEV: MOCKPCI+AMD
|
|
PYTHONPATH: .
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: mockam
|
|
deps: testing_unit
|
|
amd: 'true'
|
|
- name: Run tests on MOCKAM
|
|
run: python -m pytest test/test_tiny.py test/runtime/test_jit.py
|
|
- name: Run test_tiny on MOCKUSB
|
|
run: CHECK_OOB=0 GMMU=0 DEV=MOCKUSB+AMD python -m pytest test/test_tiny.py test/runtime/test_hcq2.py
|
|
- name: Run test_hcq2 on MOCKPCI
|
|
run: python -m pytest test/null/test_hcq2.py test/runtime/test_hcq2.py
|
|
- name: Run disk copy tests on MOCKPCI
|
|
run: python -m pytest test/runtime/test_disk_tensor.py -k test_copy_from_disk
|
|
|
|
testamd:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
backend: [amd, amdllvm]
|
|
arch: [gfx1100, gfx1201, gfx950]
|
|
|
|
name: Linux (${{ matrix.backend }} ${{ matrix.arch }})
|
|
runs-on: *linux
|
|
timeout-minutes: 20
|
|
env:
|
|
DEV: MOCKKFD+AMD:${{ matrix.backend == 'amdllvm' && 'LLVM' || '' }}:${{ matrix.arch }}
|
|
SKIP_SLOW_TEST: 1
|
|
PYTHONPATH: .
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: ${{ matrix.backend }}-minimal
|
|
deps: testing_unit
|
|
amd: 'true'
|
|
llvm: 'true'
|
|
- name: Check Device.DEFAULT and print some source
|
|
run: |
|
|
python3 -c "from tinygrad import Device; assert Device.DEFAULT in ['AMD'], Device.DEFAULT"
|
|
DEBUG=5 FORWARD_ONLY=1 python3 test/test_tiny.py TestTiny.test_plus
|
|
- name: Run pytest (amd)
|
|
run: >-
|
|
python -m pytest -n=auto test/runtime/test_ops.py test/runtime/test_dtype.py test/runtime/test_dtype_alu.py
|
|
test/runtime/test_kernel_opts.py test/runtime/test_linearizer.py test/runtime/test_randomness.py test/runtime/test_jit.py
|
|
test/runtime/test_multitensor.py test/runtime/test_search.py test/runtime/test_tensor_cores.py test/null/test_hcq2.py
|
|
test/runtime/test_hcq2.py test/external/external_test_am.py test/device/amd
|
|
test/runtime/test_disk_tensor.py::TestDiskTensor::test_copy_from_disk
|
|
test/runtime/test_disk_tensor.py::TestDiskTensor::test_copy_from_disk_offset
|
|
test/runtime/test_disk_tensor.py::TestDiskTensor::test_copy_from_disk_huge --durations=20
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
testamdmxfp4:
|
|
name: AMD MXFP4 Llama
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
env:
|
|
DEV: NULL:HIP:gfx950
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: gfx950-mxfp4
|
|
deps: testing_unit
|
|
amd: 'true'
|
|
- name: Run MXFP4 Llama training on NULL backend
|
|
run: MXFP4=1 LLAMA_LAYERS=2 BENCHMARK=3 NULL_ALLOW_COPYOUT=1 NO_HIPCC=1 ROCM_PATH=/opt/rocm JITBEAM=0 examples/mlperf/training_submission_v6.0/tinycorp/benchmarks/llama31_8b/implementations/tinybox_8xMI350X/profile.sh
|
|
|
|
testnvidia:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
backend: [ptx, nv]
|
|
|
|
name: Linux (${{ matrix.backend }})
|
|
runs-on: *linux
|
|
timeout-minutes: 20
|
|
env:
|
|
FORWARD_ONLY: 1
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: ${{ matrix.backend }}-minimal
|
|
deps: testing_unit
|
|
cuda: 'true'
|
|
ocelot: 'true'
|
|
- name: Set env
|
|
run: printf "${{ matrix.backend == 'ptx' && 'DEV=MOCK+CUDA:PTX' || matrix.backend == 'nv' && 'DEV=MOCK+NV\nSKIP_SLOW_TEST=1' }}" >> $GITHUB_ENV
|
|
- name: Check Device.DEFAULT and print some source
|
|
run: |
|
|
python3 -c "from tinygrad import Device; assert Device.DEFAULT in ['CUDA','NV'], Device.DEFAULT"
|
|
DEBUG=5 FORWARD_ONLY=1 python3 test/test_tiny.py TestTiny.test_plus
|
|
- name: Run pytest (cuda)
|
|
# skip multitensor because it's slow
|
|
# NV and CUDA share the NVIDIA device tests.
|
|
run: python -m pytest -n=auto test/runtime test/device/nv --ignore test/runtime/test_multitensor.py --durations=20
|
|
- name: Run NV PTX device tests
|
|
if: matrix.backend == 'nv'
|
|
run: DEV=MOCK+NV:PTX python -m pytest -n=auto test/device/nv --durations=20
|
|
- name: Run TestOps.test_add with PMA
|
|
run: VIZ=-1 PMA=1 PMA_BUFFER_SIZE=8 DEBUG=5 python3 test/runtime/test_ops.py TestOps.test_add
|
|
- name: Run process replay tests
|
|
uses: ./.github/actions/process-replay
|
|
|
|
# ****** Compile-only Tests ******
|
|
|
|
compiletests:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
dev:
|
|
- 'NULL:IR3:a630'
|
|
- 'NULL:QCOMCL:a630'
|
|
- 'NULL:NAK:sm_120'
|
|
name: Compile-only (DEV=${{ matrix.dev }})
|
|
runs-on: *linux
|
|
timeout-minutes: 15
|
|
env:
|
|
NULL_ALLOW_COPYOUT: 1
|
|
DEV: ${{ matrix.dev }}${{ contains(matrix.dev, 'a630') && ',IMAGE_PITCH_ALIGNMENT=64' || '' }}
|
|
IMAGE: ${{ contains(matrix.dev, 'a630') && '1' || '0' }}
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v6
|
|
- name: Setup Environment
|
|
uses: ./.github/actions/setup-tinygrad
|
|
with:
|
|
key: compile-${{ matrix.backend }}
|
|
deps: "testing_unit mesa"
|
|
qemu: ${{ contains(matrix.dev, 'QCOMCL') }}
|
|
- name: Test IMAGE
|
|
shell: bash
|
|
if: contains(matrix.dev, 'a630')
|
|
run: DEBUG=7 python3 test/runtime/test_ops.py TestOps.test_gemm | grep isam
|
|
- name: Run test_ops
|
|
shell: bash
|
|
run: |
|
|
python -c "from tinygrad import Device; assert Device.DEFAULT == 'NULL'"
|
|
DEBUG=4 python3 test/runtime/test_ops.py TestOps.test_add
|
|
# QCOMCL compiles in qemu, too slow for parallel workers
|
|
${{ contains(matrix.dev, 'QCOMCL') && 'PARALLEL=0' || '' }} python -m pytest -n=auto test/runtime/test_ops.py --durations=20
|