gpu_linux.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package gpu
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strings"
  7. "github.com/ollama/ollama/format"
  8. )
  9. var CudartGlobs = []string{
  10. "/usr/local/cuda/lib64/libcudart.so*",
  11. "/usr/lib/x86_64-linux-gnu/nvidia/current/libcudart.so*",
  12. "/usr/lib/x86_64-linux-gnu/libcudart.so*",
  13. "/usr/lib/wsl/lib/libcudart.so*",
  14. "/usr/lib/wsl/drivers/*/libcudart.so*",
  15. "/opt/cuda/lib64/libcudart.so*",
  16. "/usr/local/cuda*/targets/aarch64-linux/lib/libcudart.so*",
  17. "/usr/lib/aarch64-linux-gnu/nvidia/current/libcudart.so*",
  18. "/usr/lib/aarch64-linux-gnu/libcudart.so*",
  19. "/usr/local/cuda/lib*/libcudart.so*",
  20. "/usr/lib*/libcudart.so*",
  21. "/usr/local/lib*/libcudart.so*",
  22. }
  23. var NvmlGlobs = []string{}
  24. var NvcudaGlobs = []string{
  25. "/usr/local/cuda*/targets/*/lib/libcuda.so*",
  26. "/usr/lib/*-linux-gnu/nvidia/current/libcuda.so*",
  27. "/usr/lib/*-linux-gnu/libcuda.so*",
  28. "/usr/lib/wsl/lib/libcuda.so*",
  29. "/usr/lib/wsl/drivers/*/libcuda.so*",
  30. "/opt/cuda/lib*/libcuda.so*",
  31. "/usr/local/cuda/lib*/libcuda.so*",
  32. "/usr/lib*/libcuda.so*",
  33. "/usr/local/lib*/libcuda.so*",
  34. }
  35. var OneapiGlobs = []string{
  36. "/usr/lib/x86_64-linux-gnu/libze_intel_gpu.so*",
  37. "/usr/lib*/libze_intel_gpu.so*",
  38. }
  39. var CudartMgmtName = "libcudart.so*"
  40. var NvcudaMgmtName = "libcuda.so*"
  41. var NvmlMgmtName = "" // not currently wired on linux
  42. var OneapiMgmtName = "libze_intel_gpu.so"
  43. func GetCPUMem() (memInfo, error) {
  44. var mem memInfo
  45. var total, available, free, buffers, cached, freeSwap uint64
  46. f, err := os.Open("/proc/meminfo")
  47. if err != nil {
  48. return mem, err
  49. }
  50. defer f.Close()
  51. s := bufio.NewScanner(f)
  52. for s.Scan() {
  53. line := s.Text()
  54. switch {
  55. case strings.HasPrefix(line, "MemTotal:"):
  56. _, err = fmt.Sscanf(line, "MemTotal:%d", &total)
  57. case strings.HasPrefix(line, "MemAvailable:"):
  58. _, err = fmt.Sscanf(line, "MemAvailable:%d", &available)
  59. case strings.HasPrefix(line, "MemFree:"):
  60. _, err = fmt.Sscanf(line, "MemFree:%d", &free)
  61. case strings.HasPrefix(line, "Buffers:"):
  62. _, err = fmt.Sscanf(line, "Buffers:%d", &buffers)
  63. case strings.HasPrefix(line, "Cached:"):
  64. _, err = fmt.Sscanf(line, "Cached:%d", &cached)
  65. case strings.HasPrefix(line, "SwapFree:"):
  66. _, err = fmt.Sscanf(line, "SwapFree:%d", &freeSwap)
  67. default:
  68. continue
  69. }
  70. if err != nil {
  71. return mem, err
  72. }
  73. }
  74. mem.TotalMemory = total * format.KibiByte
  75. mem.FreeSwap = freeSwap * format.KibiByte
  76. if available > 0 {
  77. mem.FreeMemory = available * format.KibiByte
  78. } else {
  79. mem.FreeMemory = (free + buffers + cached) * format.KibiByte
  80. }
  81. return mem, nil
  82. }