hunyuan install clones self-owned MLX fork; CLUSTER fleet final state
- install_hunyuan3d_mlx.sh: auto-clone monster/Hunyuan3D-2.2-mrp-MLX (our Gitea fork) into vendor/ when missing, so any node bootstraps identically. - CLUSTER.md: M1 hunyuan verified, M4 = bg_remove + Ollama qwen2.5:7b endpoint, cpu-lane-not-pooled caveat, self-owned repo reference.
This commit is contained in:
parent
573afa7b7a
commit
9b525fa420
@ -12,7 +12,7 @@ The order of preference for any task:
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| **M3 Ultra** (primary) | `m3ultra.local` · 100.89.131.57 | 256 GB | Runs the server + the central queue on :8777. Handles everything, especially the heavy 3D models (`hunyuan3d_mlx`, `trellis_mac`) and FLUX. |
|
| **M3 Ultra** (primary) | `m3ultra.local` · 100.89.131.57 | 256 GB | Runs the server + the central queue on :8777. Handles everything, especially the heavy 3D models (`hunyuan3d_mlx`, `trellis_mac`) and FLUX. |
|
||||||
| **M1 Ultra** (worker) | `ultra.local` · 100.91.239.7 | 128 GB | GPU worker in the pool **and** its own standalone instance. MLX-native — the right node for `hunyuan3d_mlx` (trellis's torch-MPS is unverified here). Also FLUX, `sf3d`, `bg_remove_local`. |
|
| **M1 Ultra** (worker) | `ultra.local` · 100.91.239.7 | 128 GB | GPU worker in the pool **and** its own standalone instance. MLX-native — the right node for `hunyuan3d_mlx` (trellis's torch-MPS is unverified here). Also FLUX, `sf3d`, `bg_remove_local`. |
|
||||||
| **M4 Pro** (helper) | `m4pro.local` · 100.69.21.128 | 24 GB | Lightweight helper. CPU work (`ffmpeg_frames`, `ffprobe`, `colmap_poses`), light image ops (`bg_remove_local`), and small LLMs via Ollama. **Not** the big 3D/diffusion models — too little RAM. |
|
| **M4 Pro** (helper) | `m4pro.local` · 100.69.21.128 | 24 GB | GPU-pool helper for light ops (`bg_remove_local`, verified) + a standalone **Ollama LLM** (`qwen2.5:7b` at `http://100.69.21.128:11434`). **Not** the big 3D/diffusion models — too little RAM. |
|
||||||
|
|
||||||
Git origin (shared by all nodes): `ssh://git@100.71.119.27:222/monster/modelbeast.git`
|
Git origin (shared by all nodes): `ssh://git@100.71.119.27:222/monster/modelbeast.git`
|
||||||
|
|
||||||
@ -20,7 +20,9 @@ Git origin (shared by all nodes): `ssh://git@100.71.119.27:222/monster/modelbeas
|
|||||||
|
|
||||||
The M3 primary runs one server with per-lane concurrency:
|
The M3 primary runs one server with per-lane concurrency:
|
||||||
- **`gpu` lane = a pool of nodes.** Each Mac has one Metal GPU, so each node runs **one** gpu job at a time. When gpu jobs queue up, the primary hands each to the first *free* node that supports that operator — rsyncing inputs over SSH, running the operator's `run.py` on that node, and rsyncing outputs back. This is the "unified queue": submit to M3, it load-balances across M3 + M1 (+ M4 for light ops).
|
- **`gpu` lane = a pool of nodes.** Each Mac has one Metal GPU, so each node runs **one** gpu job at a time. When gpu jobs queue up, the primary hands each to the first *free* node that supports that operator — rsyncing inputs over SSH, running the operator's `run.py` on that node, and rsyncing outputs back. This is the "unified queue": submit to M3, it load-balances across M3 + M1 (+ M4 for light ops).
|
||||||
- **`cpu` / `net` lanes** run on the primary (M3) with simple concurrency limits (`cpu` 3, `net` 6).
|
- **`cpu` / `net` lanes** run on the primary (M3) with simple concurrency limits (`cpu` 3, `net` 6). **Note:** only the gpu lane is pooled today — cpu-lane ops (`ffmpeg_frames`, `colmap_poses`, `ffprobe`) run on M3 only, so a helper node can offload *gpu* work but not CPU work yet. Pooling the cpu lane is a worthwhile follow-up.
|
||||||
|
|
||||||
|
**Ollama LLM (M4):** a standalone Qwen2.5-7B server runs on M4 at `http://100.69.21.128:11434` (OpenAI-compatible at `/v1`), reachable across the tailnet. It is not a MODELBEAST operator — point any copilot/captioning client straight at that endpoint. Swap models with `ollama pull <model>` on M4.
|
||||||
|
|
||||||
Which node may run which operator is set in `nodes.json` (repo root, gitignored, primary-only) via each node's `operators` allowlist. Omit the allowlist to let a node run every gpu op. **`nodes.json` is read at server startup — restart the server (`scripts/serve.sh`) after editing it.**
|
Which node may run which operator is set in `nodes.json` (repo root, gitignored, primary-only) via each node's `operators` allowlist. Omit the allowlist to let a node run every gpu op. **`nodes.json` is read at server startup — restart the server (`scripts/serve.sh`) after editing it.**
|
||||||
|
|
||||||
@ -28,7 +30,7 @@ Which node may run which operator is set in `nodes.json` (repo root, gitignored,
|
|||||||
|
|
||||||
1. `git clone ssh://git@100.71.119.27:222/monster/modelbeast.git ~/MODELBEAST`
|
1. `git clone ssh://git@100.71.119.27:222/monster/modelbeast.git ~/MODELBEAST`
|
||||||
2. Install `uv` (`curl -LsSf https://astral.sh/uv/install.sh | sh`) — the venvs use it.
|
2. Install `uv` (`curl -LsSf https://astral.sh/uv/install.sh | sh`) — the venvs use it.
|
||||||
3. Run the per-operator install scripts you want that node to serve (`scripts/install_*.sh`). Each builds its own `vendor/*/.venv`.
|
3. Run the per-operator install scripts you want that node to serve (`scripts/install_*.sh`). Each builds its own `vendor/*/.venv`. (`install_hunyuan3d_mlx.sh` auto-clones our self-owned MLX fork — `monster/Hunyuan3D-2.2-mrp-MLX` on the Gitea — into `vendor/`, so every node runs the same patched code.)
|
||||||
4. Model weights: **copy from a node that already has them** (`rsync -a ~/.cache/huggingface/hub/models--… newnode:~/.cache/huggingface/hub/`) rather than re-downloading — faster and dodges HF rate limits. We have an HF token in Settings if a fresh download is unavoidable.
|
4. Model weights: **copy from a node that already has them** (`rsync -a ~/.cache/huggingface/hub/models--… newnode:~/.cache/huggingface/hub/`) rather than re-downloading — faster and dodges HF rate limits. We have an HF token in Settings if a fresh download is unavoidable.
|
||||||
5. On the **primary**, add the node to `nodes.json` with an `operators` allowlist matched to its RAM, then restart the server.
|
5. On the **primary**, add the node to `nodes.json` with an `operators` allowlist matched to its RAM, then restart the server.
|
||||||
|
|
||||||
|
|||||||
@ -11,9 +11,14 @@ set -euo pipefail
|
|||||||
cd "$(dirname "$0")/.."
|
cd "$(dirname "$0")/.."
|
||||||
VENDOR="vendor/hunyuan3d-mlx"
|
VENDOR="vendor/hunyuan3d-mlx"
|
||||||
|
|
||||||
|
# Our improved, self-owned MLX fork (upstream dgrauet/Hunyuan3D-2.1-mlx + our
|
||||||
|
# generate_e2e.py CLI + env-tunable remesh). Cloned from our Gitea so every node
|
||||||
|
# bootstraps identically.
|
||||||
|
HY3D_REPO="${HY3D_REPO:-ssh://git@100.71.119.27:222/monster/Hunyuan3D-2.2-mrp-MLX.git}"
|
||||||
if [ ! -d "$VENDOR" ]; then
|
if [ ! -d "$VENDOR" ]; then
|
||||||
echo "[hy3d] ERROR: $VENDOR missing. Vendor the repo there first."
|
echo "[hy3d] cloning improved MLX fork: $HY3D_REPO"
|
||||||
exit 1
|
mkdir -p vendor
|
||||||
|
git clone "$HY3D_REPO" "$VENDOR"
|
||||||
fi
|
fi
|
||||||
cd "$VENDOR"
|
cd "$VENDOR"
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user