148 lines
6.2 KiB
JavaScript
148 lines
6.2 KiB
JavaScript
import { generateUUID } from './constants.js';
|
|
|
|
export async function detectMasterIP(extension) {
|
|
try {
|
|
const isRunpod = window.location.hostname.endsWith('.proxy.runpod.net');
|
|
if (isRunpod) {
|
|
extension.log("Detected Runpod environment", "info");
|
|
}
|
|
|
|
const data = await extension.api.getNetworkInfo();
|
|
extension.log("Network info: " + JSON.stringify(data), "debug");
|
|
|
|
if (data.cuda_device !== null && data.cuda_device !== undefined) {
|
|
extension.masterCudaDevice = data.cuda_device;
|
|
|
|
if (!extension.config.master) {
|
|
extension.config.master = {};
|
|
}
|
|
if (extension.config.master.cuda_device === undefined || extension.config.master.cuda_device !== data.cuda_device) {
|
|
extension.config.master.cuda_device = data.cuda_device;
|
|
try {
|
|
await extension.api.updateMaster({ cuda_device: data.cuda_device });
|
|
extension.log(`Stored master CUDA device: ${data.cuda_device}`, "debug");
|
|
} catch (error) {
|
|
extension.log(`Error storing master CUDA device: ${error.message}`, "error");
|
|
}
|
|
}
|
|
|
|
extension.ui.updateMasterDisplay(extension);
|
|
}
|
|
|
|
if (data.cuda_device_count > 0) {
|
|
extension.cudaDeviceCount = data.cuda_device_count;
|
|
extension.log(`Detected ${extension.cudaDeviceCount} CUDA devices`, "info");
|
|
|
|
const shouldAutoPopulate =
|
|
!extension.config.settings.has_auto_populated_workers &&
|
|
(!extension.config.workers || extension.config.workers.length === 0);
|
|
|
|
extension.log(`Auto-population check: has_populated=${extension.config.settings.has_auto_populated_workers}, workers=${extension.config.workers ? extension.config.workers.length : 'null'}, should_populate=${shouldAutoPopulate}`, "debug");
|
|
|
|
if (shouldAutoPopulate) {
|
|
extension.log(`Auto-populating workers based on ${extension.cudaDeviceCount} CUDA devices (excluding master on CUDA ${extension.masterCudaDevice})`, "info");
|
|
|
|
const newWorkers = [];
|
|
let workerNum = 1;
|
|
let portOffset = 0;
|
|
|
|
for (let i = 0; i < extension.cudaDeviceCount; i++) {
|
|
if (i === extension.masterCudaDevice) {
|
|
extension.log(`Skipping CUDA ${i} (used by master)`, "debug");
|
|
continue;
|
|
}
|
|
|
|
const worker = {
|
|
id: generateUUID(),
|
|
name: `Worker ${workerNum}`,
|
|
host: isRunpod ? null : "localhost",
|
|
port: 8189 + portOffset,
|
|
cuda_device: i,
|
|
enabled: true,
|
|
extra_args: isRunpod ? "--listen" : "",
|
|
};
|
|
newWorkers.push(worker);
|
|
workerNum += 1;
|
|
portOffset += 1;
|
|
}
|
|
|
|
if (newWorkers.length > 0) {
|
|
extension.log(`Auto-populating ${newWorkers.length} workers`, "info");
|
|
|
|
extension.config.workers = newWorkers;
|
|
extension.config.settings.has_auto_populated_workers = true;
|
|
|
|
for (const worker of newWorkers) {
|
|
try {
|
|
await extension.api.updateWorker(worker.id, worker);
|
|
} catch (error) {
|
|
extension.log(`Error saving worker ${worker.name}: ${error.message}`, "error");
|
|
}
|
|
}
|
|
|
|
try {
|
|
await extension.api.updateSetting('has_auto_populated_workers', true);
|
|
} catch (error) {
|
|
extension.log(`Error saving auto-population flag: ${error.message}`, "error");
|
|
}
|
|
|
|
extension.log(`Auto-populated ${newWorkers.length} workers and saved config`, "info");
|
|
|
|
if (extension.app.extensionManager?.toast) {
|
|
extension.app.extensionManager.toast.add({
|
|
severity: "success",
|
|
summary: "Workers Auto-populated",
|
|
detail: `Automatically created ${newWorkers.length} workers based on detected CUDA devices`,
|
|
life: 5000,
|
|
});
|
|
}
|
|
|
|
await extension.loadConfig();
|
|
} else {
|
|
extension.log("No additional CUDA devices available for workers (all used by master)", "debug");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (extension.config?.master?.host) {
|
|
extension.log(`Master host already configured: ${extension.config.master.host}`, "debug");
|
|
return;
|
|
}
|
|
|
|
if (isRunpod) {
|
|
const runpodHost = window.location.hostname;
|
|
extension.log(`Setting Runpod master host: ${runpodHost}`, "info");
|
|
|
|
await extension.api.updateMaster({ host: runpodHost });
|
|
|
|
if (!extension.config.master) {
|
|
extension.config.master = {};
|
|
}
|
|
extension.config.master.host = runpodHost;
|
|
|
|
if (extension.app.extensionManager?.toast) {
|
|
extension.app.extensionManager.toast.add({
|
|
severity: "info",
|
|
summary: "Runpod Auto-Configuration",
|
|
detail: `Master host set to ${runpodHost} with --listen flag for workers`,
|
|
life: 5000,
|
|
});
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (data.recommended_ip && data.recommended_ip !== '127.0.0.1') {
|
|
extension.log(`Auto-detected master IP: ${data.recommended_ip}`, "info");
|
|
|
|
await extension.api.updateMaster({ host: data.recommended_ip });
|
|
|
|
if (!extension.config.master) {
|
|
extension.config.master = {};
|
|
}
|
|
extension.config.master.host = data.recommended_ip;
|
|
}
|
|
} catch (error) {
|
|
extension.log("Error detecting master IP: " + error.message, "error");
|
|
}
|
|
}
|