macOS#
A Mac joins a cluster as an inference machine: it serves Eos models with llama.cpp, natively, on the Apple GPU through Metal, and runs the jobs that fetch their weights. It runs no Linux containers. Use this page to add a Mac, keep it serving, and know its limits before you plan on it.
Before you begin#
- macOS 13.3 or newer (llama.cpp's own minimum).
- Apple silicon for the GPU. An Intel Mac joins too, but serves on its CPU: llama.cpp's Intel macOS build has no Metal.
- An administrator account: the command uses
sudo. - Nothing else: no Homebrew, no Xcode, no Docker. The release brings the pinned llama.cpp server.
- Outbound HTTPS to the Astraeus address and to the releases address, as for any machine (Network and firewalls).
What a Mac runs, and what it refuses#
| On a Mac | |
|---|---|
| Eos deployments of GGUF models on llama.cpp | Yes, natively, with Metal on Apple silicon. |
| The run that fetches a model's weights into its drive | Yes, in the Mac's own shell. |
| General runs (Linux container images) | No. Refused with "Linux containers on a Mac arrive with the VM; this machine runs Eos models". The scheduler never places them there. |
| vLLM | No. The fit says so; use a GGUF of the model. |
Privileged runs, exec into a worker |
No. |
| A run's outbound network policy | No: engines run on the host network, where it cannot be enforced. Such runs are refused. |
| The WireGuard mesh | No. Workers use the Mac's own network. |
| Drives served to other machines, credentials, data sources | No: only the agent's main part runs on a Mac (not its drives, credentials or data parts). Gated Hugging Face models, whose token is a credential, cannot be fetched on a Mac. |
| CPU and memory limits | Not enforced (macOS has no cgroups). llama.cpp's context size and parallelism bound its memory. |
Each model is served by llama-server on the host network, on port 8000:
one replica of a deployment per Mac.
Add a Mac#
- In the console, open Compute → Machines → Add machine, choose the pool, and click Get the install command (Add a machine).
- Open Terminal on the Mac, paste the command and press Return. Enter
your password when
sudoasks. - Answer where to keep model weights. Press Return to accept
/Users/Shared/Astraeus.
$ echo '9c4e…' > ./astraeus-token && curl -fsSL https://console.astralyx.cloud/api/v1/install.sh | sudo sh -s -- --apiserver https://api.astralyx.cloud --token-file ./astraeus-token --releases https://console.astralyx.cloud/releases --org 'Acme Research' --org-id 0192f0c4-7d1e-7a51-9c33-5e8b2a4f6d10 && rm -f ./astraeus-token
Password:
Where should this Mac keep model weights? [/Users/Shared/Astraeus]
· downloading astraeus-agent-darwin-arm64.tar.gz (latest)
· installing
· starting
Installed on this Mac:
the agent /usr/local/bin/astraeus-agent (runs as cloud.astralyx.astraeus-agent, launchd)
llama.cpp /usr/local/lib/astraeus/engines (native, Metal on the Apple GPU)
configuration /etc/astraeus/agent.env (the token: /etc/astraeus/token, root only)
its log /Library/Logs/Astraeus/agent.log
network the host network (no mesh on a Mac yet): one replica of a deployment per Mac
model weights /Users/Shared/Astraeus
macOS lists it under System Settings > General > Login Items (Allow in the Background): leave it on.
sleep kept awake while a model is served. To keep it reachable at all times: sudo pmset -a sleep 0
· mac-studio is connected to https://api.astralyx.cloud
The Mac's name is its local host name (scutil --get LocalHostName) in
lower case, unless you pass --name.
Where to keep model weights#
The data location must be a folder a background service may read. The installer refuses:
- folders macOS protects with privacy settings:
Documents,Desktop,Downloads, iCloud Drive (Library/Mobile Documents) and cloud storage folders (Library/CloudStorage) of any user; - anything under
/Volumes(external and network volumes): macOS would ask permission, and nobody is there to answer.
/Users/Shared/Astraeus is recommended. Without a terminal, pass
--data-dir, or --no-data-dir to choose later in the console.
Options that do not apply#
--runtime, the NVIDIA and AMD options and --agents are ignored on a Mac,
with a message. --network mesh is an error. See the
Installer reference.
Keep it serving#
- Allow in the Background. macOS lists the agent under System Settings → General → Login Items → Allow in the Background. Leave it on, or the agent does not run.
-
Sleep. A Mac asleep drops off the cluster. While a model is served, each engine holds a
caffeinateassertion, so a desktop, or a laptop on power, stays awake. A laptop still sleeps when its lid closes. For a Mac that should answer at all times: -
Firewall. When the macOS application firewall is on, the installer allows
llama-serverto accept connections, so no prompt blocks it.
GPU memory#
The Apple GPU is reported as one GPU of vendor apple. Its memory is what
Metal lets the GPU hold (the working set):
- the GPU wired-memory limit, when an administrator set one
(
sysctl iogpu.wired_limit_mb, macOS 14 or newer); - otherwise two thirds of the RAM up to 36 GiB, and three quarters above.
The GPU and the CPU share one memory, so the scheduler also charges what a model holds on the GPU to the Mac's RAM: it is not promised twice. Memory the desktop uses on the GPU is not counted against it.
To give models more room on a Mac dedicated to serving:
The value does not survive a restart; set it again at boot if you rely on it.
Operate a Mac#
| Task | Command |
|---|---|
| Follow the log | tail -f /Library/Logs/Astraeus/agent.log |
| Restart the agent | sudo launchctl kickstart -k system/cloud.astralyx.astraeus-agent |
| Change the configuration | Edit /etc/astraeus/agent.env, then restart the agent |
| See a model's output | /var/lib/astraeus/worker/native/<id>/log |
Each model runs as its own llama-server process, supervised in a session
of its own: it keeps serving while the agent restarts, and the new agent
adopts it. Update from the console downloads the macOS release, replaces
the files under /usr/local and restarts the agent through launchd.
A Mac installed before October 2026
Its agent was /usr/local/bin/astraeus-worker, run as
cloud.astralyx.astraeus-worker, configured by
/etc/astraeus/worker.env and logging to
/Library/Logs/Astraeus/worker.log. Update from the console keeps
those names on a Mac. Run the install command again to move it to the
names above: the configuration, the name and the data location are
kept.
Remove a Mac#
$ curl -fsSL https://console.astralyx.cloud/api/v1/install.sh | sudo sh -s -- --uninstall
· uninstalling the Astraeus agent
· kept the data location /Users/Shared/Astraeus (drive copies): delete it by hand if nothing there is needed
· the Astraeus agent is uninstalled
If this Mac is still listed in its cluster, remove it there (the console: the machine's page, Remove machine).
It stops the agent and the engines it started, and removes the launchd job,
/usr/local/bin/astraeus-agent, /usr/local/bin/astraeus,
/usr/local/lib/astraeus, /etc/astraeus, /var/lib/astraeus/worker and
/Library/Logs/Astraeus. Add --purge to delete the model weights too.
Remove the Mac from the cluster in the console as well
(Update, drain and remove).