𝗞𝗩 𝗖𝗮𝗰𝗵𝗲 𝗤𝘂𝗮𝗻𝘁𝗶𝘇𝗮𝘁𝗶𝗼𝗻 𝗳𝗼𝗿 𝗢𝗻-𝗗𝗲𝘃𝗶𝗰𝗲 𝗟𝗟𝗠𝘀

2 GB RAM ഉള്ള ഒരു ആൻഡ്രോയിഡ് ഉപകരണത്തിൽ Llama 3.2 3B പ്രവർത്തിപ്പിക്കുക എന്നത് പ്രയാസകരമാണ്. മിക്ക ഡെവലപ്പർമാരും മോഡൽ വെയ്റ്റുകളിൽ (model weights) ആണ് ശ്രദ്ധ കേന്ദ്രീകരിക്കുന്നത്. ഇത് ഒരു തെറ്റാണ്. യഥാർത്ഥത്തിൽ മെമ്മറി ഉപയോഗം കുത്തനെ കൂട്ടുന്നത് KV cache ആണ്.

നിങ്ങൾ ചാറ്റ് ചെയ്യുന്തോറും KV cache വർദ്ധിച്ചുകൊണ്ടിരിക്കും. നിങ്ങൾ സ്റ്റാൻഡേർഡ് FP16 പ്രിസിഷൻ (precision) ഉപയോഗിക്കുകയാണെങ്കിൽ, കാഷെ നൂറുകണക്കിന് മെഗാബൈറ്റുകൾ ഉപയോഗിക്കും. ഇത് ഏതാനും സംഭാഷണങ്ങൾക്ക് ശേഷം നിങ്ങളുടെ ആപ്പ് ക്രാഷ് ആകാൻ കാരണമാകുന്നു.

മൂന്ന് പ്രത്യേക ഘട്ടങ്ങളിലൂടെ നിങ്ങൾക്ക് ഇത് പരിഹരിക്കാം.

  1. മിക്സഡ്-പ്രിസിഷൻ ക്വാണ്ടൈസേഷൻ (Mixed-Precision Quantization) ഉപയോഗിക്കുക കീകളും (keys) വാല്യൂസും (values) ഒരേ പ്രിസിഷൻ ഉപയോഗിക്കേണ്ടതില്ല. കീ കാഷെകൾ കുറഞ്ഞ പ്രിസിഷൻ നന്നായി കൈകാര്യം ചെയ്യും. എന്നാൽ വാല്യൂ കാഷെകൾ അങ്ങനെയല്ല.

ഈ രീതി നിങ്ങളുടെ കാഷെ സൈസ് 62% കുറയ്ക്കുന്നു. 2048 ടോക്കൺ കോൺടെക്സ്റ്റിന് (context), 224 MB-യിൽ നിന്ന് 84 MB ആയി ഇത് കുറയും. മോഡൽ വെയ്റ്റുകളിൽ മാറ്റം വരുത്താതെ തന്നെ ഇത് സാധ്യമാണ്.

  1. സ്ലൈഡിംഗ് വിൻഡോ ഇവിക്ഷൻ (Sliding Window Eviction) നടപ്പിലാക്കുക എല്ലാ ടോക്കണുകളും ആക്റ്റീവ് മെമ്മറിയിൽ സൂക്ഷിക്കാൻ കഴിയില്ല. ഏറ്റവും പുതിയ 1536 ടോക്കണുകൾ മാത്രം നിലനിർത്താൻ ഒരു സ്ലൈഡിംഗ് വിൻഡോ ഉപയോഗിക്കുക. സിസ്റ്റം പ്രോംപ്റ്റ് നിലനിർത്തുന്നതിനായി ആദ്യത്തെ 64 ടോക്കണുകളെ ആങ്കറുകളായി (anchors) സൂക്ഷിക്കുക.

  2. ഫ്ലാഷ് സ്പില്ലിംഗ് (Flash Spilling) ഉപയോഗിക്കുക ടോക്കണുകൾ സ്ലൈഡിംഗ് വിൻഡോയിൽ നിന്ന് പുറത്തുപോകുമ്പോൾ അവ ഫ്ലാഷ് സ്റ്റോറേജ്‌ലേക്ക് മാറ്റുക. ആൻഡ്രോയിഡിൽ മെമ്മറി-മാപ്പ്ഡ് ഫയലുകൾ (memory-mapped files) ഉപയോഗിക്കുക. ആധുനിക UFS 4.0 സ്റ്റോറേജ് ഈ ഡാറ്റ ലാഗ് ഇല്ലാതെ മെമ്മറിയിലേക്ക് തിരികെ കൊണ്ടുവരാൻ ആവശ്യമായ വേഗതയുള്ളതാണ്.

ഇതിന്റെ ഫലങ്ങൾ വളരെ വലുതാണ്. ഒരു Snapdragon 8 Gen 3-ൽ:

ഈ തെറ്റുകൾ ഒഴിവാക്കുക:

ഫീച്ചറുകൾ നിർമ്മിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ മെമ്മറി ബജറ്റ് തയ്യാറാക്കുക.

Source: https://dev.to/software_mvp-factory/kv-cache-quantization-for-on-device-llms-kf