{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "f19d8fbe", "metadata": { "execution": { "iopub.execute_input": "2026-05-11T22:14:04.790447Z", "iopub.status.busy": "2026-05-11T22:14:04.790390Z", "iopub.status.idle": "2026-05-11T22:14:04.808268Z", "shell.execute_reply": "2026-05-11T22:14:04.807861Z" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import warnings\n", "\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "id": "70a16da4", "metadata": {}, "source": [ "# Performance\n", "\n", "How memory hungry is Glass Box UMAP? How big of a dataset can you fit on a typical laptop? How much does using a GPU increase time to fit? These questions are answered on this page." ] }, { "cell_type": "markdown", "id": "1ac2082d", "metadata": {}, "source": [ "## How a fit works\n", "\n", "A fit has two stages. **First**, a nearest-neighbor graph is constructed over the input array `X`, capturing which points are close to which in feature space. **Second**, a small encoder network is trained whose loss encourages the embedding to preserve those neighbor relationships in low dimensions. The graph build runs on the CPU. The encoder runs on whichever device is selected (CPU, MPS, or CUDA).\n", "\n", "Two implementation details govern what fits and how fast it runs. Graph construction uses [`pynndescent`](https://pynndescent.readthedocs.io/), which expects the full input array in RAM (and does not stream from disk). The resulting graph is sparse and small in absolute terms (a few bytes per edge), but the working set during the build is large. Once the graph is generated, the encoder is trained by iterating over the graph's edges in batches, with the dataloader reading rows from the same in-memory `X` for every batch.\n", "\n", "At least in principle, both stages could be out-of-core. An out-of-core nearest-neighbor library, plus a graph-aware streaming dataloader that reads rows from disk indexed by the edge list, would lift both memory ceilings substantially without changing what Glass Box UMAP does. We do not have that today, so the rest of this page measures the ceilings as they exist: a memory frontier set by the graph build, then a speed profile that depends on which device the encoder runs on." ] }, { "cell_type": "markdown", "id": "5c930ad9", "metadata": {}, "source": [ "## How big a dataset fits on a typical laptop?\n", "\n", ":::{note}\n", "The local numbers below come from a 2023 14-inch MacBook Pro with an M3 Max chip, 14 cores, 36 GB of unified memory, and the integrated GPU exposed to PyTorch through MPS. We treat that machine as a stand-in for \"a typical laptop.\"\n", ":::\n", "\n", ":::{warning}\n", "A faster GPU buys you faster training (more on that in the next section), but it does not improve the memory bottleneck associated with nearest-neighbor graph construction. The graph is built on the CPU regardless of the training device, and both the input array and the graph live in host RAM.\n", ":::\n", "\n", "The grid below ran the nearest-neighbor graph build on Gaussian blobs of shape `(n_samples, n_features)` for every cell. We measure peak resident set size (RSS), the total bytes the process holds in physical memory at the highest point during graph construction. The training loop adds a couple of gigabytes of model and optimizer state on top of these numbers, but nearest-neighbor graph construction is the bottleneck that decides what can be fit." ] }, { "cell_type": "code", "execution_count": 2, "id": "3e56a694", "metadata": { "execution": { "iopub.execute_input": "2026-05-11T22:14:04.809617Z", "iopub.status.busy": "2026-05-11T22:14:04.809543Z", "iopub.status.idle": "2026-05-11T22:14:04.965901Z", "shell.execute_reply": "2026-05-11T22:14:04.965444Z" }, "tags": [ "remove-input" ] }, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "from matplotlib.colors import LogNorm\n", "\n", "DATA_DIR = Path(\"performance_data\")\n", "grid_df = pd.read_csv(DATA_DIR / \"memory_grid.csv\")\n", "workers_df = pd.read_csv(DATA_DIR / \"workers.csv\")\n", "workers_h100_csv = DATA_DIR / \"workers_h100.csv\"\n", "workers_h100_df = pd.read_csv(workers_h100_csv) if workers_h100_csv.exists() else None\n", "workers_t4_csv = DATA_DIR / \"workers_t4.csv\"\n", "workers_t4_df = pd.read_csv(workers_t4_csv) if workers_t4_csv.exists() else None\n", "\n", "encoder_local = pd.read_csv(DATA_DIR / \"encoder_size.csv\")\n", "encoder_t4 = pd.read_csv(DATA_DIR / \"encoder_size_t4.csv\").assign(device=\"t4\")\n", "encoder_h100 = pd.read_csv(DATA_DIR / \"encoder_size_h100.csv\").assign(device=\"h100\")\n", "encoder_df = pd.concat([encoder_local, encoder_t4, encoder_h100], ignore_index=True)\n", "\n", "sample_levels = sorted(grid_df[\"n_samples\"].unique())\n", "feature_levels = sorted(grid_df[\"n_features\"].unique())\n", "\n", "heat_ok = np.full((len(sample_levels), len(feature_levels)), np.nan, dtype=np.float64)\n", "ok_mask = np.zeros_like(heat_ok, dtype=bool)\n", "for _, row in grid_df.iterrows():\n", " i = sample_levels.index(int(row[\"n_samples\"]))\n", " j = feature_levels.index(int(row[\"n_features\"]))\n", " if bool(row[\"ok\"]):\n", " heat_ok[i, j] = row[\"peak_rss_bytes\"] / 1e9\n", " ok_mask[i, j] = True" ] }, { "cell_type": "code", "execution_count": 3, "id": "4d3efb89", "metadata": { "execution": { "iopub.execute_input": "2026-05-11T22:14:04.967166Z", "iopub.status.busy": "2026-05-11T22:14:04.967083Z", "iopub.status.idle": "2026-05-11T22:14:05.113865Z", "shell.execute_reply": "2026-05-11T22:14:05.113452Z" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib.colors import LinearSegmentedColormap\n", "\n", "pastel_cmap = LinearSegmentedColormap.from_list(\n", " \"pastel_blue\", [\"#EAF2FA\", \"#B6CFE6\", \"#7AA4C8\"]\n", ")\n", "\n", "fig, ax = plt.subplots(figsize=(7, 5), constrained_layout=True)\n", "im = ax.imshow(\n", " heat_ok,\n", " origin=\"lower\",\n", " cmap=pastel_cmap,\n", " norm=LogNorm(vmin=float(np.nanmin(heat_ok)), vmax=float(np.nanmax(heat_ok))),\n", " aspect=\"auto\",\n", ")\n", "for i in range(len(sample_levels)):\n", " for j in range(len(feature_levels)):\n", " if ok_mask[i, j]:\n", " val = heat_ok[i, j]\n", " ax.text(j, i, f\"{val:.1f}\", ha=\"center\", va=\"center\", color=\"#1a1a1a\", fontsize=10)\n", " else:\n", " ax.add_patch(\n", " plt.Rectangle((j - 0.5, i - 0.5), 1, 1, facecolor=\"#444444\", edgecolor=\"none\")\n", " )\n", " ax.text(j, i, \"OOM\", ha=\"center\", va=\"center\", color=\"white\", fontsize=10, fontweight=\"bold\")\n", "ax.set_xticks(range(len(feature_levels)))\n", "ax.set_xticklabels(feature_levels)\n", "ax.set_yticks(range(len(sample_levels)))\n", "ax.set_yticklabels([f\"{n:,}\" for n in sample_levels])\n", "ax.set_xlabel(\"n_features\")\n", "ax.set_ylabel(\"n_samples\")\n", "ax.set_title(\"Peak RSS during NN-graph construction (GB)\")\n", "fig.colorbar(im, ax=ax, label=\"GB\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "5b63c752", "metadata": {}, "source": [ "Cells in the top-right corner, where `n_samples` and `n_features` are both large, hit the out of memory (OOM) zone. Everything else shows the peak RSS the cell actually used. Read off the boundary to size your fits: roughly fifteen million points at 16 features, three million at 64, one million at 1024, and a hundred thousand at any feature count up to a thousand without breaking a sweat. Going beyond either edge needs more RAM or a different strategy.\n", "\n", "The shape of the surface is also informative. Memory grows much more steeply along `n_samples` than along `n_features`, so doubling the number of observations is a much bigger ask of the machine than doubling the number of features.\n", "\n", "If your dataset is too large to construct the graph, the most obvious but potentially least practical solution is to use a machine with more RAM. If that's not possible, you could consider either projecting to fewer features before the nearest-neighbor step (see [PCA preprocessing](pca_preprocessing.ipynb)), or fit on a representative subsample and `transform` the rest, since Glass Box UMAP is parametric. Neither changes the underlying ceiling, but both can move you well inside it." ] }, { "cell_type": "markdown", "id": "5acc681c", "metadata": {}, "source": [ "## Speeding up training\n", "\n", "The dominant cost knob in Glass Box UMAP is `epochs`. The encoder is a neural network that needs enough training time to actually settle on a good embedding, so reducing the epoch budget is the most direct way to make a fit take less time. Many problems converge well before the default 200-epoch budget, and you can often cut that in half or further without a measurable change in the embedding. See [monitoring training](monitoring_training.ipynb) for how to watch the loss curve and decide when to stop.\n", "\n", "Reducing `epochs` makes a fit shorter by training on fewer examples. The rest of this section is about a different lever: making each epoch run faster. Two knobs control that, the device the encoder runs on and the number of subprocesses the dataloader spawns. The next two subsections measure each in turn." ] }, { "cell_type": "markdown", "id": "eee3e05d", "metadata": {}, "source": [ "### Picking a device\n", "\n", "When picking hardware for a fit, the practical question is how much faster a GPU makes things compared to plain CPU. To answer it, we ran the same one-epoch fit on full MNIST (70k observations, 784 features) across four devices: the laptop's CPU and MPS, plus a Modal T4 and an H100. Each device runs with its near-optimal `num_workers` (2 for CPU and MPS, 8 for T4 and H100), the default `batch_size=10000`, and the default encoder (133K parameters). The next subsection covers `num_workers` directly, but for now treat those values as a given. The chart below is the result." ] }, { "cell_type": "code", "execution_count": 4, "id": "38c1edad", "metadata": { "execution": { "iopub.execute_input": "2026-05-11T22:14:05.115222Z", "iopub.status.busy": "2026-05-11T22:14:05.115139Z", "iopub.status.idle": "2026-05-11T22:14:05.150762Z", "shell.execute_reply": "2026-05-11T22:14:05.150350Z" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmMAAAGbCAYAAACI4ZeUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHPElEQVR4nO3dCbyM5f//8Y9937KE7AmRLYRUKrKVEmmRSsrSRouKNinybZMlkkTxLRTK8u2rspSkIoqSZCfZl5Ddmf/jfX1/9/nPGeccM+fMnDnnzOv5eAxz7pm555p7/dyf67qvK4vP5/MZAAAAoiJrdL4WAAAAQjAGAAAQRQRjAAAAUUQwBgAAEEUEYwAAAFFEMAYAABBFBGMAAABRRDAGAAAQRQRjAAAAUUQwBkTJ2rVrrUWLFlaoUCHLkiWLffrppxH5niuvvNI9Ys3zzz/vlmtauv/+++2aa65J0+9EZPTt29caNmzI4kWaIBgDkvDee++5k7n3yJ07t5UuXdpatmxpw4cPt0OHDqVq2d111132yy+/2KBBg2zixIlWv379NFkXf/31lwtUfv755zT5vlixceNGGzt2rD311FMJpr/11lvWsWNHK1eunNuOunTpkujnFy5caNdff72VLVvWbWslS5a0Vq1a2bfffnvGe1966SVr1KiRFS9e3L33ggsusIcffth2796d4H1fffWV+86pU6cmmH7ixAm77rrrLGvWrDZu3Liw/P7MRstzxYoVNnPmzGgXBTEge7QLAKR3L7zwglWsWNFOnjxpO3bscCc4HaiHDBniDtS1atUKeZ5Hjx617777zp5++ml78MEHLS0pGBswYIBVqFDB6tSpk6bfnZkNGzbMbSdXXXVVgukvv/yyC9wvueQS2759e5Kf/+OPP1xw1LNnTxeI7d+/3/7973/bFVdcYf/5z39cYOZZtmyZW3e33nqrFShQwFavXm3vvPOOe5+C7Hz58iX5PdqOb7rpJvvss8/cZ7p27RqmJZC5aB3ccMMN9tprr7kgGYgkgjHgLFq3bp0ga9WvXz+bP3++yyzoIK0TYZ48eUJajl4Go3Dhwiz/DOLIkSOWN2/eJAOcDz74wAVSgb7++uv4rFj+/PmTnP+9997rHoHVnpUqVbKhQ4cmCMamTZt2xucbN27sgqxZs2a5IC2pct588802e/Zse/vtt+2ee+6x9OCff/5JNoCMFi0rZTU3bNjg1gMQKVRTAilw9dVX27PPPmubN2922Qt/v//+uzspnnPOOa4KSYGcf1WHqgjLly/vnj/++OPuJK0slWh+OgFXrVrVBXhFixZ1J4NNmzYF1R7Kq1oNfL9HWb0GDRq453fffXd8Faw+l5xt27a5DMq5555ruXLlsho1apxRveVViX300Ueu6rVMmTLu9zdr1szWrVt3xjx/+OEHa9OmjRUpUsSdiJVhVHbJn4Leyy+/3L2uwFWZCgW/gRYtWuR+l77v/PPPd4FGUrS+6tWr55av1pECl61btyZ4j9rYXXTRRS4DpcyUgrDA6sfA79+zZ481b978jNe0rlPadk3fq6rIAwcOnPW93jaU1HtPnTrlfuuMGTNc1Wm3bt3OOk9vnU6ZMsX9fmWLtC50ERK4zL755pv46lhtI6pufeSRR1wW2J+qaRWUrl+/3q1/ZfZuv/32FM1jy5Yt7qJIz8877zwbOXKke13V/9pHVVYt/w8//PCMoFTZYVXvapvRfnbZZZfZl19+meB93vrUMgMiicwYkEJ33HGHO0F98cUX8Se2VatWWZMmTdyJQQ2AdTJQcNKuXTuXzbjxxhutffv2LrDQSea2225zJyQvY7J06VJbvHixO2kqmFFQpROngoPffvstycxMsC688EJX7frcc89Z9+7dXaAjl156aZKf2blzp2ufpJOyqlQVHPz3v/91WZWDBw+6Klt///rXv1x1W58+fezvv/+2V155xZ1sFXx5dNLTSbRUqVLWu3dvd5JXkKWMjf6WuXPnuqykMhIKPnVCHjFihFu+y5cvjw8+dOLVjRAql96noKN///4ucAykIFFBtDIeykIpQ6l5KuD66aefEmQq9+7d675f66Jz586Jzs+jdablU7duXUstLVO16VJwN2HCBPv1118TDQR9Pp8ro36vbgbR9pYtW7ZEb9bQe7StffLJJy5g6dGjR0hl0nLT73vyySdt165dLlOnQEVVol5W+OOPP3bZw/vuu88FN0uWLHHL9s8//3SvBZZHbS8VAKka0NuuQ5nH6dOn3frRutM2psyktk/tc6r+1zanfW306NF25513usyhqpFF28ngwYPdNqDqYy3zH3/80W1X/jdg6OYaBfdqt6f9FYgYH4BEjR8/3qddZOnSpUkuoUKFCvnq1q0b/3ezZs18NWvW9B07dix+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V66cjR8/PtjZAZlS28dmRLsISMas129g+QDIuHdT3njjjda5c+ckXy9SpIjddddd4SoXACANvPnmm1a/fn3LlSuXtWvX7ozXx44da1WrVrV8+fJZhQoVbMYMLjiAdDVQOAAgYytdurQ988wzNnfuXPvzzz8TvDZmzBh74403bPLkye4mrl27diVbQwIgZeiBHwBiWPv27V1GrFixYgmmnz592p577jkbNmyY1a1b190tf+6551qlSpXc68ePH7euXbu6zxUqVMguuugiW7p0aZR+BZCxEYwBABLtO1IjqyxfvtxVT5YpU8a6detmBw8edK+///77tmLFClu3bp27gWv69OlWsmRJliSQAgRjAIAz7Nu3z/2v6ssff/zRfv75Z9u4caM98sgjbnqOHDns0KFDtnr1ancnfZUqVaxs2bIsSSAFCMYAAGfInz+/+79fv36uKlIPPZ81a5abfscdd1iXLl3cnfZ6Tc/37NnDkgSiHYxt2bLFtTMAAGRsuoMyd+7cSb6ePXt2e+qpp1xVpbJjOv4zPjGQDoIxtSuoXr26azsAAEj/Tp06ZceOHXP/x8XFuecnTpywPHnyuO6MXn75Zdu/f79rF6bnN9zwv77a5s+f76ou9Tl1e6HATQEagCgHYwsWLLC+ffvalClTwjlbAECEDBw40AVegwYNclWQet6iRQv32tChQ13XFxUrVnSZMo3AMmTIEPeaGvffdtttVrhwYfe67qjs378/6wlIgSy+TD6Gke780UHi77//toIFC0bse769oUPE5o3UazJjWposRnrgT9/ogR9AeoxBUp0Ze++999yXAAAAIHSpDsa6d+/uBhAHAABA6IJubXnOOeckOl2NNxs3bmxZs2ZN0DcNAAAAwhiMnTx50po2bWodO3aMn6bmZvfee6898cQTdt555wU7KwAAAIQajP3000/WqVMndzvzyJEj4zsE1PAYGtdMXVoAAAAgQm3GKleubIsXL3Zjj9WpU8e+/fbbEL8KAAAAgULqoU8d+qnTv5YtW7os2e23325ZsmQJZRYAAABI7d2UV199tS1fvtx+//131/NytmzZUjIbAACAmJfisSuKFi3KsEcAAABpmRnTIOAbNmxw45fJ8ePH7aOPPrLJkye7oTEAAAAQoczYypUrrVWrVi7o0p2Tn332mbVp08Y2btzo2o3lyJHDPv/8c2vQ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depUO/fcc112TAHa8OHDQ50dAABATAs5GFMVZYECBdzzL774wtq3b++6smjUqJELygAAABDBYKxy5cr26aefujsm1U6sRYsWbvquXbusYMGCoc4OAAAgpoUcjKkvsT59+liFChVce7HGjRvHZ8nq1q0biTICAABkWiEPh3TTTTe5Dl63b9/uOoL1NGvWzG688cZwlw8AACBTS9HYlCVLlnQPf5dcckm4ygQAABAzgqqm7NmzpxuPMhhTpkyxDz74ILXlAgAAiAlBZcaKFy9uNWrUsCZNmljbtm2tfv36Vrp0acudO7ft37/fjVW5aNEiN4i4po8ZMybyJQcAAIiVYOzFF1+0Bx980MaOHWujRo1ywZc/dXXRvHlzF4QxHBIAAEAE2oypc9enn37aPZQN27JlixsaqVixYnb++edblixZQvhaAAAAhBSM+StSpIh7AAAAII37GQMAAED4EIwBAABEEcEYAABAFBGMAQAAZLRg7NSpUzZ37lx7++237dChQ27aX3/9ZYcPHw53+QAAADK1kO+m3Lx5s+tLTF1bHD9+3K655hrXz9jLL7/s/h49enRkSgoAAJAJhZwZ6927t+uBX32N5cmTJ366BgmfN29euMsHAACQqYWcGfvmm29s8eLFljNnzgTTK1SoYNu2bQtn2QAAADK9kDNjcXFxdvr06TOmayBxVVcCAAAggsFYixYtbOjQofF/axgkNdzv37+/tWnTJtTZAQAAxLSQqylff/11a9mypVWvXt2OHTtmnTp1srVr17oxKidNmhSZUgIAAGRSIQdjZcqUsRUrVtjkyZNt5cqVLit2zz332O23356gQT8AAAAiNFB49uzZrXPnzin5KAAAAFIbjKmD10WLFtmuXbtcg35/vXr1SsksAQAAYlLIwdh7771nPXr0cF1bFC1a1DXg9+g5wRgAAEAEg7Fnn33WnnvuOevXr59lzcrQlgAAAKkRcjR15MgRu/XWWwnEAAAAohGM6c7Jjz/+OBzfDQAAEPNCrqYcPHiwXXfddTZnzhyrWbOm5ciRI8HrQ4YMifmFCgAAENFg7PPPP7eqVau6vwMb8AMAACDCPfCPGzfOunTpEupHAQAAkNo2Y7ly5bImTZqE+jEAAACEIxjr3bu3jRgxItSPAQAAIBzVlEuWLLH58+fb7NmzrUaNGmc04J8+fXqoswQAAIhZIQdj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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "device_styles = {\n", " \"cpu\": (\"CPU (M3 Max)\", \"#c44e52\"),\n", " \"mps\": (\"MPS (M3 Max)\", \"#4c72b0\"),\n", " \"t4\": (\"T4 (Modal)\", \"#dd8452\"),\n", " \"h100\": (\"H100 (Modal)\", \"#55a868\"),\n", "}\n", "device_order = [\"cpu\", \"mps\", \"t4\", \"h100\"]\n", "\n", "default_df = encoder_df[encoder_df[\"encoder\"] == \"133K\"].set_index(\"device\").reindex(device_order)\n", "\n", "fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True)\n", "labels = [device_styles[d][0] for d in device_order]\n", "colors = [device_styles[d][1] for d in device_order]\n", "ax.bar(labels, default_df[\"fit_time_s\"].values, color=colors)\n", "\n", "for i, v in enumerate(default_df[\"fit_time_s\"].values):\n", " ax.text(i, v + 1.0, f\"{v:.0f}s\", ha=\"center\", va=\"bottom\", fontsize=9)\n", "\n", "ax.set_ylabel(\"fit time (s), MNIST 70k by 784, 1 epoch\")\n", "ax.set_title(\"Default encoder (133K params)\")\n", "\n", "y_top = float(np.ceil(default_df[\"fit_time_s\"].max() / 25.0)) * 25.0\n", "ax.set_ylim(0, y_top)\n", "ax.set_yticks(np.arange(0, y_top + 1, 25))\n", "ax.grid(True, axis=\"y\", ls=\":\", alpha=0.4)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "61e1b413", "metadata": {}, "source": [ "Picking up a GPU does help, but only modestly. CPU is the slowest at about 20 seconds. MPS shaves a couple of seconds off, T4 a bit more, and H100 the most, dropping to about 13 seconds. The improvement is appreciable, however it's surprising that it falls well short of what neural-network training usually delivers when you graduate to a GPU. A factor of ten or more is typical when a real model moves onto a discrete card. Here even the H100 is only about 1.6x faster than CPU, and the cheap T4 lands within a few seconds of the H100, which makes the price difference hard to justify on this workload.\n", "\n", "The reason is that the encoder is small at 133K parameters, so per-step time is dominated by CPU-bound bookkeeping (DataLoader iteration, Lightning callbacks, the optimizer step, the trainer thread) rather than by GPU compute. As evidence, we re-ran the same fit with progressively larger encoders, widening `hidden_size` and deepening `n_hidden_layers` to reach 463K, 2M, 5M, and 18M parameters. If the GPU were already the bottleneck, all four devices should slow down by roughly the same factor as the model grows. They do not.\n", "\n", ":::{warning}\n", "A larger encoder is not a better one. The bigger models in the next plot exist only to characterize how each device scales with model compute. For real fits, choose the encoder that matches your data. On simple manifolds, a smaller network can produce a cleaner embedding, as the [embedding refinement](embedding_refinement.ipynb) walkthrough shows on the 3-feature Swiss roll.\n", ":::" ] }, { "cell_type": "code", "execution_count": 5, "id": "a0fc5736", "metadata": { "execution": { "iopub.execute_input": "2026-05-11T22:14:05.151872Z", "iopub.status.busy": "2026-05-11T22:14:05.151806Z", "iopub.status.idle": "2026-05-11T22:14:05.210816Z", "shell.execute_reply": "2026-05-11T22:14:05.210442Z" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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etT25fXXX3fHXl0Mh6Jj995777nATe1o9ArswEH7mBXHHgDSlCl9igFAPuy6+Pvvvw+7S1h12XvnnXf6ypYt64uKijpmN8bqClZd3xYvXtwt63VjnFrXxerqOLnq1au7dSSnz6sr5UCbNm1y06pWreo74YQTfBUqVPC1adPG9+abb/rC1aJFi5Bd+8rHH3/su+iii3zlypVz3fpWq1bNd8stt/g2bNiQ4rgFdu2bFh2Dtm3bui5zCxUq5Ktdu7bvhhtu8P3www/+ZbQudQ2c3KOPPpriHOgcPf/887569eq5POpctWvXzrdo0SL/MgkJCb5Bgwb5atas6Y6TjteDDz7oO3DgQNC6jhw54pZTl9CFCxf2tW7d2vfrr7+6c5J8/9QdsNZx4oknuu2WKVPGd/bZZ/teeOEF36FDh4KOjfIXjq+//trXsWNHX6VKldw69feaa64J6iI5+XWaVpfcynd6jz0AZIYo/ZN2OAMAAAAA2Y82KwAAAAAiEsEKAAAAgIhEsAIAAAAgIuVosKKeUpo2ber6+FdPN+ppZPny5UHLtG7d2o03EPhS14qB1AuJejwpUqSIW496V8lod48AAAAAIkOOdl08e/Zs69OnjwtYFFw89NBDdtFFF9lvv/3mH5NA1JWmumH0KCjxaCAzBSoaSXfevHmuf36NiKw+7tUPPAAAAIDcKaJ6A9NgUioZURDTsmVLf8mK+uEPNZiWqN969U+/fv16K1++vJs2bNgwu//++936NGIyAAAAgNwnogaF3Llzp/urAcUCffDBB/b++++70pMOHTrYI4884i9d0ci/p5xyij9QEQ24dtttt9nSpUutcePGKbaj0XsDR/DVwF8arKx06dKumhkAAACArKPykt27d1ulSpUsOjo68oMVBQx33XWXG/325JNP9k/v1q2bG31XO6LRdFVionYtn3zyiZu/cePGoEBFvPeal1pbmUGDBmXp/gAAAABI29q1a61KlSqRH6yo7cqvv/5qc+fODZp+8803+9MqQalYsaK1adPG/vzzT6tdu3aGtvXggw9a//79g0p0qlWrZn///bfFx8e7SE9UyqIgymvYn1VpRZPapl5ZmWafOE9ce/x/4h7BvZzvJ75zeY7g2SgqAp5h9+zZY1WrVnUdbaUlIoKVO+64wyZPnmxz5sxJM7KSZs2aub8rV650wYqqhn333XdBy2zatMn91bxQChYs6F7JKVApUaLEcewJAAAAgGPxqn4dqwlGjnZdrKhKgcqECRNsxowZVrNmzWN+ZsmSJe6vSlikefPm9ssvv9jmzZv9y0ybNs0FHQ0aNMjC3AMAAADISjE5XfXrww8/tEmTJrkiIK+NSVxcnBUuXNhV9dL89u3bu8bvarNy9913u57CTj31VLesujpWUHLdddfZc88959YxYMAAt+5QpScAAAAAcocc7bo4tWKfESNG2A033OAa3Fx77bWuLcvevXtdvbbLL7/cBSOB1bXU1kS9f82aNcuNz9KjRw975plnLCYmvFhs165dLkBS2xWqgQEAAABZK9zn74gaZyWnEKwAAAAAkff8naNtVgAAAAAgNQQrAAAAACISwQoAAACAiESwAgAAACAiEawAAAAAiEgRMYJ9bvNtxy5Zvo0Wk8ZbbujFoXHjxrZgwQIrW7as5Xa7d++20047zRYuXGhlypTJ6ewAAADke5Ss5BFz5861du3aWcmSJS0+Pt4aNWrkBsk8dOiQf0ybIkWKWLFixax8+fLWrVs327Jli5unMW3uuuuuFOusUaOGTZw4MdVtvvjii9apUyd/oPLYY4+57WgcnEDff/+9m65AwHPnnXe6cXPUVV3lypXd9r28hqK8aB0rVqwImq7BPzV9yJAhdrw0MOn1119vTz311HGvCwAAAMePYCUPmDx5sgtU2rZt6x7md+zYYWPGjLHffvvNNmzY4F9u3rx5tmfPHvvll19s3bp1IQOUcB0+fNjefPNN69mzZ9D0unXr2nvvvWeJiYlBg3zWq1cvaLnbb7/dli1b5kpnfvrpJ/dScJUWrXvkyJH+9wcPHrSxY8danTp1LLNoQFHld9++fZm2TgAAAGQMwUoupzE9+/bta/fff78LPrzqSwoO9GBfvXr1FJ8pV66cde3a1X7++ecMb/e7776zI0eO2Mknnxw0XdtVScn06dPd+wMHDti4cePsuuuuC1qufv36VrRoUf8+REdHpyg1SU4lQIGBkEp9mjZtapUqVfIvo2CsY8eObh810FDLli1dIOTRfl977bX+988//7w1bNjQ9u/f7y/BKV26tM2ePTvDxwYAAACZg2All9MD/urVq+2aa64J+zMbN250JRKnn356hre7ZMmSFKUlHpW2DB8+3KUnTJhgZ555ZlBA4XnmmWdctTQFFgooVDUsLdqeqo599dVX7r22kbxkR4GMqrjpmGzatMm1qbnyyitdQCRvvfWWffPNNy7o+eGHH+zJJ5+00aNHW+HChf3raNCggds/AAAA5CyClVzOa3ei0oxjOffcc12bFgUPtWvXtpdffjnD292+fbtrbxLKVVdd5QIKLaMqVckDCs8DDzzgSkJUXe3WW2+1ChUqHHO7WpfW+c8//9iPP/5ol112WdB85UnbV6lNoUKFbNCgQfbHH3/Y+vXr3Xy15/nggw+sX79+Loh5+umn7ZRTTkmxDuUdAAAAOYtgJZfzqn2pDcqxqERBD+Fr1qxxD/ylSpVy00844QRLSEhIsbymaV4oCnrU3iQUVb9q3769Pfvss66EInlAkZyqhKlDAFXzOhYFItOmTXOBltIFCxYMmq/qXGoPo+pcCjr0V7Zu3epfpkWLFlarVi2X/5tuuinFNjRd+wcAAICcRdfFudxJJ53kHshVlenhhx/O0DrUrkWN7wPt3bvXVaPyHvaTU89eKrVIqwTkwgsvtDvuuMNiY2OPmQcFRsdqsyIKQC655BIXrKgaV6geyhYtWuR6R6tSpYrrbECBh1cNzFtGjfMVJD300EPufSCV9CjgAQAAOTuUQ24b1gGZj5KVXE7d9g4dOtS1/9Dff//9101X1adevXrZ33//fcx1qNH5rFmzbPz48S5oUMlC//79XWmHHuhDUVUyWbp0acj5559/visBSd6Nsajql0p2FEgoiFDvZGo7ot7MwqESmxkzZoRsc6O8q/qXAhRtR8FIIAUyTzzxhH300Uf24Ycfuk4Ipk6d6p+v46VSGDXMBwAAQM6iZCUPRPaXXnqpffnll+6B/5FHHnHTqlWr5nrgqlix4jE/ry6BJ02aZAMHDnTVolS1Sg/rahyvXrpCiYmJsVtuucUFHS+88ELIIKpNmzYhP6t5ChTuueceV8KhBvZdunRJs6QmkBrrh2qwLwqy1MBeY8moipwCkzfeeMPNU/Cijgg0jorXTkUN7tVdsXpGUz7U8F7V0byeygAAAJBzonyB9WPyKf0ar3YWO3fuTLXROPLHCPban/nz5+eJ/QEAICtRDQzZ8fxNyQoyTBfWn3/+mWeOoEawX7lyZU5nAwAAAEfRZgUAAABARCJYAQAAABCRCFYAAAAARCSCFQAAAAARiWAFAAAAQEQiWAEAAAAQkQhWAAAAAEQkxlnJgA7/mWRZ7bMXO1pu8Pfff9uFF15ov/zyixv5Prf766+/7OKLL7affvopT+wPAABAbkbJSh7QunVri4qKsunTpwdNf/755930u+66yz9N74sUKWLFihWz8uXLW7du3WzLli3+Edxvv/12q1y5sptftWpVu/rqq9Pc9sCBA+3OO+/0P9jfcMMNbhtvv/120HLjxo1z0zt16uSfdsUVV1jFihXd4JI1a9a0J598Ms1t6fNFixZ1I54GuuSSS9y8iRMn2vGqUaOGNW/e3IYNG3bc6wIAAMDxIVjJI+rWrWsjRowImqb39erVS7HsvHnzbM+ePa40ZN26df5g5u6773YlC4sXL3bz58+f7wKh1Pz777/2ySefWPfu3TOUl0cffdRtT8HH7Nmz7cMPP7T3338/zf1UADVmzBj/+w0bNtjChQtd4JVZevToYf/9738zbX0AAADIGIKVPEIlIF9++aXt3LnTvdcDvDRr1izVz5QrV866du1qP//8s3u/YMECu+aaa/wP/lWqVLFbb7011c9PnTrV6tevb6VKlQqarmphqh72xx9/uPfr16+377//PqhURU455RR/iYxKRqKjo23FihVp7mfPnj2DAqH33nvPrrzySitUqJB/2po1a1weypYtayVLlnQlLwqK5PDhw67kZMCAAf7l+/TpY23atLHExET3vkWLFvbPP//Y77//nmZeAAAAkIeDlcGDB1vTpk2tePHi7sFZD7PLly/3z9+2bZurYqRf6gsXLmzVqlWzvn37+h/IPXrQTf4aPXq05Sfx8fGurcVHH33k3g8fPtw92Kdl48aNNnbsWDv99NP9D+mPP/64vfnmmy6A8fl8aX5+yZIlIUtuChQoYNdff73Lg7z77rsuoAjVBkTVzlQtTedWpTmqRpYWBSFr1661ZcuWufcKXJLvp4KO/v37u+UUNGn9vXv3dvNiYmJcCc7rr79us2bNskmTJrkqairRUbAkJ5xwgp144olu/wAAAJBPgxVV/dGv2vpFf9q0aZaQkGAXXXSR7d271/+LvF4vvPCC/frrrzZy5EibMmWK9erVK8W69NCqKkHeK/mv+PmBV+qwf/9+Gz9+vF133XUhlzv33HNdicOZZ55ptWvXtpdfftlNf/XVV11Jio6z5qmE5aWXXkp1e9u3b3ftTUJR0DFq1ChXkqH1pRY4KWhQkKKSFwU4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QcqKFSvcoI433XSTCyC8YqG5c+e6IOJYgzOqp6/zzjsvxfQePXrYG2+84UppfvzxR1d6om6IL7roInviiSesfPny/mVV5UsBymeffeaKlBTcvPrqq1asWFKjrnCozUo4deYAAACQ5NuOXbL1ULSYNJ5Dn4eE+/yd7pKVKlWquEbuN954oytJKVu2bIplTj31VGvatOkx19W6dWt/Q6BQpk6desx1qARGDf4BAAAA5C3pDlbUjfC5556b5jKKjmbOnHk8+QIAAACQz6U7WPECFVUH87oM1oCNycc7AQAAAIDjke7ewHbv3m3XXXedVa5c2Q0QqZfS1157rX/gGQAAAADI9mBFjekXLlxokydPdg3f9VL6hx9+sFtuueW4MwQAAAAAGaoGpsBEDd/POecc/zT1BPbWW2+5HsAAAAAAIEdKVkqXLu26GUtO00qWLJkpmQIAAACAdAcrAwYMsP79+9vGjRv905S+99573Sj2AAAAAJBt1cAaN27sH/BRNBhktWrV3EvWrFljBQsWtC1bttBuBQAAAED2BSsaSR4AAAAAIi5YefTRR7M+JwAAAABwPG1WAAAAACA7EKwAAAAAiEgEKwAAAAAiEsEKAAAAgLwRrPz666+pzps4ceLx5gcAAAAAMhastG3b1lavXp1i+vjx46179+7pXR0AAAAAZE6wctNNN9kFF1wQNIL9mDFj7Prrr7eRI0emd3UAAAAAkPFxVgINGjTItm3b5gKWOXPm2JQpU1wAM2rUKOvSpQuHGQAAAEDOBCsydOhQV+XrrLPOsnXr1tlHH31kHTt2zJwcAQAAAEC4wcqnn36aYlrnzp3tm2++sWuuucaioqL8y1x22WUcWAAAAADHLcrn8/mOtVB0dHhNWxS0HDlyxHKbXbt2WVxcnO3cudNKlCiR09kBAACIeN92zN7q/y0mjc/W7SEynr/DKllJTEzMzLwBAAAAwDExKCQAAACA3N/AfuvWrTZ8+HCbP3++v+viChUqWPPmza1nz55WtmzZrMonAAAAgHwm7JKV77//3k466SR79dVXXf2yli1bupfS6h2sXr169sMPP2RtbgEAAADkG2GXrNx5553WtWtXGzZsmGtIH0ht9G+99Va3jEpdAAAAACDbgpWffvrJjVCfPFARTbv77rutcePGx50hAAAAAEhXNTC1Tfnuu+9Sna955cuX56gC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HDgwqKF+cio1UeAxbtw4a9CggStheeGFF4KWUcN8lfKo62Tl66OPPnLdE6dFvY6pEwB1iaxtfPvtt266gifti/IHAACA3C3Kl7yxAPKNzz//3JWkqNqU2o3kBRo3Rm1qNJYLAAAAcjfarORjl1xyiavKtW7dOn97ktxM1cE0Vsw111yT01kBAABAJqBkBQAAAEBEyht1fwAAAADkOQQrAAAAACISwQoAAACAiESwAgAAACAiEawAAAAAiEgEKwCA46KBX+Pj4zmKAIBMR7ACAEA2i4qKsokTJ3LcAeAYCFYAADkuISEh27Z15MgRS0xMtLwgO48bAOQEghUAyCX0gD148GCrWbOmFS5c2Bo1amQff/yxf/6sWbPcL/Zff/21NWnSxIoUKWJnn322LV++PGg9n332mTVt2tQKFSpkZcqUscsvv9w/b/v27Xb99ddbyZIl3efbtWtnK1asSFHtq1q1am6+Pvvvv/+myOukSZPs9NNPd9uoVauWDRo0yA4fPuyfr3y+8cYbdtlll1nRokXtqaeeCrnPNWrUsCeeeMKuueYat1zlypXttddeC1rmpZdeslNOOcXNr1q1qt1+++22Z8+eFNXUPv30U2vQoIEVLFjQ1qxZY99//71deOGF7hjExcVZq1atbPHixUHrVj7/97//2aWXXur2t379+jZ//nxbuXKltW7d2m1Tx/jPP/8Me/+1T6Jjp/V77zN63HTOunfvbmXLlnXXRZ06dWzEiBEhjycA5Do+AECu8OSTT/rq1avnmzJliu/PP//0jRgxwlewYEHfrFmz3PyZM2f6dFtv1qyZm7Z06VLfueee6zv77LP965g8ebKvQIECvoEDB/p+++0335IlS3xPP/20f/5ll13mq1+/vm/OnDluXtu2bX0nnnii79ChQ27+ggULfNHR0b5nn33Wt3z5ct8rr7zii4+P98XFxfnXoc+WKFHCN3LkSJfPr776ylejRg3fY4895l9G+SxXrpxv+PDhbpm///475D5Xr17dV7x4cd/gwYPd9l599VWXf63T8/LLL/tmzJjhW716te/rr7/21a1b13fbbbf55+s4nXDCCe44fPvtt75ly5b59u7d65YdNWqU7/fff3fHolevXr7y5cv7du3aFZTPypUr+8aMGeO236lTJ7cv559/vjsP+txZZ53lu/jii8Pe/82bN7v1Kl8bNmxw74/nuPXp08d32mmn+b7//nt3DKZNm+b79NNPM3CFAUDkIVgBgFzgwIEDviJFivjmzZsXNF0P2Ndcc01QsDJ9+nT//M8//9xN279/v3vfvHlzX/fu3UNu448//nDL6oHes3XrVl/hwoV9Y8eOde+1rfbt2wd97qqrrgoKVtq0aRMUAImCgooVK/rfazt33XXXMfdbwUpgIOBtr127dql+Zty4cb7SpUv73yso0PYUfKXlyJEjLjD67LPPgvI5YMAA//v58+e7ae+8845/2kcffeQrVKhQuvd/woQJQctk9Lh16NDB17NnzzT3DQByq5icLtkBABybqh3t27fPVVsKdOjQIWvcuHHQtFNPPdWfrlixovu7efNmV3VryZIl1rt375Db+P333y0mJsaaNWvmn1a6dGmrW7eum+ctE1htTJo3b25Tpkzxv//pp5/s22+/DarapXYiBw4ccPug6lSiqmrh0PqTvx8yZIj//fTp0131uGXLltmuXbtctank24qNjQ06LrJp0yYbMGCAqz6n46M86jOqIhYo8HPly5d3f1XtLHCatqdtlyhRIuz9Ty6jx+22226zLl26uCpsF110kXXq1MlVTQOAvIBgBQByAa8Nxueff+7abQRSG4xAJ5xwQlAbB/EalKtNQ3bkVW0tOnfunGKe2mJ41ObieP3111+uPYke2PWQX6pUKZs7d6716tXLBXLeA7722zsWnh49erj2Nq+88opVr17dHUcFQvrcsY5nWsc43P3PrOOmdkV///23ffHFFzZt2jRr06aN9enTx1544YVUtwUAuQXBCgDkAoENw9UQPKNUSqAG+D179kwxT43HVSqxcOFC/y/zephXA31t31tG8wMtWLAg6L0aiOszJ554Yobzmdb69V75kEWLFrkg4cUXX7To6KQ+Y8aOHRvWelWK8frrr1v79u3d+7Vr19rWrVuPO7/h7L+CHZWapPdzqVHjegVfep177rl27733EqwAyBMIVgAgFyhevLjdc889dvfdd7uH83POOcd27tzpHrhV9UgPqeF49NFH3S/vtWvXtquvvtoFJ/pF/v7773e9SHXs2NFVE1MPWNrmAw884EpyNF369u1rLVq0cA/CmjZ16tSgKmAycOBAV9qhamdXXHGFCyJUxenXX3+1J598Mt37rn187rnnXPUmlRyMGzfOlTCJHuzVfe/QoUOtQ4cObtlhw4aFtV7t76hRo1y1KlXh0gN+ZpQ8hbP/6gFMQaOOpYJQ9b6W0eOmz51xxhnWsGFDO3jwoE2ePNkfzAFArpfTjWYAAOFJTEz0DRkyxPV2pd6typYt63rrmj17dlAD++3bt/s/8+OPP7pp6iXKM378eNd7VGxsrK9MmTK+zp07++dt27bNd91117kG82pYr/Wr4X0gNS6vUqWKm6/G3S+88EJQA3tRT1nqfUvLqIerM8880/fmm2+m2cA8tQb2gwYN8nXt2tV1MFChQgXXA1mgl156yTVC9/L73nvvBR0HNbBPnj9ZvHixr0mTJq5xfJ06dVzDfG1PvYullk8dR03TcfWEOu7H2n/11qVe1mJiYtw2j+e4PfHEE64HN32mVKlSvo4dO/pWrVp1zGMLALlBlP7J6YAJAIBQVAJx1113uRcAIP9hUEgAAAAAEYlgBQAAAEBEohoYAAAAgIhEyQoAAACAiESwAgAAACAiEawAAAAAiEgEKwAAAAAiEsEKAAAAgIhEsAIAAAAgIhGsAAAAAIhIBCsAAAAALBL9Hxck7OLq9IviAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "device_styles = {\n", " \"cpu\": (\"CPU (M3 Max)\", \"#c44e52\"),\n", " \"mps\": (\"MPS (M3 Max)\", \"#4c72b0\"),\n", " \"t4\": (\"T4 (Modal)\", \"#dd8452\"),\n", " \"h100\": (\"H100 (Modal)\", \"#55a868\"),\n", "}\n", "\n", "size_order = [\"133K\", \"463K\", \"2M\", \"5M\", \"18M\"]\n", "device_order = [\"cpu\", \"mps\", \"t4\", \"h100\"]\n", "\n", "x = np.arange(len(size_order))\n", "n_devices = len(device_order)\n", "bar_width = 0.8 / n_devices\n", "\n", "fig, ax = plt.subplots(figsize=(8, 4.8), constrained_layout=True)\n", "for i, dev_key in enumerate(device_order):\n", " label, color = device_styles[dev_key]\n", " sub = encoder_df[encoder_df[\"device\"] == dev_key].set_index(\"encoder\").reindex(size_order)\n", " offset = (i - (n_devices - 1) / 2) * bar_width\n", " ax.bar(x + offset, sub[\"fit_time_s\"].values, bar_width, color=color, label=label)\n", "\n", "ax.set_xticks(x)\n", "ax.set_xticklabels([\"133K\\n(default)\" if s == \"133K\" else s for s in size_order])\n", "ax.set_xlabel(\"encoder parameters\")\n", "ax.set_ylabel(\"fit time (s), MNIST 70k by 784, 1 epoch\")\n", "ax.set_title(\"Fit time vs. encoder size\")\n", "\n", "y_top = float(np.ceil(encoder_df[\"fit_time_s\"].max() / 25.0)) * 25.0\n", "ax.set_ylim(0, y_top)\n", "ax.set_yticks(np.arange(0, y_top + 1, 25))\n", "ax.grid(True, axis=\"y\", ls=\":\", alpha=0.4)\n", "ax.legend(frameon=False, fontsize=9)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "60fe046f", "metadata": {}, "source": [ "As the encoder grows from 133K to 18M parameters (a 138x increase), fit time grows several-fold on CPU, T4, and MPS, but barely changes on H100, indicative of under-utilization. At the default size, every device pays roughly the same fixed overhead and the four bars are close together. As the encoder grows, the bar that grows least is the one with the most spare compute, aka the most powerful GPU tested (H100).\n", "\n", "Ultimately, the takeaway is this: For typical Glass Box UMAP work where the encoder is modestly sized, CPU is enough. And when performance matters, modest speedup can be squeezed out by using a GPU." ] }, { "cell_type": "markdown", "id": "f3c87964", "metadata": {}, "source": [ "### Number of data workers\n", "\n", "Besides picking a device, the only knob you can turn from one fit to the next is `num_workers`, the number of Python subprocesses the dataloader spawns to pre-stage batches. The setting matters because the encoder is fast: with too few workers, batches arrive too slowly to keep it busy and the device sits idle. With too many workers, you pay scheduling overhead for nothing. The optimum depends on the device, and getting it wrong leaves a multiplicative factor of throughput on the table.\n", "\n", "The plot below sweeps `num_workers` from zero through twelve on full MNIST (70k observations, 784 features) for one training epoch on each of CPU, MPS, T4, and H100." ] }, { "cell_type": "code", "execution_count": 6, "id": "11fd2e2e", "metadata": { "execution": { "iopub.execute_input": "2026-05-11T22:14:05.212011Z", "iopub.status.busy": "2026-05-11T22:14:05.211940Z", "iopub.status.idle": "2026-05-11T22:14:05.266027Z", "shell.execute_reply": "2026-05-11T22:14:05.265638Z" }, "tags": [ "remove-input" ] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cpu_df = workers_df[workers_df[\"device\"] == \"cpu\"].sort_values(\"num_workers\")\n", "mps_df = workers_df[workers_df[\"device\"] == \"mps\"].sort_values(\"num_workers\")\n", "\n", "fig, ax = plt.subplots(figsize=(7, 4.5), constrained_layout=True)\n", "ax.plot(cpu_df[\"num_workers\"], cpu_df[\"fit_time_s\"], \"o-\", color=\"#c44e52\", label=\"CPU (M3 Max)\", lw=2)\n", "ax.plot(mps_df[\"num_workers\"], mps_df[\"fit_time_s\"], \"o-\", color=\"#4c72b0\", label=\"MPS (M3 Max)\", lw=2)\n", "if workers_t4_df is not None:\n", " t4_df = workers_t4_df.sort_values(\"num_workers\")\n", " ax.plot(t4_df[\"num_workers\"], t4_df[\"fit_time_s\"], \"o-\", color=\"#dd8452\", label=\"T4 (Modal)\", lw=2)\n", "if workers_h100_df is not None:\n", " h_df = workers_h100_df.sort_values(\"num_workers\")\n", " ax.plot(h_df[\"num_workers\"], h_df[\"fit_time_s\"], \"o-\", color=\"#55a868\", label=\"H100 (Modal)\", lw=2)\n", "ax.set_xlabel(\"num_workers\")\n", "ax.set_ylabel(\"fit time (s), MNIST 70k by 784, 1 epoch\")\n", "ax.set_title(\"Throughput vs. dataloader workers\")\n", "ax.set_xticks(sorted({int(x) for x in workers_df[\"num_workers\"]}))\n", "ax.grid(True, ls=\":\", alpha=0.4)\n", "ax.legend(frameon=False, fontsize=9)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "7064cf63", "metadata": {}, "source": [ "The four lines tell different stories. The two laptop devices (CPU and MPS) sit close together throughout. They do best at 1-2 workers, then climbs steeply as more workers presumably oversubscribe the laptop's 14 cores.\n", "\n", "The two discrete GPUs need more workers to feed them. T4 and H100 both look very slow at 0-1 workers, where the dataloader cannot keep up with the device, then drop sharply between 2-4 workers and flatten by 8. Their hosts have more cores (8 on T4, 32 on H100), so adding workers does not oversubscribe in the same range the laptop does.\n", "\n", ":::{note}\n", "On macOS, interrupting a fit with `num_workers > 0` (hitting stop in a Jupyter cell partway through training, for example) can leave PyTorch's shared memory helper subprocess in a broken state. A second fit in the same kernel then fails with\n", "\n", "```\n", "RuntimeError: Please call `iter(combined_loader)` first.\n", "```\n", "\n", "which masks the underlying `RuntimeError: Broken pipe` from `_share_filename_cpu_`. The simplest workaround is to restart the kernel after an interrupt. With `num_workers=0`, or when a fit runs to completion, you can re-run fits freely.\n", ":::\n", "\n" ] }, { "cell_type": "markdown", "id": "92953450", "metadata": {}, "source": [ "---\n", "\n", ":::{admonition} Looking to reproduce these results?\n", ":class: note\n", "\n", "See [this README](https://github.com/Arcadia-Science/glass-box-umap/blob/main/docs/user_guide/performance_data/README.md) for the scripts and commands.\n", ":::" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.1" } }, "nbformat": 4, "nbformat_minor": 5 }