Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@

## Fork 100 microVMs in 101 ms. BRANCH a live VM in 56 ms (v0.4 live mode).

<div align="center">
<img alt="forkd: pull a portable snapshot from the hub, then fork 100 microVMs" src="docs/assets/quickstart-fork-100.gif" width="760">
<br/>
<em>Unedited: `forkd pull` a portable snapshot, then fork 100 microVMs — 100/100 alive, ~200&nbsp;ms wall-clock. <a href="docs/assets/quickstart-fork-100.cast">asciicast</a>. (First pull also fetches the rootfs sidecar once; cached here.)</em>
</div>

<br/>

A microVM sandbox runtime for **AI agent fan-out**. Children fork
from a warmed parent snapshot, inheriting its address space
copy-on-write instead of cold-booting their own kernel.
Expand Down
17 changes: 17 additions & 0 deletions docs/assets/quickstart-fork-100.cast
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{"version": 2, "width": 92, "height": 26, "timestamp": 1781899155, "idle_time_limit": 2.0, "env": {"SHELL": null, "TERM": null}}
[0.80448, "o", "\u001b[1;36mforkd@demo\u001b[0m:\u001b[1;34m~\u001b[0m\u001b[1m$\u001b[0m forkd pull deeplethe/python-numpy\r\n"]
[1.511411, "o", "→ resolving via https://raw.githubusercontent.com/deeplethe/forkd/main/registry.json\r\n==> GET https://raw.githubusercontent.com/deeplethe/forkd/main/registry.json\r\n"]
[1.813527, "o", "\r 0.0 MiB ( 11.5 MiB/s) \r\n"]
[1.81359, "o", "==> GET https://github.com/deeplethe/forkd/releases/download/hub-python-numpy-v1/python-numpy.forkd-snapshot.tar.zst\r\n"]
[16.034542, "o", "\r 1.6 / 15.5 MiB ( 10.3% · 1.6 MiB/s) \r 2.8 / 15.5 MiB ( 18.2% · 1.4 MiB/s) \r 4.0 / 15.5 MiB ( 26.0% · 1.3 MiB/s) \r 5.0 / 15.5 MiB ( 32.0% · 1.2 MiB/s) \r 6.0 / 15.5 MiB ( 38.7% · 1.2 MiB/s) \r 7.2 / 15.5 MiB ( 46.1% · 1.2 MiB/s) \r 8.2 / 15.5 MiB ( 52.7% · 1.1 MiB/s) \r 9.3 / 15.5 MiB ( 60.0% · 1.1 MiB/s) \r 10.5 / 15.5 MiB ( 67.7% · 1.1 MiB/s) \r 11.5 / 15.5 MiB ( 74.2% · 1.1 MiB/s) \r 12.7 / 15.5 MiB ( 81.8% · 1.1 MiB/s) \r 13.9 / 15.5 MiB ( 89.4% · 1.1 MiB/s) \r 14.9 / 15.5 MiB ( 96.0% · 1.1 MiB/s) \r 15.5 / 15.5 MiB (100.0% · 1.1 MiB/s) \r\n✓ downloaded 15.5 MiB (https://github.com/deeplethe/forkd/releases/download/hub-python-numpy-v1/python-numpy.forkd-snapshot.tar.zst)\r\n"]
[16.049549, "o", "✓ sha256 verified (0084e2eb769e2df0)\r\n"]
[16.591322, "o", "✓ unpacked tag 'python-numpy' at /root/.local/share/forkd/snapshots/python-numpy\r\n next: forkd fork --tag python-numpy -n <N>\r\n"]
[17.582377, "o", "==> downloading rootfs sidecar f4ae4fc74992a9eb.rootfs.zst (1.50 GiB)\r\n==> GET https://github.com/deeplethe/forkd/releases/download/hub-python-numpy-v1/f4ae4fc74992a9eb.rootfs.zst\r\n"]
[59.976578, "o", "\r 1.6 / 48.3 MiB ( 3.2% · 1.6 MiB/s) \r 2.8 / 48.3 MiB ( 5.7% · 1.3 MiB/s) \r 4.1 / 48.3 MiB ( 8.5% · 1.3 MiB/s) \r 5.1 / 48.3 MiB ( 10.6% · 1.2 MiB/s) \r 6.2 / 48.3 MiB ( 12.8% · 1.2 MiB/s) \r 7.3 / 48.3 MiB ( 15.1% · 1.2 MiB/s) \r 8.6 / 48.3 MiB ( 17.8% · 1.2 MiB/s) \r 9.9 / 48.3 MiB ( 20.6% · 1.2 MiB/s) \r 11.1 / 48.3 MiB ( 22.9% · 1.2 MiB/s) \r 12.1 / 48.3 MiB ( 25.0% · 1.2 MiB/s) \r 13.2 / 48.3 MiB ( 27.2% · 1.2 MiB/s) \r 14.3 / 48.3 MiB ( 29.6% · 1.2 MiB/s) \r 15.6 / 48.3 MiB ( 32.3% · 1.2 MiB/s) \r 16.8 / 48.3 MiB ( 34.8% · 1.2 MiB/s) \r 18.0 / 48.3 MiB ( 37.2% · 1.2 MiB/s) \r 19.0 / 48.3 MiB ( 39.4% · 1.2 MiB/s) \r 20.1 / 48.3 MiB ( 41.6% · 1.2 MiB/s) \r 21.3 / 48.3 MiB ( 44.2% · 1.2 MiB/s) \r 22.4 / 48.3 MiB ( 46.4% · 1.2 MiB/s) \r 23.6 / 48.3 MiB ( 48.9% · 1.2 MiB/s) \r 24.6 / 48.3 MiB ( 50.9% · 1.2 MiB/s) \r 25.6 / 48.3 MiB ( 53.0% · 1.1 MiB/s) \r 26.8 / 48.3 MiB ( 55.4% · 1.1 MiB/s) \r 28.0 / 48.3 MiB ( 58.0% · 1.2 MiB/s) \r 29.4 / 48.3 MiB ( 61.0% · 1.2 MiB/s) \r 30.7 / 48.3 MiB ( 63.5% · 1.2 MiB/s) \r 31.7 / 48.3 MiB ( 65.7% · 1.2 MiB/s) \r 32.8 / 48.3 MiB ( 67.8% · 1.2 MiB/s) \r 33.9 / 48.3 MiB ( 70.2% · 1.2 MiB/s) \r 35.2 / 48.3 MiB ( 72.9% · 1.2 MiB/s) \r 36.4 / 48.3 MiB ( 75.4% · 1.2 MiB/s) \r 37.6 / 48.3 MiB ( 77.9% · 1.2 MiB/s) \r 38.6 / 48.3 MiB ( 79.9% · 1.2 MiB/s) \r 39.7 / 48.3 MiB ( 82.2% · 1.2 MiB/s) \r 40.9 / 48.3 MiB ( 84.6% · 1.2 MiB/s) \r 42.2 / 48.3 MiB ( 87.3% · 1.2 MiB/s) \r 43.3 / 48.3 MiB ( 89.7% · 1.2 MiB/s) \r 44.5 / 48.3 MiB ( 92.0% · 1.2 MiB/s) \r 45.5 / 48.3 MiB ( 94.3% · 1.2 MiB/s) \r 46.6 / 48.3 MiB ( 96.5% · 1.2 MiB/s) \r 47.8 / 48.3 MiB ( 99.0% · 1.2 MiB/s) \r 48.3 / 48.3 MiB (100.0% · 1.2 MiB/s) \r\n"]
[73.139986, "o", "✓ rootfs ready at /var/cache/forkd/python-3-12-slim.ext4\r\n"]
[73.1418, "o", "\r\n"]
[74.343196, "o", "\u001b[1;36mforkd@demo\u001b[0m:\u001b[1;34m~\u001b[0m\u001b[1m$\u001b[0m sudo -E forkd fork --tag python-numpy -n 100 --per-child-netns\r\n"]
[75.05061, "o", "==> forking 100 children from snapshot 'python-numpy' (per-child netns)...\r\n"]
[75.245088, "o", "✓ all sockets up in 111 ms\r\n✓ 100 restores fired in parallel in 82 ms\r\n✓ total wall-clock: 193 ms\r\n==> letting children settle for 2s...\r\n"]
[77.245932, "o", "✓ 100 / 100 children alive\r\n==> shutting down...\r\n"]
[79.327369, "o", " cleaned work_dir /tmp/forkd-fork-python-numpy\r\n"]
Binary file added docs/assets/quickstart-fork-100.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading