একটি তিন-স্তর বিশিষ্ট প্রায়োরিটি শিডিউলার (priority scheduler) অন-ডিভাইস ল্যাঙ্গুয়েজ-মডেলের ল্যাটেন্সি এক সেকেন্ডের বেশি থেকে কমিয়ে দুই-দশমাংশের নিচে নিয়ে আসে, যার ফলে ফোন ব্যাকগ্রাউন্ডে কাজ করার সময়ও চ্যাট অ্যাপগুলো রেসপন্সিভ থাকে। একটি ৩ বিলিয়ন-প্যারামিটার মডেল চালনা করা Tensor G3 চিপের জন্য তৈরি এই শিডিউলারটি ব্যাকগ্রাউন্ড জবগুলোকে বন্ধ না করেই ল্যাটেন্সি ১,৪২০ ms থেকে কমিয়ে ১৬১ ms-এ নিয়ে আসে।
কেন অন-ডিভাইস LLM-গুলো সমস্যায় পড়ে
একটি মোবাইল প্রসেসরে একটি লার্জ ল্যাঙ্গুয়েজ মডেল চালানো মানে হলো রিসোর্সের ব্যাপক টান। Tensor G3-তে, ৩ B মডেলটি ইতিমধ্যেই নিউরাল-প্রসেসিং ইউনিট (NPU)-এর প্রায় ৮৫% দখল করে নেয়। যখন একটি লো-প্রায়োরিটি টাস্ক—যেমন একটি অফলাইন ইনডেক্সার—ঠিক সেই সময়ে চলে যখন একজন ব্যবহারকারী চ্যাট উইন্ডো খোলেন, তখন অনুভূত রেসপন্স টাইম প্রায় ১৪০ ms থেকে লাফিয়ে ১,৪০০ ms হয়ে যায়, যা ব্যবহারকারীরা তাৎক্ষণিকভাবে একটি দশগুণ ধীরগতি হিসেবে লক্ষ্য করেন।
সমস্যাটি কেবল গতির নয়। মোবাইল ডিভাইসগুলোকে UI-এর সাবলীলতা, ব্যাটারি লাইফ এবং একাধিক অ্যাপের কম্পিউট রিকোয়েস্টের মধ্যে ভারসাম্য বজায় রাখতে হয়। একটি সাধারণ (naïve) কিউ (queue) যা ক্রমানুসারে জব প্রসেস করে, তা UI থ্রেডকে ব্যাকগ্রাউন্ড কাজের জন্য অপেক্ষা করতে বাধ্য করে, যা একটি কথোপকথনমূলক অ্যাসিস্ট্যান্টকে একটি ধীরগতির অভিজ্ঞতায় পরিণত করে।
তিন-স্তর বিশিষ্ট শিডিউলারটি যেভাবে কাজ করে
নতুন শিডিউলারটি ইনফারেন্স পাইপলাইনে (inference pipeline) তিনটি সমন্বিত উপাদান যুক্ত করে:
- Priority Queue – একটি min-heap যা আগত জবগুলোকে একটি স্ট্যাটিক গুরুত্বের স্তর অনুযায়ী সাজায়।
- Preemption Controller – যখন একটি উচ্চ-প্রায়োরিটি রিকোয়েস্ট আসে, এটি লো-প্রায়োরিটি জবগুলোকে বাতিল করার পরিবর্তে সাময়িকভাবে থামিয়ে (pause) দেয়।
- Token Budget Governor – অ্যাপের লাইফসাইকেল স্টেটের ওপর ভিত্তি করে একটি জব কতগুলো টোকেন জেনারেট করতে পারবে তার সীমা নির্ধারণ করে।
একত্রে এগুলো একটি ফোরগ্রাউন্ড চ্যাট রিকোয়েস্টকে লাইনের একেবারে সামনে চলে আসতে সাহায্য করে, যেখানে ব্যাকগ্রাউন্ড জবগুলো একটি 'পার্কড' (parked) অবস্থায় থাকে এবং রিসোর্স খালি হওয়ার সাথে সাথে পুনরায় শুরু হওয়ার জন্য প্রস্তুত থাকে।
প্রায়োরিটি স্তর এবং প্রি-এমপশন (preemption)
চারটি স্তর নির্ধারণ করে কোন কাজগুলো বাধাগ্রস্ত হতে পারে:
| স্তর (Tier) | বর্ণনা |
|---|---|
| Foreground Chat | গুরুত্বপূর্ণ UI ইন্টারঅ্যাকশন |
| Inline Suggestion | অটো-কমপ্লিট স্টাইলের ইঙ্গিত |
| Background Summary | পর্যায়ক্রমিক কন্টেন্ট সামারাইজেশন |
| Offline Indexing | বাল্ক ডেটা প্রসেসিং |
শিডিউলার কখনোই একটি লো-প্রায়োরিটি জব বাতিল করে না। পরিবর্তে, এটি মডেলের কী-ভ্যালু (KV) ক্যাশ—একটি স্ট্রাকচার যা ইন্টারমিডিয়েট অ্যাটেনশন রেজাল্ট ধরে রাখে—এর একটি স্ন্যাপশট নেয় এবং জবটিকে থামিয়ে দেয়। যখন উচ্চ-প্রায়োরিটি রিকোয়েস্টটি শেষ হয়, কন্ট্রোলারটি সেই স্ন্যাপশটটি রিস্টোর করে এবং ব্যাকগ্রাউন্ড টাস্কটিকে ঠিক যেখান থেকে থেমেছিল সেখান থেকে পুনরায় শুরু করতে দেয়। এই “pause-and-resume” পদ্ধতিটি সেই ব্যয়বহুল রিকম্পিউটেশন এড়িয়ে চলে যা জবটি একেবারে শুরু থেকে পুনরায় শুরু করলে হতো।
আংশিক KV-ক্যাশ ইভিকশন (eviction) অপচয় আরও কমিয়ে দেয়। স্ট্যাটিক সিস্টেম প্রম্পটটি ক্যাশে থাকে, আর শুধুমাত্র ডায়নামিক কনভারসেশন টার্নগুলো ইভিক্ট করা হয়। এর ফলে বিরতির পর মডেলটিকে পুনরায় প্রি-ফিল করার খরচ ৪০%-৬০% হ্রাস পায়।
টাইমার ছাড়াই টোকেন বাজেট ম্যানেজ করা
অনেক ইমপ্লিমেন্টেশন একটি জব কখন CPU বা NPU টাইম ছেড়ে দেবে তা অনুমান করার জন্য টাইমারের ওপর নির্ভর করে। টাইমারগুলো খুব একটা নিখুঁত নয়; এগুলো হয় UI-কে বাধাগ্রস্ত করতে পারে অথবা চিপের পূর্ণ ব্যবহার নিশ্চিত করতে পারে না। শিডিউলারটি টাইমারের পরিবর্তে Android-এর ProcessLifecycleOwner ব্যবহার করে, যা লাইফসাইকেল ইভেন্ট প্রদান করে এবং নির্ভরযোগ্যভাবে নির্দেশ করে যে অ্যাপটি ফোরগ্রাউন্ডে নাকি ব্যাকগ্রাউন্ডে আছে।
- ON_RESUME – অ্যাপটি পূর্ণ কম্পিউট বাজেট ফিরে পায়, যা পেন্ডিং ফোরগ্রাউন্ড জবগুলোকে কোনো বাধা ছাড়াই চলতে দেয়।
- ON_STOP – অ্যাপটি ব্যাকগ্রাউন্ড টাস্কগুলোকে তাদের স্বাভাবিক টোকেন বাজেটের প্রায় ২৫%-এ কমিয়ে আনে (throttle), যাতে যেকোনো আকস্মিক UI রিকোয়েস্টের জন্য পর্যাপ্ত জায়গা (headroom) বজায় থাকে।
রিসোর্স বরাদ্দকে লাইফসাইকেল ইভেন্টের সাথে যুক্ত করার মাধ্যমে, সিস্টেমটি যেকোনো এলোমেলো টাইম স্লাইসের পরিবর্তে প্রকৃত ব্যবহারকারীর আচরণের ওপর ভিত্তি করে প্রতিক্রিয়া জানায়।
পারফরম্যান্সের উন্নতি এবং ট্রেড-অফ (trade-offs)
একটি সাধারণ ফার্স্ট-কাম-ফার্স্ট-সার্ভড (first-come-first-served) কিউ-এর অধীনে, একটি ব্যাকগ্রাউন্ড টাস্ক ফোরগ্রাউন্ড চ্যাট ল্যাটেন্সি বাড়িয়ে প্রায় ১,৪২০ ms করে দেয়। প্রায়োরিটি শিডিউলার সক্রিয় থাকলে, একই চ্যাট রিকোয়েস্ট প্রায় ১৬১ ms-এ সম্পন্ন হয়, যা একটি দশগুণ উন্নতি এবং ব্যবহারকারীর অভিজ্ঞতাকে পুনরায় সাবলীল করে তোলে।
একটি থামানো (paused) জব পুনরায় শুরু করলে এর মোট এক্সিকিউশন টাইম প্রায় ২২% বৃদ্ধি পায়। যেহেতু ব্যাকগ্রাউন্ড কাজগুলো ক্রিটিক্যাল নয়, তাই এই ট্রেড-অফটি গ্রহণযোগ্য, বিশেষ করে যখন UI অত্যন্ত দ্রুত বা স্ন্যাপি (snappy) থাকে।
