Ubuntu sunucularda özellikle yapay zekâ, CUDA, vLLM, Ollama veya Docker tabanlı uygulamalar çalıştırıldığında ekran kartı belleğinin hangi süreç tarafından kullanıldığını tespit etmek gerekebilir.

NVIDIA ekran kartlarında bu işlem için en temel araç nvidia-smi komutudur.

GPU kullanımını görüntüleme

Sistemdeki tüm NVIDIA ekran kartlarını ve bu kartları kullanan süreçleri görmek için şu komut çalıştırılır:

nvidia-smi

Belirli bir ekran kartını incelemek için GPU numarası belirtilir:

nvidia-smi -i 1

Buradaki 1, ikinci ekran kartını ifade eder.

Komut çıktısının alt kısmında Processes isimli bir tablo bulunur:

| GPU   PID       Type   Process name       GPU Memory |
|   1   17449       C    VLLM::EngineCore      2110MiB |
|   1   1441625     C    VLLM::EngineCore     90272MiB |

Bu tabloda:

  • PID, işlemin sistemdeki süreç numarasıdır.
  • Type, işlemin grafik veya hesaplama süreci olduğunu gösterir.
  • Process name, uygulamanın veya sürecin adıdır.
  • GPU Memory, sürecin kullandığı ekran kartı belleğidir.

C tipi süreçler CUDA veya hesaplama uygulamalarını, G tipi süreçler ise grafik arayüzü kullanan uygulamaları ifade eder.

GPU kullanımını anlık izleme

GPU süreçlerini sürekli izlemek için şu komut kullanılabilir:

watch -n 1 nvidia-smi -i 1

Bu komut ekranı saniyede bir yeniler.

Daha ayrıntılı süreç takibi için:

nvidia-smi pmon -i 1 -s um

Örnek çıktı:

# gpu       pid   type    sm    mem     fb    command
    1     17449     C      -      -   2110    VLLM::EngineCor
    1   1441625     C      -      -  90272    VLLM::EngineCor

Burada:

  • sm, GPU hesaplama birimlerinin kullanım oranını,
  • mem, aktif bellek erişim oranını,
  • fb, ayrılan ekran kartı belleğini,
  • command, sürecin adını gösterir.

sm ve mem sütunlarında - görünmesi, işlemin ekran kartı belleğini ayırdığı fakat o anda aktif hesaplama yapmadığı anlamına gelebilir.

Örneğin bir yapay zekâ modeli VRAM üzerinde yüklü olarak beklerken GPU kullanımı yüzde sıfır olabilir.

PID üzerinden uygulamanın komutunu bulma

nvidia-smi çıktısından elde edilen PID ile sürecin ayrıntıları görüntülenebilir:

ps -fp 1441625

Komut satırı kesiliyorsa tam komut şu şekilde okunabilir:

tr '\0' ' ' < /proc/1441625/cmdline
echo

Birden fazla PID için:

for pid in 17449 1441625; do
    echo "===== PID $pid ====="
    tr '\0' ' ' < /proc/$pid/cmdline
    echo
done

Bu çıktı uygulamanın hangi model, port veya parametrelerle başlatıldığını gösterebilir.

Sürecin Docker container’ına ait olup olmadığını bulma

GPU kullanan uygulama Docker içinde çalışıyorsa yalnızca süreç adını görmek yeterli olmayabilir. Sürecin hangi container’a ait olduğunu tespit etmek için Linux cgroup bilgisi kullanılabilir.

Örneğin:

cat /proc/1441625/cgroup

Çıktı şu şekilde olabilir:

0::/system.slice/docker-ad8eeb767630772d710db98fd43f5171d077320b77a9c7d28129db1209a90631.scope

Buradaki uzun hexadecimal ifade Docker container kimliğidir:

ad8eeb767630772d710db98fd43f5171d077320b77a9c7d28129db1209a90631

Container adını ve kullanılan imajı görmek için:

docker inspect -f 'Ad={{.Name}} Image={{.Config.Image}} Durum={{.State.Status}}' \
ad8eeb767630772d710db98fd43f5171d077320b77a9c7d28129db1209a90631

Daha kısa bir yöntem olarak container kimliğinin ilk 12 karakteri kullanılabilir:

docker ps --no-trunc | grep ad8eeb767630

Birden fazla GPU sürecini container’larla eşleştirme

Birden fazla PID için şu komut kullanılabilir:

for pid in 17449 1441625; do
    echo "===== PID $pid ====="
    cat /proc/$pid/cgroup
    echo
done

Örnek çıktı:

===== PID 17449 =====
0::/system.slice/docker-f9ef466725c1030c37d3cc4032d1cce31f37366c252d51e241b948b4157a08a5.scope

===== PID 1441625 =====
0::/system.slice/docker-ad8eeb767630772d710db98fd43f5171d077320b77a9c7d28129db1209a90631.scope

Bu durumda iki farklı GPU süreci iki farklı Docker container’ına aittir.

Container bilgilerini birlikte görüntülemek için:

docker inspect -f 'Ad={{.Name}} Image={{.Config.Image}} Durum={{.State.Status}}' \
f9ef466725c1030c37d3cc4032d1cce31f37366c252d51e241b948b4157a08a5 \
ad8eeb767630772d710db98fd43f5171d077320b77a9c7d28129db1209a90631

Container’ın başlatma komutunu görüntüleme

Container’ın hangi komutla çalıştırıldığını öğrenmek için:

docker inspect -f 'Ad={{.Name}}
Image={{.Config.Image}}
Entrypoint={{json .Config.Entrypoint}}
Komut={{json .Config.Cmd}}' CONTAINER_ID

Bu yöntem özellikle aynı imajdan birden fazla vLLM, Ollama veya CUDA servisi çalıştırıldığında oldukça faydalıdır.

Kullanışlı toplu kontrol komutu

GPU kullanan süreçlerin PID, komut satırı ve Docker cgroup bilgilerini tek seferde görmek için şu betik kullanılabilir:

for pid in $(nvidia-smi --query-compute-apps=pid --format=csv,noheader,nounits); do
    echo "========================================"
    echo "PID: $pid"

    echo
    echo "Süreç:"
    ps -p "$pid" -o pid,user,cmd --no-headers

    echo
    echo "Tam komut:"
    tr '\0' ' ' < /proc/$pid/cmdline
    echo

    echo
    echo "Cgroup:"
    cat /proc/$pid/cgroup

    echo
done

Yalnızca belirli bir GPU için:

for pid in $(nvidia-smi -i 1 --query-compute-apps=pid --format=csv,noheader,nounits); do
    echo "========================================"
    echo "PID: $pid"
    ps -p "$pid" -o pid,user,cmd --no-headers
    cat /proc/$pid/cgroup
done

Sonuç

Ubuntu’da ekran kartını hangi uygulamanın kullandığını bulmak için izlenecek temel sıra şöyledir:

  1. nvidia-smi ile GPU kullanan PID’ler bulunur.
  2. ps veya /proc/PID/cmdline ile süreç komutu incelenir.
  3. /proc/PID/cgroup ile sürecin Docker container’ına ait olup olmadığı belirlenir.
  4. docker inspect ile container adı, imajı ve başlatma komutu görüntülenir.

Bu yöntemle yalnızca GPU’yu hangi uygulamanın kullandığı değil, uygulamanın hangi Docker container’ında çalıştığı, hangi imajdan başlatıldığı ve ne kadar VRAM kullandığı da kolayca tespit edilebilir.