nbd-vram - Linux में NVIDIA GPU VRAM को swap space के रूप में इस्तेमाल करने वाला टूल
(github.com/c0dejedi)- nbd-vram एक छोटा daemon है जो Linux में NVIDIA GPU की खाली पड़ी VRAM को high-priority swap space के रूप में इस्तेमाल करने देता है
- soldered memory होने के कारण upgrade मुश्किल हो और integrated AMD/ATI GPU डिस्प्ले आउटपुट संभाल रहा हो, ऐसे hybrid graphics laptop में यह खाली NVIDIA VRAM का उपयोग memory pressure कम करने के लिए करता है
- टेस्ट environment AMD/ATI + RTX 3070 Laptop, RAM 16GB, VRAM 8GB, NVIDIA driver 580.159.03, kernel 6.17, Pop!_OS है, और इसमें 7GB VRAM को swap के लिए आवंटित करके zram·SSD swap सहित लगभग 46GB addressable memory बनाई गई
- काम करने का क्रम यह है कि पहले RAM भरती है, फिर VRAM PCIe के जरिए overflow हुए pages को absorb करती है, उसके बाद zram CPU पर compression करता है, और अंत में SSD इस्तेमाल होता है
- daemon, CUDA driver API से VRAM allocate करता है, Unix socket पर NBD(Network Block Device) protocol के जरिए block device उपलब्ध कराता है, और kernel का built-in
nbddriver इसे/dev/nbdXके रूप में expose करता है ताकि इसे सामान्य swap device की तरह इस्तेमाल किया जा सके - data path इस तरह है: kernel swap subsystem →
/dev/nbdX→ nbd kernel driver → Unix socket → nbd-vram daemon →cuMemcpyHtoD/DtoH→ GPU VRAM - अलग kernel module या NVIDIA kernel symbol की जरूरत नहीं होती, इसलिए kernel·driver update के बाद भी बिना rebuild के इसे बनाए रखा जा सकता है
- NVIDIA P2P API तरीका consumer GeForce GPU पर इसलिए विफल होता है क्योंकि
nvidia_p2p_get_pages_persistentEINVALलौटाता है, और BAR1 directioremap_wcतरीका भी लगभग 16MiB display framebuffer के बाहर के क्षेत्र को पढ़ने पर 0 लौटाता है - CUDA copy path
cuMemcpyHtoDऔरcuMemcpyDtoHबिना किसी विशेष permission के CUDA GPU पर काम करते हैं, इसलिए NBD access, P2P·BAR1 सीमाओं को bypass कर देता है - आवश्यकताएँ हैं: CUDA support वाला NVIDIA GPU,
libcuda.so.1के साथ NVIDIA driver, Linux kernel 3.0+ का nbd module,nbd-client,gcc,make; CUDA toolkit की जरूरत नहीं है - installation के बाद
vram-swap-nbdsystemd service boot पर अपने-आप चलती है, और/etc/systemd/system/vram-swap-nbd.serviceमेंVRAM_SETUP_SIZE_MBऔरVRAM_SWAP_PRIORITYसे इस्तेमाल होने वाली VRAM की अधिकतम सीमा और swap priority समायोजित की जा सकती है - daemon पहले मांगे गए VRAM size को आज़माता है, और अगर GPU memory कम पड़े तो 512MiB के step में घटाकर allocate करता है, इसलिए
VRAM_SETUP_SIZE_MBअनिवार्य size नहीं बल्कि upper limit की तरह काम करता है - power-aware management चालू होने पर AC power हटने या battery threshold से नीचे जाने पर service अपने-आप रुक जाती है, और power वापस आने पर फिर शुरू हो जाती है; manual
systemctl stopको यह override नहीं करती - RTX 3070 Laptop benchmark में sequential throughput और sustained random I/O में NVMe तेज़ है, लेकिन 4K read 1 request/sec latency में VRAM औसतन 335us के साथ NVMe के 9.05ms से 27 गुना तेज़ है
- यह MIT license के तहत उपलब्ध है, और repository में smoke test के लिए
test-nbd.sh, पूरे partition की जाँच के लिएtest-fill.sh, तथा throughput·IOPS·latency benchmark scripts भी शामिल हैं
1 टिप्पणियां
Hacker News की टिप्पणियाँ
अगर इसे CUDA के ज़रिए फ़ाइल स्टोरेज या माउंट की तरह हैंडल किया जाए तो ओवरहेड बड़ा होगा, इसलिए BAR का उपयोग करने पर throughput या IOPS में साफ़ सुधार हो सकता है
अगर यह soldered memory वाले, बिना upgrade path वाले लैपटॉप के लिए है, तो “महंगी RAM से भी महंगी RAM में swap क्यों करें?” वाला शुरुआती सवाल समझ में आ जाता है
उपयोग-क्षेत्र सीमित लगता है, लेकिन SSD पर swap होने वाली स्थिति में खाली पड़ी 8GB VRAM का इस्तेमाल ज़रूरत पड़ने पर अच्छा विचार है
उदाहरण के लिए अगर आपने gaming के लिए GPU खरीदा है, तो जब आप गेम नहीं खेल रहे हों तब desktop rendering को 16GB VRAM की ज़रूरत नहीं होती, तो उसे किसी और काम में क्यों न लिया जाए
हाँ, इसके लिए यह मानना पड़ेगा कि गेम शुरू होने पर सिस्टम swap के लिए इस्तेमाल हो रही VRAM को खाली कर सके; असल में यह संभव है या नहीं, यह जानना दिलचस्प होगा
1980 के दशक के मध्य से 1990 के दशक के मध्य तक UK में आम Amstrad PCW में अधिकतम 512kB RAM इस्तेमाल की जा सकती थी, और उसका काफ़ी बड़ा हिस्सा RAM disk बनाया जा सकता था
Turbo Pascal से compile करना भी बहुत तेज़ हो जाता था :-)
विचार अच्छा है, लेकिन यहाँ कुछ बहुत गड़बड़ लग रहा है
RTX 3070 Laptop पर sequential throughput लगभग 1.3 GB/s बताया गया है, जबकि यह RTX 3070 chip PCIe 4.0 x16 है, तो 64GB/s आना चाहिए, और 8GB GDDR6 खुद 448GB/s है
NVMe drive पर swap करना शायद दोगुना तेज़ होगा, लेकिन latency ज़्यादा होगी
benchmark भी ZRAM के साथ चलाया गया, और ZRAM swap में लिखने से पहले pages को compress करता है. उसका performance overhead ठीक-ठीक कितना है, पता नहीं, लेकिन काफ़ी बड़ा हो सकता है
सबसे पहले, user-space program उस nbd driver पर टिका है जो धीमा होने के लिए जाना जाता है, और GPU में ट्रांसफ़र से पहले user-space bounce buffer भी इस्तेमाल करता है. जब kernel को page swap करना हो, तो पहले उसे user-space में exposed buffer में copy करना पड़ता है, फिर user-space program दोबारा जागता है, CUDA operation issue करता है, और उस page को device memory में copy करता है
nbd high queue depth या adjacent access merging को भी अच्छी तरह support नहीं करता. अगर kernel बिना merge किए बहुत सारे 4K page swap issue करे, तो सिर्फ़ 4 GB/s संभालने के लिए भी प्रति सेकंड कम-से-कम दस लाख kernel/user-space context switch चाहिए होंगे. 64 GB/s की तो बात ही छोड़िए. यह सिर्फ़ NBD हिस्से की बात है, NVIDIA driver की जटिलता को छोड़कर
PCIe बहुत सारा data ले जा सकता है, लेकिन पूरी bandwidth के करीब पहुँचने के लिए लंबे page list वाले DMA engine का इस्तेमाल करना पड़ता है. PCIe पर हर 4K page के लिए transfer setup करने से bus पूरी तरह saturate नहीं होगी
NVMe पर swap का path बहुत optimized है. swapper page list सीधे NVMe driver को submit कर सकता है, और controller RAM से सीधे DMA के ज़रिए fetch कर लेता है, इसलिए CPU side copy या context switch बिल्कुल नहीं होता
अगर इसे ublk driver पर ले जाया जाए, तो शायद user-space bounce buffer से बचा जा सके, और कई write queue के साथ CUDA copy को parallel setup करके सुधार भी संभव हो सकता है
RAM या VRAM इस्तेमाल करने से degrade नहीं होती
मेरे development machine में 32GB RAM है और 32GB VRAM भी, जो AI model न चलाने पर ज़्यादातर खाली पड़ी रहती है, इसलिए यह विचार इतना बुरा नहीं लगता
सोच रहा हूँ backpressure को यह कैसे संभालता है. अगर VRAM swap space के रूप में इस्तेमाल हो रही हो और उसी दौरान VRAM allocation की मांग आ जाए तो क्या होगा?
X11 में buffers पहले से allocate रहते हैं, इसलिए स्थिति उतनी बुरी नहीं, लेकिन Wayland में allocation कहीं ज़्यादा dynamic है, तो VRAM कम पड़ने पर पूरा desktop आसानी से crash हो सकता है
Hyprland+llama-server+KVM के साथ कंप्यूटर switch करते समय VRAM रिलीज़ न हो पाने से मैंने ऐसे crash कई बार झेले हैं
user level पर swap device बनाना पहले से ही classic unsolved problems में से एक रहा है
अगर daemon को किसी page को swap in करना हो, लेकिन उस page को swap in करने से पहले daemon के अपने pages को ही swap in करना पड़े, तो क्या होगा?
कम-से-कम microkernel के कभी काम न करने के कारणों में इस तरह की चर्चा होती रही है. यहाँ समाधान क्या है, यह साफ़ नहीं है
Linux kernel भी अपने text pages को swap out होने से रोकता है, इसलिए समाधान पहले से मौजूद है, और microkernel design पर यह लागू क्यों नहीं हो सकता, समझ नहीं आता
उस daemon की पूरी memory pin कर देने से यह समस्या मामूली बन जाती है
याद है, पहले Linux के MTD/phram driver से कुछ ऐसा ही किया था: https://wiki.archlinux.org/title/Swap_on_video_RAM
बस यह नहीं पता कि आज भी वह कितना प्रासंगिक है, क्योंकि DRM के साथ इसका interaction कैसा है और VRAM का कुछ हिस्सा reserve कैसे किया जाता है, यह स्पष्ट नहीं है. xorg.conf से limit सुझाने वाला तरीका अब शायद काफ़ी पुराना पड़ चुका है
उस page पर OpenCL के ऊपर implement किया गया एक FUSE filesystem भी है: https://github.com/Overv/vramfs
संभव है यह ज़्यादा compatible हो
पुरानी यादें ताज़ा हो गईं
Windows पर भी कुछ साल पहले ऐसा कुछ देखा था
वह एक experimental proof-of-concept driver था जो NVIDIA card की VRAM से RAM drive बनाने देता था, और sequential access अपेक्षा के अनुसार तेज़ था, लेकिन random access में अभी बहुत सुधार की गुंजाइश थी
GpuRamDrive GPU RAM से backed virtual drive बनाता है: https://github.com/prsyahmi/GpuRamDrive
AMD support fork: https://github.com/brzz/GpuRamDrive/
मिलता-जुलता है, लेकिन यह OpenCL API का उपयोग करता है इसलिए AMD पर भी चलता है
हालाँकि AMD driver में काफ़ी bugs हैं, इसलिए “चलता है” की परिभाषा चाहिए: https://libguestfs.org/nbdkit-vram-plugin.1.html
समझ नहीं आता कि 32GB RAM वाले Apple Silicon Mac में, जब 20GB अभी भी unused/“free” है, तब भी swap file क्यों इस्तेमाल होती है या बनाई भी जाती है
Linux के
swapoff -aजैसी आसान command से swap file को पूरी तरह disable क्यों नहीं किया जा सकता?अगर मकसद जानबूझकर SSD की उम्र घटाना नहीं है, तो यह थोड़ा मूर्खतापूर्ण लगता है
अच्छा होता अगर GUI में swap file बंद करने की system setting होती, और Apple मौजूदा system settings/layout के इस “phase” को भी आखिर छोड़ दे. दशकों पुराने preference panels की तुलना में यह अब भी शब्दों का सलाद जैसा लगता है
#Apple #Feedback #swapfile
“available memory” की धारणा भी आदर्श रूप में “ऐसी memory जिसे दूसरे काम के लिए जल्दी reclaim किया जा सके” के ज़्यादा करीब है
कुछ स्थितियों में anonymous memory को main memory में बनाए रखने से बेहतर होता है कि cached file contents उसकी जगह ले लें