RAM 32GB मैकबुक और वर्कस्टेशन पर 744B MoE मॉडल को बिना रुके चलाने के लिए सेटिंग्स
सामान्य वर्कस्टेशन या मैकबुक पर GLM-5.2 जैसे 744B MoE मॉडल को स्थानीय रूप से चलाते समय, VRAM क्षमता से पहले स्टोरेज बैंडविड्थ और OS वर्चुअल मेमोरी पॉलिसी में बॉटलनैक आ जाता है। C भाषा पर आधारित लाइटवेट इन्फेरेंस इंजन JustVugg का colibrì केवल 17B आकार की रेजिडेंट लेयर (int4 के आधार पर 9.9 GiB) को RAM में लॉक रखता है, और 21,504 भागों में विभाजित रूटिंग एक्सपर्ट वेट्स (~370 GB) को बाहरी SSD से टोकन दर टोकन रियल-टाइम में स्ट्रीम करता है।
समस्या यह है कि डिफ़ॉल्ट OS सेटिंग्स के साथ इसे चलाने पर स्वैप थ्रैशिंग होती है या कर्नल OOM किलर प्रोसेस को जबरन समाप्त कर देता है। टोकन जनरेशन को रुकने से बचाने के लिए कंपाइल फ्लैग से लेकर NVMe I/O कतार और कर्नल पैरामीटर तक खुद सेट करने पड़ते हैं।
आर्किटेक्चर के अनुसार कंपाइल फ्लैग और वेक्टर इंस्ट्रक्शन सेट सेटिंग्स
colibrì का कोर कंप्यूटिंग इंजन बिना किसी बाहरी निर्भरता के लगभग 1,300 लाइनों की एक सिंगल C11 फाइल है। कंपाइलर किस SIMD वेक्टर इंस्ट्रक्शन का उपयोग करता है, इस पर मैट्रिक्स मल्टिप्लिकेशन कंप्यूटिंग थ्रूपुट निर्भर करता है। डिफ़ॉल्ट -O2 बिल्ड के बजाय टारगेट CPU के इंटीजर ऑपरेशन एक्सटेंशन इंस्ट्रक्शन को सीधे निर्दिष्ट करना होगा।
बिल्ड एनवायरनमेंट सेटअप और कंपाइलेशन
x86_64 लिनक्स एनवायरनमेंट में GCC 12 या इसके बाद के संस्करण के साथ AVX-512 VNNI को चालू किया जाता है, और Apple Silicon पर Clang के माध्यम से NEON DotProduct को जोड़ा जाता है।
Ubuntu और Debian श्रृंखला के लिए पहले बिल्ड टूल इंस्टॉल करें।
`bash
sudo apt-get install gcc-12 libomp-dev
`
macOS एनवायरनमेंट में Homebrew के साथ OpenMP रनटाइम प्राप्त करें।
`bash
brew install libomp
`
x86_64 Linux मशीन पर AVX-512 VNNI इंस्ट्रक्शन को टारगेट करके बिल्ड करें।
`bash
gcc -O3 -march=native -mtune=native
-mavx512f -mavx512bw -mavx512vnni -mavx512dq
-fopenmp -funroll-loops -ffast-math
-o colibri_engine colibri_glm52.c -lm
`
Apple Silicon (M सीरीज) एनवायरनमेंट में लाइब्रेरी पाथ को सीधे सेट करके कंपाइल करें।
`bash
clang -O3 -mcpu=native
-march=armv8.4-a+dotprod+fp16
-Xpreprocessor -fopenmp
-I/opt/homebrew/opt/libomp/include
-L/opt/homebrew/opt/libomp/lib -lomp
-o colibri_engine colibri_glm52.c -lm
`
यदि स्ट्रक्चर से संबंधित बिल्ड वार्निंग आती है, तो -std=c11 फ्लैग जोड़कर इसे हल करें।
| प्लेटफॉर्म |
कंपाइलर |
वेक्टर इंस्ट्रक्शन फ्लैग |
थ्रेड पैरेललाइजेशन |
| x86_64 (Linux) |
GCC 12+ |
-mavx512vnni -mavx512bw |
-fopenmp |
| ARM64 (macOS) |
Apple Clang |
-march=armv8.4-a+dotprod |
-Xpreprocessor -fopenmp |
| पुराना x86 |
GCC / Clang |
-mavx2 -mfma |
-fopenmp |
बाहरी SSD बेंचमार्क और असमकालिक I/O कतार विस्तार
colibrì की डिकोडिंग लेटेंसी डिस्क की 1MB यूनिट रैंडम रीड स्पीड द्वारा तय होती है। GLM-5.2 का रूटिंग एक्सपर्ट पैरामीटर फाइल प्रत्येक लगभग 19 MB आकार में विभाजित है, इसलिए जब भी कोई टोकन बनाया जाता है, तो असमकालिक I/O थ्रेड SSD से आवश्यक चंक को पढ़ता है।
fio के माध्यम से स्टोरेज रीड बैंडविड्थ मापना
पैकेज मैनेजर के साथ fio इंस्टॉल करें।
`bash
Linux
sudo apt-get install fio
macOS
brew install fio
`
1MB ब्लॉक साइज और डायरेक्ट I/O (Direct I/O) शर्त के साथ रैंडम रीड बैंडविड्थ मापें।
`bash
fio --name=colibri_stream_bench
--filename=/Volumes/ExternalSSD/glm52_test.tmp
--size=10G
--rw=randread
--bs=1m
--iodepth=32
--numjobs=4
--ioengine=posixaio
--direct=1
--group_reporting
--runtime=60
`
Thunderbolt 4 या USB4 (40 Gbps) इंटरफेस वास्तविक मापी गई बैंडविड्थ 2,8003,200 MB/s बनाए रखते हैं और 0.080.10 tok/s डिकोडिंग स्पीड देते हैं। इसके विपरीत, यदि बाहरी ड्राइव को USB 3.2 Gen2 (10 Gbps) पोर्ट से जोड़ा जाता है जिसकी बैंडविड्थ केवल 900~1,050 MB/s है, तो 100 टोकन निकालने में 80 मिनट से अधिक का समय लगता है।
`
+-------------------------------------------------------------------------+
| colibrì C Inference Engine |
| +--------------------------+ +-------------------------------------+ |
| | Dense Weights (9.9 GiB) | | Multi-Token Prediction (MTP) Head | |
| | Resident in RAM (mlock) | | int8 Quantized | |
| +------------+-------------+ +------------------+------------------+ |
+---------------+-----------------------------------+---------------------+
| |
v v
+-------------------------------------------------------------------------+
| Memory & Storage I/O Layer |
| +--------------------------+ +-------------------------------------+ |
| | Async Expert Readahead | | 21,504 Routed Experts (370 GB) | |
| | I/O Queue Depth 3264 | | Streamed from NVMe SSD via mmap | |
| +--------------------------+ +-------------------------------------+ |
+-------------------------------------------------------------------------+
`
असमकालिक प्रीफैच (Async Expert Readahead) की I/O कतार गहराई (iodepth) को 32~64 स्तर तक बढ़ाने से NVMe कंट्रोलर के समानांतर चैनलों का पूरी तरह से उपयोग किया जा सकता है और डिस्क प्रतीक्षा लेटेंसी को कम किया जा सकता है।
कर्नल वर्चुअल मेमोरी और OOM रोकथाम सेटिंग्स
32 GB RAM सिस्टम पर 9.9 GiB के रेजिडेंट वेट्स, KV कैशे और फाइल सिस्टम पेज कैशे एक साथ लोड होने पर कर्नल मेमोरी कॉन्फ्लिक्ट होता है। डिफ़ॉल्ट लिनक्स सेटिंग्स में, 370 GB आकार के mmap कॉल के दौरान वर्चुअल एड्रेस स्पेस एलोकेशन ब्लॉक हो जाता है या OOM किलर इंजन को बंद कर देता है।
Linux कर्नल पैरामीटर लागू करना
/etc/sysctl.d/99-colibri-memory.conf फाइल बनाएं और नीचे दी गई सामग्री दर्ज करें।
`ini
रेजिडेंट मेमोरी के डिस्क स्वैप रिलीज को रोकना
pm.swappiness = 1
वर्चुअल मेमोरी ओवरकमिट की अनुमति देना
pm.overcommit_memory = 1
इमरजेंसी बफर मेमोरी स्पेस सुरक्षित करना (2GB)
pm.min_free_kbytes = 2097152
डिस्क फाइल कैशे रिटेंशन रेट बढ़ाना
pm.vfs_cache_pressure = 50
mmap मैपिंग काउंट लिमिट का विस्तार
pm.max_map_count = 524288
`
सेव करने के बाद पैरामीटर्स को तुरंत लागू करें।
`bash
sudo sysctl --system
`
शेल सेशन में मेमोरी लॉक लिमिट को हटाकर रेजिडेंट लेयर के mlock() कॉल की अनुमति दें।
`bash
ulimit -l unlimited
`
| पैरामीटर |
डिफ़ॉल्ट मान |
अनुशंसित मान |
सेटिंग का उद्देश्य |
| vm.swappiness |
60 |
1 |
RAM में फिक्स 9.9 GiB वेट्स को स्वैप एरिया में जाने से रोकना |
| vm.overcommit_memory |
0 |
1 |
370 GB आकार के mmap मैपिंग के दौरान कर्नल मेमोरी रिजेक्शन को रोकना |
| vm.vfs_cache_pressure |
100 |
50 |
फाइल कैशे लाइफटाइम बढ़ाकर बार-बार कॉल होने वाले एक्सपर्ट वेट्स का पुनरुपयोग |
| vm.max_map_count |
65530 |
524288 |
21,504 पैरामीटर फाइल मैपिंग लिमिट को हटाना |
| ulimit -l |
64 (KB) |
unlimited |
Dense लेयर की फिजिकल मेमोरी फिक्स (mlock) अनुमति देना |
macOS एनवायरनमेंट में, यदि खाली मेमोरी समाप्त हो जाती है, तो dynamic_pager पृष्ठभूमि में मेमोरी कॉम्प्रेशन लागू करता है जो CPU उपयोग को प्रभावित करता है। चलने से पहले उच्च उपयोग वाले ऐप्स को बंद कर दिया जाना चाहिए ताकि कॉम्प्रेशन इंजन में प्रवेश करने से रोका जा सके।
CPU कोर पिनिंग और निष्पादन स्क्रिप्ट कॉन्फ़िगरेशन
MoE डिकोडिंग लगातार CPU कैशे और मेमोरी बस का उपयोग करता है। यदि मल्टी-सकेट वर्कस्टेशन में NUMA नोड का गलत उपयोग किया जाता है, तो इंटरकनेक्ट बस बॉटलनैक के कारण टोकन जनरेशन स्पीड आधी हो जाती है।
एकीकृत निष्पादन स्क्रिप्ट लिखना
पहले numactl --hardware के साथ बाहरी NVMe कंट्रोलर से सीधे जुड़े फिजिकल CPU नोड नंबर की जांच करें। इसके बाद एक शेल स्क्रिप्ट लिखें जो हाइपरथ्रेडिंग डुप्लीकेट एलोकेशन से बचे और केवल फिजिकल कोर पर थ्रेड्स को पिन करे।
`bash
#!/usr/bin/env bash
set -euo pipefail
1. कर्नल वर्चुअल मेमोरी सेटिंग्स
sudo sysctl -w vm.swappiness=1 > /dev/null
sudo sysctl -w vm.overcommit_memory=1 > /dev/null
sudo sysctl -w vm.max_map_count=524288 > /dev/null
sudo sysctl -w vm.vfs_cache_pressure=50 > /dev/null
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null
2. मेमोरी लॉक लिमिट हटाना
ulimit -l unlimited
3. OpenMP थ्रेड फिजिकल कोर बाइंडिंग
export OMP_NUM_THREADS=16
export OMP_PROC_BIND=TRUE
export OMP_PLACES=cores
4. NUMA नोड 0 बाइंडिंग निष्पादन
ENGINE_BIN="./colibri_engine"
MODEL_PATH="/mnt/nvme_ext/GLM-5.2-colibri-int4-g64-with-int8-mtp"
exec numactl --physcpubind=0-15 --membind=0
"${ENGINE_BIN}"
--model "${MODEL_PATH}"
--threads "${OMP_NUM_THREADS}"
`
Apple Silicon मैकबुक पर, आपको macOS के QoS डेमन को वर्कर थ्रेड्स को एफिशिएंसी कोर (E-Core) में ले जाने से रोकना होगा। प्राथमिकता को जबरन बढ़ाकर चलाएं।
`bash
sudo nice -n -20 taskpolicy -c default ./colibri_engine --model /Volumes/SSD/glm52_i4
`
इन चार सेटिंग्स को पूरा करने के बाद, आप 32 GB RAM वर्कस्टेशन या मैकबुक पर भी OOM क्रैश के बिना स्थानीय डिस्क स्ट्रीमिंग विधि के माध्यम से 744B MoE मॉडल को stably चला सकते हैं।