വെറും 3.2 GB RAM മാത്രമുള്ള ഒരു ലാപ്ടോപ്പിൽ, C99 ഉം ഒരു NVMe ഡ്രൈവും മാത്രം ഉപയോഗിച്ച് 284 ബില്യൺ പാരാമീറ്ററുകളുള്ള ഒരു ലാംഗ്വേജ് മോഡൽ പ്രവർത്തിപ്പിക്കാൻ എനിക്ക് സാധിച്ചു. മുഴുവൻ 160 GB ചെക്ക്പോയിന്റും മെമ്മറിയിലേക്ക് ലോഡ് ചെയ്യുന്നതിന് പകരം മോഡലിന്റെ എക്സ്പെർട്ട് വെയ്റ്റുകൾ (expert weights) സ്ട്രീം ചെയ്യുക എന്നതായിരുന്നു ഇതിന്റെ രഹസ്യം. ഏറ്റവും വലിയ മിക്സ്ചർ-ഓഫ്-എക്സ്പെർട്ട്സ് (MoE) മോഡലുകൾ പോലും സാധാരണ കമ്പ്യൂട്ടറുകളിൽ പ്രവർത്തിപ്പിക്കാൻ കഴിയുമെന്ന് ഇത് തെളിയിക്കുന്നു.
എന്തുകൊണ്ട് ഇത് പ്രസക്തമാകുന്നു
വലിയ ലാംഗ്വേജ് മോഡലുകൾ (LLMs) കോഡ് ജനറേഷൻ, ഗവേഷണ സഹായം എന്നിവയ്ക്ക് ഉപയോഗിക്കുന്നുണ്ടെങ്കിലും, അവയുടെ വലിപ്പം കാരണം സാധാരണയായി വിലകൂടിയ മൾട്ടി-GPU സെർവറുകളോ അല്ലെങ്കിൽ ഗുണനിലവാരം കുറയ്ക്കുന്ന കനത്ത ക്വാണ്ടൈസേഷനോ (quantisation) ഉപയോഗിക്കേണ്ടി വരുന്നു. കുറച്ച് ജിബി റാം ഉപയോഗിച്ച് ഒരു 284 B-പാരാമീറ്റർ MoE മോഡൽ പ്രവർത്തിപ്പിക്കാൻ കഴിയുമെന്ന് കാണിക്കുന്നത്, ഗുണനിലവാരം കുറയ്ക്കാതെ തന്നെ അത്യാധുനിക മോഡലുകൾ പരീക്ഷിക്കാൻ ഹോബിസ്റ്റുകൾക്കും ചെറുകിട സ്റ്റാർട്ടപ്പുകൾക്കും ബജറ്റ് പരിമിതിയുള്ള ഗവേഷകർക്കും അവസരം നൽകുന്നു.
മോഡലും ഹാർഡ്വെയർ തടസ്സങ്ങളും
DeepSeek-V4-Flash ഓരോ ട്രാൻസ്ഫോർമർ ലെയറിലും 256 എക്സ്പെർട്ടുകളിലായി 284 B പാരാമീറ്ററുകൾ സൂക്ഷിക്കുന്നു. ഇതിന്റെ റ $\text{raw}$ ചെക്ക്പോയിന്റ് ഡിസ്കിൽ ഏകദേശം 160 GB വരും—ഇത് ഒരു സാധാരണ ലാപ്ടോപ്പിലെ 3.2 GB RAM-നെ അപേക്ഷിച്ച് വളരെ വലുതാണ്. പരമ്പരാഗത ഇൻഫറൻസ് പൈപ്പ്ലൈനുകൾ മുഴുവൻ ചെക്ക്പോയിന്റും മെമ്മറിയിലേക്ക് മാപ്പ് ചെയ്യാൻ ശ്രമിക്കുകയും, അത് റാം പരിധി കവിഞ്ഞതിനെത്തുടർന്ന് സിസ്റ്റം ക്രാഷ് ആകുകയും ചെയ്യുന്നു.
എക്സ്പെർട്ട് വെയ്റ്റുകൾ സ്ട്രീം ചെയ്യുക: പ്രധാന ആശയം
MoE ആർക്കിടെക്ചറുകൾ ഓരോ ടോക്കണിനും എക്സ്പെർട്ടുകളുടെ വളരെ ചെറിയൊരു ഭാഗം മാത്രമേ ഉപയോഗിക്കുന്നുള്ളൂ. DeepSeek-V4-Flash-ൽ, ഓരോ ലെയറിലും 256-ൽ നിന്ന് ആറ് എക്സ്പെർട്ടുകളെയാണ് റൂട്ടർ തിരഞ്ഞെടുക്കുന്നത്. ഉപയോഗിക്കാത്ത എക്സ്പെർട്ടുകളെ കണക്കുകൂട്ടലുകൾക്കായി ഉപയോഗിക്കാത്തതിനാൽ, അവ ലോഡ് ചെയ്യുന്നത് ഒഴിവാക്കാൻ ഇൻഫറൻസ് എഞ്ചിന് സാധിക്കും.
ഈ രീതിയിൽ ചെക്ക്പോയിന്റിനെ ഒരു സ്ട്രീമിംഗ് സ്രോതസ്സായി പരിഗണിക്കുന്നു. നിലവിലെ ടോക്കണിന് ഏത് എക്സ്പെർട്ടുകളെയാണ് ആവശ്യമെന്ന് റൂട്ടർ തീരുമാനിക്കുമ്പോൾ, എഞ്ചിൻ ആ വെയ്റ്റ് ബ്ലോക്കുകളെ NVMe ഡ്രൈവിൽ നിന്ന് റാമിലുള്ള ഒരു LRU (least-recently-used) കാഷിലേക്ക് (cache) വലിച്ചെടുക്കുന്നു. കാഷിൽ ആവശ്യത്തിന് സ്ഥലം ഉണ്ടെങ്കിൽ, തുടർച്ചയായ ടോക്കണുകളിൽ ഒരേ എക്സ്പെർട്ടുകളെ തന്നെ വീണ്ടും ഉപയോഗിക്കാൻ സാധിക്കും (cache hits); കാഷ് ചെറുതാണെങ്കിൽ എഞ്ചിൻ കൂടുതൽ തവണ ഡിസ്കിൽ നിന്ന് ഡാറ്റ വായിക്കേണ്ടി വരും. ഇതിന്റെ ഫലമായി, ഫുൾ-പ്രിസിഷൻ വെയ്റ്റുകൾ നിലനിർത്തിക്കൊണ്ടും GPU വേഗത ആവശ്യമില്ലാതെയും, ലാപ്ടോപ്പിന്റെ പരിധിക്കുള്ളിൽ നിന്നുകൊണ്ട് 3.23 GB എന്ന പീക്ക് മെമ്മറി ഉപയോഗം മാത്രം ഇതിന് ആവശ്യമാണ്.
പ്രയോഗത്തിലൂടെ നേടിയ പാഠങ്ങൾ
1. ഒഴുക്കുള്ള ഔട്ട്പുട്ട് ശരിയാണെന്നതിന്റെ തെളിവല്ല ഒരു ബഗ്ഗുള്ള കേർണൽ (kernel) തെറ്റായ വിവരങ്ങൾ നൽകിയാലും അത് ശരിയാണെന്ന് തോന്നുന്ന രീതിയിൽ വാചകങ്ങൾ നിർമ്മിച്ചേക്കാം, പ്രത്യേകിച്ച് മോഡലിന്റെ ഭാഷാ ശൈലികൾ ആ സംഖ്യാപരമായ പിശകുകളെ മറച്ചുവെക്കുമ്പോൾ. അതിനാൽ ഞാൻ ഓരോ 14 നിർണ്ണായക ഓപ്പറേഷനുകളും ഒരു പുതിയ PyTorch റഫറൻസുമായി താരതമ്യം ചെയ്ത് പരിശോധിച്ചു, സംഖ്യാപരമായ വ്യത്യാസം വളരെ കുറവാണെന്ന് ഉറപ്പുവരുത്തി. ഇത് ചെയ്തില്ലായിരുന്നെങ്കിൽ ചെറിയ വ്യതിയാനങ്ങൾ പോലും തിരിച്ചറിയാൻ കഴിയില്ലായിരുന്നു.
2. പരാജയങ്ങൾ പരിശോധനകളെ തെറ്റിദ്ധരിപ്പിച്ചേക്കാം മെമ്മറി കറപ്ഷൻ ബഗ് കാരണം റൂട്ടിംഗ് ഓപ്ഷനുകൾ കുറച്ച് എക്സ്പെർട്ടുകളിൽ മാത്രം ഒതുങ്ങിപ്പോയി, ഇത് കാഷ്-ഹിറ്റ് റേറ്റ് 52%-ൽ നിന്ന് 95%-ലേക്ക് ഉയർത്തുകയും വേഗത വർദ്ധിച്ചതായി തോന്നിപ്പിക്കുകയും ചെയ്തു. ടെസ്റ്റ് സ്യൂട്ട് ഒരേ ബഗ്ഗുള്ള കോഡിന്റെ രണ്ട് പതിപ്പുകൾ തമ്മിലാണ് താരതമ്യം ചെയ്തതുകൊണ്ട് ഈ പ്രശ്നം കണ്ടെത്താനായില്ല. ഇതിനുള്ള പരിഹാരം, പ്രൈമറി ഇംപ്ലിമെന്റേഷനുമായി യാതൊരു ബന്ധവുമില്ലാത്ത ഒരു ഇൻഡിപെൻഡന്റ് റഫറൻസ് പാത്ത് (independent reference path) കൂടി ഉൾപ്പെടുത്തുക എന്നതാണ്—അങ്ങനെയാണെങ്കിൽ മാത്രമേ പൊതുവായ പിശകുകൾ ശ്രദ്ധിക്കപ്പെടാതെ പോകില്ലാവൂ.
3. ഒപ്റ്റിമൈസ് ചെയ്യുന്നതിന് മുമ്പ് അളക്കുക ഒരു മെമ്മറി കോപ്പിക്ക് 1 ms സമയമെടുക്കുമെന്ന് ഞാൻ കരുതി അത് ഒപ്റ്റിമൈസ് ചെയ്യാൻ സമയം ചിലവഴിച്ചു. എന്നാൽ പ്രൊഫൈലിംഗ് പരിശോധിച്ചപ്പോൾ ആ ഓപ്പറേഷന് യഥാർത്ഥത്തിൽ 3.6 ms സമയമാണ് എടുക്കുന്നത് എന്ന് മനസ്സിലായി, അതായത് ആകെ ഇൻഫറൻസ് സമയത്തിന്റെ 22%. പാഫോമൻസ് കാര്യങ്ങളിൽ ഒരിക്കലും ഊഹങ്ങളെ മാത്രം ആശ്രയിക്കരുത്; കൃത്യമായ അളവുകോലുകൾ മാത്രമാണ് വിശ്വസനീയമായ മാർഗ്ഗം.
4. താപനില പ്രവർത്തനക്ഷമതയെ ഗണ്യമായി ബാധിക്കുന്നു ചൂടായ ഒരു ലാപ്ടോപ്പിൽ ബെഞ്ച്മാർക്കുകൾ നടത്തുമ്പോൾ തണുത്ത മെഷീനേക്കാൾ മൂന്നിരട്ടി വരെ വേഗത കുറഞ്ഞതായി കാണപ്പെട്ടു. ഉയർന്ന താപനില NVMe ഡ്രൈവിന്റെ ത്രൂപുട്ട് കുറയ്ക്കുകയും CPU പതുക്കെയാക്കുകയും ചെയ്യുന്നു, ഇത് ഫലങ്ങളെ തെറ്റായി സ്വാധീനിക്കുന്നു. അതിനാൽ പെർഫോമൻസ് നമ്പറുകൾ പ്രസിദ്ധീകരിക്കുമ്പോൾ സിസ്റ്റത്തിന്റെ താപനില കൂടി രേഖപ്പെടുത്തുക.
കണക്കുകൾ ഇങ്ങനെയാണ്
- ഡിസ്കിലെ മോഡൽ വലിപ്പം: ~160 GB
- പീക്ക് RAM ഉപയോഗം: 3.23 GB
- ഓരോ ടോക്കണിനും വേണ്ട എക്സ്പെർട്ടുകൾ: 6 (256-ൽ നിന്ന്)
- കാഷ്-ഹിറ്റ് റേറ്റ്: റാം അനുസരിച്ച് മാറുന്നു; 3.2 GB-യിൽ ഇത് വ്യതിയാനം കാണിക്കുന്നു.
- ക്വാണ്ടൈസേഷൻ ഇല്ല: ഫുൾ-പ്രിസിഷൻ വെയ്റ്റുകൾ സ്ട്രീം ചെയ്യുന്നു, ഇത് മോഡലിന്റെ ഗുണനിലവാരം നിലനിർത്തുന്നു.
റാം 3.21 GB-യിൽ താഴെയായാൽ കാഷ് ഒരിക്കലും നിറയില്ല, അതിനാൽ ഓരോ ടോക്കണിനും സ്ട്രീമിംഗ് നടത്തേണ്ടി വരും, ഇത് പെർഫോമൻസിൽ വലിയ കുറവുണ്ടാക്കും.
സോഴ്സ് കോഡ് github.com/ronak-create/deepseek-v4-in-c എന്ന വിലാസത്തിൽ ലഭ്യമാണ്. ഈ പരീക്ഷണം ആവർത്തിക്കാനോ വികസിപ്പിക്കാനോ ആഗ്രഹിക്കുന്നവർക്ക് t.me/GyaanSetuAi എന്ന ചാനലിൽ ചർച്ചകളിൽ പങ്കുചേരാം.
സംഗ്രഹം
ഒരു MoE മോഡൽ യഥാർത്ഥത്തിൽ ഉപയോഗിക്കുന്ന എക്സ്പെർട്ടുകളെ (experts) മാത്രം സ്ട്രീം ചെയ്യുന്നതിലൂടെ, ക്വാണ്ടൈസേഷനോ (quantisation) GPU ആക്സിലറേഷനോ ഇല്ലാതെ തന്നെ 284 ബില്യൺ പാരാമീറ്റർ ഉള്ള ഒരു LLM ഒരു സാധാരണ ലാപ്ടോപ്പിൽ പ്രവർത്തിപ്പിക്കാൻ സാധിക്കും. ബുദ്ധിപരമായ ഡാറ്റാ കൈമാറ്റം, കർശനമായ പരിശോധന, കൃത്യമായ അളവെടുപ്പ് എന്നിവയിലൂടെ, മാറ്റാൻ കഴിയില്ലെന്ന് പലരും കരുതുന്ന ഹാർഡ്വെയർ പരിമിതികളെ മറികടക്കാൻ കഴിയുമെന്ന് ഈ പരീക്ഷണം തെളിയിക്കുന്നു.
