𝗞𝗩 𝗖𝗮𝗰𝗵𝗲 𝗮𝗻𝗱 𝗣𝗮𝗴𝗲𝗱𝗔𝘁𝘁𝗲𝗻𝘁𝗶𝗼𝗻: 𝗪𝗵𝘆 𝗬𝗼𝘂𝗿 𝗟𝗟𝗠 𝗦𝗲𝗿𝘃𝗲𝗿 𝗦𝗹𝗼𝘄𝘀 𝗗𝗼𝘄𝗻

ನಿಮ್ಮ LLM ಸರ್ವರ್ ನಿಧಾನವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದೆ.

ನೀವು ನಾಲ್ಕು A100 GPUಗಳ ಮೇಲೆ 70B ಮಾಡೆಲ್ ಅನ್ನು ನಿಯೋಜಿಸಿದ್ದೀರಿ (deployed). ಬೆಳಿಗ್ಗೆ 8 ಗಂಟೆಗೆ ಎಲ್ಲವೂ ಸರಿಯಾಗಿ ಕಾಣುತ್ತದೆ. ಮಧ್ಯಾಹ್ನದ ವೇಳೆಗೆ, latency (ವಿಳಂಬತೆ) ಎರಡರಷ್ಟು ಹೆಚ್ಚಾಗುತ್ತದೆ. ನೀವು ನಿಮ್ಮ ಮೆಮೊರಿಯನ್ನು ಪರಿಶೀಲಿಸಿದಾಗ, ಹೆಚ್ಚಿನ ಭಾಗವು "tensor buffers"ಗಳಿಂದ ತುಂಬಿರುವುದನ್ನು ಕಾಣುತ್ತೀರಿ. ಇವು ವಾಸ್ತವವಾಗಿ ಹಳೆಯ ಸಂಭಾಷಣೆಗಳ ಕ್ಯಾಶ್ ಮಾಡಲಾದ ಸ್ಥಿತಿಗಳು (cached states).

ಇದು KV cache ಸಮಸ್ಯೆ. ಪ್ರೊಡಕ್ಷನ್ LLM ಸರ್ವಿಂಗ್‌ನಲ್ಲಿ ಇದು ಅತಿದೊಡ್ಡ bottleneck (ಅಡಚಣೆ) ಆಗಿದೆ.

KV cache ಎಂದರೇನು?

ಪ್ರತಿಯೊಂದು transformer ಮಾಡೆಲ್ ಒಂದೊಂದಾಗಿ ಟೋಕನ್‌ಗಳನ್ನು (tokens) ಸೃಷ್ಟಿಸುತ್ತದೆ. ಹೊಸ ಟೋಕನ್ ಅನ್ನು ರಚಿಸಲು, ಮಾಡೆಲ್‌ಗೆ ಹಿಂದಿನ ಎಲ್ಲಾ ಟೋಕನ್‌ಗಳ Key ಮತ್ತು Value tensors ಬೇಕಾಗುತ್ತವೆ. ಇವುಗಳನ್ನು ಪ್ರತಿ ಬಾರಿಯೂ ಮರುಹೊಂದಿಸುವುದು (recomputing) ತುಂಬಾ ನಿಧಾನವಾಗುತ್ತದೆ. ಬದಲಾಗಿ, ಇಂಜಿನ್ ಅವುಗಳನ್ನು ಸಂಗ್ರಹಿಸಿಡುತ್ತದೆ. ಈ ಸಂಗ್ರಹಣೆಯೇ KV cache.

ಮೆಮೊರಿ ಸಮಸ್ಯೆ:

Llama 3.1 70B ಮಾಡೆಲ್‌ಗಾಗಿ, ಒಂದೇ 4096-token ಸೀಕ್ವೆನ್ಸ್ (sequence) ಸುಮಾರು 1.3 GB ಮೆಮೊರಿಯನ್ನು ಅವಲಂಬಿಸುತ್ತದೆ.

ಏಕಕಾಲದಲ್ಲಿ 256 ಬಳಕೆದಾರರಿದ್ದರೆ, ನಿಮಗೆ 336 GB ಮೆಮೊರಿ ಬೇಕಾಗುತ್ತದೆ. ಇದು ನಾಲ್ಕು A100 GPUಗಳ ಸಾಮರ್ಥ್ಯಕ್ಕಿಂತಲೂ ಹೆಚ್ಚಾಗಿದೆ. KV cache ಎಷ್ಟು ವೇಗವಾಗಿ ಬೆಳೆಯುತ್ತದೆ ಎಂದರೆ, ಇದು ಅನೇಕ ಬಾರಿ ಮಾಡೆಲ್ ತೂಕಕ್ಕಿಂತ (model weights) ಹೆಚ್ಚಿನ ಮೆಮೊರಿಯನ್ನು ಬಳಸುತ್ತದೆ.

ಸಾಂಪ್ರದಾಯಿಕ ಮೆಮೊರಿ ನಿರ್ವಹಣೆ (Traditional memory management) ಏಕೆ ವಿಫಲವಾಗುತ್ತದೆ:

  • Internal fragmentation: ನೀವು 4096 ಟೋಕನ್‌ಗಳಿಗಾಗಿ ಸ್ಥಳವನ್ನು ಮೀಸಲಿಡುತ್ತೀರಿ ಆದರೆ ಕೇವಲ 300 ಅನ್ನು ಮಾತ್ರ ಬಳಸುತ್ತೀರಿ. ಇದರಿಂದ ಆ ಸ್ಥಳದ 93% ವ್ಯರ್ಥವಾಗುತ್ತದೆ.
  • No sharing: ಒಂದೇ ಸಿಸ್ಟಮ್ ಪ್ರಾಂಪ್ಟ್ (system prompt) ಹೊಂದಿರುವ ಇಬ್ಬರು ಬಳಕೆದಾರರು ಆ ಪ್ರಾಂಪ್ಟ್‌ನ ತಮ್ಮದೇ ಆದ ಪ್ರತಿಯನ್ನು ಸಂಗ್ರಹಿಸುತ್ತಾರೆ.
  • All-or-nothing eviction: ಮೆಮೊರಿ ಖಾಲಿಯಾದಾಗ, ನೀವು ಇಡೀ ಸೀಕ್ವೆನ್ಸ್ ಅನ್ನು CPU ಗೆ ವರ್ಗಾಯಿಸಬೇಕಾಗುತ್ತದೆ. ಇದು GPU ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸುತ್ತದೆ (stalls).

PagedAttention ಇದನ್ನು ಹೇಗೆ ಸರಿಪಡಿಸುತ್ತದೆ:

PagedAttention ಒಂದು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್‌ನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಇದು KV cache ಅನ್ನು 'pages' ಎಂದು ಕರೆಯಲಾಗುವ ಸಣ್ಣ, ನಿಗದಿತ ಗಾತ್ರದ ಬ್ಲಾಕ್‌ಗಳಾಗಿ ವಿಂಗಡಿಸುತ್ತದೆ.

ಇದು ಮೂರು ಪ್ರಮುಖ ಸಮಸ್ಯೆಗಳನ್ನು ಪರಿಹರಿಸುತ್ತದೆ:

  • On-demand allocation: ಒಂದು ಸೀಕ್ವೆನ್ಸ್ ಬೆಳೆದಂತೆಲ್ಲಾ ಅದು ಪೇಜ್‌ಗಳನ್ನು ಮಾತ್ರ ಬಳಸಿಕೊಳ್ಳುತ್ತದೆ. ಬಳಕೆಯಾಗದ ಸಾಮರ್ಥ್ಯಕ್ಕಾಗಿ ನೀವು ಮೆಮೊರಿಯನ್ನು ವ್ಯರ್ಥ ಮಾಡುವುದಿಲ್ಲ.
  • Shared prefix support: ಅನೇಕ ಬಳಕೆದಾರರು ಸಾಮಾನ್ಯ ಸಿಸ್ಟಮ್ ಪ್ರಾಂಪ್ಟ್‌ಗಾಗಿ ಒಂದೇ ಭೌತಿಕ ಪೇಜ್‌ಗಳನ್ನು (physical pages) ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಇದು ಮೆಮೊರಿಯನ್ನು ಬೃಹತ್ ಪ್ರಮಾಣದಲ್ಲಿ ಉಳಿಸಲು "copy-on-write" ತರ್ಕವನ್ನು (logic) ಬಳಸುತ್ತದೆ.
  • Fine-grained eviction: ಮೆಮೊರಿ ತುಂಬಿದಾಗ, ಸಿಸ್ಟಮ್ ದೊಡ್ಡ ಸೀಕ್ವೆನ್‌ಗಳ ಬದಲಿಗೆ ಸಣ್ಣ ಪೇಜ್‌ಗಳನ್ನು CPU ಗೆ ವರ್ಗಾಯಿಸುತ್ತದೆ.

ಫಲಿತಾಂಶ:

PagedAttention (vLLM ಒಳಗಿರುವ ತಂತ್ರಜ್ಞಾನ) ಬಳಸುವುದರಿಂದ ಸಾಂಪ್ರದಾಯಿಕ ವಿಧಾನಗಳಿಗೆ ಹೋಲಿಸಿದರೆ throughput ಅನ್ನು 2x ರಿಂದ 4x ವರೆಗೆ ಹೆಚ್ಚಿಸಬಹುದು.

ಯಾವಾಗ ಬಳಸಬೇಕು:

  • ಹೆಚ್ಚಿನ ಏಕಕಾಲಿಕ ಬಳಕೆ (High concurrency).
  • ವಿಭಿನ್ನ ಉದ್ದದ ಸೀಕ್ವೆನ್‌ಗಳು.
  • ಒಂದೇ ಆರಂಭವನ್ನು ಹೊಂದಿರುವ ಪ್ರಾಂಪ್ಟ್‌ಗಳು.

ಯಾವಾಗ ಬಳಸಬಾರದು:

  • ಏಕ-ಬಳಕೆದಾರರ ಸ್ಥಳೀಯ ಇನ್ಫರೆನ್ಸ್ (Single-user local inference).
  • ಅತ್ಯಂತ ಸಣ್ಣ ಮಾಡೆಲ್‌ಗಳು.
  • ಪ್ರತಿಯೊಂದು ಸೀಕ್ವೆನ್ಸ್ ಕೂಡ ನಿಖರವಾಗಿ ಒಂದೇ ಉದ್ದವನ್ನು ಹೊಂದಿರುವ ಕಾರ್ಯಗಳು.

KV Cache ಮತ್ತು PagedAttention: ಅವು ಏನು ಮಾಡುತ್ತವೆ ಮತ್ತು ಅವು ಏಕೆ ಮುಖ್ಯ?

Large Language Models (LLMs) ನ ಇನ್ಫರೆನ್ಸ್ (inference) ಪ್ರಕ್ರಿಯೆಯು ಅತ್ಯಂತ ಹೆಚ್ಚು ಕಂಪ್ಯೂಟೇಶನಲ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸುವ ಕೆಲಸವಾಗಿದೆ. ಈ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಹೆಚ್ಚು ವೇಗವಾಗಿ ಮತ್ತು ದಕ್ಷವಾಗಿ ಮಾಡಲು ಎರಡು ಪ್ರಮುಖ ತಂತ್ರಗಳು ಬಹಳ ಮುಖ್ಯವಾಗಿವೆ: KV Cache ಮತ್ತು PagedAttention.

KV Cache ಎಂದರೇನು?

LLMಗಳು ಪಠ್ಯವನ್ನು ಉತ್ಪಾದಿಸುವಾಗ, ಅವು 'auto-regressive' ವಿಧಾನವನ್ನು ಬಳಸುತ್ತವೆ. ಅಂದರೆ, ಒಂದು ಸಮಯದಲ್ಲಿ ಒಂದು ಟೋಕನ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತವೆ ಮತ್ತು ಆ ಟೋಕನ್ ಅನ್ನು ಮುಂದಿನ ಹಂತದ ಇನ್‌ಪುಟ್ ಆಗಿ ಬಳಸುತ್ತವೆ.

Attention mechanism ನಲ್ಲಿ, ಪ್ರತಿಯೊಂದು ಹೊಸ ಟೋಕನ್ ಅನ್ನು ಉತ್ಪಾದಿಸುವಾಗ, ಮಾದರಿಯು ಹಿಂದಿನ ಎಲ್ಲಾ ಟೋಕನ್‌ಗಳ ಮಾಹಿತಿಯನ್ನು ಗಮನಿಸಬೇಕಾಗುತ್ತದೆ. ಈ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ 'Key' (K) ಮತ್ತು 'Value' (V) ಎಂಬ ಎರಡು ವೆಕ್ಟರ್‌ಗಳು (vectors) ಪ್ರಮುಖ ಪಾತ್ರ ವಹಿಸುತ್ತವೆ.

ಪ್ರತಿ ಹಂತದಲ್ಲೂ ಈ K ಮತ್ತು V ವೆಕ್ಟರ್‌ಗಳನ್ನು ಮರು-ಲೆಕ್ಕಾಚಾರ (recompute) ಮಾಡುವುದು ತುಂಬಾ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಇದನ್ನು ತಪ್ಪಿಸಲು, ನಾವು ಹಿಂದಿನ ಟೋಕನ್‌ಗಳ K ಮತ್ತು V ವೆಕ್ಟರ್‌ಗಳನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಿಡುತ್ತೇವೆ. ಇದನ್ನೇ KV Cache ಎಂದು ಕರೆಯಲಾಗುತ್ತದೆ. ಇದು ಇನ್ಫರೆನ್ಸ್ ವೇಗವನ್ನು ಗಣನೀಯವಾಗಿ ಹೆಚ್ಚಿಸುತ್ತದೆ.

KV Cache ನಲ್ಲಿರುವ ಸಮಸ್ಯೆಗಳು

KV Cache ಉಪಯುಕ್ತವಾಗಿದ್ದರೂ, ಇದು ಮೆಮೊರಿ ನಿರ್ವಹಣೆಯಲ್ಲಿ ಕೆಲವು ದೊಡ್ಡ ಸವಾಲುಗಳನ್ನು ಎದುರಿಸುತ್ತದೆ:

  1. ಮೆಮೊರಿ ಫ್ರಾಗ್ಮೆಂಟೇಶನ್ (Memory Fragmentation): KV Cache ಅನ್ನು ಸಂಗ್ರಹಿಸಲು ಮೆಮೊರಿ ಬೇಕು. ಸಾಂಪ್ರದಾಯಿಕ ವಿಧಾನಗಳಲ್ಲಿ, ಈ ಮೆಮೊರಿಯನ್ನು ಸತತವಾಗಿ (contiguous) ಮೀಸಲಿಡಬೇಕಾಗುತ್ತದೆ. ಇದರಿಂದಾಗಿ ಮೆಮೊರಿ ಚೂರುಚೂರಾಗಬಹುದು (fragmentation), ಮತ್ತು ಸಾಕಷ್ಟು ಖಾಲಿ ಜಾಗವಿದ್ದರೂ ಸಹ ದೊಡ್ಡ ಕ್ಯಾಶ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಾಗದಿರಬಹುದು.
  2. ಅತಿಯಾದ ಮೀಸಲಿಡುವಿಕೆ (Over-provisioning): ಮಾದರಿಯು ಎಷ್ಟು ಉದ್ದದ ಪಠ್ಯವನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ ಎಂದು ಮೊದಲೇ ತಿಳಿಯಲು ಸಾಧ್ಯವಿಲ್ಲದ ಕಾರಣ, ನಾವು ಗರಿಷ್ಠ ಉದ್ದಕ್ಕೆ ತಕ್ಕಂತೆ ಮೆಮೊರಿಯನ್ನು ಮೊದಲೇ ಮೀಸಲಿಡಬೇಕಾಗುತ್ತದೆ. ಇದರಿಂದಾಗಿ ಹೆಚ್ಚಿನ ಮೆಮೊರಿ ವ್ಯರ್ಥವಾಗುತ್ತದೆ.

PagedAttention ಎಂದರೇನು?

ಈ ಸಮಸ್ಯೆಗಳನ್ನು ಪರಿಹರಿಸಲು vLLM ತಂಡವು PagedAttention ಎಂಬ ತಂತ್ರವನ್ನು ಪರಿಚಯಿಸಿತು. ಇದು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್‌ಗಳಲ್ಲಿನ 'Virtual Memory' ಮತ್ತು 'Paging' ತಂತ್ರವನ್ನು ಆಧರಿಸಿದೆ.

ಇದು ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ?

PagedAttention ಮೆಮೊರಿಯನ್ನು ಸಣ್ಣ ಸಣ್ಣ 'blocks' ಗೆ ವಿಂಗಡಿಸುತ್ತದೆ. ಈ ಬ್ಲಾಕ್‌ಗಳನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಎಲ್ಲಿ ಬೇಕಾದರೂ (ಅಂದರೆ ಸತತವಾಗಿರಬೇಕೆಂದಿಲ್ಲ) ಸಂಗ್ರಹಿಸಬಹುದು.

  • Non-contiguous Allocation: KV Cache ಅನ್ನು ಮೆಮೊರಿಯ ವಿವಿಧ ಭಾಗಗಳಲ್ಲಿ ಹಂಚಿಡಬಹುದು. ಇದರಿಂದ ಮೆಮೊರಿ ಫ್ರಾಗ್ಮೆಂಟೇಶನ್ ಸಮಸ್ಯೆ ಕಡಿಮೆಯಾಗುತ್ತದೆ.
  • Dynamic Allocation: ಅಗತ್ಯಕ್ಕೆ ತಕ್ಕಂತೆ ಮಾತ್ರ ಮೆಮೊರಿ ಬ್ಲಾಕ್‌ಗಳನ್ನು ನೀಡಲಾಗುತ್ತದೆ, ಇದರಿಂದ ಮೆಮೊರಿ ವ್ಯರ್ಥವಾಗುವುದು ತಪ್ಪುತ್ತದೆ.

ಇದು ಏಕೆ ಮುಖ್ಯ?

PagedAttention ಬಳಸುವುದರಿಂದ:

  • ಹೆಚ್ಚಿನ ಥ್ರೂಪುಟ್ (Higher Throughput): ಒಂದೇ ಸಮಯದಲ್ಲಿ ಹೆಚ್ಚು ಬಳಕೆದಾರರಿಗೆ ಅಥವಾ ಹೆಚ್ಚು ಪ್ರಾಂಪ್ಟ್‌ಗಳಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.
  • ಮೆಮೊರಿ ದಕ್ಷತೆ (Memory Efficiency): ಮೆಮೊರಿಯನ್ನು ಅತ್ಯಂತ ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಬಳಸಬಹುದು, ಇದರಿಂದ ಕಡಿಮೆ ಹಾರ್ಡ್‌ವೇರ್‌ನಲ್ಲಿ ಹೆಚ್ಚು ಕೆಲಸ ಮಾಡಬಹುದು.

ಸಂಕ್ಷಿಪ್ತವಾಗಿ ಹೇಳುವುದಾದರೆ, KV Cache ಇನ್ಫರೆನ್ಸ್ ವೇಗವನ್ನು ಹೆಚ್ಚಿಸಿದರೆ, PagedAttention ಆ ವೇಗವನ್ನು ಮತ್ತು ಮೆಮೊರಿ ಬಳಕೆಯನ್ನು ಅತ್ಯಂತ ದಕ್ಷವಾಗಿ ನಿರ್ವಹಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ.


Optional learning community: https://t.me/GyaanSetuAi