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ı
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:
Çalışmayı başlatan, kaynakları yöneten veya başka şekillerde GPU durumunu etkileyen tüm CUDA sürücü API'leri kilitlenir. | |
Akış geri aramaları da dahil olmak üzere halihazırda gönderilen CUDA çalışması tamamlandı. | |
Aygıt belleği, CUDA sürücüsü tarafından yönetilen tahsislere göre ana bilgisayara kopyalanır. | |
Tüm CUDA GPU kaynakları serbest bırakıldı. |
cuda-checkpoint
CUDA'yı askıya almak için kullanılırcuda-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:
İşlem sonucunda GPU'lar tekrar elde edilir. | |
Aygıt belleği GPU'ya geri kopyalanır ve GPU bellek eşlemeleri orijinal adreslerine geri yüklenir. | |
Akışlar ve bağlamlar gibi CUDA nesneleri geri yüklenir. | |
CUDA sürücü API'leri kilidi açıldı. |
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 counter
Her 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!