CRIU ile CUDA Uygulamalarının Kontrol Noktası Belirlenmesi

8


CUDA için kontrol noktası ve geri yükleme işlevi, CUDA adlı bir komut satırı yardımcı programı aracılığıyla ortaya çıkarılmıştır. cuda-kontrol noktası. Bu yardımcı program, çalışan bir Linux işleminde CUDA durumunu şeffaf bir şekilde kontrol etmek ve geri yüklemek için kullanılabilir. Bunu şununla birleştirin: CRIU (Kullanıcı Alanında Kontrol Noktası/Geri Yükleme), CUDA uygulamalarını tam olarak kontrol noktasılamak için açık kaynaklı bir kontrol noktası oluşturma yardımcı programıdır.

Kontrol noktası genel bakışı

Şeffaf, işlem başına kontrol noktası, sanal makine kontrol noktası ve uygulama odaklı kontrol noktası arasında bir orta yol sunar. İşlem başına kontrol noktası, karmaşık bir uygulamanın durumunu kontrol noktası yapmak için kapsayıcılarla birlikte kullanılabilir ve aşağıdaki gibi kullanım durumlarını kolaylaştırır:

  • Periyodik kontrol noktalarıyla hata toleransı
  • Önceden kesilen görevin kontrol noktası olarak belirlenmesiyle tek bir düğümdeki daha düşük öncelikli işin önceden kesilmesi
  • Göç ile küme planlaması
Sanal makine kontrol noktası altında, simgeler fiziksel bellek, depolama ve donanım durumu olan bir sanal makineyi gösterir. İşlem başına kontrol noktası altında, simgeler bir terminale ve cihaza açık iş parçacıkları, sanal bellek ve dosya tanımlayıcıları olan bir işlemi gösterir. Uygulama odaklı kontrol noktası altında, bir simge bir uygulamanın durumunu ızgara boyutunda ve üç koordinattan oluşan bir listeyi gösterir: madenler, tıklamalar ve bayraklar.
Şekil 1. Kontrol noktası türleri

CRIU

CRIU (Kullanıcı Alanında Kontrol Noktası/Geri Yükleme) NVIDIA dışında sürdürülen, Linux için açık kaynaklı bir kontrol noktası oluşturma yardımcı programıdır ve işlem ağaçlarını kontrol edebilir ve geri yükleyebilir.

CRIU, işlevselliğini komut satırı programı aracılığıyla ortaya koyuyor criu ve bir işlemle ilişkili her çekirdek modu kaynağını kontrol noktası haline getirerek ve geri yükleyerek çalışır. Bu kaynaklar şunları içerir:

  • Anonim hafıza
  • İş Parçacığı
  • Düzenli dosyalar
  • Soketler
  • Kontrol noktası oluşturulmuş süreçler arasındaki borular

Bu kaynakların davranışı Linux tarafından belirlendiği ve altta yatan donanımdan bağımsız olduğu için, CRIU bunları nasıl kontrol edeceğini ve geri yükleyeceğini bilir.

Buna karşılık NVIDIA GPU'ları standart bir Linux çekirdeğinin ötesinde işlevsellik sağlıyor, dolayısıyla CRIU bunları yönetemiyor. cuda-checkpoint bu yeteneği ekler ve bir CUDA uygulamasını kontrol noktası haline getirmek ve geri yüklemek için CRIU ile birlikte kullanılabilir.

cuda-kontrol noktası

cuda-checkpoint kontrol noktaları oluşturur ve tek bir Linux işleminin CUDA durumunu geri yükler. 550 ve üzeri ekran sürücüsü sürümünü destekler ve şu adresten indirilebilir: /bin dizini.

localhost$ cuda-checkpoint --help

CUDA checkpoint and restore utility.
Toggles the state of CUDA within a process between suspended and running.
Version 550.54.09. Copyright (C) 2024 NVIDIA Corporation. All rights reserved.

    --toggle --pid 
        Toggle the state of CUDA in the specified process.

    --help
        Print help message.

The cuda-checkpoint ikili, PID tarafından belirtilen bir işlemin CUDA durumunu askıya alınmış ve çalışıyor arasında değiştirebilir. Çalışıyor-askıya alınmış geçişine bir geçiş denir askıya almak ve zıt geçişe bir geçiş denir sürdürmek.

Bir işlemin CUDA durumu başlangıçta çalışıyor. cuda-checkpoint Bir işlemde CUDA'yı askıya almak için kullanılır, şu adımları izler:

Kilit simgesi. Çalışmayı başlatan, kaynakları yöneten veya başka şekillerde GPU durumunu etkileyen tüm CUDA sürücü API'leri kilitlenir.
Hilal simgesi. Akış geri aramaları da dahil olmak üzere halihazırda gönderilen CUDA çalışması tamamlandı.
Sağdan sola doğru ok bulunan sayfalar simgesi. Aygıt belleği, CUDA sürücüsü tarafından yönetilen tahsislere göre ana bilgisayara kopyalanır.
Altta dikdörtgen bulunan daire simgesi. Tüm CUDA GPU kaynakları serbest bırakıldı.
Tablo 1. cuda-checkpoint CUDA'yı askıya almak için kullanılır

cuda-checkpoint CPU iş parçacıklarını askıya almaz; bu, CUDA ile aşağıdaki yollardan biriyle güvenli bir şekilde etkileşime girmeye devam edebilir: CUDA devam ettirilene kadar engellenebilecek çalışma zamanı veya sürücü API'lerini çağırma veya CUDA tarafından tahsis edilen ana bilgisayar belleğine erişme cudaMallocHost ve geçerliliğini koruyan benzer API'ler.

Askıya alınmış bir CUDA işlemi artık işletim sistemi düzeyinde herhangi bir GPU donanımına doğrudan atıfta bulunmaz ve bu nedenle CRIU gibi bir CPU kontrol noktası yardımcı programı tarafından kontrol noktası oluşturulabilir.

Bir işlemin CUDA durumu kullanılarak sürdürüldüğünde cuda-checkpointşu adımları takip eder:

Üstte dikdörtgen bulunan daire simgesi. İşlem sonucunda GPU'lar tekrar elde edilir.
Soldan sağa işaret eden oklu sayfalar simgesi. Aygıt belleği GPU'ya geri kopyalanır ve GPU bellek eşlemeleri orijinal adreslerine geri yüklenir.
Güneş simgesi Akışlar ve bağlamlar gibi CUDA nesneleri geri yüklenir.
Kilit açık simgesi CUDA sürücü API'leri kilidi açıldı.
Tablo 2. CUDA durumu kullanılarak devam ettirilir cuda-checkpoint

Bu noktada CUDA unblock çağrısını yapar ve CUDA GPU üzerinde tekrar çalışmaya başlayabilir.

Kontrol noktası örneği

Bu örnek şunu kullanır: cuda-checkpoint ve CRIU, CUDA uygulaması olarak adlandırılan bir kontrol noktasını kontrol etmek için counterHer seferinde counter bir paket alır, GPU belleğini artırır ve güncellenmiş değerle yanıt verir. örnek kod GitHub deposunda da mevcuttur.

#include 
#include 
#include 
#include 
#include 

#define PORT 10000

__device__ int counter = 100;
__global__ void increment()
{
    counter++;
}

int main(void)
{
    cudaFree(0);

    int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    sockaddr_in addr = {AF_INET, htons(PORT), inet_addr("127.0.0.1")};
    bind(sock, (sockaddr *)&addr, sizeof addr);

    while (true) {
        char buffer[16] = {0};
        sockaddr_in peer = {0};
        socklen_t inetSize = sizeof peer;
        int hCounter = 0;

        recvfrom(sock, buffer, sizeof buffer, 0, (sockaddr *)&peer, &inetSize);

        increment<<<1,1>>>();
        cudaMemcpyFromSymbol(&hCounter, counter, sizeof counter);

        size_t bytes = sprintf(buffer, "%d\n", hCounter);
        sendto(sock, buffer, bytes, 0, (sockaddr *)&peer, inetSize);
    }
    return 0;
}

Şunu inşa edebilirsiniz: counter uygulama kullanarak nvcc.

localhost$ nvcc counter.cu -o counter

Kaydet counter Sonraki komutlarda referans olması açısından PID:

Göndermek counter bir paket ve döndürülen değeri gözlemleyin. Başlangıç ​​değeri 100'dü ancak yanıt 101'dir, bu da GPU belleğinin başlatmadan bu yana değiştiğini gösterir.

localhost# echo hello | nc -u localhost 10000 -W 1
101

Kullanmak nvidia-smi bunu doğrulamak için counter GPU üzerinde çalışıyor:

localhost# nvidia-smi --query --display=PIDS | grep $PID
Process ID : 298027

Kullanmak cuda-checkpoint askıya almak counter CUDA durumu:

localhost# cuda-checkpoint --toggle --pid $PID

Kullanmak nvidia-smi bunu doğrulamak için counter artık bir GPU'da çalışmıyor:

localhost# nvidia-smi --query --display=PIDS | grep $PID

Kontrol noktası görüntüsünü tutacak bir dizin oluşturun:

Kullanmak criu kontrol noktasına counter:

localhost# criu dump --shell-job --images-dir demo --tree $PID
[1]+ Killed ./counter

Bunu onaylayın counter artık çalışmıyor:

localhost# ps --pid $PID
PID TTY TIME CMD

Kullanmak criu yenilemek counter:

localhost# criu restore --shell-job --restore-detached --images-dir demo

Kullanmak cuda-checkpoint devam etmek için counter CUDA durumu:

localhost# cuda-checkpoint --toggle --pid $PID

Şimdi counter tamamen geri yüklendi, başka bir paket gönder. Cevap 102'dir, bu da önceki GPU işlemlerinin doğru şekilde kalıcı hale getirildiğini gösterir.

localhost# echo hello | nc -u localhost 10000 -W 1
102

İşlevsellik

Ekran sürücüsü sürüm 550 itibariyle, denetim noktası ve geri yükleme işlevselliği hala etkin bir şekilde geliştirilmektedir. Özellikle, cuda-checkpoint aşağıdaki özelliklere sahiptir:

  • yalnızca x64.
  • Bir işlem ağacı üzerinde değil, tek bir işlem üzerinde işlem yapar.
  • UVM veya IPC belleği desteklemiyor.
  • GPU geçişini desteklemiyor.
  • Bir kontrol noktasını tamamlamadan önce önceden gönderilmiş CUDA çalışmasının bitmesini bekler.
  • Kontrol noktası veya geri yükleme sırasında bir hata (UVM tahsisinin varlığı gibi) ile karşılaşıldığında işlemi iyi durumda tutmaya çalışmaz.

Bu sınırlamalar sonraki ekran sürücüsü sürümlerinde ele alınacak ve cuda-checkpoint yardımcı programının kendisinin güncellenmesi gerekmeyecektir. cuda-checkpoint yardımcı program, sürücüde bulunan işlevselliği ortaya çıkarır.

Özet

The cuda-checkpoint yardımcı program, CRIU ile birleştirildiğinde, Linux uygulamalarının şeffaf işlem başına kontrol noktasını etkinleştirir. Daha fazla bilgi için bkz. /NVIDIA/cuda-kontrol noktası GitHub deposu.

Kontrol noktasını deneyin counter uygulamasını veya herhangi bir uyumlu CUDA uygulamasını kendi makinenizde çalıştırın!

Kaynak: Nvidia

Doğrudan cihazınızda gerçek zamanlı güncellemeleri alın, şimdi abone olun.

Yorumlar