{ "cells": [ { "cell_type": "markdown", "id": "6aa2f949", "metadata": {}, "source": [ "# Choosing a Backend\n", "\n", "LightGP picks the fastest available backend automatically with `Backend.Auto`.\n", "This tutorial shows the available choices, what `Auto` does, and how to force\n", "a specific backend when benchmarking or debugging." ] }, { "cell_type": "code", "execution_count": 1, "id": "2c0d1275", "metadata": { "execution": { "iopub.execute_input": "2026-05-15T06:51:25.680120Z", "iopub.status.busy": "2026-05-15T06:51:25.679898Z", "iopub.status.idle": "2026-05-15T06:51:25.892129Z", "shell.execute_reply": "2026-05-15T06:51:25.891752Z" } }, "outputs": [], "source": [ "import os\n", "import sys\n", "\n", "# Make the locally-built lightgp importable. Real users install via 'pip install lightgp'.\n", "sys.path.insert(0, os.path.abspath(os.path.join(\"..\", \"..\", \"..\", \"python\")))\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import lightgp as gp\n", "\n", "rng = np.random.default_rng(0)\n", "plt.rcParams.update({\"figure.figsize\": (8, 3.5), \"figure.dpi\": 90})" ] }, { "cell_type": "markdown", "id": "a182b37c", "metadata": {}, "source": [ "## Available backends\n", "\n", "| Backend | Library | Available on |\n", "|---------|---------|--------------|\n", "| `Backend.CPU` | reference C++ + Accelerate (macOS) / OpenBLAS (Linux) | always |\n", "| `Backend.Metal` | Apple Metal Shading Language compute shaders | macOS builds |\n", "| `Backend.CUDA` | cuBLAS + cuSOLVER + cuFFT + custom kernels | CUDA-enabled builds |\n", "| `Backend.Auto` | resolves at fit time based on problem shape | always |" ] }, { "cell_type": "markdown", "id": "89bd4473", "metadata": {}, "source": [ "## Forcing a specific backend" ] }, { "cell_type": "code", "execution_count": 2, "id": "687d4af3", "metadata": { "execution": { "iopub.execute_input": "2026-05-15T06:51:25.893569Z", "iopub.status.busy": "2026-05-15T06:51:25.893472Z", "iopub.status.idle": "2026-05-15T06:51:26.040372Z", "shell.execute_reply": "2026-05-15T06:51:26.039986Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU fit ok\n", "Metal fit ok\n", "Auto fit ok\n" ] } ], "source": [ "N, D = 1500, 4\n", "X = rng.standard_normal((N, D)).astype(np.float32)\n", "y = (np.sin(X[:, 0]) + 0.1 * rng.standard_normal(N)).astype(np.float32)\n", "\n", "for name, backend in [\n", " (\"CPU\", gp.Backend.CPU),\n", " (\"Metal\", gp.Backend.Metal),\n", " (\"Auto\", gp.Backend.Auto),\n", "]:\n", " try:\n", " m = gp.GPExact(gp.RBF(), backend=backend, noise_var=0.05)\n", " m.fit(X, y)\n", " print(f\"{name:<6} fit ok\")\n", " except Exception as e:\n", " print(f\"{name:<6} not available: {e}\")" ] }, { "cell_type": "markdown", "id": "85ce7509", "metadata": {}, "source": [ "## Quick wall-time comparison" ] }, { "cell_type": "code", "execution_count": 3, "id": "27228492", "metadata": { "execution": { "iopub.execute_input": "2026-05-15T06:51:26.041499Z", "iopub.status.busy": "2026-05-15T06:51:26.041423Z", "iopub.status.idle": "2026-05-15T06:51:26.216006Z", "shell.execute_reply": "2026-05-15T06:51:26.215707Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import time\n", "results = {}\n", "for name, backend in [\n", " (\"CPU\", gp.Backend.CPU),\n", " (\"Metal\", gp.Backend.Metal),\n", " (\"Auto\", gp.Backend.Auto),\n", "]:\n", " try:\n", " m = gp.GPExact(gp.RBF(), backend=backend, noise_var=0.05)\n", " m.fit(X, y); m.predict(X[:16]) # warmup\n", " t0 = time.perf_counter()\n", " m.fit(X, y); m.predict(X[:16])\n", " results[name] = (time.perf_counter() - t0) * 1000.0\n", " except Exception:\n", " pass\n", "\n", "fig, ax = plt.subplots(figsize=(6, 3.4))\n", "names = list(results.keys()); vals = list(results.values())\n", "ax.bar(names, vals, color=[\"#2563EB\", \"#10B981\", \"#F59E0B\"][: len(names)])\n", "for n, v in zip(names, vals):\n", " ax.text(n, v, f\"{v:.1f}\", ha=\"center\", va=\"bottom\", fontsize=9)\n", "ax.set_ylabel(\"fit + predict (ms)\")\n", "ax.set_title(f\"GPExact at N={N}, D={D}\")\n", "plt.tight_layout(); plt.show()" ] }, { "cell_type": "markdown", "id": "464c1f26", "metadata": {}, "source": [ "## How `Backend.Auto` chooses\n", "\n", "The dispatch heuristic, derived empirically and baked into\n", "`resolve_auto_backend`:\n", "\n", "```text\n", "Solver.SKI → CPU (vDSP, on macOS)\n", "Solver.CG, N > 2000 → Metal (matrix-free matvec)\n", "D ≥ 16 and N ≥ 2000 → Metal (kernel construction)\n", "otherwise → CPU (AMX Cholesky wins)\n", "```\n", "\n", "A surprising finding: for moderate-N **dense Cholesky** on Apple Silicon, the\n", "CPU (with its AMX matrix coprocessor) **beats** the integrated Metal GPU.\n", "`Auto` reflects that.\n", "\n", "## Cross-platform code\n", "\n", "The same Python script runs unchanged on macOS and Linux. With `Backend.Auto`,\n", "LightGP picks the Metal / CUDA / OpenBLAS path that fits the host." ] } ], "metadata": { "kernelspec": { "display_name": "lightgp-docs", "language": "python", "name": "lightgp-docs" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }