Three-LLM: اجرای مدل زبانی توی مرورگر با Three.js
خلاصهٔ کاملتر
Three.js رو معمولاً بهعنوان کتابخونهٔ رندر سهبعدی میشناسن، ولی رندرر WebGPUش چیزهای دیگهای هم بیرون میده: storage buffer، دیسپچ محاسباتی، حافظهٔ workgroup، اتمیکها و خوندن نتیجه از GPU. نویسنده میگه پروژهٔ Three-LLM رو ساخته تا ببینه این پشتهٔ محاسباتی رو تا کجا میشه کشید، چون یه مدل زبانی همهٔ اینا رو همزمان لازم داره: صدها دیسپچ پشتسرهم، ضرب ماتریس در بردار، و یه حلقهٔ تنگ بین GPU و جاوااسکریپت به ازای هر توکن.
استفاده ازش از یه WebGPURenderer معمولی شروع میشه و بقیهش دست کتابخونهست:
const renderer = new WebGPURenderer();
await renderer.init();
const runner = await createTSLRunner(
'https://huggingface.co/HuggingFaceTB/SmolLM2-135M/resolve/main/',
);
const result = await runner.generate(renderer, 'Once upon a time,', {
maxNewTokens: 64,
});آدرسی که به createTSLRunner میدی مستقیم مخزن Hugging Face همون مدله. Three-LLM فایل config.json، توکنایزر و وزنهای SafeTensors رو همونجا تو مرورگر میخونه، پس نه مرحلهٔ تبدیل آفلاین لازمه نه یه رانتایم جدا برای هر مدل.
مکانیزم کار اینه که هر عملیات مدل یه کرنل کوچیک TSL (یعنی زبان شیدرنویسی خود Three.js) میشه: TSLLinear برای ضرب ماتریس، TSLAttention برای attention، TSLMLP و TSLGatedMLP برای بلوکهای feed-forward و TSLLogitSampler برای انتخاب توکن روی GPU. یه runner اینها رو طبق «رسپی» هر معماری به هم وصل میکنه و TSL موقع اجرا کد WGSL تولید میکنه، نه اینکه از قبل کامپایل شده باشه.
کنار نسخهٔ GPU، یه پیادهسازی مرجع روی CPU با TypeScript هم هست و خروجی هر پنج مدل بین این دوتا مقایسه میشه. نویسنده میگه این بخش حیاتی بوده، چون یه شیدر میتونه بدون هیچ خطایی اجرا بشه و در عین حال متن نامحسوس اشتباه بده. تفاوت معماریها هم با فلگهای رسپی هندل میشه: SmolLM2 سبک Llama با RMSNorm و RoPE و Grouped-Query Attention و SwiGLU، و Phi-1.5 که شاخهٔ attention و MLP رو موازی از یه ورودی نرمالشده اجرا میکنه.
سنگینترین مورد Qwen3.5 0.8B با پشتهٔ ترکیبیه: به ازای هر لایهٔ attention کامل، سه لایهٔ Gated DeltaNet داره. لایهٔ attention کامل یه KV cache نگه میداره که با طولانیتر شدن متن بزرگتر میشه، ولی DeltaNet بهجاش یه حالت بازگشتی با اندازهٔ ثابت داره، پس مصرف حافظهش با رشد متن بالا نمیره. یه دروازهٔ decay تعیین میکنه چقدر از حالت قبلی زنده بمونه.
از نظر عملی، فایل مدلها از ۱۵ مگابایت تا ۲.۸ گیگابایته، اون هم قبل از اینکه Three-LLM وزنها رو به float 32 بیتی باز کنه. نویسنده توصیه میکنه روی موبایل سراغ TinyStories یا SmolLM2 برید؛ Qwen و Phi اونقدر حافظه میخوان که خیلی از دستگاههای موبایل اصلاً لودشون نمیکنن.
نکات کلیدی:
- پنج چکپوینت آماده: TinyStories GPT-2 3M، GPT-2 124M، SmolLM2 135M، Qwen3.5 0.8B و Phi-1.5 1.3B
- معماریهای شناختهشده: GPT-2، سبک Llama، Gemma 3، Phi و Qwen3.5
- attention روی GPU در چهار مرحله اجرا میشه: نوشتن key/value تو کش، آمادهسازی query، امتیاز مقیاسشدهٔ query-key و در آخر softmax پایدار
- حجم فایل مدلها بین ۱۵ مگابایت تا ۲.۸ گیگابایته، قبل از باز شدن وزنها به float32
- هیچ رانتایم سمت سرور یا باینری WebAssembly مخصوص هر مدل لازم نیست




