C# VRAM 모니터링 방법
게임이나 일반응용프램과 달리 AI쪽에서는 그래픽카드 처리속도보다 VRAM 크기가 중요하다
게임처럼 실시간 처리가 필요한게 아니니 처리속도야 시간을 들이면 해결될이지만
VRAM이 부족하면 로드 자체가 실패하기 때문
상용프로그램으로 개발할땐 엄청나게 커다란 문제이다
프로그램을 다운로드 받았는데 작동이 안 된다고 하면 곤란하지 않은가
그런데 일반 윈폼프로젝트에는 VRAM측정이 존재하지 않는다. Direct3D기반 프로젝트에서만 분석해주기 때문
https://learn.microsoft.com/ko-kr/visualstudio/profiling/gpu-usage?view=vs-2022
그래서 이번엔 Nuget을 이용한 VRAM 측정방법을 소개하겠다
LibreHardwareMonitorLib를 쓸것이다
상업적 사용도 가능하단다
설치끝
아래코드를 넣어준다
https://gist.github.com/ahzkwid/a003bf0e6c9f3794d47b1296b3644a9d
using LibreHardwareMonitor.Hardware;
using System;
using System.Diagnostics;
namespace Ahzkwid
{
internal class MemoryChecker
{
static Computer computer = null;
public static Computer GetComputer()
{
if (computer == null)
{
computer = new Computer
{
IsGpuEnabled = true
};
computer.Open();
}
return computer;
}
static List<IHardware> GPUHardwares()
{
computer = GetComputer();
var hardwares= computer.Hardware.ToList().FindAll(hardware =>
{
if (hardware.HardwareType == HardwareType.GpuNvidia || hardware.HardwareType == HardwareType.GpuAmd || hardware.HardwareType == HardwareType.GpuIntel)
{
return true;
}
return false;
});
return hardwares;
}
public static float RamUsed
{
get
{
float usad = 0;
var process = Process.GetCurrentProcess();
usad = process.PrivateMemorySize64 / (1024 * 1024);
return usad;
}
}
public static float VramFree
{
get
{
return VramTotal-VramUsed;
}
}
public static float VramUsed
{
get
{
float usad = 0;
foreach (var hardware in GPUHardwares())
{
hardware.Update();
foreach (var sensor in hardware.Sensors)
{
var lowerName = sensor.Name.ToLower();
if (lowerName.Contains("memory") && lowerName.Contains("used") && lowerName.Contains("gpu"))
{
usad = (float)sensor.Value;
break;
}
}
}
return usad;
}
//computer.Close();
}
public static float VramTotal
{
get
{
float total = 0;
foreach (var hardware in GPUHardwares())
{
hardware.Update();
foreach (var sensor in hardware.Sensors)
{
var lowerName = sensor.Name.ToLower();
if (lowerName.Contains("memory") && lowerName.Contains("total") && lowerName.Contains("gpu"))
{
total = (float)sensor.Value;
break;
}
}
}
return total;
}
//computer.Close();
}
}
}
그리고 테스트할 코드 앞뒤로 아래와같이 변화량을 추적한다
왜냐하면 VRAM의 전체사용량만을 추적할뿐 프로세스가 얼만큼 차지하는지는 나오지 않기 떄문이다
Debug.WriteLine($"Private Memory: {MemoryChecker.RamUsed} MB");
var vramUsad = MemoryChecker.VramUsed;
var vramUsadPre = vramUsad;
Debug.WriteLine($"vramUsad:{vramUsad - vramUsadPre} MB");
일반메모리가 5GB, VRAM을 4GB먹는다는것을 알게되었다
이것은 에디터에서만 테스트하는 용도뿐만이 아니고
일반사용자들의 VRAM을 측정하여 어떤 모델을 올릴지 취사선택하는것도 가능하다
GpuLayerCount를 최소 256으로 올려야 GPU에서 처리를 하는데 메모리가 너무 부족하여
32레이어밖에 못 올리니 GPU가 작동 안 하는 문제가 발생한다
옵션 좀 잘 조정해봐야겠다
끝