fix(amd/linux): show dedicated VRAM on device list (override Vulkan UMA) (#6533)
This commit is contained in:
parent
01050f3103
commit
c096929d8b
@ -2012,6 +2012,69 @@ export default class llamacpp_extension extends AIEngine {
|
|||||||
libraryPath,
|
libraryPath,
|
||||||
envs,
|
envs,
|
||||||
})
|
})
|
||||||
|
// On Linux with AMD GPUs, llama.cpp via Vulkan may report UMA (shared) memory as device-local.
|
||||||
|
// For clearer UX, override with dedicated VRAM from the hardware plugin when available.
|
||||||
|
try {
|
||||||
|
const sysInfo = await getSystemInfo()
|
||||||
|
if (sysInfo?.os_type === 'linux' && Array.isArray(sysInfo.gpus)) {
|
||||||
|
const usage = await getSystemUsage()
|
||||||
|
if (usage && Array.isArray(usage.gpus)) {
|
||||||
|
const uuidToUsage: Record<string, { total_memory: number; used_memory: number }> = {}
|
||||||
|
for (const u of usage.gpus as any[]) {
|
||||||
|
if (u && typeof u.uuid === 'string') {
|
||||||
|
uuidToUsage[u.uuid] = u
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const indexToAmdUuid = new Map<number, string>()
|
||||||
|
for (const gpu of sysInfo.gpus as any[]) {
|
||||||
|
const vendorStr =
|
||||||
|
typeof gpu?.vendor === 'string'
|
||||||
|
? gpu.vendor
|
||||||
|
: typeof gpu?.vendor === 'object' && gpu.vendor !== null
|
||||||
|
? String(gpu.vendor)
|
||||||
|
: ''
|
||||||
|
if (
|
||||||
|
vendorStr.toUpperCase().includes('AMD') &&
|
||||||
|
gpu?.vulkan_info &&
|
||||||
|
typeof gpu.vulkan_info.index === 'number' &&
|
||||||
|
typeof gpu.uuid === 'string'
|
||||||
|
) {
|
||||||
|
indexToAmdUuid.set(gpu.vulkan_info.index, gpu.uuid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (indexToAmdUuid.size > 0) {
|
||||||
|
const adjusted = dList.map((dev) => {
|
||||||
|
if (dev.id?.startsWith('Vulkan')) {
|
||||||
|
const match = /^Vulkan(\d+)/.exec(dev.id)
|
||||||
|
if (match) {
|
||||||
|
const vIdx = Number(match[1])
|
||||||
|
const uuid = indexToAmdUuid.get(vIdx)
|
||||||
|
if (uuid) {
|
||||||
|
const u = uuidToUsage[uuid]
|
||||||
|
if (
|
||||||
|
u &&
|
||||||
|
typeof u.total_memory === 'number' &&
|
||||||
|
typeof u.used_memory === 'number'
|
||||||
|
) {
|
||||||
|
const total = Math.max(0, Math.floor(u.total_memory))
|
||||||
|
const free = Math.max(0, Math.floor(u.total_memory - u.used_memory))
|
||||||
|
return { ...dev, mem: total, free }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dev
|
||||||
|
})
|
||||||
|
return adjusted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logger.warn('Device memory override (AMD/Linux) failed:', e)
|
||||||
|
}
|
||||||
|
|
||||||
return dList
|
return dList
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Failed to query devices:\n', error)
|
logger.error('Failed to query devices:\n', error)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user