效果图

修改
**
API 增加代码:/usr/share/perl5/PVE/API2/Nodes.pm**
增加代码:
$res->{gpu_info} = `nvidia-smi --query-gpu=index,name,memory.total,memory.used,memory.free,temperature.gpu,utilization.gpu,power.draw`;页面JS 增加代码:/usr/share/pve-manager/js/pvemanagerlib.js
{
itemId: 'gpu-info',
colspan: 2,
printBar: false,
title: gettext('GPU'),
textField: 'gpu_info',
renderer: function(value) {
if (!value) return 'No GPU detected';
var lines = value.split('\n');
var html = '<div style="font-family: monospace; font-size: 12px;">';
var gpuCount = 0;
lines.forEach(function(line, index) {
if (line.trim() === '' || index === 0) return; // 跳过空行和第一行标题
var parts = line.split(', ');
if (parts.length >= 8) {
gpuCount++;
html += '<div style="margin-bottom: 10px; padding: 5px; border-radius: 3px;">';
html += '<strong>GPU ' + parts[0] + ':</strong> ' + parts[1] + '<br/>';
// 显存使用进度条
var memTotal = parseInt(parts[2]);
var memUsed = parseInt(parts[3]);
var memPercent = memTotal > 0 ? Math.round((memUsed / memTotal) * 100) : 0;
html += '<div style="margin: 3px 0;">';
html += '<span>Memory: ' + parts[3] + ' / ' + parts[2] + '</span>';
html += '<div style="width: 100%; height: 10px; background: #ddd; border-radius: 5px; margin: 2px 0;">';
html += '<div style="width: ' + memPercent + '%; height: 100%; background: ' +
(memPercent > 80 ? '#e53935' : memPercent > 60 ? '#ff9800' : '#4caf50') +
'; border-radius: 5px;"></div>';
html += '</div>';
html += '</div>';
// 其他信息
html += '<div style="display: flex; justify-content: space-between; font-size: 11px;">';
html += '<span>Usage: ' + parts[6] + '</span>';
html += '<span> Temp: ' + parts[5] + '°C</span>';
html += '<span> Power: ' + parts[7] + '</span>';
html += '</div>';
html += '</div>';
}
});
if (gpuCount === 0) {
html = 'No GPU data available';
}
html += '</div>';
return html;
}
}PS:修改后记得调整显示高度:
参考:https://blog.mstg.top/archives/945#toc-head-9
重启PVE相关:
systemctl restart pveproxy
systemctl restart pvedaemon