Flatten QUICKSTART commands to single lines for easier copy-paste.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
111
QUICKSTART.md
111
QUICKSTART.md
@@ -131,10 +131,7 @@ URL that nodes should use for outbound relay connections:
|
|||||||
.venv/bin/meshnet-relay --host 0.0.0.0 --port 8765
|
.venv/bin/meshnet-relay --host 0.0.0.0 --port 8765
|
||||||
|
|
||||||
# Terminal 2 — tracker
|
# Terminal 2 — tracker
|
||||||
.venv/bin/meshnet-tracker start \
|
.venv/bin/meshnet-tracker start --host 0.0.0.0 --port 8081 --relay-url wss://ai.neuron.d-popov.com/ws
|
||||||
--host 0.0.0.0 \
|
|
||||||
--port 8081 \
|
|
||||||
--relay-url wss://ai.neuron.d-popov.com/ws
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If this host sits behind Nginx Proxy Manager, point `/` and `/v1/*` at tracker
|
If this host sits behind Nginx Proxy Manager, point `/` and `/v1/*` at tracker
|
||||||
@@ -249,9 +246,7 @@ meshnet-node start --tracker https://ai.neuron.d-popov.com --model Qwen/Qwen2.5-
|
|||||||
If the wrong entry point is shadowing, invoke via the full conda path:
|
If the wrong entry point is shadowing, invoke via the full conda path:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
C:\Users\popov\miniforge3\Scripts\meshnet-node.exe start `
|
C:\Users\popov\miniforge3\Scripts\meshnet-node.exe start --tracker https://ai.neuron.d-popov.com --model Qwen/Qwen2.5-0.5B-Instruct
|
||||||
--tracker https://ai.neuron.d-popov.com `
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Option B — isolated virtualenv (fresh machine, no existing torch)
|
#### Option B — isolated virtualenv (fresh machine, no existing torch)
|
||||||
@@ -297,12 +292,7 @@ Use the IPv4 address on the active Ethernet/Wi-Fi adapter, for example
|
|||||||
Administrator once:
|
Administrator once:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
New-NetFirewallRule `
|
New-NetFirewallRule -DisplayName "Meshnet node 8005" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8005
|
||||||
-DisplayName "Meshnet node 8005" `
|
|
||||||
-Direction Inbound `
|
|
||||||
-Action Allow `
|
|
||||||
-Protocol TCP `
|
|
||||||
-LocalPort 8005
|
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Start the Windows node from normal PowerShell. Replace the tracker and
|
5. Start the Windows node from normal PowerShell. Replace the tracker and
|
||||||
@@ -310,18 +300,10 @@ advertised host values with your actual LAN addresses:
|
|||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$env:HF_HOME = "D:\DEV\models"
|
$env:HF_HOME = "D:\DEV\models"
|
||||||
|
.\.venv\Scripts\meshnet-node.exe start --tracker http://192.168.0.179:8081 --model Qwen/Qwen2.5-0.5B-Instruct --shard-start 12 --shard-end 23 --quantization bfloat16 --host 0.0.0.0 --advertise-host 192.168.0.42 --port 8005
|
||||||
.\.venv\Scripts\meshnet-node.exe start `
|
|
||||||
--tracker http://192.168.0.179:8081 `
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct `
|
|
||||||
--shard-start 12 --shard-end 23 `
|
|
||||||
--quantization bfloat16 `
|
|
||||||
--host 0.0.0.0 `
|
|
||||||
--advertise-host 192.168.0.42 `
|
|
||||||
--port 8005
|
|
||||||
```
|
```
|
||||||
|
|
||||||
One-line variants (direct LAN — node must be reachable by IP from other machines):
|
Other start examples (direct LAN — node must be reachable by IP from other machines):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
.\.venv\Scripts\meshnet-node.exe start --tracker http://192.168.0.179:8081 --model Qwen/Qwen2.5-0.5B-Instruct --advertise-host 192.168.0.20
|
.\.venv\Scripts\meshnet-node.exe start --tracker http://192.168.0.179:8081 --model Qwen/Qwen2.5-0.5B-Instruct --advertise-host 192.168.0.20
|
||||||
@@ -466,10 +448,7 @@ After NPM is correct, start relay and tracker on the LAN machine:
|
|||||||
.venv/bin/meshnet-relay --host 0.0.0.0 --port 8765
|
.venv/bin/meshnet-relay --host 0.0.0.0 --port 8765
|
||||||
|
|
||||||
# Terminal 2 — tracker (advertises relay to nodes)
|
# Terminal 2 — tracker (advertises relay to nodes)
|
||||||
.venv/bin/meshnet-tracker start \
|
.venv/bin/meshnet-tracker start --host 0.0.0.0 --port 8081 --relay-url wss://ai.neuron.d-popov.com/ws
|
||||||
--host 0.0.0.0 \
|
|
||||||
--port 8081 \
|
|
||||||
--relay-url wss://ai.neuron.d-popov.com/ws
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Nodes using `https://ai.neuron.d-popov.com` should then log:
|
Nodes using `https://ai.neuron.d-popov.com` should then log:
|
||||||
@@ -491,9 +470,7 @@ opens a persistent outbound WebSocket. If the relay connection drops, the node
|
|||||||
keeps retrying it.
|
keeps retrying it.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
.venv/bin/meshnet-node start \
|
.venv/bin/meshnet-node start --tracker https://ai.neuron.d-popov.com --model Qwen/Qwen2.5-0.5B-Instruct
|
||||||
--tracker https://ai.neuron.d-popov.com \
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct
|
|
||||||
```
|
```
|
||||||
|
|
||||||
No authentication is required in the prototype. The first public node for a model
|
No authentication is required in the prototype. The first public node for a model
|
||||||
@@ -555,16 +532,10 @@ In WSL2 (which gets a `172.x.x.x` virtual IP — unreachable from other machines
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# WSL2 Terminal 1 — head node (layers 0–11, handles chat requests)
|
# WSL2 Terminal 1 — head node (layers 0–11, handles chat requests)
|
||||||
.venv/bin/meshnet-node start \
|
.venv/bin/meshnet-node start --tracker https://ai.neuron.d-popov.com --model Qwen/Qwen2.5-0.5B-Instruct --shard-start 0 --shard-end 11
|
||||||
--tracker https://ai.neuron.d-popov.com \
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct \
|
|
||||||
--shard-start 0 --shard-end 11
|
|
||||||
|
|
||||||
# WSL2 Terminal 2 — tail node (layers 12–23)
|
# WSL2 Terminal 2 — tail node (layers 12–23)
|
||||||
.venv/bin/meshnet-node start \
|
.venv/bin/meshnet-node start --tracker https://ai.neuron.d-popov.com --model Qwen/Qwen2.5-0.5B-Instruct --shard-start 12 --shard-end 23
|
||||||
--tracker https://ai.neuron.d-popov.com \
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct \
|
|
||||||
--shard-start 12 --shard-end 23
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Both nodes connect to the relay automatically. When a chat request arrives at Node A,
|
Both nodes connect to the relay automatically. When a chat request arrives at Node A,
|
||||||
@@ -573,14 +544,7 @@ it forwards activations to Node B via `wss://ai.neuron.d-popov.com/rpc/{peer_id_
|
|||||||
Send inference through the tracker (which picks the head node and injects the route):
|
Send inference through the tracker (which picks the head node and injects the route):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -s https://ai.neuron.d-popov.com/v1/chat/completions \
|
curl -s https://ai.neuron.d-popov.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer sk-mesh-<your-key>" -d '{"model": "Qwen/Qwen2.5-0.5B-Instruct", "messages": [{"role": "user", "content": "What is 7 times 8?"}], "stream": false}' | python3 -m json.tool
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "Authorization: Bearer sk-mesh-<your-key>" \
|
|
||||||
-d '{
|
|
||||||
"model": "Qwen/Qwen2.5-0.5B-Instruct",
|
|
||||||
"messages": [{"role": "user", "content": "What is 7 times 8?"}],
|
|
||||||
"stream": false
|
|
||||||
}' | python3 -m json.tool
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Or send directly to Node A's local port (within WSL):
|
Or send directly to Node A's local port (within WSL):
|
||||||
@@ -608,24 +572,18 @@ refill during testing.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Register (once)
|
# 1. Register (once)
|
||||||
curl -s https://<tracker>/v1/auth/register \
|
curl -s https://<tracker>/v1/auth/register -H "Content-Type: application/json" -d '{"email": "you@example.com", "password": "hunter22-or-better"}'
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"email": "you@example.com", "password": "hunter22-or-better"}'
|
|
||||||
# → {"session_token": "...", ...}
|
# → {"session_token": "...", ...}
|
||||||
|
|
||||||
# 2. Create an API key (session token from step 1)
|
# 2. Create an API key (session token from step 1)
|
||||||
curl -s https://<tracker>/v1/account/keys -X POST \
|
curl -s https://<tracker>/v1/account/keys -X POST -H "Authorization: Bearer <session_token>"
|
||||||
-H "Authorization: Bearer <session_token>"
|
|
||||||
# → {"api_key": "sk-mesh-...", "caller_credit_granted": true}
|
# → {"api_key": "sk-mesh-...", "caller_credit_granted": true}
|
||||||
|
|
||||||
# 3. Check balance / usage
|
# 3. Check balance / usage
|
||||||
curl -s https://<tracker>/v1/account -H "Authorization: Bearer <session_token>"
|
curl -s https://<tracker>/v1/account -H "Authorization: Bearer <session_token>"
|
||||||
|
|
||||||
# 4. (devnet trackers only) top up a key
|
# 4. (devnet trackers only) top up a key
|
||||||
curl -s https://<tracker>/v1/account/topup -X POST \
|
curl -s https://<tracker>/v1/account/topup -X POST -H "Authorization: Bearer <session_token>" -H "Content-Type: application/json" -d '{"api_key": "sk-mesh-..."}'
|
||||||
-H "Authorization: Bearer <session_token>" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"api_key": "sk-mesh-..."}'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Operator side: both features default to 1 USDT (`--starting-credit` /
|
Operator side: both features default to 1 USDT (`--starting-credit` /
|
||||||
@@ -661,12 +619,7 @@ Keep this terminal open.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /run/media/popov/d/DEV/repos/d-popov.com/AI
|
cd /run/media/popov/d/DEV/repos/d-popov.com/AI
|
||||||
HF_HOME=/run/media/popov/d/DEV/models \
|
HF_HOME=/run/media/popov/d/DEV/models .venv/bin/meshnet-node start --model Qwen/Qwen2.5-0.5B-Instruct --quantization bfloat16 --tracker http://localhost:8080 --port 8001
|
||||||
.venv/bin/meshnet-node start \
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct \
|
|
||||||
--quantization bfloat16 \
|
|
||||||
--tracker http://localhost:8080 \
|
|
||||||
--port 8001
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Shard range is **auto-detected** from the curated catalog (no network call for known
|
Shard range is **auto-detected** from the curated catalog (no network call for known
|
||||||
@@ -708,13 +661,7 @@ If you started the node with `--port 8001`, send the request directly to that
|
|||||||
head node:
|
head node:
|
||||||
|
|
||||||
```bash Qwen2.5-0.5B-Instruct
|
```bash Qwen2.5-0.5B-Instruct
|
||||||
curl -s http://localhost:8001/v1/chat/completions \
|
curl -s http://localhost:8001/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "qwen2.5-0.5b", "messages": [{"role": "user", "content": "What is 7 times 8? Answer in one word."}], "stream": false}' | python3 -m json.tool
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"model": "qwen2.5-0.5b",
|
|
||||||
"messages": [{"role": "user", "content": "What is 7 times 8? Answer in one word."}],
|
|
||||||
"stream": false
|
|
||||||
}' | python3 -m json.tool
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If you did not pass `--port`, `meshnet-node start` uses the first free port at
|
If you did not pass `--port`, `meshnet-node start` uses the first free port at
|
||||||
@@ -724,21 +671,13 @@ To test tracker routing/proxying, send the same OpenAI-compatible request to the
|
|||||||
tracker, using either the full HuggingFace repo or the quick alias:
|
tracker, using either the full HuggingFace repo or the quick alias:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -s http://localhost:8080/v1/chat/completions \
|
curl -s http://localhost:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "qwen2.5-0.5b", "messages": [{"role": "user", "content": "What is 7 times 8? Answer in one word."}], "stream": false}' | python3 -m json.tool
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"model": "qwen2.5-0.5b",
|
|
||||||
"messages": [{"role": "user", "content": "What is 7 times 8? Answer in one word."}],
|
|
||||||
"stream": false
|
|
||||||
}' | python3 -m json.tool
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Or use the test script:
|
Or use the test script:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
.venv/bin/python scripts/test_lan_inference.py \
|
.venv/bin/python scripts/test_lan_inference.py --tracker http://localhost:8080 --gateway http://localhost:8001
|
||||||
--tracker http://localhost:8080 \
|
|
||||||
--gateway http://localhost:8001
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -749,24 +688,12 @@ Split Qwen2.5-0.5B's 24 layers across two node processes to test the sharded pip
|
|||||||
|
|
||||||
**Node A — layers 0–11 (tracker mode, serves chat completions):**
|
**Node A — layers 0–11 (tracker mode, serves chat completions):**
|
||||||
```bash
|
```bash
|
||||||
HF_HOME=/run/media/popov/d/DEV/models \
|
HF_HOME=/run/media/popov/d/DEV/models .venv/bin/meshnet-node start --model Qwen/Qwen2.5-0.5B-Instruct --shard-start 0 --shard-end 11 --quantization bfloat16 --tracker http://localhost:8080 --port 8001
|
||||||
.venv/bin/meshnet-node start \
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct \
|
|
||||||
--shard-start 0 --shard-end 11 \
|
|
||||||
--quantization bfloat16 \
|
|
||||||
--tracker http://localhost:8080 \
|
|
||||||
--port 8001
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Node B — layers 12–23:**
|
**Node B — layers 12–23:**
|
||||||
```bash
|
```bash
|
||||||
HF_HOME=/run/media/popov/d/DEV/models \
|
HF_HOME=/run/media/popov/d/DEV/models .venv/bin/meshnet-node start --model Qwen/Qwen2.5-0.5B-Instruct --shard-start 12 --shard-end 23 --quantization bfloat16 --tracker http://localhost:8080 --port 8002
|
||||||
.venv/bin/meshnet-node start \
|
|
||||||
--model Qwen/Qwen2.5-0.5B-Instruct \
|
|
||||||
--shard-start 12 --shard-end 23 \
|
|
||||||
--quantization bfloat16 \
|
|
||||||
--tracker http://localhost:8080 \
|
|
||||||
--port 8002
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Send the request to Node A — it tokenizes, runs layers 0–11, passes binary
|
Send the request to Node A — it tokenizes, runs layers 0–11, passes binary
|
||||||
|
|||||||
Reference in New Issue
Block a user