@mariozechner/pi 0.1.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +410 -216
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +348 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/models.d.ts +39 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +612 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/pods.d.ts +21 -0
- package/dist/commands/pods.d.ts.map +1 -0
- package/dist/commands/pods.js +175 -0
- package/dist/commands/pods.js.map +1 -0
- package/dist/commands/prompt.d.ts +7 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +55 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/model-configs.d.ts +22 -0
- package/dist/model-configs.d.ts.map +1 -0
- package/dist/model-configs.js +75 -0
- package/dist/model-configs.js.map +1 -0
- package/dist/models.json +305 -0
- package/dist/ssh.d.ts +24 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +115 -0
- package/dist/ssh.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -40
- package/LICENSE +0 -21
- package/pi.js +0 -878
- package/pod_setup.sh +0 -133
- package/vllm_manager.py +0 -499
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { spawn } from "child_process";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import { dirname, join } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { getActivePod, loadConfig, saveConfig } from "../config.js";
|
|
7
|
+
import { getModelConfig, getModelName, isKnownModel } from "../model-configs.js";
|
|
8
|
+
import { sshExec } from "../ssh.js";
|
|
9
|
+
/**
|
|
10
|
+
* Get the pod to use (active or override)
|
|
11
|
+
*/
|
|
12
|
+
const getPod = (podOverride) => {
|
|
13
|
+
if (podOverride) {
|
|
14
|
+
const config = loadConfig();
|
|
15
|
+
const pod = config.pods[podOverride];
|
|
16
|
+
if (!pod) {
|
|
17
|
+
console.error(chalk.red(`Pod '${podOverride}' not found`));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
return { name: podOverride, pod };
|
|
21
|
+
}
|
|
22
|
+
const active = getActivePod();
|
|
23
|
+
if (!active) {
|
|
24
|
+
console.error(chalk.red("No active pod. Use 'pi pods active <name>' to set one."));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
return active;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Find next available port starting from 8001
|
|
31
|
+
*/
|
|
32
|
+
const getNextPort = (pod) => {
|
|
33
|
+
const usedPorts = Object.values(pod.models).map((m) => m.port);
|
|
34
|
+
let port = 8001;
|
|
35
|
+
while (usedPorts.includes(port)) {
|
|
36
|
+
port++;
|
|
37
|
+
}
|
|
38
|
+
return port;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Select GPUs for model deployment (round-robin)
|
|
42
|
+
*/
|
|
43
|
+
const selectGPUs = (pod, count = 1) => {
|
|
44
|
+
if (count === pod.gpus.length) {
|
|
45
|
+
// Use all GPUs
|
|
46
|
+
return pod.gpus.map((g) => g.id);
|
|
47
|
+
}
|
|
48
|
+
// Count GPU usage across all models
|
|
49
|
+
const gpuUsage = new Map();
|
|
50
|
+
for (const gpu of pod.gpus) {
|
|
51
|
+
gpuUsage.set(gpu.id, 0);
|
|
52
|
+
}
|
|
53
|
+
for (const model of Object.values(pod.models)) {
|
|
54
|
+
for (const gpuId of model.gpu) {
|
|
55
|
+
gpuUsage.set(gpuId, (gpuUsage.get(gpuId) || 0) + 1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Sort GPUs by usage (least used first)
|
|
59
|
+
const sortedGPUs = Array.from(gpuUsage.entries())
|
|
60
|
+
.sort((a, b) => a[1] - b[1])
|
|
61
|
+
.map((entry) => entry[0]);
|
|
62
|
+
// Return the least used GPUs
|
|
63
|
+
return sortedGPUs.slice(0, count);
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Start a model
|
|
67
|
+
*/
|
|
68
|
+
export const startModel = async (modelId, name, options) => {
|
|
69
|
+
const { name: podName, pod } = getPod(options.pod);
|
|
70
|
+
// Validation
|
|
71
|
+
if (!pod.modelsPath) {
|
|
72
|
+
console.error(chalk.red("Pod does not have a models path configured"));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
if (pod.models[name]) {
|
|
76
|
+
console.error(chalk.red(`Model '${name}' already exists on pod '${podName}'`));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
const port = getNextPort(pod);
|
|
80
|
+
// Determine GPU allocation and vLLM args
|
|
81
|
+
let gpus = [];
|
|
82
|
+
let vllmArgs = [];
|
|
83
|
+
let modelConfig = null;
|
|
84
|
+
if (options.vllmArgs?.length) {
|
|
85
|
+
// Custom args override everything
|
|
86
|
+
vllmArgs = options.vllmArgs;
|
|
87
|
+
console.log(chalk.gray("Using custom vLLM args, GPU allocation managed by vLLM"));
|
|
88
|
+
}
|
|
89
|
+
else if (isKnownModel(modelId)) {
|
|
90
|
+
// Handle --gpus parameter for known models
|
|
91
|
+
if (options.gpus) {
|
|
92
|
+
// Validate GPU count
|
|
93
|
+
if (options.gpus > pod.gpus.length) {
|
|
94
|
+
console.error(chalk.red(`Error: Requested ${options.gpus} GPUs but pod only has ${pod.gpus.length}`));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
// Try to find config for requested GPU count
|
|
98
|
+
modelConfig = getModelConfig(modelId, pod.gpus, options.gpus);
|
|
99
|
+
if (modelConfig) {
|
|
100
|
+
gpus = selectGPUs(pod, options.gpus);
|
|
101
|
+
vllmArgs = [...(modelConfig.args || [])];
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.error(chalk.red(`Model '${getModelName(modelId)}' does not have a configuration for ${options.gpus} GPU(s)`));
|
|
105
|
+
console.error(chalk.yellow("Available configurations:"));
|
|
106
|
+
// Show available configurations
|
|
107
|
+
for (let gpuCount = 1; gpuCount <= pod.gpus.length; gpuCount++) {
|
|
108
|
+
const config = getModelConfig(modelId, pod.gpus, gpuCount);
|
|
109
|
+
if (config) {
|
|
110
|
+
console.error(chalk.gray(` - ${gpuCount} GPU(s)`));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// Find best config for this hardware (original behavior)
|
|
118
|
+
for (let gpuCount = pod.gpus.length; gpuCount >= 1; gpuCount--) {
|
|
119
|
+
modelConfig = getModelConfig(modelId, pod.gpus, gpuCount);
|
|
120
|
+
if (modelConfig) {
|
|
121
|
+
gpus = selectGPUs(pod, gpuCount);
|
|
122
|
+
vllmArgs = [...(modelConfig.args || [])];
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!modelConfig) {
|
|
127
|
+
console.error(chalk.red(`Model '${getModelName(modelId)}' not compatible with this pod's GPUs`));
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Unknown model
|
|
134
|
+
if (options.gpus) {
|
|
135
|
+
console.error(chalk.red("Error: --gpus can only be used with predefined models"));
|
|
136
|
+
console.error(chalk.yellow("For custom models, use --vllm with tensor-parallel-size or similar arguments"));
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
// Single GPU default
|
|
140
|
+
gpus = selectGPUs(pod, 1);
|
|
141
|
+
console.log(chalk.gray("Unknown model, defaulting to single GPU"));
|
|
142
|
+
}
|
|
143
|
+
// Apply memory/context overrides
|
|
144
|
+
if (!options.vllmArgs?.length) {
|
|
145
|
+
if (options.memory) {
|
|
146
|
+
const fraction = parseFloat(options.memory.replace("%", "")) / 100;
|
|
147
|
+
vllmArgs = vllmArgs.filter((arg) => !arg.includes("gpu-memory-utilization"));
|
|
148
|
+
vllmArgs.push("--gpu-memory-utilization", String(fraction));
|
|
149
|
+
}
|
|
150
|
+
if (options.context) {
|
|
151
|
+
const contextSizes = {
|
|
152
|
+
"4k": 4096,
|
|
153
|
+
"8k": 8192,
|
|
154
|
+
"16k": 16384,
|
|
155
|
+
"32k": 32768,
|
|
156
|
+
"64k": 65536,
|
|
157
|
+
"128k": 131072,
|
|
158
|
+
};
|
|
159
|
+
const maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context);
|
|
160
|
+
vllmArgs = vllmArgs.filter((arg) => !arg.includes("max-model-len"));
|
|
161
|
+
vllmArgs.push("--max-model-len", String(maxTokens));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Show what we're doing
|
|
165
|
+
console.log(chalk.green(`Starting model '${name}' on pod '${podName}'...`));
|
|
166
|
+
console.log(`Model: ${modelId}`);
|
|
167
|
+
console.log(`Port: ${port}`);
|
|
168
|
+
console.log(`GPU(s): ${gpus.length ? gpus.join(", ") : "Managed by vLLM"}`);
|
|
169
|
+
if (modelConfig?.notes)
|
|
170
|
+
console.log(chalk.yellow(`Note: ${modelConfig.notes}`));
|
|
171
|
+
console.log("");
|
|
172
|
+
// Read and customize model_run.sh script with our values
|
|
173
|
+
const scriptPath = join(dirname(fileURLToPath(import.meta.url)), "../../scripts/model_run.sh");
|
|
174
|
+
let scriptContent = readFileSync(scriptPath, "utf-8");
|
|
175
|
+
// Replace placeholders - no escaping needed, heredoc with 'EOF' is literal
|
|
176
|
+
scriptContent = scriptContent
|
|
177
|
+
.replace("{{MODEL_ID}}", modelId)
|
|
178
|
+
.replace("{{NAME}}", name)
|
|
179
|
+
.replace("{{PORT}}", String(port))
|
|
180
|
+
.replace("{{VLLM_ARGS}}", vllmArgs.join(" "));
|
|
181
|
+
// Upload customized script
|
|
182
|
+
const result = await sshExec(pod.ssh, `cat > /tmp/model_run_${name}.sh << 'EOF'
|
|
183
|
+
${scriptContent}
|
|
184
|
+
EOF
|
|
185
|
+
chmod +x /tmp/model_run_${name}.sh`);
|
|
186
|
+
// Prepare environment
|
|
187
|
+
const env = [
|
|
188
|
+
`HF_TOKEN='${process.env.HF_TOKEN}'`,
|
|
189
|
+
`PI_API_KEY='${process.env.PI_API_KEY}'`,
|
|
190
|
+
`HF_HUB_ENABLE_HF_TRANSFER=1`,
|
|
191
|
+
`VLLM_NO_USAGE_STATS=1`,
|
|
192
|
+
`PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`,
|
|
193
|
+
`FORCE_COLOR=1`,
|
|
194
|
+
`TERM=xterm-256color`,
|
|
195
|
+
...(gpus.length === 1 ? [`CUDA_VISIBLE_DEVICES=${gpus[0]}`] : []),
|
|
196
|
+
...Object.entries(modelConfig?.env || {}).map(([k, v]) => `${k}='${v}'`),
|
|
197
|
+
]
|
|
198
|
+
.map((e) => `export ${e}`)
|
|
199
|
+
.join("\n");
|
|
200
|
+
// Start the model runner with script command for pseudo-TTY (preserves colors)
|
|
201
|
+
// Note: We use script to preserve colors and create a log file
|
|
202
|
+
// setsid creates a new session so it survives SSH disconnection
|
|
203
|
+
const startCmd = `
|
|
204
|
+
${env}
|
|
205
|
+
mkdir -p ~/.vllm_logs
|
|
206
|
+
# Create a wrapper that monitors the script command
|
|
207
|
+
cat > /tmp/model_wrapper_${name}.sh << 'WRAPPER'
|
|
208
|
+
#!/bin/bash
|
|
209
|
+
script -q -f -c "/tmp/model_run_${name}.sh" ~/.vllm_logs/${name}.log
|
|
210
|
+
exit_code=$?
|
|
211
|
+
echo "Script exited with code $exit_code" >> ~/.vllm_logs/${name}.log
|
|
212
|
+
exit $exit_code
|
|
213
|
+
WRAPPER
|
|
214
|
+
chmod +x /tmp/model_wrapper_${name}.sh
|
|
215
|
+
setsid /tmp/model_wrapper_${name}.sh </dev/null >/dev/null 2>&1 &
|
|
216
|
+
echo $!
|
|
217
|
+
exit 0
|
|
218
|
+
`;
|
|
219
|
+
const pidResult = await sshExec(pod.ssh, startCmd);
|
|
220
|
+
const pid = parseInt(pidResult.stdout.trim());
|
|
221
|
+
if (!pid) {
|
|
222
|
+
console.error(chalk.red("Failed to start model runner"));
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
// Save to config
|
|
226
|
+
const config = loadConfig();
|
|
227
|
+
config.pods[podName].models[name] = { model: modelId, port, gpu: gpus, pid };
|
|
228
|
+
saveConfig(config);
|
|
229
|
+
console.log(`Model runner started with PID: ${pid}`);
|
|
230
|
+
console.log("Streaming logs... (waiting for startup)\n");
|
|
231
|
+
// Small delay to ensure log file is created
|
|
232
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
233
|
+
// Stream logs with color support, watching for startup complete
|
|
234
|
+
const sshParts = pod.ssh.split(" ");
|
|
235
|
+
const sshCommand = sshParts[0]; // "ssh"
|
|
236
|
+
const sshArgs = sshParts.slice(1); // ["root@86.38.238.55"]
|
|
237
|
+
const host = sshArgs[0].split("@")[1] || "localhost";
|
|
238
|
+
const tailCmd = `tail -f ~/.vllm_logs/${name}.log`;
|
|
239
|
+
// Build the full args array for spawn
|
|
240
|
+
const fullArgs = [...sshArgs, tailCmd];
|
|
241
|
+
const logProcess = spawn(sshCommand, fullArgs, {
|
|
242
|
+
stdio: ["inherit", "pipe", "pipe"], // capture stdout and stderr
|
|
243
|
+
env: { ...process.env, FORCE_COLOR: "1" },
|
|
244
|
+
});
|
|
245
|
+
let interrupted = false;
|
|
246
|
+
let startupComplete = false;
|
|
247
|
+
// Handle Ctrl+C
|
|
248
|
+
const sigintHandler = () => {
|
|
249
|
+
interrupted = true;
|
|
250
|
+
logProcess.kill();
|
|
251
|
+
};
|
|
252
|
+
process.on("SIGINT", sigintHandler);
|
|
253
|
+
// Process log output line by line
|
|
254
|
+
const processOutput = (data) => {
|
|
255
|
+
const lines = data.toString().split("\n");
|
|
256
|
+
for (const line of lines) {
|
|
257
|
+
if (line) {
|
|
258
|
+
console.log(line); // Echo the line to console
|
|
259
|
+
// Check for startup complete message
|
|
260
|
+
if (line.includes("Application startup complete")) {
|
|
261
|
+
startupComplete = true;
|
|
262
|
+
logProcess.kill(); // Stop tailing logs
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
logProcess.stdout?.on("data", processOutput);
|
|
268
|
+
logProcess.stderr?.on("data", processOutput);
|
|
269
|
+
await new Promise((resolve) => logProcess.on("exit", resolve));
|
|
270
|
+
process.removeListener("SIGINT", sigintHandler);
|
|
271
|
+
if (startupComplete) {
|
|
272
|
+
// Model started successfully - output connection details
|
|
273
|
+
console.log("\n" + chalk.green("✓ Model started successfully!"));
|
|
274
|
+
console.log("\n" + chalk.bold("Connection Details:"));
|
|
275
|
+
console.log(chalk.cyan("─".repeat(50)));
|
|
276
|
+
console.log(chalk.white("Base URL: ") + chalk.yellow(`http://${host}:${port}/v1`));
|
|
277
|
+
console.log(chalk.white("Model: ") + chalk.yellow(modelId));
|
|
278
|
+
console.log(chalk.white("API Key: ") + chalk.yellow(process.env.PI_API_KEY || "(not set)"));
|
|
279
|
+
console.log(chalk.cyan("─".repeat(50)));
|
|
280
|
+
console.log("\n" + chalk.bold("Export for shell:"));
|
|
281
|
+
console.log(chalk.gray(`export OPENAI_BASE_URL="http://${host}:${port}/v1"`));
|
|
282
|
+
console.log(chalk.gray(`export OPENAI_API_KEY="${process.env.PI_API_KEY || "your-api-key"}"`));
|
|
283
|
+
console.log(chalk.gray(`export OPENAI_MODEL="${modelId}"`));
|
|
284
|
+
console.log("\n" + chalk.bold("Example usage:"));
|
|
285
|
+
console.log(chalk.gray(`
|
|
286
|
+
# Python
|
|
287
|
+
from openai import OpenAI
|
|
288
|
+
client = OpenAI() # Uses env vars
|
|
289
|
+
response = client.chat.completions.create(
|
|
290
|
+
model="${modelId}",
|
|
291
|
+
messages=[{"role": "user", "content": "Hello!"}]
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
# CLI
|
|
295
|
+
curl $OPENAI_BASE_URL/chat/completions \\
|
|
296
|
+
-H "Authorization: Bearer $OPENAI_API_KEY" \\
|
|
297
|
+
-H "Content-Type: application/json" \\
|
|
298
|
+
-d '{"model":"${modelId}","messages":[{"role":"user","content":"Hi"}]}'`));
|
|
299
|
+
console.log("");
|
|
300
|
+
console.log(chalk.cyan(`Chat with model: pi agent ${name} "Your message"`));
|
|
301
|
+
console.log(chalk.cyan(`Interactive mode: pi agent ${name} -i`));
|
|
302
|
+
console.log(chalk.cyan(`Monitor logs: pi logs ${name}`));
|
|
303
|
+
console.log(chalk.cyan(`Stop model: pi stop ${name}`));
|
|
304
|
+
}
|
|
305
|
+
else if (interrupted) {
|
|
306
|
+
console.log(chalk.yellow("\n\nStopped monitoring. Model deployment continues in background."));
|
|
307
|
+
console.log(chalk.cyan(`Chat with model: pi agent ${name} "Your message"`));
|
|
308
|
+
console.log(chalk.cyan(`Check status: pi logs ${name}`));
|
|
309
|
+
console.log(chalk.cyan(`Stop model: pi stop ${name}`));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
console.log(chalk.yellow("\n\nLog stream ended. Model may still be running."));
|
|
313
|
+
console.log(chalk.cyan(`Chat with model: pi agent ${name} "Your message"`));
|
|
314
|
+
console.log(chalk.cyan(`Check status: pi logs ${name}`));
|
|
315
|
+
console.log(chalk.cyan(`Stop model: pi stop ${name}`));
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Stop a model
|
|
320
|
+
*/
|
|
321
|
+
export const stopModel = async (name, options) => {
|
|
322
|
+
const { name: podName, pod } = getPod(options.pod);
|
|
323
|
+
const model = pod.models[name];
|
|
324
|
+
if (!model) {
|
|
325
|
+
console.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
console.log(chalk.yellow(`Stopping model '${name}' on pod '${podName}'...`));
|
|
329
|
+
// Kill the script process and all its children
|
|
330
|
+
// Using pkill to kill the process and all children
|
|
331
|
+
const killCmd = `
|
|
332
|
+
# Kill the script process and all its children
|
|
333
|
+
pkill -TERM -P ${model.pid} 2>/dev/null || true
|
|
334
|
+
kill ${model.pid} 2>/dev/null || true
|
|
335
|
+
`;
|
|
336
|
+
await sshExec(pod.ssh, killCmd);
|
|
337
|
+
// Remove from config
|
|
338
|
+
const config = loadConfig();
|
|
339
|
+
delete config.pods[podName].models[name];
|
|
340
|
+
saveConfig(config);
|
|
341
|
+
console.log(chalk.green(`✓ Model '${name}' stopped`));
|
|
342
|
+
};
|
|
343
|
+
/**
|
|
344
|
+
* Stop all models on a pod
|
|
345
|
+
*/
|
|
346
|
+
export const stopAllModels = async (options) => {
|
|
347
|
+
const { name: podName, pod } = getPod(options.pod);
|
|
348
|
+
const modelNames = Object.keys(pod.models);
|
|
349
|
+
if (modelNames.length === 0) {
|
|
350
|
+
console.log(`No models running on pod '${podName}'`);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
console.log(chalk.yellow(`Stopping ${modelNames.length} model(s) on pod '${podName}'...`));
|
|
354
|
+
// Kill all script processes and their children
|
|
355
|
+
const pids = Object.values(pod.models).map((m) => m.pid);
|
|
356
|
+
const killCmd = `
|
|
357
|
+
for PID in ${pids.join(" ")}; do
|
|
358
|
+
pkill -TERM -P $PID 2>/dev/null || true
|
|
359
|
+
kill $PID 2>/dev/null || true
|
|
360
|
+
done
|
|
361
|
+
`;
|
|
362
|
+
await sshExec(pod.ssh, killCmd);
|
|
363
|
+
// Clear all models from config
|
|
364
|
+
const config = loadConfig();
|
|
365
|
+
config.pods[podName].models = {};
|
|
366
|
+
saveConfig(config);
|
|
367
|
+
console.log(chalk.green(`✓ Stopped all models: ${modelNames.join(", ")}`));
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* List all models
|
|
371
|
+
*/
|
|
372
|
+
export const listModels = async (options) => {
|
|
373
|
+
const { name: podName, pod } = getPod(options.pod);
|
|
374
|
+
const modelNames = Object.keys(pod.models);
|
|
375
|
+
if (modelNames.length === 0) {
|
|
376
|
+
console.log(`No models running on pod '${podName}'`);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
// Get pod SSH host for URL display
|
|
380
|
+
const sshParts = pod.ssh.split(" ");
|
|
381
|
+
const host = sshParts.find((p) => p.includes("@"))?.split("@")[1] || "unknown";
|
|
382
|
+
console.log(`Models on pod '${chalk.bold(podName)}':`);
|
|
383
|
+
for (const name of modelNames) {
|
|
384
|
+
const model = pod.models[name];
|
|
385
|
+
const gpuStr = model.gpu.length > 1
|
|
386
|
+
? `GPUs ${model.gpu.join(",")}`
|
|
387
|
+
: model.gpu.length === 1
|
|
388
|
+
? `GPU ${model.gpu[0]}`
|
|
389
|
+
: "GPU unknown";
|
|
390
|
+
console.log(` ${chalk.green(name)} - Port ${model.port} - ${gpuStr} - PID ${model.pid}`);
|
|
391
|
+
console.log(` Model: ${chalk.gray(model.model)}`);
|
|
392
|
+
console.log(` URL: ${chalk.cyan(`http://${host}:${model.port}/v1`)}`);
|
|
393
|
+
}
|
|
394
|
+
// Optionally verify processes are still running
|
|
395
|
+
console.log("");
|
|
396
|
+
console.log("Verifying processes...");
|
|
397
|
+
let anyDead = false;
|
|
398
|
+
for (const name of modelNames) {
|
|
399
|
+
const model = pod.models[name];
|
|
400
|
+
// Check both the wrapper process and if vLLM is responding
|
|
401
|
+
const checkCmd = `
|
|
402
|
+
# Check if wrapper process exists
|
|
403
|
+
if ps -p ${model.pid} > /dev/null 2>&1; then
|
|
404
|
+
# Process exists, now check if vLLM is responding
|
|
405
|
+
if curl -s -f http://localhost:${model.port}/health > /dev/null 2>&1; then
|
|
406
|
+
echo "running"
|
|
407
|
+
else
|
|
408
|
+
# Check if it's still starting up
|
|
409
|
+
if tail -n 20 ~/.vllm_logs/${name}.log 2>/dev/null | grep -q "ERROR\\|Failed\\|Cuda error\\|died"; then
|
|
410
|
+
echo "crashed"
|
|
411
|
+
else
|
|
412
|
+
echo "starting"
|
|
413
|
+
fi
|
|
414
|
+
fi
|
|
415
|
+
else
|
|
416
|
+
echo "dead"
|
|
417
|
+
fi
|
|
418
|
+
`;
|
|
419
|
+
const result = await sshExec(pod.ssh, checkCmd);
|
|
420
|
+
const status = result.stdout.trim();
|
|
421
|
+
if (status === "dead") {
|
|
422
|
+
console.log(chalk.red(` ${name}: Process ${model.pid} is not running`));
|
|
423
|
+
anyDead = true;
|
|
424
|
+
}
|
|
425
|
+
else if (status === "crashed") {
|
|
426
|
+
console.log(chalk.red(` ${name}: vLLM crashed (check logs with 'pi logs ${name}')`));
|
|
427
|
+
anyDead = true;
|
|
428
|
+
}
|
|
429
|
+
else if (status === "starting") {
|
|
430
|
+
console.log(chalk.yellow(` ${name}: Still starting up...`));
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if (anyDead) {
|
|
434
|
+
console.log("");
|
|
435
|
+
console.log(chalk.yellow("Some models are not running. Clean up with:"));
|
|
436
|
+
console.log(chalk.cyan(" pi stop <name>"));
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
console.log(chalk.green("✓ All processes verified"));
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
/**
|
|
443
|
+
* View model logs
|
|
444
|
+
*/
|
|
445
|
+
export const viewLogs = async (name, options) => {
|
|
446
|
+
const { name: podName, pod } = getPod(options.pod);
|
|
447
|
+
const model = pod.models[name];
|
|
448
|
+
if (!model) {
|
|
449
|
+
console.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));
|
|
450
|
+
process.exit(1);
|
|
451
|
+
}
|
|
452
|
+
console.log(chalk.green(`Streaming logs for '${name}' on pod '${podName}'...`));
|
|
453
|
+
console.log(chalk.gray("Press Ctrl+C to stop"));
|
|
454
|
+
console.log("");
|
|
455
|
+
// Stream logs with color preservation
|
|
456
|
+
const sshParts = pod.ssh.split(" ");
|
|
457
|
+
const sshCommand = sshParts[0]; // "ssh"
|
|
458
|
+
const sshArgs = sshParts.slice(1); // ["root@86.38.238.55"]
|
|
459
|
+
const tailCmd = `tail -f ~/.vllm_logs/${name}.log`;
|
|
460
|
+
const logProcess = spawn(sshCommand, [...sshArgs, tailCmd], {
|
|
461
|
+
stdio: "inherit",
|
|
462
|
+
env: {
|
|
463
|
+
...process.env,
|
|
464
|
+
FORCE_COLOR: "1",
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
// Wait for process to exit
|
|
468
|
+
await new Promise((resolve) => {
|
|
469
|
+
logProcess.on("exit", () => resolve());
|
|
470
|
+
});
|
|
471
|
+
};
|
|
472
|
+
/**
|
|
473
|
+
* Show known models and their hardware requirements
|
|
474
|
+
*/
|
|
475
|
+
export const showKnownModels = async () => {
|
|
476
|
+
const modelsJson = await import("../models.json", { assert: { type: "json" } });
|
|
477
|
+
const models = modelsJson.default.models;
|
|
478
|
+
// Get active pod info if available
|
|
479
|
+
const activePod = getActivePod();
|
|
480
|
+
let podGpuCount = 0;
|
|
481
|
+
let podGpuType = "";
|
|
482
|
+
if (activePod) {
|
|
483
|
+
podGpuCount = activePod.pod.gpus.length;
|
|
484
|
+
// Extract GPU type from name (e.g., "NVIDIA H200" -> "H200")
|
|
485
|
+
podGpuType = activePod.pod.gpus[0]?.name?.replace("NVIDIA", "")?.trim()?.split(" ")[0] || "";
|
|
486
|
+
console.log(chalk.bold(`Known Models for ${activePod.name} (${podGpuCount}x ${podGpuType || "GPU"}):\n`));
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
console.log(chalk.bold("Known Models:\n"));
|
|
490
|
+
console.log(chalk.yellow("No active pod. Use 'pi pods active <name>' to filter compatible models.\n"));
|
|
491
|
+
}
|
|
492
|
+
console.log("Usage: pi start <model> --name <name> [options]\n");
|
|
493
|
+
// Group models by compatibility and family
|
|
494
|
+
const compatible = {};
|
|
495
|
+
const incompatible = {};
|
|
496
|
+
for (const [modelId, info] of Object.entries(models)) {
|
|
497
|
+
const modelInfo = info;
|
|
498
|
+
const family = modelInfo.name.split("-")[0] || "Other";
|
|
499
|
+
let isCompatible = false;
|
|
500
|
+
let compatibleConfig = "";
|
|
501
|
+
let minGpu = "Unknown";
|
|
502
|
+
let minNotes;
|
|
503
|
+
if (modelInfo.configs && modelInfo.configs.length > 0) {
|
|
504
|
+
// Sort configs by GPU count to find minimum
|
|
505
|
+
const sortedConfigs = [...modelInfo.configs].sort((a, b) => (a.gpuCount || 1) - (b.gpuCount || 1));
|
|
506
|
+
// Find minimum requirements
|
|
507
|
+
const minConfig = sortedConfigs[0];
|
|
508
|
+
const minGpuCount = minConfig.gpuCount || 1;
|
|
509
|
+
const gpuTypes = minConfig.gpuTypes?.join("/") || "H100/H200";
|
|
510
|
+
if (minGpuCount === 1) {
|
|
511
|
+
minGpu = `1x ${gpuTypes}`;
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
minGpu = `${minGpuCount}x ${gpuTypes}`;
|
|
515
|
+
}
|
|
516
|
+
minNotes = minConfig.notes || modelInfo.notes;
|
|
517
|
+
// Check compatibility with active pod
|
|
518
|
+
if (activePod && podGpuCount > 0) {
|
|
519
|
+
// Find best matching config for this pod
|
|
520
|
+
for (const config of sortedConfigs) {
|
|
521
|
+
const configGpuCount = config.gpuCount || 1;
|
|
522
|
+
const configGpuTypes = config.gpuTypes || [];
|
|
523
|
+
// Check if we have enough GPUs
|
|
524
|
+
if (configGpuCount <= podGpuCount) {
|
|
525
|
+
// Check if GPU type matches (if specified)
|
|
526
|
+
if (configGpuTypes.length === 0 ||
|
|
527
|
+
configGpuTypes.some((type) => podGpuType.includes(type) || type.includes(podGpuType))) {
|
|
528
|
+
isCompatible = true;
|
|
529
|
+
if (configGpuCount === 1) {
|
|
530
|
+
compatibleConfig = `1x ${podGpuType}`;
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
compatibleConfig = `${configGpuCount}x ${podGpuType}`;
|
|
534
|
+
}
|
|
535
|
+
minNotes = config.notes || modelInfo.notes;
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
const modelEntry = {
|
|
543
|
+
id: modelId,
|
|
544
|
+
name: modelInfo.name,
|
|
545
|
+
notes: minNotes,
|
|
546
|
+
};
|
|
547
|
+
if (activePod && isCompatible) {
|
|
548
|
+
if (!compatible[family]) {
|
|
549
|
+
compatible[family] = [];
|
|
550
|
+
}
|
|
551
|
+
compatible[family].push({ ...modelEntry, config: compatibleConfig });
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
if (!incompatible[family]) {
|
|
555
|
+
incompatible[family] = [];
|
|
556
|
+
}
|
|
557
|
+
incompatible[family].push({ ...modelEntry, minGpu });
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
// Display compatible models first
|
|
561
|
+
if (activePod && Object.keys(compatible).length > 0) {
|
|
562
|
+
console.log(chalk.green.bold("✓ Compatible Models:\n"));
|
|
563
|
+
const sortedFamilies = Object.keys(compatible).sort();
|
|
564
|
+
for (const family of sortedFamilies) {
|
|
565
|
+
console.log(chalk.cyan(`${family} Models:`));
|
|
566
|
+
const modelList = compatible[family].sort((a, b) => a.name.localeCompare(b.name));
|
|
567
|
+
for (const model of modelList) {
|
|
568
|
+
console.log(` ${chalk.green(model.id)}`);
|
|
569
|
+
console.log(` Name: ${model.name}`);
|
|
570
|
+
console.log(` Config: ${model.config}`);
|
|
571
|
+
if (model.notes) {
|
|
572
|
+
console.log(chalk.gray(` Note: ${model.notes}`));
|
|
573
|
+
}
|
|
574
|
+
console.log("");
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
// Display incompatible models
|
|
579
|
+
if (Object.keys(incompatible).length > 0) {
|
|
580
|
+
if (activePod && Object.keys(compatible).length > 0) {
|
|
581
|
+
console.log(chalk.red.bold("✗ Incompatible Models (need more/different GPUs):\n"));
|
|
582
|
+
}
|
|
583
|
+
const sortedFamilies = Object.keys(incompatible).sort();
|
|
584
|
+
for (const family of sortedFamilies) {
|
|
585
|
+
if (!activePod) {
|
|
586
|
+
console.log(chalk.cyan(`${family} Models:`));
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
console.log(chalk.gray(`${family} Models:`));
|
|
590
|
+
}
|
|
591
|
+
const modelList = incompatible[family].sort((a, b) => a.name.localeCompare(b.name));
|
|
592
|
+
for (const model of modelList) {
|
|
593
|
+
const color = activePod ? chalk.gray : chalk.green;
|
|
594
|
+
console.log(` ${color(model.id)}`);
|
|
595
|
+
console.log(chalk.gray(` Name: ${model.name}`));
|
|
596
|
+
console.log(chalk.gray(` Min Hardware: ${model.minGpu}`));
|
|
597
|
+
if (model.notes && !activePod) {
|
|
598
|
+
console.log(chalk.gray(` Note: ${model.notes}`));
|
|
599
|
+
}
|
|
600
|
+
if (activePod) {
|
|
601
|
+
console.log(""); // Less verbose for incompatible models when filtered
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
console.log("");
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
console.log(chalk.gray("\nFor unknown models, defaults to single GPU deployment."));
|
|
610
|
+
console.log(chalk.gray("Use --vllm to pass custom arguments to vLLM."));
|
|
611
|
+
};
|
|
612
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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"}
|