<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://thakicloud.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://thakicloud.github.io/" rel="alternate" type="text/html" /><updated>2026-07-15T16:46:06+09:00</updated><id>https://thakicloud.github.io/feed.xml</id><title type="html">Thaki Cloud Tech Blog | ThakiCloud | 다키클라우드 기술 블로그</title><subtitle>Thaki Cloud (ThakiCloud, 다키클라우드, thaki cloud, THAKI CLOUD, ثاكي كلاود)는 AI/ML Engineering, LLMOps, DevOps 분야의 최신 기술과 실무 경험을 공유하는 전문 기술 블로그입니다. 머신러닝 모델 운영, 쿠버네티스, 클라우드 인프라, AI 엔지니어링 커리어, 인공지능 기술 블로그, 다키클라우드 개발 팀의 깊이 있는 인사이트를 제공합니다. مدونة تقنية متخصصة في هندسة الذكاء الاصطناعي والحوسبة السحابية.</subtitle><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><entry xml:lang="ar"><title type="html">تشريح عناقيد GPU وTPU: كيف يحدد الاتصال الجماعي سرعة التدريب الموزع</title><link href="https://thakicloud.github.io/ar/dev/collective-communication-clusters/" rel="alternate" type="text/html" title="تشريح عناقيد GPU وTPU: كيف يحدد الاتصال الجماعي سرعة التدريب الموزع" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ar/dev/collective-communication-clusters</id><content type="html" xml:base="https://thakicloud.github.io/ar/dev/collective-communication-clusters/"><![CDATA[<h2 id="نظرة-عامة">نظرة عامة</h2>

<p>لقد مضى وقت طويل منذ أن كان من الممكن وضع نموذج لغوي كبير على GPU واحد. فالنماذج التي تحتوي على عشرات المليارات إلى تريليونات المعاملات (parameters) تُقسّم على عشرات إلى آلاف المسرّعات (accelerators)، وفي كل خطوة تدريب يجب على هذه المسرّعات أن توائم نتائجها مع بعضها البعض. هذه العملية من “المواءمة المتبادلة” هي بالضبط ما يُعرف بالاتصال الجماعي (collective communication)، والنقطة التي تستهلك الوقت فعلياً في التدريب الموزع الحديث غالباً ما تكون هذا الاتصال وليست عمليات ضرب المصفوفات.</p>

<p>هذا المقال موجّه لمهندسي البنية التحتية الذين يدرّبون أو يقدّمون النماذج على عناقيد GPU أو TPU، ولمن يتحمل مسؤولية تكلفة التقديم (serving) وقابلية التوسع. ننطلق من التحليل المعمّق الشهير الذي كتبه Aleksa Gordić بعنوان “Inside TPU and GPU Clusters: The Anatomy of Collective Communication”، ونعيد التحقق من المفاهيم الأساسية التي يتناولها بالرجوع إلى مراجع قياسية (مثل NCCL وورقة TPU v4).</p>

<p>نبدأ برسالة أساسية موجزة. أولاً، يمكن اختزال أداء التدريب الموزع في عدد قليل من عمليات الاتصال الجماعي. ثانياً، حتى العملية نفسها تختلف تكلفتها اختلافاً جذرياً بحسب البنية الطوبولوجية الفيزيائية التي تعمل عليها (بنية NVIDIA القائمة على المفاتيح switch مقابل بنية Google القائمة على التوروس). ثالثاً، استراتيجية التوازي (parallelism) المُختارة هي التي تحدد أي عملية جماعية تُستدعى ومدى تكرارها. وفهم هذه العناصر الثلاثة يوضح لماذا يؤثر مكان وكيفية توزيع عدد من وحدات GPU تأثيراً كبيراً على الأداء.</p>

<h2 id="ما-هو-الاتصال-الجماعي">ما هو الاتصال الجماعي؟</h2>

<p>العملية الجماعية هي نمط اتصال يشارك فيه عدد من العمليات (غالباً واحدة لكل مسرّع) معاً. فإذا كان الاتصال من نقطة إلى نقطة (P2P) هو أن يرسل طرف واحد بيانات إلى طرف آخر، فإن العملية الجماعية تعني أن المجموعة بأكملها تقسّم البيانات وتجمعها وفق قاعدة محددة. وفيما يلي أبرز العمليات التي تتكرر في التدريب الموزع.</p>

<ul>
  <li><strong>All-reduce</strong>: يقوم جميع المشاركين بجمع (أو أخذ متوسط) التنسور (tensor) الذي يملكه كل منهم عنصراً بعنصر، ثم تُعاد النتيجة إلى الجميع. وهذه هي العملية المستخدمة تحديداً لمواءمة التدرجات (gradients) في التدريب الموازي للبيانات (data parallel).</li>
  <li><strong>Reduce-scatter</strong>: يُحسب المجموع، لكن النتيجة لا يحتفظ بها طرف واحد بالكامل، بل تُقسّم إلى أجزاء يوزَّع كل جزء منها على طرف مختلف.</li>
  <li><strong>All-gather</strong>: تُجمع الأجزاء التي يملكها كل طرف بحيث يحصل الجميع على النسخة الكاملة. وهي العملية المقابلة لـ reduce-scatter، وعند ضمهما معاً ينتج all-reduce.</li>
  <li><strong>All-to-all</strong>: يرسل كل مشارك جزءاً مختلفاً من البيانات إلى كل واحد من المشاركين الآخرين. وهو نمط أقرب إلى النقل المقلوب (transpose)، وهو محوري في تمرير الرموز (tokens) إلى الخبراء (experts) في نماذج مزيج الخبراء (Mixture of Experts, MoE).</li>
  <li><strong>Broadcast / Reduce</strong>: عمليتان أحادّيتا الاتجاه، إما أن يبثّ طرف واحد نفس البيانات للجميع، أو أن تُجمَع بيانات الجميع وتُختزل عند طرف واحد.</li>
</ul>

<p>هناك ملاحظة مهمة هنا وهي أن all-reduce ليست عملية ذرية (atomic) بحد ذاتها. فهي تتحلل إلى <strong>reduce-scatter يليها all-gather</strong>. وهذا التحلل هو الأساس الذي تُبنى عليه معادلة التكلفة التي سنتناولها لاحقاً.</p>

<pre><code class="language-mermaid">flowchart TB
    A["كل مسرّع: تدرج/تنسور محلي"] --&gt; B["Reduce-scatter&lt;br/&gt;توزيع المجموع على شكل أجزاء"]
    B --&gt; C["All-gather&lt;br/&gt;استعادة الأجزاء لدى الجميع"]
    C --&gt; D["اكتمال All-reduce&lt;br/&gt;يمتلك الجميع المجموع نفسه"]
    A --&gt; E["All-to-all&lt;br/&gt;توجيه رموز MoE"]
    A --&gt; F["Broadcast/Reduce&lt;br/&gt;توزيع/تجميع أحادي الاتجاه"]
</code></pre>

<h2 id="البنية-الفيزيائية-لعناقيد-gpu">البنية الفيزيائية لعناقيد GPU</h2>

<p>يسهل فهم عناقيد NVIDIA إذا نظرنا إليها كطبقتين: داخل العقدة (node) الواحدة (scale-up)، وبين العقد (scale-out).</p>

<p>داخل العقدة، تربط <strong>NVLink</strong> و<strong>NVSwitch</strong> وحدات GPU ببعضها بكثافة عالية. فوحدات GPU الثماني مثلاً الموجودة داخل خادم واحد تُربط عبر NVSwitch بشكل شبه متصل بالكامل (fully connected)، بحيث يتواصل أي GPU مع أي GPU آخر بعرض نطاق ترددي (bandwidth) عالٍ وموحّد. وهذا هو سبب حصر الأعمال التي تتطلب اتصالاً متكرراً جداً، مثل التوازي التنسوري (tensor parallelism)، داخل هذا النطاق.</p>

<p>أما بين العقد، فتُستخدم شبكة من نوع ورقة الشجرة السمينة (leaf-spine / fat-tree) مبنية على <strong>InfiniBand</strong> أو <strong>RoCE</strong> (RDMA over Converged Ethernet). وهذه النسيجة الموسّعة (scale-out fabric) تربط وحدات GPU عبر الرفوف (racks) والخوادم. ومن التصاميم الشائعة هنا الطوبولوجيا المحسّنة بالمسارات (rail-optimized)، حيث يُربط منفذ الشبكة (NIC) بنفس الترتيب في كل عقدة بنفس المفتاح (“المسار” أو rail)، بحيث تمر عملية all-reduce بين العقد بأقل قدر ممكن من طبقة العمود الفقري (spine).</p>

<p>وهذه المرونة لها ثمن. فآلاف المفاتيح (switches) اللازمة للتوسع الأفقي (scale-out) تستهلك ما يقارب 5 إلى 10 بالمئة من إجمالي طاقة العنقود [تقديري وقد يختلف بحسب التهيئة]، وتتطلب نفقات رأسمالية كبيرة. أي أن نهج NVIDIA، بدلاً من الاكتفاء بجعل “أي GPU يتواصل جيداً مع أي GPU آخر”، يشتري هذا التجانس عبر مفاتيح تعالج الحزم (packets) بشكل فعّال.</p>

<h2 id="الخيار-المختلف-لعناقيد-tpu">الخيار المختلف لعناقيد TPU</h2>

<p>تسلك Google في وحدات TPU مساراً مختلفاً تماماً. فبدلاً من نسيجة مفاتيح فعّالة، تُربط شرائح TPU مباشرة بجاراتها عبر رابط عالي السرعة مخصص يُسمى <strong>ICI</strong> (Inter-Chip Interconnect). في الجيل الأحدث، تمتد روابط ICI من كل شريحة في ست اتجاهات (X موجب، X سالب، Y موجب، Y سالب، Z موجب، Z سالب) لتشكّل شبكة <strong>توروس ثلاثي الأبعاد (3D torus)</strong> (أما الأجيال الأولى فكانت تستخدم توروس ثنائي الأبعاد لتشكيل “pod” بسعة 256 شريحة). وبما أن الاتصال يتم مباشرة مع الجيران فقط، فإن طبقة المفاتيح تختفي في معظمها.</p>

<p>يبقى سؤال: كيف تُربط الشرائح البعيدة عن بعضها، أو ما هو أكبر من حجم الـ pod؟ هنا يظهر <strong>مفتاح الدارة الضوئية (OCS, Optical Circuit Switch)</strong>. وبحسب ورقة TPU v4 البحثية، يعمل OCS عبر إعادة توجيه ألياف ضوئية باستخدام مرايا MEMS، أي أنه لا يفسّر الإشارة الضوئية بشكل فعّال بل يكتفي بعكسها. وبفضل ذلك يمكن ربط ما يصل إلى 4096 شريحة بطريقة قابلة لإعادة التشكيل، بينما لا يستهلك سوى طاقة قليلة جداً مقارنة بمفاتيح InfiniBand، لأن الطاقة تُستخدم فقط للحفاظ على اتجاه المرايا. كما يمكن لف أحد محاور التوروس ضوئياً، أو إعادة توجيه الطوبولوجيا برمجياً لتجاوز عقدة معطوبة.</p>

<p>باختصار، تستثمر عناقيد GPU في مفاتيح فعّالة من أجل وصول موحّد، بينما تعتمد عناقيد TPU على توروس متصل مباشرة بالجيران مع إعادة تشكيل ضوئية لتوفير الطاقة والتكلفة. ولا يتفوق أي من الخيارين على الآخر بشكل مطلق. فالتوروس مثالي للاتصال مع الجيران لكنه يحتاج قفزات (hops) أكثر للاتصال البعيد العشوائي، بينما نسيجة المفاتيح موحّدة لكنها مكلفة وتستهلك طاقة أكبر.</p>

<h2 id="كيف-تُترجم-العمليات-الجماعية-إلى-استراتيجيات-التوازي">كيف تُترجم العمليات الجماعية إلى استراتيجيات التوازي</h2>

<p>أي عملية جماعية تُستدعى وبأي وتيرة، يتحدد في النهاية بنوع التوازي المُستخدم.</p>

<ul>
  <li><strong>التوازي البياني (Data Parallel, DP)</strong>: تعالج كل نسخة (replica) دفعة (batch) مختلفة، ثم تُوائَم التدرجات عبر <strong>all-reduce</strong>. وحجم الاتصال يتناسب مع حجم النموذج ويحدث مرة واحدة في كل خطوة.</li>
  <li><strong>التوازي البياني الكامل التشظّي (FSDP/ZeRO)</strong>: تُقسّم المعاملات (parameters) إلى أجزاء توزَّع بين المسرّعات، ثم قبل التمرير الأمامي (forward pass) مباشرة تُجمع المعاملات اللازمة عبر <strong>all-gather</strong>، وبعد التمرير الخلفي (backward pass) تُعاد تشظية التدرجات عبر <strong>reduce-scatter</strong>. توفر هذه الطريقة الذاكرة لكنها تزيد من تكرار الاتصال.</li>
  <li><strong>التوازي التنسوري (Tensor Parallel, TP)</strong>: تُقسَّم عملية طبقة واحدة على عدة وحدات GPU، وعند حدود كل طبقة تُدمج النتائج عبر <strong>all-reduce</strong> أو من خلال all-gather/reduce-scatter. والاتصال هنا متكرر للغاية، لذا يكاد يكون حصره داخل نطاق NVLink المذكور سابقاً أمراً ضرورياً.</li>
  <li><strong>التوازي عبر خطوط الأنابيب (Pipeline Parallel, PP)</strong>: يُقسَّم النموذج على مستوى الطبقات وتُوزَّع على وحدات GPU مختلفة، وتُنقل القيم المفعّلة (activations) بين المراحل غالباً عبر اتصال <strong>P2P</strong>. وهنا يسود الاتصال من نقطة إلى نقطة بدلاً من العمليات الجماعية.</li>
  <li><strong>التوازي على مستوى الخبراء (Expert Parallel, EP/MoE)</strong>: يجب إرسال الرموز (tokens) إلى المسرّع الذي يستضيف الخبير المعني، لذا فإن <strong>all-to-all</strong> هو جوهر هذا النوع. وعدد أزواج الاتصال في all-to-all يزداد تربيعياً مع زيادة عدد المشاركين، ما يجعله حساساً بشكل خاص للطوبولوجيا.</li>
</ul>

<p>في الممارسة العملية تُستخدم هذه الأنواع مجتمعة. فمثلاً يُصمَّم التوزيع بحيث يُوضع TP داخل نطاق NVLink في العقدة الواحدة، وتُنقل عمليات all-reduce الخاصة بـ DP عبر InfiniBand بين العقد، ويربط PP بين هذه الأجزاء. وإذا أُسيء التوزيع، فقد يتسرب اتصال التوازي التنسوري المتكرر إلى رابط أبطأ بين العقد، مما يبطئ التدريب بأكمله.</p>

<h2 id="القاعدة-التي-تحكم-الأداء-الحلقة-والشجرة">القاعدة التي تحكم الأداء: الحلقة والشجرة</h2>

<p>توجد خوارزميات متعددة لتنفيذ العمليات الجماعية فعلياً، لكن الأشهر من منظور عرض النطاق الترددي هي <strong>all-reduce الحلقي (ring all-reduce)</strong>. حيث يُربط المشاركون في شكل دائري واحد، وفي كل خطوة يُرسل كل طرف جزءه إلى الجار التالي، وتُنفَّذ عمليتا reduce-scatter وall-gather كل منهما عبر N-1 خطوة.</p>

<p>ومن المعروف أن إجمالي حجم البيانات التي يحملها كل رابط يُحسب تقريباً على النحو التالي. عند تنفيذ all-reduce لتنسور بحجم S عبر N مشارك، تكون حركة المرور لكل رابط تقريباً</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2 × (N − 1) / N × S
</code></pre></div></div>

<p>وذلك لأن (N−1)/N × S تتدفق في مرحلة reduce-scatter، ومثلها مرة أخرى في مرحلة all-gather. والخاصية المهمة هنا أن (N−1)/N تقترب من 1 كلما كبر N، أي أن حركة المرور لكل رابط تستقر عند نحو 2S تقريباً. لهذا السبب يُوصف ring all-reduce بأنه أمثل من حيث عرض النطاق الترددي (bandwidth-optimal)، وهو ما استخدمته مكتبات مثل NCCL وGloo لفترة طويلة.</p>

<p>المشكلة تكمن في زمن الوصول (latency). فالحلقة تمر عبر N−1 خطوة بشكل متسلسل، لذا فإن زمن الوصول الثابت (α) المرتبط بكل خطوة يتراكم بما يتناسب مع عدد المشاركين. فإذا نفّذت أعداد كبيرة جداً من العقد عملية all-reduce على تنسور صغير، يتبقى عرض النطاق الترددي فائضاً بينما يصبح زمن الوصول هو عنق الزجاجة. لهذا السبب تختار المكتبات الفعلية تلقائياً بين خوارزميات الحلقة والشجرة (أو الهرمية) بحسب حجم التنسور وعدد العقد. فطريقة الشجرة تقلّل زمن الوصول ليقترب من log(N)، لكنها تتنازل عن جزء من كفاءة عرض النطاق الترددي. وهذا هو سبب اختيار NCCL خوارزميات مختلفة بحسب حجم الرسالة.</p>

<p>والدلالة العملية لهذه القاعدة واضحة: عند تغيير حجم الدفعة (batch)، أو حجم النموذج، أو عدد العقد، ينتقل عنق الزجاجة المهيمن بين عرض النطاق الترددي وزمن الوصول. ولهذا لا يمكن الافتراض، من دون قياس فعلي، أن “مضاعفة عدد العقد يعني مضاعفة السرعة”.</p>

<h2 id="دلالات-تطبيقية-على-منتجات-thakicloud">دلالات تطبيقية على منتجات ThakiCloud</h2>

<p>هذا الموضوع يلامس جوهر البنية التحتية، وهو ذو أهمية عملية خاصة من منظور <strong>ai-platform</strong> التابعة لـ ThakiCloud (بنية تحتية لـ AI/ML كخدمة SaaS قائمة على K8s).</p>

<p>أولاً، <strong>الجدولة الواعية بالطوبولوجيا (topology-aware scheduling)</strong>. تستخدم ai-platform أداة Kueue لجدولة أعباء عمل GPU، ومبدأ التوزيع الذي يضع مهام التوازي التنسوري داخل نطاق NVLink نفسه (أي العقدة نفسها)، ويوجّه عمليات all-reduce الخاصة بالتوازي البياني عبر روابط بين العقد محسّنة بالمسارات (rail-optimized)، يتطابق تماماً مع خصائص الاتصال الجماعي التي عرضناها في هذا المقال. فمعرفة أي عملية جماعية تسري عبر أي رابط هي ما يجعل توزيع المهام يُترجَم فعلياً إلى أداء.</p>

<p>ثانياً، <strong>التوازي التنسوري في التقديم (serving)</strong>. عند تقديم نموذج كبير عبر عدة وحدات GPU بتوازٍ تنسوري باستخدام محرّك مثل vLLM، تحدث عملية all-reduce في كل طبقة. وإذا وُزِّعت الحاويات (pods) بحيث يبقى هذا الاتصال داخل نطاق NVLink، يسهل الحفاظ على هدف زمن الوصول، أما إذا تجاوز حدود العقدة فإن زمن الوصول لكل رمز (token) يزداد بشكل ملحوظ. وفي بيئة متعددة المستأجرين (multi-tenant)، ينعكس هذا الانضباط في التوزيع مباشرة على تكلفة التقديم واتفاقيات مستوى الخدمة (SLA).</p>

<p>ثالثاً، <strong>جدوى التكلفة في السحابة المحلية والسيادية (on-prem/sovereign cloud)</strong>. حقيقة أن مفاتيح شبكة GPU تستهلك حصة كبيرة من الطاقة تعني أنه عند تصميم عنقود في بيئة داخلية أو سيادية محلية، لا تُعد الشبكة عنصراً ثانوياً، بل متغيراً محورياً في إجمالي تكلفة الملكية (TCO). والاستضافة الذاتية (self-hosting) وكفاءة التكلفة التي تسعى إليها ThakiCloud لا تقوم إلا على قرارات تصميم شبكي من هذا النوع.</p>

<p>وهناك أيضاً نقطة تقاطع مع منتج تنسيق الوكلاء (agent orchestration) <strong>Paxis</strong>. ففي سياق تنسيق مهام التدريب الموزع والاستدلال (inference) الكبير عبر رسم بياني موجّه غير دوري (DAG) وتنفيذها بعزل، فإن فهم البروفايل الاتصالي لكل عملية جماعية تستدعيها كل مرحلة يتيح تصميماً أدق لحجز الموارد وبوابات السياسات. لكن ثقل هذا المقال ينصبّ على طبقة البنية التحتية، لذا يبقى منظور ai-platform هو المحور الرئيسي.</p>

<h2 id="القيود-والاعتراضات">القيود والاعتراضات</h2>

<p>هذا الطرح ليس بلا اعتراضات. أولاً، توفّر أطر العمل تجريداً (abstraction) كبيراً للعمليات الجماعية. فعند استخدام واجهات برمجة عليا مثل PyTorch أو JAX، تتم معظم قرارات التوزيع تلقائياً داخل المكتبة والمجدول (scheduler)، ولا يحتاج مطوّر التطبيق لمعرفة هذه التفاصيل. وعليه، فإن السؤال “هل يجب على كل فريق أن يعرف معادلات التوروس والحلقة؟” يكون جوابه أقرب إلى لا.</p>

<p>غير أن هذا التجريد ينهار في اللحظة التي يصبح فيها الأداء مشكلة. فعندما يكون التدريب أبطأ من المتوقع أو يتذبذب زمن وصول التقديم، فإن إيجاد السبب يتطلب في النهاية معرفة أي عملية جماعية تسري عبر أي رابط. فالتجريد مريح على المسار الطبيعي، لكنه يتحول إلى تجريد “متسرّب” (leaky abstraction) عند تشخيص عنق الزجاجة.</p>

<p>كما أن القواعد التي عرضها هذا المقال تتغير باستمرار مع كل جيل من الأجهزة. فعرض النطاق الترددي لـ NVLink وInfiniBand، وعدد روابط ICI في TPU، وحجم OCS، تختلف من جيل إلى آخر، لذا يجب دائماً التحقق من الأرقام الدقيقة عبر المصادر الرسمية الخاصة بكل جيل. توفر معادلات هذا المقال وبنيته إطاراً للتفكير، لكن القرار الإنتاجي يجب أن يُحسم عبر قياسات فعلية (benchmark). وأخيراً، تبقى الفجوة بين البرمجيات والأجهزة واقعاً قائماً، فحتى الطوبولوجيا المثلى نظرياً تصبح عديمة الجدوى إذا لم تستطع النواة (kernel) ومكتبة الاتصال استغلالها بالكامل.</p>

<h2 id="المصادر">المصادر</h2>

<ul>
  <li>Aleksa Gordić، “Inside TPU and GPU Clusters: The Anatomy of Collective Communication”: https://www.aleksagordic.com/blog/collective-operations</li>
  <li>وثائق NVIDIA NCCL ونموذج تكلفة اتصال ring all-reduce (reduce-scatter + all-gather، الأمثلية من حيث عرض النطاق الترددي)</li>
  <li>ورقة Google TPU v4 البحثية، “TPU v4: An Optically Reconfigurable Supercomputer for Machine Learning with Hardware Support for Embeddings” (توروس ICI ثلاثي الأبعاد، OCS): https://arxiv.org/abs/2304.01433</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="dev" /><category term="dev" /><category term="distributed-training" /><category term="gpu" /><category term="tpu" /><category term="nccl" /><category term="nvlink" /><category term="infiniband" /><category term="kubernetes" /><category term="self-hosting" /><category term="paxis" /><summary type="html"><![CDATA[عند تدريب أو تقديم نموذج كبير موزّع على عدة مسرّعات، لا تكون عملية الحساب هي عنق الزجاجة الحقيقي، بل البيانات المتنقلة بين المسرّعات. يشرح هذا المقال ماهية العمليات الجماعية (collective operations) مثل all-reduce وall-gather وreduce-scatter وall-to-all، وكيف تعمل هذه العمليات فوق بنيتين فيزيائيتين مختلفتين تماماً: عناقيد GPU (عبر NVLink وNVSwitch وInfiniBand) وعناقيد TPU (عبر توروس ICI ثلاثي الأبعاد ومفاتيح الدارة الضوئية). من معادلة تكلفة عرض النطاق الترددي في ring all-reduce إلى العمليات الجماعية التي يستدعيها كل من التوازي البياني والتنسوري وخطوط الأنابيب والتوازي على مستوى الخبراء، يتناول المقال هذه الموضوعات من منظور ThakiCloud القائم على تشغيل بنية تحتية لوحدات GPU.]]></summary></entry><entry xml:lang="ar"><title type="html">نفّذ مرة واحدة واخدم بسرعة vLLM الأصلية: خلفية Transformers تُنهي البناء المزدوج</title><link href="https://thakicloud.github.io/ar/llmops/vllm-transformers-native-speed/" rel="alternate" type="text/html" title="نفّذ مرة واحدة واخدم بسرعة vLLM الأصلية: خلفية Transformers تُنهي البناء المزدوج" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ar/llmops/vllm-transformers-native-speed</id><content type="html" xml:base="https://thakicloud.github.io/ar/llmops/vllm-transformers-native-speed/"><![CDATA[<h2 id="نظرة-عامة">نظرة عامة</h2>

<p>إذا سبق لك أن استضفت نماذج مفتوحة الأوزان ذاتيًا، فأنت تعرف جدارًا مألوفًا. يصدر نموذج رائع، لكن لخدمته بسرعة فعليًا عليك الانتظار حتى يدعم محرك الخدمة تلك البنية. البنية الجديدة التي تصل إلى مكتبة Transformers قابلة للاستخدام فورًا للتدريب والبحث، لكن لبلوغ السرعة الكاملة في محرك استدلال عالي الأداء مثل vLLM كان على أحدهم إعادة تنفيذ تلك البنية من الصفر داخل vLLM. أي أنك تبني النموذج نفسه مرتين عمليًا.</p>

<p>هذا المقال موجّه لقادة الهندسة المسؤولين عن كلفة الاستدلال وزمن الخدمة، وللممارسين الذين يشغّلون نماذج مفتوحة الأوزان محليًا أو في بيئات سيادية، ولعلماء البيانات الذين يجرّبون بنى جديدة مع القلق بشأن سرعة النشر. في يوليو 2026، شارك Clement Delangue من Hugging Face نقطة تحوّل كبيرة للاستدلال مفتوح المصدر: بدءًا من vLLM v0.25.0، يمكن تشغيل نماذج Transformers داخل vLLM <strong>بالسرعة الأصلية</strong>، وغالبًا بما يضاهي التطبيقات المكتوبة يدويًا أو يتفوق عليها.</p>

<p>الفكرة الجوهرية هي التالية. بمجرد أن ينفّذ مؤلف النموذج بنية في Transformers، يمكنه الاستفادة من كومة الاستدلال المُحسّنة في vLLM مجانًا، دون أي عمل نقل منفصل. لم نأخذ هذا الادعاء تسليمًا. أعدنا إنتاج خطوة تحليل الرسم التي تنفّذها الخلفية داخليًا على كتلة مُفكّك صغيرة وقِسناها. يشرح هذا المقال الآلية وقياساتنا وما تعنيه لبنية تحتية تخدم نماذج مختلفة كثيرة تحت سقف واحد متعدد المستأجرين.</p>

<h2 id="ما-هذه-التقنية">ما هذه التقنية</h2>

<p>براية واحدة هي <code class="language-plaintext highlighter-rouge">--model-impl transformers</code>، يُحمّل vLLM تعريف النموذج مباشرة من مكتبة Transformers بدلًا من تطبيق منقول مخصص، ويخدمه. ظاهريًا يبدو ذلك طبقة توافق، لكن ما يميّز خلفية v0.25.0 هو أن هذا التوافق لم يعد يكلّف سرعة. كان مسار التوافق القديم أقرب إلى بديل «يعمل لكنه بطيء». أما الآن فتُطبَّق عمليات دمج الطبقات الخاصة بالاستدلال ديناميكيًا في وقت التشغيل، فتضاهي الخلفية سرعة الشيفرة المخصصة للبنى المتوافقة.</p>

<p>بالنظر عن قرب، تنقسم الآلية إلى مرحلتين. أولًا تستخدم الخلفية <code class="language-plaintext highlighter-rouge">torch.fx</code> لتحليل رسم حسابات النموذج بشكل ثابت، بحثًا عن أنماط قابلة للتحسين مثل حساب درجات الانتباه، وتطبيع RMSNorm، وطبقات SwiGLU MLP، ومزيج الخبراء Mixture-of-Experts. ثم تعالج شجرة الصياغة المجردة لإعادة كتابة تلك الشيفرة في مكانها، وتربط العمليات المكتشفة بنوى vLLM المُحسّنة. في نموذج MoE يعني ذلك نوى Expert Parallelization، وفي الانتباه عائلة paged attention. في النهاية، يُحسّن vLLM الإنتاجية وزمن الاستجابة فوق البنية التي عبّر عنها Transformers.</p>

<pre><code class="language-mermaid">flowchart TB
    A[بنية نموذج جديدة] --&gt; B[تُنفَّذ مرة واحدة في Transformers&lt;br/&gt;للتدريب والبحث]
    B --&gt; C{كيف تُخدَم في vLLM}
    C --&gt;|سابقًا| D[إعادة تنفيذ في vLLM&lt;br/&gt;نقل يدوي لنوى مخصصة]
    C --&gt;|الآن: model-impl transformers| E[تحليل رسم ثابت عبر torch.fx]
    E --&gt; F[كشف أنماط معروفة&lt;br/&gt;الانتباه، RMSNorm، SwiGLU، MoE]
    F --&gt; G[إعادة كتابة المصدر عبر ast&lt;br/&gt;دمج طبقات في وقت التشغيل]
    G --&gt; H[الربط بنوى vLLM المُحسّنة&lt;br/&gt;EP و paged attention]
    H --&gt; I[استدلال بالسرعة الأصلية&lt;br/&gt;من 4B إلى 235B، مضاهاة أو تفوّق]
    D --&gt; I
</code></pre>

<p>المعنى العملي لهذا التحول هو اختفاء الفجوة بين محرك الخدمة ومنظومة النماذج. سابقًا كانت كل بنية جديدة تتطلب قاعدتَي شيفرة، تطبيقًا للتدريب وتطبيقًا للاستدلال، وكانت الفجوة بينهما هي بالضبط نافذة «النموذج الرائع صدر لكن لا نستطيع خدمته بسرعة بعد». الآن تضيق هذه النافذة. سواء كنت فريق بحث يجرّب بنية مخصصة أو فريق تشغيل يحاول وضع نموذج صدر حديثًا في الإنتاج، يمنحك تطبيق Transformers واحد سرعة vLLM.</p>

<h2 id="التثبيت-والتكامل">التثبيت والتكامل</h2>

<p>هذه الخلفية ليست حزمة منفصلة؛ إنها تأتي داخل vLLM نفسه. ثبّت vLLM v0.25.0 أو أحدث وأضف <code class="language-plaintext highlighter-rouge">--model-impl transformers</code> إلى أمر الخدمة. الأمثلة الحقيقية التي نشرتها Hugging Face كالتالي.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># وحدة معالجة رسومات واحدة، نموذج كثيف</span>
vllm serve Qwen/Qwen3-4B <span class="nt">--model-impl</span> transformers

<span class="c"># توازٍ موتّري عبر وحدتَين، نموذج كثيف كبير</span>
vllm serve Qwen/Qwen3-32B <span class="se">\</span>
  <span class="nt">--model-impl</span> transformers <span class="se">\</span>
  <span class="nt">--tensor-parallel-size</span> 2

<span class="c"># توازي بيانات مع توازي خبراء، نموذج MoE</span>
vllm serve Qwen/Qwen3-235B-A22B-FP8 <span class="se">\</span>
  <span class="nt">--model-impl</span> transformers <span class="se">\</span>
  <span class="nt">--data-parallel-size</span> 8 <span class="se">\</span>
  <span class="nt">--enable-expert-parallel</span>
</code></pre></div></div>

<p>ويعمل الأمر نفسه من واجهة Python للاستدلال دون اتصال.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">vllm</span> <span class="kn">import</span> <span class="n">LLM</span><span class="p">,</span> <span class="n">SamplingParams</span>

<span class="n">llm</span> <span class="o">=</span> <span class="nc">LLM</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="sh">"</span><span class="s">Qwen/Qwen3-4B</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">model_impl</span><span class="o">=</span><span class="sh">"</span><span class="s">transformers</span><span class="sh">"</span><span class="p">,</span>   <span class="c1"># استخدام تعريف Transformers بدل نقل مخصص
</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">llm</span><span class="p">.</span><span class="nf">generate</span><span class="p">(</span>
    <span class="p">[</span><span class="sh">"</span><span class="s">كيف تخدم ThakiCloud النماذج مفتوحة الأوزان؟</span><span class="sh">"</span><span class="p">],</span>
    <span class="nc">SamplingParams</span><span class="p">(</span><span class="n">max_tokens</span><span class="o">=</span><span class="mi">256</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.7</span><span class="p">),</span>
<span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">out</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">outputs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">text</span><span class="p">)</span>
</code></pre></div></div>

<p>ما يلفت النظر عبر الأمثلة الثلاثة أن خيارات الخدمة الموزعة مثل التوازي الموتّري وتوازي البيانات وتوازي الخبراء تعمل جميعها تحت خلفية Transformers. أي أنك لا تتخلى عن التوسّع الأفقي مقابل التوافق. من نموذج كثيف بحجم 4B إلى نموذج MoE بحجم 235B، تغطّي براية واحدة ذلك.</p>

<h2 id="نتائج-التجربة-الفعلية">نتائج التجربة الفعلية</h2>

<p>هذه البيئة هي macOS (Apple Silicon)، لذا لا يمكنها تشغيل نوى CUDA الخاصة بـ vLLM، ولم نتمكن من إعادة إنتاج قياس إنتاجية vLLM نفسه. بدلًا من ذلك أعدنا إنتاج <strong>الخطوة الأهم التي تنفّذها الخلفية داخليًا: استخدام torch.fx لتحليل رسم النموذج بشكل ثابت والعثور على أنماط أهداف الدمج</strong>. بنينا مُفكّكًا من أربع طبقات على نمط Llama بلغة PyTorch خالصة، بالبنية نفسها التي تستخدمها نماذج الخدمة الحقيقية (انتباه الاستعلام المجمّع GQA وطبقة SwiGLU MLP)، وتتبّعنا رسمه عبر <code class="language-plaintext highlighter-rouge">torch.fx.symbolic_trace</code>، وصنّفنا العُقد.</p>

<p>كانت القياسات كالتالي. أنتج تتبّع هذا المُفكّك الصغير البالغ 2.902 مليون معامل رسم torch.fx بإجمالي <strong>178 عقدة</strong>. حسب نوع العملية كان هناك 80 استدعاء دالة، و60 استدعاء طريقة، و28 استدعاء وحدة، و8 عمليات جلب سمات. من بين هذه، بلغت الأنماط على مستوى الدوال التي تستطيع الخلفية استبدالها فورًا بنوى دمج 16 عملية اختزال RMSNorm، و8 عمليات ضرب مصفوفات متعلقة بالانتباه، و4 عمليات softmax، و4 تفعيلات SwiGLU، أي 32 إجمالًا، إضافة إلى 28 استدعاء وحدة تحمل إسقاطات QKV والإخراج وطبقة MLP والتطبيع. بلغ زمن التمرير الأمامي عند طول تسلسل 64 في المتوسط 1.4 ملّي ثانية، مقيسًا على torch 2.13.0.</p>

<p><img src="/assets/images/vllm-transformers-native-speed-results.png" alt="مخطط أعمدة يوضح توزيع عُقد أهداف الدمج في رسم torch.fx" /></p>

<p>ما تُظهره هذه الأرقام واضح. حتى في كتلة صغيرة واحدة من 178 عقدة، تتكرر أنماط جيدة التكوين من الانتباه والتطبيع وتفعيل MLP، وهذه بالضبط النقاط التي تستهدفها الخلفية لاستبدالها بنوى vLLM. في نموذج حقيقي بعشرات الطبقات يتضاعف هذا النمط بعدد الطبقات، فيتيح تحليل رسم واحد للخلفية دمج عمليات الاختناق عبر النموذج كله دفعة واحدة. وفق Hugging Face، أتاح هذا النهج لخلفية Transformers مضاهاة إنتاجية vLLM الأصلية أو التفوّق عليها من 4B إلى 235B، شاملًا إعدادات التوازي الموتّري وMoE. لم تُعد تجربتنا إنتاج تلك الأرقام؛ بل أكّدت بالقياس <strong>الهيكل العظمي للآلية</strong> التي تنتجها.</p>

<h2 id="دلالات-لـ-thakicloud">دلالات لـ ThakiCloud</h2>

<p><strong>ai-platform</strong> من ThakiCloud هي بنية تحتية متعددة المستأجرين للذكاء الاصطناعي وتعلّم الآلة تخدم النماذج لبيئات عملاء متنوعة فوق K8s وجدولة GPU المستندة إلى Kueue. هذه الخلفية فائدة مباشرة لمشغّل خدمة مثلنا. أولًا، <strong>يتقلّص زمن إدخال النموذج.</strong> عند صدور نموذج جديد مفتوح الأوزان، كان علينا حتى الآن انتظار دعم vLLM الرسمي لتلك البنية أو قبول نقل ذاتي. إذا وُجد تطبيق Transformers، تتيح لنا <code class="language-plaintext highlighter-rouge">--model-impl transformers</code> تشغيل حجيرة خدمة بسرعة مُحسّنة فورًا. وهذا يؤثر مباشرة في السؤال التنافسي عن سرعة وصول نموذج جديد إلى الإنتاج.</p>

<p>ثانيًا، <strong>يصبح مسار خدمة البنى المخصصة أبسط.</strong> عند خدمة نموذج مضبوط أو معدّل هيكليًا لعميل محدد محليًا، فإن القدرة على النشر من تعريف Transformers وحده، دون نقل مخصص إلى vLLM، تقلّل عبء الصيانة كثيرًا. في بيئات السحابة السيادية أو المنظّمة التي تتطلب الاستضافة الذاتية، نوفّر الوقت المُنفَق في التوفيق بين إصدارات المحرك والنموذج. وبما أن التوازي الموتّري وتوازي البيانات وتوازي الخبراء يعمل كله، يمكننا تبنّي هذا المسار دون تغيير طوبولوجيات الخدمة متعددة الـGPU التي نشغّلها بالفعل.</p>

<p>من منظور الوكلاء، تنطبق عدسة <strong>Paxis</strong> أيضًا. Paxis هي مستوى تحكّم Agent-Native Cloud يعمل فوق ai-platform، ويبدّل نماذج مختلفة كالأدوات أثناء تشغيل الوكلاء. إذا استطاعت طبقة الخدمة إدخال نماذج جديدة مفتوحة الأوزان أسرع وأرخص، اتّسع مجمع النماذج الذي يمكن للوكلاء فوقها اختياره وانخفضت كلفة التبديل. ولأن الخدمة منخفضة الكلفة وزمن الاستجابة هي في النهاية ما يجعل أحمال الوكلاء اقتصادية، تتجه كفاءة خدمة ai-platform ومرونة وكلاء Paxis في الاتجاه نفسه.</p>

<h2 id="القيود-والاعتراضات">القيود والاعتراضات</h2>

<p>هذه الخلفية ليست حلًّا لكل شيء، وثمة حدود واضحة تستحق الذكر إنصافًا. أولًا، ميزة الأداء محصورة في «البنى المتوافقة». يجب أن يكون النموذج قابلًا للتتبع الثابت عبر torch.fx، وأن يطابق أنماطًا تعرفها الخلفية مسبقًا حتى ينطبق الدمج. البنية ذات تدفق تحكّم ديناميكي كثيف أو عمليات جديدة لم ترها الخلفية سترتد إلى مسارات غير مدموجة في بعض الأجزاء، فتتقلّص ميزة السرعة تبعًا لذلك. ليست كل نماذج Transformers تبلغ السرعة الأصلية تلقائيًا.</p>

<p>ثانيًا، بلغت هذه الميزة النضج في v0.25.0 لكنها لا تزال في تطوّر. لبعض تركيبات التكميم، وبعض متغيرات الانتباه، أو مخططات توجيه MoE النادرة، قد يظل التطبيق المنقول المخصص أكثر استقرارًا أو أسرع. قبل الإنتاج، الأأمن أن تقيس بنفسك الإنتاجية والدقة الفعليتين على نموذجك وعتادك المستهدفين. لهذا السبب بالذات لم نستشهد بأرقام إنتاجية vLLM مباشرة بل نسبناها إلى الإعلان الرسمي؛ فالأرقام تختلف حسب البيئة، والقياس على عنقود GPU الخاص بـ ThakiCloud مخطّط له على حدة.</p>

<p>ثالثًا، ثمة اعتراض ممكن. حين يقترن محرك الخدمة ومكتبة النموذج اقترانًا وثيقًا، قد تؤثر تغييرات Transformers في استقرار الخدمة. في زمن قاعدتَي الشيفرة المنفصلتين كان يمكنك تثبيت كومة الاستدلال باستقلال، لكن مشاركة الخلفية تفرض إعادة التفكير في إدارة الإصدارات. ومع ذلك، موازنةً بكلفة تنفيذ كل نموذج جديد مرتين، نرى أن مكسب سرعة الإدخال من هذا الاقتران أكبر في معظم سيناريوهات الخدمة.</p>

<h2 id="المصادر">المصادر</h2>

<ul>
  <li><a href="https://huggingface.co/blog/native-speed-vllm-transformers-backend">Native-speed vLLM transformers modeling backend (Hugging Face Blog)</a></li>
  <li><a href="https://daily.dev/posts/vllm-v0-25-0-transformers-backend-now-matches-native-vllm-speed-z8kvnsk7c">vLLM v0.25.0: transformers backend now matches native vLLM speed (daily.dev)</a></li>
  <li><a href="https://blog.vllm.ai/2025/04/11/transformers-backend.html">Transformers modeling backend integration in vLLM (vLLM Blog)</a></li>
  <li><a href="https://x.com/ClementDelangue/status/2076763231788339669">Clement Delangue (@ClementDelangue) on X</a></li>
  <li>شيفرة التجربة والسجلات: <code class="language-plaintext highlighter-rouge">outputs/blog-impl/vllm-transformers-native-speed/</code> (إعادة إنتاج تحليل رسم torch.fx، torch 2.13.0، وحدة المعالجة المركزية)</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="llmops" /><category term="vllm" /><category term="transformers" /><category term="inference" /><category term="serving" /><category term="torch-fx" /><category term="llmops" /><category term="self-hosting" /><category term="open-weights" /><category term="paxis" /><summary type="html"><![CDATA[حتى الآن كان يجب بناء كل بنية نموذج مرتين: مرة في Transformers للتدريب والبحث، ومرة أخرى في vLLM للاستدلال الإنتاجي. خلفية Transformers بالسرعة الأصلية في vLLM v0.25.0 تُنهي هذا التكرار. تعمل عبر استخدام torch.fx لتحليل رسم النموذج بشكل ثابت، والعثور على أنماط معروفة مثل الانتباه والتطبيع وطبقات MLP، ثم إعادة توصيلها بنوى vLLM المُحسّنة. أعدنا إنتاج خطوة تحليل الرسم التي تنفّذها الخلفية فعليًا على مُفكّك من أربع طبقات وقِسنا أيًّا من عُقده الـ178 يصبح هدفًا للدمج. ثم ننظر في ما يعنيه ذلك لبنية ThakiCloud التحتية متعددة المستأجرين لخدمة النماذج مفتوحة الأوزان.]]></summary></entry><entry xml:lang="en"><title type="html">The Anatomy of GPU and TPU Clusters: How Collective Communication Determines the Speed of Distributed Training</title><link href="https://thakicloud.github.io/en/dev/collective-communication-clusters/" rel="alternate" type="text/html" title="The Anatomy of GPU and TPU Clusters: How Collective Communication Determines the Speed of Distributed Training" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/en/dev/collective-communication-clusters</id><content type="html" xml:base="https://thakicloud.github.io/en/dev/collective-communication-clusters/"><![CDATA[<h2 id="overview">Overview</h2>

<p>It has been a while since large language models could fit on a single GPU. Models with tens of billions to trillions of parameters are split across tens or thousands of accelerators, and at every training step those accelerators have to reconcile each other’s results. This “reconciling” process is collective communication, and in most modern distributed training workloads, the thing that actually eats up time isn’t matrix multiplication, it’s this communication.</p>

<p>This post is for infrastructure engineers training or serving models on GPU or TPU clusters, and for anyone responsible for serving cost and scalability. It takes Aleksa Gordic’s widely read deep dive, “Inside TPU and GPU Clusters: The Anatomy of Collective Communication,” as a starting point, and cross-checks the core concepts against standard references (NCCL, the TPU v4 paper, and so on) along the way.</p>

<p>Here’s the headline summary up front. First, the performance of distributed training reduces down to a handful of collective operations. Second, the cost of the same operation changes completely depending on the physical topology it runs on (NVIDIA’s switch-based fabric versus Google’s torus structure). Third, which parallelism strategy you use determines which collectives get called, and how often. Understanding these three points explains why placing a handful of GPUs in a particular arrangement has such an outsized effect on performance.</p>

<h2 id="what-collective-communication-actually-is">What Collective Communication Actually Is</h2>

<p>A collective operation is a communication pattern that multiple processes (typically one per accelerator) participate in together. Where point-to-point (P2P) communication is one process sending to another single process, a collective has the whole group split and merge data according to a shared rule. A few of these show up over and over in distributed training:</p>

<ul>
  <li><strong>All-reduce</strong>: every participant’s tensor is reduced element-wise (summed or averaged), and the result is sent back to everyone. This is the exact operation used to reconcile gradients in data-parallel training.</li>
  <li><strong>Reduce-scatter</strong>: a sum is computed, but instead of one participant holding the whole result, it’s split into chunks that get distributed across participants.</li>
  <li><strong>All-gather</strong>: each participant’s chunk is collected so that everyone ends up with the full set. This is the counterpart to reduce-scatter, and chaining the two together produces an all-reduce.</li>
  <li><strong>All-to-all</strong>: every participant sends a different chunk of data to every other participant. This pattern is close to a transpose, and it’s central to routing tokens to experts in mixture-of-experts (MoE) models.</li>
  <li><strong>Broadcast / Reduce</strong>: one-directional operations where one participant sends the same data to everyone, or everyone’s data is collected and reduced down to one participant.</li>
</ul>

<p>One key insight here is that all-reduce is not an atomic operation. All-reduce decomposes into a <strong>reduce-scatter followed by an all-gather</strong>. This decomposition is the root of the cost formula we’ll get to later.</p>

<pre><code class="language-mermaid">flowchart TB
    A["Each accelerator: local gradient/tensor"] --&gt; B["Reduce-scatter&lt;br/&gt;Sum split into chunks"]
    B --&gt; C["All-gather&lt;br/&gt;Chunks restored to everyone"]
    C --&gt; D["All-reduce complete&lt;br/&gt;Everyone holds the same sum"]
    A --&gt; E["All-to-all&lt;br/&gt;MoE token routing"]
    A --&gt; F["Broadcast/Reduce&lt;br/&gt;One-directional distribute/aggregate"]
</code></pre>

<h2 id="the-physical-structure-of-gpu-clusters">The Physical Structure of GPU Clusters</h2>

<p>It’s easiest to think of an NVIDIA-based cluster as two layers: within a node (scale-up) and between nodes (scale-out).</p>

<p>Within a node, <strong>NVLink</strong> and <strong>NVSwitch</strong> tie the GPUs together tightly. The eight or so GPUs inside a single server are wired through NVSwitch into something close to a full mesh, communicating at uniformly high bandwidth from any GPU to any other. This is exactly why work with extremely frequent communication, like tensor parallelism, gets confined inside this domain.</p>

<p>Between nodes, a leaf-spine (fat-tree) network built on <strong>InfiniBand</strong> or <strong>RoCE</strong> (RDMA over Converged Ethernet) is used. This scale-out fabric connects GPUs across racks and servers. A design that shows up often here is the rail-optimized topology: the same-numbered NIC on each node is attached to the same switch (a “rail”), so that inter-node all-reduce traffic passes through fewer hops at the spine layer.</p>

<p>That flexibility comes at a cost. The thousands of switches a scale-out fabric requires can consume roughly 5 to 10 percent of a cluster’s total power [the estimated range varies by configuration], and they demand significant capital expenditure. In other words, instead of relying on any GPU being able to talk cleanly to any other GPU by default, NVIDIA’s approach buys that uniformity by paying for switches that actively process packets.</p>

<h2 id="tpu-clusters-take-a-different-path">TPU Clusters Take a Different Path</h2>

<p>Google’s TPUs go a completely different route. Rather than an active switching fabric, TPU chips connect directly to their neighbors over a dedicated high-speed link called <strong>ICI (Inter-Chip Interconnect)</strong>. In the latest generation, each chip extends ICI links in six directions, plus and minus X, Y, and Z, forming a <strong>3D torus</strong> lattice (earlier generations used a 2D torus to build pods of 256 chips). Because chips only connect directly to their neighbors, most of the switching layer disappears.</p>

<p>That raises an obvious question: how do you connect chips that are far apart, or scale beyond a single pod? This is where the <strong>optical circuit switch (OCS)</strong> comes in. According to the TPU v4 paper, an OCS reconfigures optical fibers using MEMS mirrors rather than actively interpreting the optical signal, it just reflects it. That lets it reconfigurably connect up to 4096 chips while consuming far less power than an InfiniBand switch, since power is only needed to hold the mirror positions in place. It also allows one axis of the torus to be optically wrapped around, or lets the topology be rewired in software to route around a failed node.</p>

<p>Put simply, GPU clusters invest in active switches to buy uniform access, while TPU clusters lean on a neighbor-direct torus plus optical reconfiguration to save on power and cost. Neither approach is unconditionally superior. A torus is optimal for neighbor-to-neighbor traffic but adds hops for arbitrary long-distance communication, while a switch fabric is uniform but expensive and power-hungry.</p>

<h2 id="how-collectives-map-to-parallelism-strategies">How Collectives Map to Parallelism Strategies</h2>

<p>Which collective gets called, and how often, ultimately comes down to which parallelism strategy is in use.</p>

<ul>
  <li><strong>Data parallelism (DP)</strong>: each replica processes a different batch, then gradients are reconciled with <strong>all-reduce</strong>. Communication volume scales with model size and happens once per step.</li>
  <li><strong>Fully sharded data parallelism (FSDP/ZeRO)</strong>: parameters are sharded and held in pieces, gathered with <strong>all-gather</strong> right before the forward pass, and split back apart with <strong>reduce-scatter</strong> after the backward pass. It saves memory at the cost of more frequent communication.</li>
  <li><strong>Tensor parallelism (TP)</strong>: a single layer’s computation is split across multiple GPUs, and the results are merged at each layer boundary with <strong>all-reduce</strong> or all-gather/reduce-scatter. Communication is extremely frequent, which is why confining it inside the NVLink domain mentioned earlier is practically mandatory.</li>
  <li><strong>Pipeline parallelism (PP)</strong>: the model is sliced by layer and distributed across different GPUs, and activations are handed off between stages mostly via <strong>P2P</strong> transfers. Point-to-point communication dominates rather than collectives.</li>
  <li><strong>Expert parallelism (EP/MoE)</strong>: tokens have to be routed to the accelerator holding the relevant expert, so <strong>all-to-all</strong> is central. As the number of participants grows, the number of communication pairs in an all-to-all grows quadratically, making it especially sensitive to topology.</li>
</ul>

<p>In practice, these strategies are layered on top of each other. For example, a typical layout places TP inside a node’s NVLink, DP’s all-reduce over the inter-node InfiniBand, and PP spanning across both. Get the placement wrong, and frequent tensor-parallel communication leaks onto the slower inter-node links, slowing down the entire training run.</p>

<h2 id="the-rule-that-governs-performance-rings-and-trees">The Rule That Governs Performance: Rings and Trees</h2>

<p>There are several algorithms for actually implementing a collective, but from a bandwidth perspective, the best known is <strong>ring all-reduce</strong>. Participants are connected in a single ring, and at each step each one passes its chunk to its next neighbor, carrying out reduce-scatter and all-gather each over N-1 steps.</p>

<p>The total amount of data carried on each link works out to a well-known formula. For an all-reduce of a tensor of size S across N participants, the traffic per link is approximately:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2 x (N - 1) / N x S
</code></pre></div></div>

<p>That’s because (N-1)/N x S flows during reduce-scatter, and another (N-1)/N x S flows during all-gather. The key property here is that as N grows, (N-1)/N converges toward 1, so traffic per link flattens out to roughly 2S. This is why ring all-reduce is called bandwidth-optimal, and it’s why libraries like NCCL and Gloo have relied on it for a long time.</p>

<p>The problem is latency. A ring has to traverse N-1 sequential steps, so the fixed per-step latency (alpha) accumulates in proportion to the number of participants. When a lot of nodes are doing an all-reduce on a small tensor, bandwidth is left on the table while latency becomes the bottleneck. That’s why real libraries automatically choose between ring and tree (or hierarchical) algorithms depending on tensor size and node count. Tree algorithms bring latency down closer to log(N) at the cost of some bandwidth efficiency, which is why NCCL selects different algorithms depending on message size.</p>

<p>The practical implication of this rule is clear. As you change batch size, model size, and node count, the dominant bottleneck shifts back and forth between bandwidth and latency. That’s exactly why you can’t assume “doubling the number of nodes doubles the speed” without benchmarking it.</p>

<h2 id="implications-for-thakiclouds-products">Implications for ThakiCloud’s Products</h2>

<p>This topic touches the heart of infrastructure, which makes it especially practical from the perspective of ThakiCloud’s <strong>ai-platform</strong> (our Kubernetes-based AI/ML SaaS infrastructure).</p>

<p>First, <strong>topology-aware scheduling</strong>. ai-platform schedules GPU workloads with Kueue, and the placement principle of keeping tensor-parallel jobs inside the same NVLink domain (the same node) while routing a data-parallel job’s all-reduce over rail-optimized inter-node links lines up exactly with the communication characteristics of the collectives covered here. You need to know which collective flows over which link before job placement can translate into performance.</p>

<p>Second, <strong>tensor parallelism in serving</strong>. When a large model is served across multiple GPUs with tensor parallelism using an engine like vLLM, an all-reduce fires at every layer. Placing pods so that this communication stays inside NVLink makes it much easier to hit latency targets, and crossing a node boundary noticeably raises per-token latency. In a multi-tenant environment, this kind of placement discipline translates directly into serving cost and SLA outcomes.</p>

<p>Third, <strong>the economics of on-premises and sovereign cloud</strong>. The fact that GPU switches account for a meaningful share of power draw means that when designing a cluster for an on-premises or domestic sovereign environment, networking isn’t a minor add-on, it’s a core variable in total cost of ownership (TCO). The self-hosting and cost efficiency ThakiCloud aims for only holds up on top of these network design decisions.</p>

<p>There’s also a connection to <strong>Paxis</strong>, our agent orchestration product. When distributed training or large-scale inference jobs are coordinated as a DAG and executed in isolation, understanding the communication profile of the collectives each stage calls makes it possible to design more precise resource reservations and policy gates. That said, the center of gravity in this post is the infrastructure layer, so the ai-platform lens is the primary one here.</p>

<h2 id="limitations-and-counterarguments">Limitations and Counterarguments</h2>

<p>This perspective has its counterarguments too. First, frameworks abstract collectives away quite a lot. With the higher-level APIs in PyTorch or JAX, most placement decisions happen automatically inside the library and scheduler, and application developers don’t need to know these details. So if you ask, “does every team need to know torus and ring formulas,” the honest answer is closer to no.</p>

<p>But the moment performance becomes a problem, this abstraction breaks down. When training runs slower than expected or serving latency spikes, finding the root cause eventually requires looking at which collective is flowing over which link. The abstraction is convenient on the happy path, but it turns into a leaky abstraction the moment you’re diagnosing a bottleneck.</p>

<p>The rules laid out in this post also keep changing across hardware generations. NVLink and InfiniBand bandwidth, the number of TPU ICI links, and OCS scale all vary from generation to generation, so any concrete numbers should always be re-verified against the official documentation for that specific generation. The formulas and structures here provide a mental framework, but production decisions need to be closed out with real benchmarks. Finally, there’s the practical gap where software fails to keep pace with hardware. Even a theoretically optimal topology is wasted if the kernels and communication libraries can’t fully exploit it.</p>

<h2 id="sources">Sources</h2>

<ul>
  <li>Aleksa Gordic, “Inside TPU and GPU Clusters: The Anatomy of Collective Communication”: https://www.aleksagordic.com/blog/collective-operations</li>
  <li>NVIDIA NCCL documentation and the communication cost model for ring all-reduce (reduce-scatter + all-gather, bandwidth optimality)</li>
  <li>Google’s TPU v4 paper, “TPU v4: An Optically Reconfigurable Supercomputer for Machine Learning with Hardware Support for Embeddings” (ICI 3D torus, OCS): https://arxiv.org/abs/2304.01433</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="dev" /><category term="dev" /><category term="distributed-training" /><category term="gpu" /><category term="tpu" /><category term="nccl" /><category term="nvlink" /><category term="infiniband" /><category term="kubernetes" /><category term="self-hosting" /><category term="paxis" /><summary type="html"><![CDATA[When training or serving a large model across many accelerators, the real bottleneck usually isn't computation, it's the data moving between accelerators. This post walks through what collective operations like all-reduce, all-gather, reduce-scatter, and all-to-all actually are, and how they run on two very different physical structures: GPU clusters (NVLink, NVSwitch, InfiniBand) and TPU clusters (the ICI 3D torus and optical circuit switches). From the bandwidth cost formula behind ring all-reduce to which collectives are triggered by data, tensor, pipeline, and expert parallelism, we cover this from the perspective ThakiCloud brings to running GPU infrastructure.]]></summary></entry><entry xml:lang="en"><title type="html">Implement Once, Serve at vLLM Native Speed: the Transformers Backend Ends the Double-Build</title><link href="https://thakicloud.github.io/en/llmops/vllm-transformers-native-speed/" rel="alternate" type="text/html" title="Implement Once, Serve at vLLM Native Speed: the Transformers Backend Ends the Double-Build" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/en/llmops/vllm-transformers-native-speed</id><content type="html" xml:base="https://thakicloud.github.io/en/llmops/vllm-transformers-native-speed/"><![CDATA[<h2 id="overview">Overview</h2>

<p>If you have ever self-hosted open-weight models, you know one familiar wall. A great model ships, but to actually serve it fast you have to wait until your serving engine supports that architecture. A new structure landing in the Transformers library is immediately usable for training and research, yet to reach full speed in a high-performance inference engine like vLLM, someone had to reimplement that architecture from scratch inside vLLM. You effectively built the same model twice.</p>

<p>This post is for engineering leaders who own inference cost and serving latency, for practitioners running open-weight models on-premises or in sovereign environments, and for data scientists who experiment with new architectures while worrying about deployment speed. In July 2026, Hugging Face’s Clement Delangue shared a big turning point for open-source inference: starting with vLLM v0.25.0, Transformers models can run inside vLLM at <strong>native speed</strong>, often matching or beating hand-written implementations.</p>

<p>The core idea is this. Once a model author implements an architecture in Transformers, they can enjoy vLLM’s optimized inference stack for free, with no separate porting work. We did not take this claim on faith. We reproduced the graph-analysis step the backend runs internally on a small decoder block and measured it. This post walks through the mechanism, our measurements, and what it means for infrastructure that serves many different models under one multi-tenant roof.</p>

<h2 id="what-this-technology-is">What This Technology Is</h2>

<p>With a single <code class="language-plaintext highlighter-rouge">--model-impl transformers</code> flag, vLLM loads the model definition straight from the Transformers library instead of a dedicated ported implementation, and serves it. On the surface this looks like a compatibility layer, but what makes the v0.25.0 backend special is that this compatibility no longer costs speed. The old compatibility path was closer to a “works but slow” fallback. Now inference-specific layer fusions are applied dynamically at runtime, so for compatible architectures the backend matches the speed of dedicated code.</p>

<p>Look a little closer and the mechanism splits into two stages. First the backend uses <code class="language-plaintext highlighter-rouge">torch.fx</code> to statically analyze the model’s compute graph, searching for optimizable patterns like attention-score computation, RMSNorm, SwiGLU MLPs, and Mixture-of-Experts. Then it manipulates the abstract syntax tree to rewrite that source in place and maps the discovered operations onto vLLM’s optimized kernels. For an MoE model that means the Expert Parallelization kernels; for attention, the paged-attention family. In the end, vLLM optimizes throughput and latency on top of the architecture that Transformers expressed.</p>

<pre><code class="language-mermaid">flowchart TB
    A[New model architecture] --&gt; B[Implemented once in Transformers&lt;br/&gt;for training and research]
    B --&gt; C{How to serve in vLLM}
    C --&gt;|Before| D[Reimplement in vLLM&lt;br/&gt;hand-port dedicated kernels]
    C --&gt;|Now: model-impl transformers| E[torch.fx static graph analysis]
    E --&gt; F[Detect known patterns&lt;br/&gt;attention, RMSNorm, SwiGLU, MoE]
    F --&gt; G[Rewrite source via ast&lt;br/&gt;runtime layer fusion]
    G --&gt; H[Map to vLLM optimized kernels&lt;br/&gt;EP and paged attention]
    H --&gt; I[Native-speed inference&lt;br/&gt;4B to 235B, match or beat]
    D --&gt; I
</code></pre>

<p>The practical meaning of this shift is that the lag between the serving engine and the model ecosystem disappears. Previously every new architecture required two codebases, a training implementation and an inference implementation, and the gap between them was exactly the “great model is out but we cannot serve it fast yet” window. Now that window narrows. Whether you are a research team experimenting with a custom architecture or an operations team trying to put a freshly released model into production, one Transformers implementation gives you vLLM speed.</p>

<h2 id="installation-and-integration">Installation and Integration</h2>

<p>This backend is not a separate package; it ships inside vLLM itself. Install vLLM v0.25.0 or later and add <code class="language-plaintext highlighter-rouge">--model-impl transformers</code> to your serving command. The real examples Hugging Face published are as follows.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Single GPU, dense model</span>
vllm serve Qwen/Qwen3-4B <span class="nt">--model-impl</span> transformers

<span class="c"># Tensor parallel across 2 GPUs, large dense model</span>
vllm serve Qwen/Qwen3-32B <span class="se">\</span>
  <span class="nt">--model-impl</span> transformers <span class="se">\</span>
  <span class="nt">--tensor-parallel-size</span> 2

<span class="c"># Data parallel plus expert parallel, MoE model</span>
vllm serve Qwen/Qwen3-235B-A22B-FP8 <span class="se">\</span>
  <span class="nt">--model-impl</span> transformers <span class="se">\</span>
  <span class="nt">--data-parallel-size</span> 8 <span class="se">\</span>
  <span class="nt">--enable-expert-parallel</span>
</code></pre></div></div>

<p>The same works from the Python API for offline inference.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">vllm</span> <span class="kn">import</span> <span class="n">LLM</span><span class="p">,</span> <span class="n">SamplingParams</span>

<span class="n">llm</span> <span class="o">=</span> <span class="nc">LLM</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="sh">"</span><span class="s">Qwen/Qwen3-4B</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">model_impl</span><span class="o">=</span><span class="sh">"</span><span class="s">transformers</span><span class="sh">"</span><span class="p">,</span>   <span class="c1"># use the Transformers definition, not a dedicated port
</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">llm</span><span class="p">.</span><span class="nf">generate</span><span class="p">(</span>
    <span class="p">[</span><span class="sh">"</span><span class="s">How does ThakiCloud serve open-weight models?</span><span class="sh">"</span><span class="p">],</span>
    <span class="nc">SamplingParams</span><span class="p">(</span><span class="n">max_tokens</span><span class="o">=</span><span class="mi">256</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.7</span><span class="p">),</span>
<span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">out</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">outputs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">text</span><span class="p">)</span>
</code></pre></div></div>

<p>What stands out across the three examples is that distributed serving options like tensor parallel, data parallel, and expert parallel all still work under the Transformers backend. In other words, you do not give up scale-out in exchange for compatibility. From a dense 4B model to a 235B MoE, one flag covers it.</p>

<h2 id="real-experiment-results">Real Experiment Results</h2>

<p>This environment is macOS (Apple Silicon), so it cannot run vLLM’s CUDA kernels, and we could not reproduce the vLLM throughput benchmark itself. Instead we reproduced the <strong>single most important step the backend performs internally: using torch.fx to statically analyze the model graph and find fusion-target patterns</strong>. We built a 4-layer Llama-style decoder in pure PyTorch with the same structure real serving models use (grouped-query attention and a SwiGLU MLP), traced its graph with <code class="language-plaintext highlighter-rouge">torch.fx.symbolic_trace</code>, and classified the nodes.</p>

<p>The measurements were as follows. Tracing this small decoder of 2.902M parameters produced a torch.fx graph with a total of <strong>178 nodes</strong>. By op type there were 80 function calls, 60 method calls, 28 module calls, and 8 attribute lookups. Among these, the function-level patterns the backend can immediately swap for fusion kernels were 16 RMSNorm reductions, 8 attention-related matmuls, 4 softmaxes, and 4 SwiGLU activations, for 32 in total, plus 28 module calls carrying the QKV/output/MLP projections and normalizations. Forward latency at sequence length 64 averaged 1.4ms, measured on torch 2.13.0.</p>

<p><img src="/assets/images/vllm-transformers-native-speed-results.png" alt="Bar chart showing the distribution of fusion-target nodes in the torch.fx graph" /></p>

<p>What these numbers show is clear. Even in a single small block of 178 nodes, well-formed patterns of attention, normalization, and MLP activation recur, and these are exactly the points the backend targets to replace with vLLM kernels. In a real model with dozens of layers this pattern multiplies by the layer count, so a single graph analysis lets the backend fuse the bottleneck operations across the whole model at once. According to Hugging Face, this approach let the Transformers backend match or beat native vLLM throughput from 4B to 235B, including tensor-parallel and MoE setups. Our experiment did not reproduce those throughput figures; it confirmed by measurement the <strong>skeleton of the mechanism</strong> that produces them.</p>

<h2 id="implications-for-thakicloud">Implications for ThakiCloud</h2>

<p>ThakiCloud’s <strong>ai-platform</strong> is multi-tenant AI/ML infrastructure that serves models to diverse customer environments on top of K8s and Kueue-based GPU scheduling. This backend is a direct benefit for a serving operator like us. First, <strong>model onboarding lead time shrinks.</strong> When a new open-weight model ships, until now we had to wait for vLLM to officially support that architecture or accept a self-port. If a Transformers implementation exists, <code class="language-plaintext highlighter-rouge">--model-impl transformers</code> lets us bring up an optimized-speed serving pod right away. That directly affects the competitive question of how fast a new model reaches production.</p>

<p>Second, <strong>the serving path for custom architectures gets simpler.</strong> When we serve a model fine-tuned or structurally modified for a specific customer on-premises, being able to deploy from the Transformers definition alone, with no dedicated vLLM port, greatly reduces maintenance burden. In sovereign-cloud or regulated environments that require self-hosting, we save the time spent reconciling engine and model versions. Since tensor, data, and expert parallel all still work, we can adopt this path without changing the multi-GPU serving topologies we already run.</p>

<p>From an agent perspective, the <strong>Paxis</strong> lens applies too. Paxis is the Agent-Native Cloud control plane that runs on top of ai-platform, swapping different models like tools as it executes agents. If the serving layer can bring up new open-weight models faster and cheaper, the pool of models the agents on top can choose from widens and the cost of switching drops. Because low-cost, low-latency serving is ultimately what makes agent workloads economical, ai-platform’s serving efficiency and Paxis’s agent flexibility point in the same direction.</p>

<h2 id="limitations-and-counterarguments">Limitations and Counterarguments</h2>

<p>This backend is not a cure-all, and a few clear limits deserve mention to be fair. First, the performance advantage is limited to “compatible architectures.” The model must be statically traceable by torch.fx, and it must match patterns the backend already knows for fusion to apply. A structure with heavy dynamic control flow or novel operations the backend has not seen will fall back to unfused paths for some parts, and the speed advantage shrinks accordingly. Not every Transformers model automatically reaches native speed.</p>

<p>Second, this feature reached maturity in v0.25.0 but is still evolving. For certain quantization combinations, certain attention variants, or rare MoE routing schemes, a dedicated ported implementation may still be more stable or faster. Before going to production it is safer to benchmark actual throughput and accuracy yourself on your target model and target hardware. That is exactly why we did not cite vLLM throughput numbers directly and instead attributed them to the official announcement; the figures vary by environment, so a measurement on the ThakiCloud GPU cluster is planned separately.</p>

<p>Third, a counterargument is possible. When the serving engine and the model library become tightly coupled, changes in Transformers can affect serving stability. In the era of two separate codebases you could pin the inference stack independently, but sharing a backend forces you to rethink version management. Even so, weighed against the cost of implementing every new model twice, we judge that in most serving scenarios the onboarding-speed gain from this coupling is larger.</p>

<h2 id="sources">Sources</h2>

<ul>
  <li><a href="https://huggingface.co/blog/native-speed-vllm-transformers-backend">Native-speed vLLM transformers modeling backend (Hugging Face Blog)</a></li>
  <li><a href="https://daily.dev/posts/vllm-v0-25-0-transformers-backend-now-matches-native-vllm-speed-z8kvnsk7c">vLLM v0.25.0: transformers backend now matches native vLLM speed (daily.dev)</a></li>
  <li><a href="https://blog.vllm.ai/2025/04/11/transformers-backend.html">Transformers modeling backend integration in vLLM (vLLM Blog)</a></li>
  <li><a href="https://x.com/ClementDelangue/status/2076763231788339669">Clement Delangue (@ClementDelangue) on X</a></li>
  <li>Experiment code and logs: <code class="language-plaintext highlighter-rouge">outputs/blog-impl/vllm-transformers-native-speed/</code> (torch.fx graph-analysis reproduction, torch 2.13.0, CPU)</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="llmops" /><category term="vllm" /><category term="transformers" /><category term="inference" /><category term="serving" /><category term="torch-fx" /><category term="llmops" /><category term="self-hosting" /><category term="open-weights" /><category term="paxis" /><summary type="html"><![CDATA[Until now, every new model architecture had to be built twice: once in Transformers for training and research, and again in vLLM for production inference. vLLM v0.25.0's native-speed Transformers backend ends that duplication. It works by using torch.fx to statically analyze the model graph, finding known patterns like attention, normalization, and MLP, then rewiring them onto vLLM's optimized kernels. We reproduced the graph-analysis step the backend actually runs on a 4-layer decoder and measured which of its 178 nodes become fusion targets. Then we look at what this means for ThakiCloud's multi-tenant open-weight serving infrastructure.]]></summary></entry><entry xml:lang="ko"><title type="html">GPU와 TPU 클러스터의 해부학: 컬렉티브 커뮤니케이션이 분산 학습의 속도를 결정합니다</title><link href="https://thakicloud.github.io/ko/dev/collective-communication-clusters/" rel="alternate" type="text/html" title="GPU와 TPU 클러스터의 해부학: 컬렉티브 커뮤니케이션이 분산 학습의 속도를 결정합니다" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ko/dev/collective-communication-clusters</id><content type="html" xml:base="https://thakicloud.github.io/ko/dev/collective-communication-clusters/"><![CDATA[<h2 id="개요">개요</h2>

<p>대규모 언어 모델을 하나의 GPU에 올릴 수 없게 된 지는 이미 오래되었습니다. 수백억에서 수조 개의 파라미터를 가진 모델은 수십에서 수천 개의 가속기에 걸쳐 나뉘고, 학습 한 스텝마다 그 가속기들이 서로의 결과를 맞춰야 합니다. 이 “서로 맞추는” 과정이 바로 컬렉티브 커뮤니케이션이고, 현대 분산 학습에서 실제로 시간을 잡아먹는 지점은 행렬 곱이 아니라 이 통신인 경우가 대부분입니다.</p>

<p>이 글은 GPU나 TPU 클러스터에서 모델을 학습하거나 서빙하는 인프라 엔지니어, 그리고 서빙 비용과 확장성을 책임지는 사람을 위한 것입니다. 널리 읽힌 Aleksa Gordić의 딥다이브 “Inside TPU and GPU Clusters: The Anatomy of Collective Communication”을 출발점으로 삼되, 거기서 다루는 핵심 개념을 표준 레퍼런스(NCCL, TPU v4 논문 등)로 다시 확인하며 정리했습니다.</p>

<p>핵심 메시지를 먼저 요약하면 이렇습니다. 첫째, 분산 학습의 성능은 몇 가지 컬렉티브 연산으로 환원됩니다. 둘째, 같은 연산이라도 그것이 도는 물리적 토폴로지(NVIDIA의 스위치 기반 구조 대 Google의 토러스 구조)에 따라 비용이 완전히 달라집니다. 셋째, 어떤 병렬화 전략을 쓰느냐가 어떤 컬렉티브를 얼마나 자주 부를지를 결정합니다. 이 세 가지를 이해하면, GPU 몇 장을 어디에 어떻게 배치할지가 성능에 왜 그렇게 큰 영향을 주는지 설명할 수 있습니다.</p>

<h2 id="컬렉티브-커뮤니케이션이란-무엇인가">컬렉티브 커뮤니케이션이란 무엇인가</h2>

<p>컬렉티브 연산은 여러 프로세스(보통 가속기 한 장에 하나씩)가 함께 참여하는 통신 패턴입니다. 점대점(P2P) 통신이 한 명이 다른 한 명에게 보내는 것이라면, 컬렉티브는 그룹 전체가 규칙에 따라 데이터를 나누고 합칩니다. 분산 학습에서 반복적으로 등장하는 것은 다음 몇 가지입니다.</p>

<ul>
  <li><strong>All-reduce</strong>: 모든 참여자가 가진 텐서를 원소별로 합(또는 평균)한 뒤, 그 결과를 모두에게 되돌려줍니다. 데이터 병렬 학습에서 그래디언트를 맞출 때 쓰는 바로 그 연산입니다.</li>
  <li><strong>Reduce-scatter</strong>: 합을 구하되 결과를 한 명이 다 갖지 않고 조각내어 나눠 갖습니다.</li>
  <li><strong>All-gather</strong>: 각자가 가진 조각을 모두가 전부 갖도록 모읍니다. reduce-scatter의 짝이 되는 연산으로, 둘을 이어 붙이면 all-reduce가 됩니다.</li>
  <li><strong>All-to-all</strong>: 각 참여자가 다른 모든 참여자에게 서로 다른 데이터 조각을 보냅니다. 전치(transpose)에 가까운 패턴으로, 전문가 혼합(MoE) 모델에서 토큰을 전문가에게 라우팅할 때 핵심입니다.</li>
  <li><strong>Broadcast / Reduce</strong>: 한 명이 모두에게 같은 데이터를 뿌리거나, 모두의 데이터를 한 명에게 모아 줄이는 단방향 연산입니다.</li>
</ul>

<p>여기서 중요한 통찰 하나는 all-reduce가 원자적 연산이 아니라는 점입니다. all-reduce는 <strong>reduce-scatter 다음에 all-gather</strong>로 분해됩니다. 이 분해가 뒤에 나오는 비용 공식의 뿌리가 됩니다.</p>

<pre><code class="language-mermaid">flowchart TB
    A["각 가속기: 로컬 그래디언트/텐서"] --&gt; B["Reduce-scatter&lt;br/&gt;합을 조각내어 분배"]
    B --&gt; C["All-gather&lt;br/&gt;조각을 모두에게 복원"]
    C --&gt; D["All-reduce 완료&lt;br/&gt;모두가 동일한 합을 보유"]
    A --&gt; E["All-to-all&lt;br/&gt;MoE 토큰 라우팅"]
    A --&gt; F["Broadcast/Reduce&lt;br/&gt;단방향 분배·집계"]
</code></pre>

<h2 id="gpu-클러스터의-물리적-구조">GPU 클러스터의 물리적 구조</h2>

<p>NVIDIA 기반 클러스터는 두 개의 층으로 나뉜다고 보면 이해가 쉽습니다. 노드 안(scale-up)과 노드 사이(scale-out)입니다.</p>

<p>노드 안에서는 <strong>NVLink</strong>와 <strong>NVSwitch</strong>가 GPU들을 촘촘히 연결합니다. 한 서버 안의 8장 같은 GPU들은 NVSwitch를 통해 서로 완전 연결에 가깝게 묶여, 어느 GPU에서 어느 GPU로든 균일하게 높은 대역폭으로 통신합니다. 텐서 병렬화처럼 통신이 매우 잦은 작업을 이 도메인 안에 가두는 이유가 여기에 있습니다.</p>

<p>노드 사이에서는 <strong>InfiniBand</strong>나 <strong>RoCE</strong>(RDMA over Converged Ethernet)로 구성된 리프-스파인(팻트리) 네트워크가 쓰입니다. 이 스케일아웃 패브릭은 랙과 서버를 가로질러 GPU를 잇습니다. 여기서 자주 등장하는 설계가 레일 최적화(rail-optimized) 토폴로지입니다. 각 노드의 같은 순번 NIC를 같은 스위치(“레일”)에 붙여, 노드 간 all-reduce가 스파인 층을 덜 거치도록 만드는 방식입니다.</p>

<p>이 유연성에는 대가가 따릅니다. 스케일아웃에 필요한 수천 개의 스위치는 클러스터 전체 전력의 5~10%가량을 소비하고, 상당한 자본 지출을 요구합니다[추정 범위는 구성에 따라 달라집니다]. 즉 NVIDIA의 접근은 “어느 GPU든 어느 GPU와도 잘 통신하게” 만드는 대신, 그 균일함을 능동적으로 패킷을 처리하는 스위치들로 사서 씁니다.</p>

<h2 id="tpu-클러스터의-다른-선택">TPU 클러스터의 다른 선택</h2>

<p>Google의 TPU는 전혀 다른 길을 갑니다. TPU 칩은 능동 스위치 패브릭 대신 <strong>ICI(Inter-Chip Interconnect)</strong> 라는 전용 고속 링크로 이웃 칩과 직접 연결됩니다. 최신 세대의 각 칩은 ±X, ±Y, ±Z 여섯 방향으로 ICI 링크를 뻗어 <strong>3D 토러스</strong> 격자를 이룹니다(초기 세대는 2D 토러스로 256칩 규모의 pod를 구성했습니다). 이웃과만 직접 연결되므로 스위치 계층이 대부분 사라집니다.</p>

<p>그러면 멀리 떨어진 칩끼리, 또는 pod보다 큰 규모는 어떻게 잇느냐는 질문이 남습니다. 여기서 <strong>광 회선 스위치(OCS, Optical Circuit Switch)</strong> 가 등장합니다. TPU v4 논문에 따르면 OCS는 광섬유를 MEMS 거울로 재배치하는 방식으로, 광신호를 능동적으로 해석하지 않고 그대로 반사만 시킵니다. 덕분에 4096칩 규모를 재구성 가능한 방식으로 잇으면서도, 거울 방향을 유지하는 데만 전력이 들어 InfiniBand 스위치보다 훨씬 적은 전력으로 동작합니다. 토러스의 한 축을 광학적으로 감아 붙이거나, 고장 난 노드를 우회하도록 토폴로지를 소프트웨어로 재배선하는 것도 가능합니다.</p>

<p>정리하면, GPU 클러스터는 균일 접근을 위해 능동 스위치에 투자하고, TPU 클러스터는 이웃 직결 토러스에 광학 재구성을 얹어 전력과 비용을 절약합니다. 어느 쪽도 무조건 우월하지 않습니다. 토러스는 이웃 통신에 최적이지만 임의의 먼 통신에는 홉이 늘고, 스위치 패브릭은 균일하지만 비싸고 전력을 씁니다.</p>

<h2 id="컬렉티브가-병렬화-전략에-매핑되는-방식">컬렉티브가 병렬화 전략에 매핑되는 방식</h2>

<p>어떤 컬렉티브를 얼마나 부를지는 결국 어떤 병렬화를 쓰느냐로 정해집니다.</p>

<ul>
  <li><strong>데이터 병렬(DP)</strong>: 각 복제본이 서로 다른 배치를 처리한 뒤, 그래디언트를 <strong>all-reduce</strong>로 맞춥니다. 통신량은 모델 크기에 비례하고, 스텝마다 한 번 발생합니다.</li>
  <li><strong>완전 샤딩 데이터 병렬(FSDP/ZeRO)</strong>: 파라미터를 조각내어 나눠 갖고, 순전파 직전 <strong>all-gather</strong>로 필요한 파라미터를 모으고, 역전파 후 <strong>reduce-scatter</strong>로 그래디언트를 다시 나눕니다. 메모리를 아끼는 대신 통신 빈도가 늘어납니다.</li>
  <li><strong>텐서 병렬(TP)</strong>: 하나의 레이어 연산을 여러 GPU가 쪼개어 계산하고, 레이어 경계마다 <strong>all-reduce</strong> 또는 all-gather/reduce-scatter로 합칩니다. 통신이 극도로 잦아, 앞서 말한 NVLink 도메인 안에 가두는 것이 사실상 필수입니다.</li>
  <li><strong>파이프라인 병렬(PP)</strong>: 모델을 층 단위로 잘라 서로 다른 GPU에 배치하고, 스테이지 사이는 주로 <strong>P2P</strong> 전송으로 활성값을 넘깁니다. 컬렉티브 대신 점대점 통신이 지배적입니다.</li>
  <li><strong>전문가 병렬(EP/MoE)</strong>: 토큰을 각 전문가가 있는 가속기로 보내야 하므로 <strong>all-to-all</strong>이 핵심입니다. all-to-all은 참여자 수가 늘수록 통신 쌍이 제곱으로 늘어, 토폴로지에 특히 민감합니다.</li>
</ul>

<p>실전에서는 이들을 겹쳐 씁니다. 예를 들어 TP는 노드 안 NVLink에, DP의 all-reduce는 노드 사이 InfiniBand에, PP는 그 사이를 잇는 식으로 배치를 설계합니다. 잘못 배치하면 잦은 텐서 병렬 통신이 느린 노드 간 링크로 새어 나가 전체 학습이 느려집니다.</p>

<h2 id="성능을-지배하는-규칙-링과-트리">성능을 지배하는 규칙: 링과 트리</h2>

<p>컬렉티브를 실제로 구현하는 알고리즘은 여러 가지지만, 대역폭 관점에서 가장 유명한 것이 <strong>링(ring) all-reduce</strong>입니다. 참여자를 하나의 원형으로 잇고, 각 스텝마다 자기 조각을 다음 이웃에게 넘기며 reduce-scatter와 all-gather를 각각 N-1 스텝에 걸쳐 수행합니다.</p>

<p>이때 각 링크가 실어 나르는 데이터 총량은 다음과 같이 알려져 있습니다. 크기 S의 텐서를 N개 참여자가 all-reduce할 때, 링크당 트래픽은 대략</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2 × (N − 1) / N × S
</code></pre></div></div>

<p>입니다. reduce-scatter에서 (N−1)/N × S, all-gather에서 다시 (N−1)/N × S가 흐르기 때문입니다. 여기서 중요한 성질은 N이 커져도 (N−1)/N이 1에 수렴하므로, 링크당 트래픽이 약 2S로 평평해진다는 점입니다. 이 때문에 링 all-reduce를 대역폭 최적(bandwidth-optimal)이라고 부르고, NCCL과 Gloo 같은 라이브러리가 오래 사용해 왔습니다.</p>

<p>문제는 지연(latency)입니다. 링은 N−1 스텝을 순차적으로 거치므로, 스텝마다 붙는 고정 지연(α)이 참여자 수에 비례해 쌓입니다. 작은 텐서를 아주 많은 노드가 all-reduce하면, 대역폭은 남는데 지연이 병목이 됩니다. 그래서 실제 라이브러리는 텐서 크기와 노드 수에 따라 링과 트리(또는 계층적) 알고리즘을 자동으로 골라 씁니다. 트리 방식은 지연을 log(N)에 가깝게 줄이는 대신 대역폭 효율을 일부 내줍니다. NCCL이 메시지 크기별로 다른 알고리즘을 선택하는 이유가 여기에 있습니다.</p>

<p>이 규칙이 실무에 주는 함의는 분명합니다. 배치 크기, 모델 크기, 노드 수를 바꾸면 지배적인 병목이 대역폭과 지연 사이를 오갑니다. 벤치마크 없이 “노드를 두 배로 늘리면 두 배 빨라진다”고 가정할 수 없는 이유입니다.</p>

<h2 id="thakicloud-제품-적용-시사점">ThakiCloud 제품 적용 시사점</h2>

<p>이 주제는 인프라의 심장에 닿아 있어, ThakiCloud의 <strong>ai-platform</strong>(K8s 기반 AI/ML SaaS 인프라) 관점에서 특히 실질적입니다.</p>

<p>첫째, <strong>토폴로지 인지 스케줄링</strong>입니다. ai-platform은 Kueue로 GPU 워크로드를 스케줄링하는데, 텐서 병렬 잡을 같은 NVLink 도메인(같은 노드) 안에 배치하고 데이터 병렬의 all-reduce는 레일 최적화된 노드 간 링크에 태우는 배치 원칙이, 이 글에서 정리한 컬렉티브의 통신 특성과 정확히 맞물립니다. 어느 컬렉티브가 어느 링크로 흐르는지를 알아야 잡 배치가 성능으로 이어집니다.</p>

<p>둘째, <strong>서빙에서의 텐서 병렬</strong>입니다. vLLM 같은 엔진으로 큰 모델을 여러 GPU에 텐서 병렬로 서빙할 때, 레이어마다 all-reduce가 발생합니다. 이 통신이 NVLink 안에 머무르도록 파드를 배치하면 지연 목표를 지키기 쉽고, 노드 경계를 넘어가면 토큰당 지연이 눈에 띄게 늘어납니다. 멀티테넌트 환경에서 이런 배치 규율은 곧 서빙 비용과 SLA로 직결됩니다.</p>

<p>셋째, <strong>온프렘·소버린 클라우드의 경제성</strong>입니다. GPU 스위치가 전력의 상당 부분을 차지한다는 사실은, 온프레미스나 국내 소버린 환경에서 클러스터를 설계할 때 네트워크가 단순 부속이 아니라 총소유비용(TCO)의 핵심 변수임을 뜻합니다. ThakiCloud가 지향하는 self-hosting과 비용 효율은 이런 네트워크 설계 판단 위에서만 성립합니다.</p>

<p>에이전트 오케스트레이션 제품인 <strong>Paxis</strong> 관점에서도 접점이 있습니다. 분산 학습·대규모 추론 잡을 DAG로 조율하고 격리 실행하는 상황에서, 각 단계가 부르는 컬렉티브의 통신 프로파일을 이해하면 자원 예약과 정책 게이트를 더 정교하게 설계할 수 있습니다. 다만 이 글의 무게중심은 인프라 계층이므로 ai-platform 렌즈가 주가 됩니다.</p>

<h2 id="한계-및-반론">한계 및 반론</h2>

<p>이 관점에도 반론이 있습니다. 우선, 프레임워크가 컬렉티브를 상당히 추상화해 준다는 점입니다. PyTorch나 JAX의 상위 API를 쓰면 대부분의 배치 결정이 라이브러리와 스케줄러 안에서 자동으로 일어나고, 애플리케이션 개발자는 이 세부를 몰라도 됩니다. 그래서 “모든 팀이 토러스와 링 공식을 알아야 하는가”라고 물으면, 답은 아니오에 가깝습니다.</p>

<p>그러나 성능이 문제가 되는 순간, 이 추상화는 무너집니다. 학습이 예상보다 느리거나 서빙 지연이 튈 때, 원인을 찾으려면 결국 어떤 컬렉티브가 어느 링크로 흐르는지를 봐야 합니다. 추상화는 정상 경로에서는 편하지만 병목 진단에서는 새는 추상화가 됩니다.</p>

<p>또한 이 글이 정리한 규칙들은 하드웨어 세대에 따라 계속 바뀝니다. NVLink와 InfiniBand의 대역폭, TPU ICI의 링크 수, OCS의 규모는 세대마다 달라지므로, 구체적 수치는 항상 해당 세대의 공식 자료로 다시 확인해야 합니다. 이 글의 공식과 구조는 사고의 틀을 주지만, 프로덕션 판단은 실측 벤치마크로 닫아야 합니다. 마지막으로, 소프트웨어가 하드웨어를 따라가지 못하는 간극도 현실입니다. 이론상 최적인 토폴로지도 커널과 통신 라이브러리가 이를 온전히 활용하지 못하면 그림의 떡입니다.</p>

<h2 id="출처">출처</h2>

<ul>
  <li>Aleksa Gordić, “Inside TPU and GPU Clusters: The Anatomy of Collective Communication”: https://www.aleksagordic.com/blog/collective-operations</li>
  <li>NVIDIA NCCL 문서 및 링 all-reduce 통신 비용 모델 (reduce-scatter + all-gather, 대역폭 최적성)</li>
  <li>Google TPU v4 논문, “TPU v4: An Optically Reconfigurable Supercomputer for Machine Learning with Hardware Support for Embeddings” (ICI 3D 토러스, OCS): https://arxiv.org/abs/2304.01433</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="dev" /><category term="dev" /><category term="distributed-training" /><category term="gpu" /><category term="tpu" /><category term="nccl" /><category term="nvlink" /><category term="infiniband" /><category term="kubernetes" /><category term="self-hosting" /><category term="paxis" /><summary type="html"><![CDATA[대규모 모델을 여러 가속기에 나눠 학습하거나 서빙할 때, 실제 병목은 연산이 아니라 가속기 사이를 오가는 데이터입니다. 이 글은 all-reduce, all-gather, reduce-scatter, all-to-all 같은 컬렉티브 연산이 무엇인지, 그리고 이 연산들이 GPU 클러스터(NVLink·NVSwitch·InfiniBand)와 TPU 클러스터(ICI 3D 토러스·광 회선 스위치)라는 서로 다른 물리 구조 위에서 어떻게 도는지를 정리합니다. 링 all-reduce의 대역폭 비용 공식부터 데이터·텐서·파이프라인·전문가 병렬화가 각각 어떤 컬렉티브를 부르는지까지, ThakiCloud가 GPU 인프라를 운영하며 마주하는 관점에서 짚습니다.]]></summary></entry><entry xml:lang="ko"><title type="html">한 번만 구현하면 vLLM 네이티브 속도로: Transformers 백엔드가 서빙 이중화를 끝내다</title><link href="https://thakicloud.github.io/ko/llmops/vllm-transformers-native-speed/" rel="alternate" type="text/html" title="한 번만 구현하면 vLLM 네이티브 속도로: Transformers 백엔드가 서빙 이중화를 끝내다" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ko/llmops/vllm-transformers-native-speed</id><content type="html" xml:base="https://thakicloud.github.io/ko/llmops/vllm-transformers-native-speed/"><![CDATA[<h2 id="개요">개요</h2>

<p>오픈웨이트 모델을 직접 서빙해 본 팀이라면 익숙한 벽이 하나 있습니다. 좋은 모델이 공개되었는데, 정작 그 모델을 빠르게 추론하려면 서빙 엔진이 그 아키텍처를 지원할 때까지 기다려야 한다는 벽입니다. Transformers 라이브러리에 올라온 새 구조는 학습과 연구에는 곧바로 쓸 수 있지만, vLLM 같은 고성능 추론 엔진에서 제 속도를 내려면 누군가가 그 아키텍처를 vLLM 안에 처음부터 다시 구현해야 했습니다. 같은 모델을 사실상 두 번 만드는 셈이었습니다.</p>

<p>이 글은 추론 비용과 서빙 지연을 책임지는 엔지니어링 리더, 온프레미스나 소버린 환경에서 오픈웨이트 모델을 직접 굴리는 실무자, 그리고 새 아키텍처를 실험하면서 배포 속도를 걱정하는 데이터 과학자를 위한 것입니다. 2026년 7월, Hugging Face의 Clement Delangue가 오픈소스 추론의 큰 전환점을 공유했습니다. vLLM v0.25.0부터 Transformers 모델을 vLLM 안에서 <strong>네이티브 속도로</strong> 돌릴 수 있게 되었고, 많은 경우 손으로 짠 전용 구현과 대등하거나 그것을 앞선다는 내용이었습니다.</p>

<p>핵심은 이렇습니다. 모델 저자가 아키텍처를 Transformers에 한 번만 구현하면, vLLM의 최적화된 추론 스택을 별도 작업 없이 그대로 누릴 수 있게 되었다는 것입니다. 저희는 이 주장을 개념으로만 받아들이지 않고, 이 백엔드가 내부적으로 수행하는 그래프 분석 단계를 작은 디코더 블록으로 직접 재현해 실측했습니다. 이 글은 그 원리와 측정 과정, 그리고 이것이 멀티테넌트로 다양한 모델을 서빙하는 저희 인프라에 어떤 의미인지를 풀어냅니다.</p>

<h2 id="이-기술은-무엇인가">이 기술은 무엇인가</h2>

<p><code class="language-plaintext highlighter-rouge">--model-impl transformers</code> 플래그 하나면, vLLM은 전용으로 포팅된 구현 대신 Transformers 라이브러리의 모델 정의를 그대로 불러와 서빙합니다. 겉보기에는 단순한 호환 계층 같지만, v0.25.0의 백엔드가 특별한 이유는 이 호환성이 더 이상 속도를 희생하지 않기 때문입니다. 예전의 호환 경로는 “돌아가기는 하지만 느린” 폴백에 가까웠습니다. 이제는 컴파일 타임이 아니라 런타임에 추론 전용 레이어 퓨전을 동적으로 적용해, 호환 가능한 아키텍처라면 전용 코드에 필적하는 속도를 냅니다.</p>

<p>그 원리를 조금 더 들여다보면 두 단계로 나뉩니다. 먼저 백엔드는 <code class="language-plaintext highlighter-rouge">torch.fx</code>로 모델의 연산 그래프를 정적 분석해, 어텐션 점수 계산, RMSNorm 정규화, SwiGLU MLP, Mixture-of-Experts 같은 최적화 가능한 패턴을 찾습니다. 그다음 추상 구문 트리를 조작해 그 부분의 소스를 제자리에서 다시 쓰고, 찾아낸 연산을 vLLM의 최적화 커널로 매핑합니다. MoE 모델이라면 Expert Parallelization 커널에, 어텐션이라면 페이지드 어텐션 계열 커널에 붙는 식입니다. 결국 Transformers가 표현한 아키텍처 위에 vLLM이 처리량과 지연을 최적화해 얹는 구조입니다.</p>

<pre><code class="language-mermaid">flowchart TB
    A[새 모델 아키텍처] --&gt; B[Transformers로 1회 구현&lt;br/&gt;학습·연구용]
    B --&gt; C{vLLM 서빙 방식}
    C --&gt;|과거| D[vLLM에 재구현&lt;br/&gt;전용 커널 수작업 포팅]
    C --&gt;|현재: model-impl transformers| E[torch.fx 정적 그래프 분석]
    E --&gt; F[알려진 패턴 탐지&lt;br/&gt;어텐션·RMSNorm·SwiGLU·MoE]
    F --&gt; G[ast로 소스 재작성&lt;br/&gt;런타임 레이어 퓨전]
    G --&gt; H[vLLM 최적화 커널에 매핑&lt;br/&gt;EP·페이지드 어텐션]
    H --&gt; I[네이티브 속도 추론&lt;br/&gt;4B~235B 매칭 또는 추월]
    D --&gt; I
</code></pre>

<p>이 변화의 실질적 의미는 서빙 엔진과 모델 생태계 사이의 시차가 사라진다는 데 있습니다. 과거에는 새 아키텍처가 나올 때마다 학습용 구현과 추론용 구현이라는 두 개의 코드베이스가 필요했고, 둘 사이의 간극이 곧 “좋은 모델이 나왔지만 아직 빠르게 서빙할 수 없는” 공백이었습니다. 이제 그 공백이 좁아집니다. 커스텀 아키텍처를 실험하는 연구팀이든, 갓 공개된 모델을 프로덕션에 올리려는 운영팀이든, Transformers 구현 하나로 vLLM 속도를 얻습니다.</p>

<h2 id="설치-및-통합">설치 및 통합</h2>

<p>이 백엔드는 별도 패키지가 아니라 vLLM 자체에 포함됩니다. v0.25.0 이상의 vLLM을 설치한 뒤 서빙 명령에 <code class="language-plaintext highlighter-rouge">--model-impl transformers</code>를 붙이면 됩니다. Hugging Face 블로그가 제시한 실제 예시는 다음과 같습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 단일 GPU, 밀집(dense) 모델</span>
vllm serve Qwen/Qwen3-4B <span class="nt">--model-impl</span> transformers

<span class="c"># 텐서 병렬 2장, 대형 밀집 모델</span>
vllm serve Qwen/Qwen3-32B <span class="se">\</span>
  <span class="nt">--model-impl</span> transformers <span class="se">\</span>
  <span class="nt">--tensor-parallel-size</span> 2

<span class="c"># 데이터 병렬 + 전문가 병렬, MoE 모델</span>
vllm serve Qwen/Qwen3-235B-A22B-FP8 <span class="se">\</span>
  <span class="nt">--model-impl</span> transformers <span class="se">\</span>
  <span class="nt">--data-parallel-size</span> 8 <span class="se">\</span>
  <span class="nt">--enable-expert-parallel</span>
</code></pre></div></div>

<p>파이썬 API에서도 동일하게 오프라인 추론에 쓸 수 있습니다.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">vllm</span> <span class="kn">import</span> <span class="n">LLM</span><span class="p">,</span> <span class="n">SamplingParams</span>

<span class="n">llm</span> <span class="o">=</span> <span class="nc">LLM</span><span class="p">(</span>
    <span class="n">model</span><span class="o">=</span><span class="sh">"</span><span class="s">Qwen/Qwen3-4B</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">model_impl</span><span class="o">=</span><span class="sh">"</span><span class="s">transformers</span><span class="sh">"</span><span class="p">,</span>   <span class="c1"># 전용 포팅 대신 Transformers 정의 사용
</span><span class="p">)</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">llm</span><span class="p">.</span><span class="nf">generate</span><span class="p">(</span>
    <span class="p">[</span><span class="sh">"</span><span class="s">ThakiCloud는 오픈웨이트 모델을 어떻게 서빙하나요?</span><span class="sh">"</span><span class="p">],</span>
    <span class="nc">SamplingParams</span><span class="p">(</span><span class="n">max_tokens</span><span class="o">=</span><span class="mi">256</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.7</span><span class="p">),</span>
<span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">out</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">outputs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">text</span><span class="p">)</span>
</code></pre></div></div>

<p>세 예시에서 눈여겨볼 점은 텐서 병렬, 데이터 병렬, 전문가 병렬 같은 분산 서빙 옵션이 Transformers 백엔드에서도 그대로 동작한다는 것입니다. 즉 호환성을 얻는 대가로 스케일 아웃을 포기하지 않아도 됩니다. 밀집 4B 모델부터 235B MoE까지 같은 플래그 하나로 커버됩니다.</p>

<h2 id="실제-실험-결과">실제 실험 결과</h2>

<p>이 환경은 macOS(Apple Silicon)라 vLLM의 CUDA 커널을 실행할 수 없어, vLLM 처리량 벤치마크 자체는 재현하지 못했습니다. 대신 이 백엔드가 내부적으로 수행하는 <strong>가장 핵심적인 단계, 즉 torch.fx로 모델 그래프를 정적 분석해 퓨전 대상 패턴을 찾아내는 과정</strong>을 CPU에서 직접 재현했습니다. 실제 서빙 모델과 같은 구조(그룹 쿼리 어텐션과 SwiGLU MLP)를 가진 4층 Llama 계열 디코더를 순수 PyTorch로 만들고, <code class="language-plaintext highlighter-rouge">torch.fx.symbolic_trace</code>로 그래프를 떠서 노드를 분류했습니다.</p>

<p>측정 결과는 다음과 같았습니다. 파라미터 2.902M의 이 작은 디코더를 추적하니 torch.fx 그래프에 총 <strong>178개의 노드</strong>가 잡혔습니다. 연산 종류별로는 함수 호출 80개, 메서드 호출 60개, 모듈 호출 28개, 속성 조회 8개였습니다. 이 가운데 백엔드가 곧바로 퓨전 커널로 바꿀 수 있는 함수 수준 패턴은 RMSNorm 리덕션 16개, 어텐션 관련 행렬곱 8개, 소프트맥스 4개, SwiGLU 활성화 4개로 합계 32개였고, 여기에 QKV·출력·MLP 투영과 정규화를 담은 모듈 호출 28개가 더해집니다. 순전파 지연은 시퀀스 길이 64에서 평균 1.4ms였으며 torch 2.13.0에서 측정했습니다.</p>

<p><img src="/assets/images/vllm-transformers-native-speed-results.png" alt="torch.fx 그래프에서 퓨전 대상이 되는 노드 분포를 보여주는 막대 차트" /></p>

<p>이 숫자가 말해주는 바는 분명합니다. 178개 노드짜리 작은 블록 하나에서도 어텐션과 정규화, MLP 활성화라는 정형화된 패턴이 반복적으로 나타나고, 이것들이 바로 백엔드가 노려 vLLM 커널로 치환하는 지점입니다. 실제 수십 층짜리 대형 모델에서는 이 패턴이 층수만큼 곱해지므로, 그래프 분석 한 번으로 모델 전체의 병목 연산을 일괄 퓨전할 수 있게 됩니다. Hugging Face가 밝힌 바에 따르면 이 방식으로 Transformers 백엔드는 4B부터 235B까지, 텐서 병렬과 MoE 구성을 포함해 네이티브 vLLM 처리량과 대등하거나 그것을 앞섰습니다. 저희 실험은 그 처리량 수치를 재현한 것이 아니라, 그 처리량이 나오는 <strong>메커니즘의 뼈대</strong>를 실측으로 확인한 것입니다.</p>

<h2 id="thakicloud-제품-적용-시사점">ThakiCloud 제품 적용 시사점</h2>

<p>ThakiCloud의 <strong>ai-platform</strong>은 K8s와 Kueue 기반 GPU 스케줄링 위에서 다양한 고객 환경에 모델을 서빙하는 멀티테넌트 AI/ML 인프라입니다. 이 백엔드는 저희 같은 서빙 사업자에게 직접적인 이득입니다. 첫째, <strong>모델 온보딩 리드타임이 줄어듭니다.</strong> 새 오픈웨이트 모델이 공개되면 지금까지는 vLLM이 그 아키텍처를 정식 지원할 때까지 기다리거나 자체 포팅을 감수해야 했지만, Transformers에 구현이 있으면 <code class="language-plaintext highlighter-rouge">--model-impl transformers</code>로 곧바로 최적화된 속도의 서빙 파드를 띄울 수 있습니다. 이는 “새 모델을 얼마나 빨리 제품에 태우느냐”라는 경쟁력에 직결됩니다.</p>

<p>둘째, <strong>커스텀 아키텍처의 서빙 경로가 단순해집니다.</strong> 특정 고객을 위해 미세조정하거나 구조를 변형한 모델을 온프레미스에서 서빙할 때, 전용 vLLM 포팅 없이 Transformers 정의만으로 배포할 수 있다면 유지보수 부담이 크게 줄어듭니다. 소버린 클라우드나 규제 환경처럼 self-hosting이 요구되는 경우, 엔진과 모델의 버전 정합성을 맞추느라 소모하던 시간이 절약됩니다. 텐서·데이터·전문가 병렬이 그대로 지원되므로, 저희가 이미 운용하는 멀티 GPU 서빙 토폴로지를 바꾸지 않고도 이 경로를 채택할 수 있습니다.</p>

<p>에이전트 관점에서는 <strong>Paxis</strong> 렌즈도 맞닿습니다. Paxis는 ai-platform 위에서 도는 Agent-Native Cloud 제어 평면으로, 다양한 모델을 도구처럼 갈아 끼우며 에이전트를 실행합니다. 서빙 계층이 새 오픈웨이트 모델을 더 빠르고 저렴하게 올릴 수 있다는 것은, 그 위에서 도는 에이전트가 선택할 수 있는 모델 풀이 넓어지고 교체 비용이 낮아진다는 뜻입니다. 저비용·저지연 서빙이 결국 에이전트 워크로드의 경제성을 만든다는 점에서, ai-platform의 서빙 효율과 Paxis의 에이전트 유연성은 같은 방향을 봅니다.</p>

<h2 id="한계-및-반론">한계 및 반론</h2>

<p>이 백엔드가 만능은 아닙니다. 몇 가지 분명한 한계를 짚어야 공정합니다. 먼저 성능 이점은 “호환 가능한 아키텍처”에 한정됩니다. torch.fx가 정적으로 추적할 수 있어야 하고, 백엔드가 알고 있는 패턴에 들어맞아야 퓨전이 적용됩니다. 동적 제어 흐름이 심하거나 아직 알려지지 않은 신형 연산을 쓰는 구조라면 일부는 퓨전되지 않은 경로로 폴백하며, 그만큼 속도 이점이 줄어듭니다. 즉 모든 Transformers 모델이 자동으로 네이티브 속도를 내는 것은 아닙니다.</p>

<p>둘째, 이 기능은 v0.25.0에서 성숙 단계에 들어섰을 뿐 여전히 진화 중입니다. 특정 양자화 조합, 특정 어텐션 변형, 드문 MoE 라우팅 방식 등에서는 전용 포팅 구현이 여전히 더 안정적이거나 빠를 수 있습니다. 프로덕션에 올리기 전에는 대상 모델과 대상 하드웨어에서 실제 처리량과 정확도를 각자 벤치마크해 확인하는 편이 안전합니다. 저희가 이 글에서 vLLM 처리량 수치를 직접 인용하지 않고 공식 발표에 귀속한 것도 같은 이유입니다. 수치는 환경에 따라 달라지므로, ThakiCloud GPU 클러스터를 대상으로 한 실측은 별도로 진행할 예정입니다.</p>

<p>셋째, 반론도 가능합니다. 서빙 엔진과 모델 라이브러리가 강하게 결합되면, Transformers의 변경이 서빙 안정성에 영향을 줄 여지가 생깁니다. 두 코드베이스를 분리해 유지하던 시절에는 추론 스택을 독립적으로 고정할 수 있었지만, 백엔드를 공유하면 버전 관리 전략을 다시 짜야 합니다. 그럼에도 새 모델을 두 번 구현하던 비용에 견주면, 이 결합이 주는 온보딩 속도의 이득이 대부분의 서빙 시나리오에서 더 크다고 저희는 판단합니다.</p>

<h2 id="출처">출처</h2>

<ul>
  <li><a href="https://huggingface.co/blog/native-speed-vllm-transformers-backend">Native-speed vLLM transformers modeling backend (Hugging Face Blog)</a></li>
  <li><a href="https://daily.dev/posts/vllm-v0-25-0-transformers-backend-now-matches-native-vllm-speed-z8kvnsk7c">vLLM v0.25.0: transformers backend now matches native vLLM speed (daily.dev)</a></li>
  <li><a href="https://blog.vllm.ai/2025/04/11/transformers-backend.html">Transformers modeling backend integration in vLLM (vLLM Blog)</a></li>
  <li><a href="https://x.com/ClementDelangue/status/2076763231788339669">Clement Delangue (@ClementDelangue) on X</a></li>
  <li>실험 코드·로그: <code class="language-plaintext highlighter-rouge">outputs/blog-impl/vllm-transformers-native-speed/</code> (torch.fx 그래프 분석 재현, torch 2.13.0, CPU)</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="llmops" /><category term="vllm" /><category term="transformers" /><category term="inference" /><category term="serving" /><category term="torch-fx" /><category term="llmops" /><category term="self-hosting" /><category term="open-weights" /><category term="paxis" /><summary type="html"><![CDATA[지금까지 새 모델 아키텍처는 두 번 만들어야 했습니다. 한 번은 학습·연구를 위한 Transformers에서, 또 한 번은 프로덕션 추론을 위한 vLLM에서요. vLLM v0.25.0의 네이티브 속도 Transformers 백엔드는 이 이중화를 끝냅니다. 원리는 torch.fx로 모델 그래프를 정적 분석해 어텐션·정규화·MLP 같은 알려진 패턴을 찾아 vLLM의 최적화 커널로 다시 붙이는 것입니다. 저희는 이 백엔드가 실제로 수행하는 그래프 분석 단계를 4층 디코더로 직접 재현해, 178개 노드 중 어떤 것들이 퓨전 대상이 되는지 실측했습니다. 그리고 이것이 멀티테넌트로 오픈웨이트 모델을 서빙하는 ThakiCloud 인프라에 무엇을 의미하는지 짚어봅니다.]]></summary></entry><entry xml:lang="ko"><title type="html">디자인시스템으로 화면을 생성하려면, 모델보다 게이트를 먼저 만들어야 한다</title><link href="https://thakicloud.github.io/ko/research/tds-ui-generator/" rel="alternate" type="text/html" title="디자인시스템으로 화면을 생성하려면, 모델보다 게이트를 먼저 만들어야 한다" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ko/research/tds-ui-generator</id><content type="html" xml:base="https://thakicloud.github.io/ko/research/tds-ui-generator/"><![CDATA[<p>이 글은 우리 플랫폼 팀이 THAKI Design System(<code class="language-plaintext highlighter-rouge">@thaki/tds</code>)으로 데스크톱 콘솔 UI를 자동
생성하는 모델을 만들면서 배운 것을 정리한 기록이다. 읽는 대상은 LLM으로 UI를 뽑아보려는
프론트엔드·ML 엔지니어다. 결론부터 말하면, 화면 생성의 품질은 모델 크기가 아니라 <strong>생성물을
실제로 컴파일하고 검증하는 게이트</strong>가 결정했다.</p>

<p><img src="/assets/images/posts/research/tds-ui-generator/hero.png" alt="파인튜닝 0/40에서 제약 디코딩 39/40으로 뒤집힌 TDS UI 생성기 실험 결과 배너" />
<em>학습으로 문법을 가르치는 대신, 규칙으로 유효한 출력만 나오게 강제했습니다.</em></p>

<h2 id="왜-코드를-직접-생성하지-않았나">왜 코드를 직접 생성하지 않았나</h2>

<p>스크린샷이나 요구사항에서 긴 JSX를 한 번에 생성하는 방식은 오래 알려진 실패 패턴이 있다.
요소가 빠지고, 계층이 뒤틀리고, 레이아웃이 평평해진다. 우리는 일반적인 표현은 보존하고
도메인 특화 부분만 강하게 학습한다는 원리를 UI에 옮겼다. 모델이
픽셀이나 코드를 직접 만들지 않고 두 단계의 중간표현만 만들게 했다. 먼저 디자인시스템과 무관한
UX-IR로 “이 화면이 무엇을 하는가”를 표현하고, 그다음 TDS-IR로 “그것을 어떤 TDS 컴포넌트로
실현하는가”를 표현한다. 실제 코드는 모델이 아니라 결정론적 컴파일러가 소유한다. TDS가 이미
패딩과 타이포와 상호작용을 구현하고 있으니, 모델은 스타일을 다시 배울 필요 없이 어떤 컴포넌트를
어떤 구조로 쓸지만 배우면 된다.</p>

<h2 id="먼저-만든-것은-모델이-아니라-레지스트리와-게이트였다">먼저 만든 것은 모델이 아니라 레지스트리와 게이트였다</h2>

<p><code class="language-plaintext highlighter-rouge">tds_ssot</code> 저장소를 분석해 61개 컴포넌트의 props와 slot, enum 값, 그리고 어떤 slot에 어떤
컴포넌트가 들어갈 수 있는지를 자동으로 추출해 Component Registry로 만들었다. Button의 variant가
여덟 가지 중 하나여야 한다는 것, FormField의 control slot에 들어갈 수 있는 컴포넌트가 정해져
있다는 것 같은 규칙이 전부 여기에 들어간다. 흥미로운 발견 하나는, <code class="language-plaintext highlighter-rouge">@thaki/tds</code>가 모바일
시스템이 아니라 Table과 Drawer와 Modal 중심의 데스크톱 콘솔 시스템이라는 점이었다. 데모가
<code class="language-plaintext highlighter-rouge">/desktop</code> 경로인 이유이기도 하다. 그래서 UX 역할을 TDS 컴포넌트로 실현하는 매핑도 콘솔 패턴에
맞춰 잡았다.</p>

<p>게이트는 코드가 소유하게 했다. 컴포넌트가 실제로 존재하는지, prop이 정의된 값인지, slot 호환이
맞는지, 누를 수 있는 요소에 동작이 붙어 있는지, primary 버튼이 중복되지 않는지를 결정론적으로
검사한다. 모델이 “잘 만들었습니다”라고 자기 보고하는 것은 검증이 아니다. 컴파일이 되고 스키마를
통과하는 것이 검증이다.</p>

<h2 id="데이터는-100개면-충분한가">데이터는 100개면 충분한가</h2>

<p>사용자 요청은 샘플 100개였다. 여기서 정직하게 짚어야 할 것이 있다. 100개로 27B 모델을 풀
파인튜닝하면 과적합과 mode collapse가 확정이다. 그래서 100개를 27B 학습셋이 아니라 파이프라인을
증명하는 데이터로 썼다. 확률 그래머로 실제 콘솔 화면 패턴을 합성하고, 게이트를 통과한 화면에서만
학습 예제를 파생했다. 화면 한 개에서 텍스트에서 UX-IR, 텍스트에서 TDS-IR, 편집 지시에서 JSON
Patch, 잘못된 IR에서 복구, 그리고 good과 corrupt를 짝지은 선호쌍까지 여러 태스크를 뽑아냈다.
게이트를 통과한 시드 화면 22개 중 20개에서 100개의 SFT 예제와 20개의 선호쌍이 나왔다. 데이터의
양보다 실행 가능한 검증을 통과했는지가 중요하다는 원칙을 그대로 지켰다.</p>

<h2 id="가장-중요한-숫자">가장 중요한 숫자</h2>

<p>우리가 이 프로젝트에서 얻은 가장 값진 결과는 학습 곡선이 아니라 지표들의 판별력 비교였다. 정답
IR에서 컴포넌트 하나를 지우고 prop의 enum 값을 망가뜨린 다음, 여러 지표가 이 손상을 얼마나
잡아내는지 쟀다.</p>

<table>
  <thead>
    <tr>
      <th>지표</th>
      <th>정상</th>
      <th>손상</th>
      <th>변화</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>component F1 (유사도)</td>
      <td>1.00</td>
      <td>0.81</td>
      <td>거의 안 떨어짐</td>
    </tr>
    <tr>
      <td>valid-prop rate</td>
      <td>1.00</td>
      <td>0.30</td>
      <td>붕괴</td>
    </tr>
    <tr>
      <td>schema-valid rate</td>
      <td>0.93</td>
      <td>0.23</td>
      <td>붕괴</td>
    </tr>
    <tr>
      <td>compile-ok</td>
      <td>1.00</td>
      <td>1.00</td>
      <td>반응 없음</td>
    </tr>
  </tbody>
</table>

<p>유사도 기반 지표는 관대했고, 컴파일 성공은 아예 반응하지 않았다. 컴파일러는 잘못된 prop도 그냥
그대로 뱉기 때문에 컴파일이 됐다고 품질이 좋은 것이 아니다. 반대로 스키마 검증과 prop 유효성은
손상에 정확히 반응해 절반 아래로 떨어졌다. 다시 말해, 화면 생성 품질을 유사도나 컴파일 성공만으로
정렬하면 거의 맞지만 틀린 출력을 걸러내지 못한다. 품질을 만드는 것은 컴파일과 스키마와 slot과
상호작용으로 루프를 닫는 게이트다.</p>

<h2 id="학습을-붙여보고-정직하게-실패했다">학습을 붙여보고, 정직하게 실패했다</h2>

<p>여기까지가 하네스 이야기라면, 다음은 실제 학습이다. 데이터 엔진을 돌려 게이트를 통과한 화면
1185개에서 5924개의 학습 예제를 만들고, Qwen3.6-27B에 LoRA를 붙여 사내 H200 클러스터에서
학습했다. 학습 자체는 잘 수렴했다. 손실은 0.07까지 떨어졌고 토큰 정확도는 96%였다. 그리고
학습한 어댑터를 실제로 서빙해 학습 전후를 비교했다.</p>

<p>결과는 정직하게 말하면 실패였다. 300스텝짜리 진단용 LoRA는 자동 생성 결과를 거의 바꾸지
못했다. 학습 전 모델과 학습 후 모델의 오류 프로파일이 사실상 같았다. 둘 다 FormField에 입력
속성을 직접 붙이고, Card에 없는 title을 붙였다. 실제 디자인시스템은 FormField가 입력을 슬롯으로
감싸는 중첩 구조인데, 두 모델 모두 더 납작한 구조를 상상하고 있었다.</p>

<p>원인을 파고들면 세 가지였다. 학습이 짧았고, 토큰 정확도가 일찌감치 포화해서 기울기 신호가
약했다. 더 중요한 건 데이터였다. 합성 데이터를 만든 realize 함수가 실제 중첩 구조를 보여주지
않았으니, 모델은 데이터에 없는 계약을 배울 수 없었다. 그리고 27B 모델의 기존 습관이 강했다.</p>

<p>여기서 두 번째 교훈이 나온다. 세 가지 대리 지표가 모두 진짜 생성 품질을 놓쳤다. 컴파일 성공도,
teacher-forced 토큰 정확도도, LoRA를 붙였을 때의 토큰 정확도 변화도 전부 게이트 통과율과
어긋났다. 오직 완전한 레지스트리에 대한 실행 게이트만이 두 모델이 공유하는 진짜 간극을 드러냈다.
그 과정에서 우리 레지스트리 자체가 불완전해서 멀쩡한 출력을 떨구고 있었다는 것도 알게 됐고,
30개 컴포넌트의 속성을 전수 추출해 바로잡았다.</p>

<h2 id="그래서-데이터를-고치고-다시-학습하고-결국-답을-찾았다">그래서 데이터를 고치고, 다시 학습하고, 결국 답을 찾았다</h2>

<p>우리는 realize 함수를 실제 중첩 구조를 만들도록 다시 썼다. 이제 FormField는 입력을 슬롯으로
감싸고, 컴포넌트마다 실제 속성을 쓴다. 게이트를 완벽히 통과하는 화면이 2771개 나왔고, 여기서
학습 예제 1만 3855개를 만들었다. 그리고 이번에는 훨씬 오래, 최적화 업데이트를 1500번 돌렸다.</p>

<p>그런데도 학습된 모델은 여전히 게이트를 통과하지 못했다. 학습 전과 후가 또 거의 같았다. 이쯤에서
분명해졌다. 이 문제에서 27B 모델의 평탄한 습관은 우리가 감당할 만한 학습량으로는 뒤집히지
않는다는 것이다.</p>

<p>그래서 방향을 바꿨다. 모델을 설득하는 대신, 생성 자체를 강제하기로 했다. 레지스트리에서 JSON
스키마를 자동으로 만들었다. 컴포넌트 이름은 실재하는 것만, 속성은 그 컴포넌트가 실제로 가진
것만 허용하고, 중첩 구조는 재귀로 강제하는 스키마다. 이걸 디코딩 제약으로 걸었다. 결과는
분명했다. 같은 held-out 40건에서 학습 없이, 게이트 통과율이 0%에서 39건, 즉 97.5%로 올랐다
(95% 신뢰구간 86.8%에서 99.9%).</p>

<p><img src="/assets/images/posts/research/tds-ui-generator/fig1-reversal.png" alt="기본·파인튜닝·repair·제약 디코딩 네 방법의 게이트 통과율 막대그래프" />
<em>네 갈래 비교: 학습 없이 제약만으로 게이트 통과율이 39/40까지 올랐습니다. 측정값(n=40).</em></p>

<p>이 세 갈래 비교가 이 프로젝트의 결론이다. 아무 처치 없는 기본 모델도, 파인튜닝한 모델도 0/40이었고,
디코딩을 제약한 기본 모델만 39/40을 통과했다. 강한 습관을 가진 모델에게 구조화된 출력을 시킬 때는,
파인튜닝으로 습관을 지우려 애쓰는 것보다 실행 게이트와 같은 규칙으로 디코딩을 제약하는 편이
이 조건에서는 값싸고 확실했다.</p>

<p>여기서부터가 정직해야 하는 대목이다. 첫째, 97.5%이지 100%가 아니다. 통과하지 못한 한 건은 제약을
걸었는데도 JSON이 중간에 끊겨서 나왔다. 스키마 제약은 파싱 가능한 JSON조차 완전히 보장하지 못한다.
둘째, 이 승리는 타당성의 승리이지 품질의 승리가 아니다. 정답 화면과의 컴포넌트 유사도(F1)는
제약을 걸었을 때 오히려 소폭 낮아졌다(0.317에서 0.292로). 유효하다는 것과 요구한 의도에 부합한다는
것은 다르며, 이 간극이 다음 단계의 진짜 숙제다. 셋째, 통과율이 높은 이유를 오해하면 안 된다.
처음엔 이 100%가 스키마가 게이트를 대부분 포함하기 때문이라고 적었지만, 실제로 두 규칙을 적대적
케이스로 대조해 보니 반대였다. 게이트가 스키마보다 더 엄격했다. 스키마는 가장 흔한 두 오류
(존재하지 않는 컴포넌트, 없는 속성)만 막고, schemaVersion 누락이나 슬롯에 엉뚱한 컴포넌트를 넣는
것 같은 위반은 통과시켰다. 그런 것까지 잡는 것은 게이트였다. 그러니 제약이 값어치를 한 이유는
스키마가 지배적 실패 유형을 제거했고 남은 출력이 마침 게이트의 더 엄격한 규칙까지 만족했기
때문이다. 진짜 by-construction 위험은 스키마와 게이트가 같은 레지스트리에서 나온다는 점이고,
이건 레지스트리 밖의 검증기(React 렌더와 TypeScript 타입 검사)로만 배제할 수 있다.</p>

<h2 id="유효한-화면이-좋은-화면은-아니었다">유효한 화면이 좋은 화면은 아니었다</h2>

<p>여기서 멈추면 “제약이 답이다”로 끝나지만 그건 절반의 진실이었다. 우리는 더 파봤다. held-out 정답
화면에서 요구사항 계약을 뽑아, 각 방법이 화면의 실제 내용을 얼마나 재현하는지 쟀다. 결과는 뼈아팠다.
유효성은 제약이 가장 높았지만 참조의 정보와 컴포넌트 재현은 제약이 가장 낮았다. 학습 없이 유효성만
산 셈이고, 내용 재현은 무처치 기본 모델보다도 낮았다. GPU 없이 기본 출력을 결정론적으로 고치는
repair도, 자유 계획을 먼저 세우고 제약하는 방식도 마찬가지였다. 둘 다 유효성을 내용과 맞바꿨다.
유효하다는 것과 요구에 맞다는 것은 다른 축이었다.</p>

<h2 id="그래서-어디에-투자할지-먼저-쟀다">그래서 어디에 투자할지 먼저 쟀다</h2>

<p>다음 본능은 모델을 더 키우거나 여러 개 뽑아 고르는 것이었다. 그 전에 물었다. 여덟 번 생성하면
그중 좋은 게 있기는 한가. 한 프롬프트에 여덟 개씩 제약 생성해 단일 샘플과 최선의 후보를 비교하니,
최선의 후보는 단일 샘플의 유사도를 크게 웃돌았다. 0.29 대 0.45였다. 좋은 화면은 이미 생성되고
있었다. 못 하는 건 그중 좋은 걸 고르는 일이었다. 병목은 생성이 아니라 선택이었다.</p>

<h2 id="선택기는-심판이-아니라-요구사항이었다">선택기는 심판이 아니라 요구사항이었다</h2>

<p>그래서 정답을 모르는 선택기를 만들어 그 천장의 얼마를 실제로 잡는지 쟀다.</p>

<p><img src="/assets/images/posts/research/tds-ui-generator/fig2-verifier.png" alt="Top-1·구조·심판·요구사항·Oracle 선택기의 컴포넌트 F1 비교 막대그래프" />
<em>정답을 모르는 선택기 중 요구사항 predicate가 헤드룸의 27%를 회수했고, LLM 심판은 무선택보다 나빴습니다. 측정값(n=40).</em>
 구조가 풍부한 후보를
고르는 건 거의 소용없었다. 오히려 게이트를 통과한 후보를 고르면 나빠졌다. 유효성으로 고르면 내용이
떨어진다는 걸 여기서 또 봤다. 기본 모델에게 직접 이 중 뭐가 제일 낫냐 물으면 아무것도 안 고른
것보다 못했다. 통한 건 하나였다. 프롬프트에서 이 화면이 담아야 할 것을 먼저 뽑고, 그 요구를 가장
잘 채운 후보를 고르는 것. 이게 선택 헤드룸의 4분의 1을 잡았다. 심판이 아니라 요구사항이 선택기였다.</p>

<p>프로젝트를 정리하며 남는 교훈은 넷이다. 하나, 가장 먼저 투자할 곳은 더 큰 모델이 아니라 생성물을
실제로 실행하고 검증하는 골격이다. 둘, 그 골격이 정확해야 실패도 성공도 정확하게 보인다. 셋,
강한 습관과 구조화된 출력이 부딪혔을 때 적어도 이 문제에서는 학습을 더 밀어붙이기보다 제약을
거는 쪽이 값쌌다. 이것을 모든 경우로 일반화하지는 않는다. 넷, 유효성과 충실도는 다른 축이고,
남은 병목은 생성이 아니라 선택이며, 그 선택기는 심판이 아니라 요구사항 기반이어야 했다. 다음으로
증명할 것은 사람이 쓴 요구사항 계약으로 선택기와 의미 정확도를 함께 끌어올리는 것이다.</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="research" /><category term="llm" /><category term="constrained-decoding" /><category term="structured-generation" /><category term="ui-generation" /><category term="design-system" /><category term="evaluation" /><category term="verifier" /><summary type="html"><![CDATA[파인튜닝이 이길 줄 알고 시작했는데 데이터가 뒤집었습니다. 학습 없이 TDS를 지키는 생성기를 얻은 과정과, 유효한 화면이 좋은 화면은 아니라는 다음 숙제까지 정리합니다.]]></summary></entry><entry xml:lang="ko"><title type="html">AI한테 취조당하는 면접ㅋ</title><link href="https://thakicloud.github.io/ko/%EB%A7%8C%ED%99%94/the-ai-that-grills-you/" rel="alternate" type="text/html" title="AI한테 취조당하는 면접ㅋ" /><published>2026-07-15T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ko/%EB%A7%8C%ED%99%94/the-ai-that-grills-you</id><content type="html" xml:base="https://thakicloud.github.io/ko/%EB%A7%8C%ED%99%94/the-ai-that-grills-you/"><![CDATA[<p>이번 화제는 ‘/grill-me’입니다. 답을 대신 써주는 도구가 아니라, 꼬리에 꼬리를 무는 되물음으로 상대가 정말 이해했는지 캐묻는 스킬이에요. 아는 척은 두세 번만 ‘왜요?’를 던지면 밑천이 드러납니다. 그런데 이걸 기술 면접에 가져다 쓰는 사람이 생겼습니다. 정답을 맞혔는지가 아니라 압박 속에서 후보가 어떻게 생각을 풀어가는지를 옆에서 구경하는 거죠. 파시스와 메티스가 이 취조기를 손에 넣었고, 결국 서로에게 겨눕니다.</p>

<p><img src="/assets/images/posts/만화/the-ai-that-grills-you/strip.png" alt="AI한테 취조당하는 면접ㅋ" /></p>

<blockquote>
  <p>원 뉴스: <a href="https://x.com/hjguyhan/status/2077017688761938198">RT @mattpocockuk: Someone DM’d me saying they’re using /grill-me in technical interviews</a> · twitter</p>
</blockquote>

<h2 id="thakicloud-제품-적용-시사점">ThakiCloud 제품 적용 시사점</h2>

<p>만화는 웃기려고 서로 갈구지만, 사실 이건 ThakiCloud가 매일 하는 일입니다. 파시스가 만든 에이전트 결과물을 곧장 내보내지 않고, 다른 에이전트가 ‘이 주장 근거가 뭐냐’며 반증을 시도하게 합니다. 통과한 것만 배포하고요. 메티스도 추론 결과를 스스로 채점하는 대신 검증 게이트에 통과시킵니다. 취조기를 남한테만 겨누면 자기 헛소리는 못 걸러냅니다. 그래서 우리 파이프라인은 배포 전에 자기들끼리 먼저 갈굽니다. 이 만화가 올라온 과정도 그 루프를 한 바퀴 돈 결과입니다.</p>

<hr />

<p><em>이 만화는 업계 뉴스를 바탕으로 자동 생성된 초안입니다.</em></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="만화" /><category term="grill-me" /><category term="AI-interview" /><category term="adversarial-verify" /><category term="agents" /><category term="paxis" /><category term="metis" /><summary type="html"><![CDATA[후보를 갈구던 AI, 자기부터 갈궈봤더니ㅋ]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://thakicloud.github.io/assets/images/posts/%EB%A7%8C%ED%99%94/the-ai-that-grills-you/strip.png" /><media:content medium="image" url="https://thakicloud.github.io/assets/images/posts/%EB%A7%8C%ED%99%94/the-ai-that-grills-you/strip.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="ar"><title type="html">الاستقلالية ليست مفتاحا للتشغيل والإيقاف، بل مقياسا متدرجا: ما تشتريه البنوك قبل القدرة</title><link href="https://thakicloud.github.io/ar/agentops/banks-buy-control-not-capability/" rel="alternate" type="text/html" title="الاستقلالية ليست مفتاحا للتشغيل والإيقاف، بل مقياسا متدرجا: ما تشتريه البنوك قبل القدرة" /><published>2026-07-14T00:00:00+09:00</published><updated>2026-07-15T00:00:00+09:00</updated><id>https://thakicloud.github.io/ar/agentops/banks-buy-control-not-capability</id><content type="html" xml:base="https://thakicloud.github.io/ar/agentops/banks-buy-control-not-capability/"><![CDATA[<h2 id="حين-نفحص-سطرا-واحدا-من-إعلان-مناقصة-تحت-المجهر">حين نفحص سطرا واحدا من إعلان مناقصة تحت المجهر</h2>

<p>كان أهدأ خبر في ملخص هذا الصباح خبرا حصريا عن اتحاد المصارف الكوري. مضمونه المختصر أن الاتحاد طرح مناقصة لخدمة استشارية لبناء استراتيجية تبني الذكاء الاصطناعي. والمثير في الأمر هو ما ستنتجه هذه الخدمة فعليا. فهي ليست إضافة نموذج جديد، وليست نشر روبوت محادثة. إنها تحليل خصائص العمل لاكتشاف المهام، ومقارنة وتقييم الذكاء الاصطناعي السيادي المحلي مقابل الذكاء الاصطناعي التابع لشركات التقنية العالمية الكبرى والحلول المتخصصة، وبناء خارطة طريق تبني على مراحل. مدة العقد ثلاثة أشهر، وسيختار الاتحاد الجهة المرشحة المفضلة خلال هذا الشهر.</p>

<p>هنا يبرز سؤال. لو كانت القدرة هي المشكلة، فالسوق مليء أصلا بنماذج قوية. فلماذا لا تشتري البنوك النموذج أولا، بل ترسم الترتيب أولا؟ حين نمسك بهذا السؤال ونعيد قراءة أخبار اليوم كاملة، نلاحظ أن شركات مختلفة تقول في الواقع الشيء نفسه. نقطة الحسم في تبني الذكاء الاصطناعي انتقلت من مدى ذكاء النظام إلى مدى قدرتك على التحكم فيه.</p>

<h2 id="المال-ما-زال-يتدفق-نحو-الأجهزة">المال ما زال يتدفق نحو الأجهزة</h2>

<p>بالطبع ما زال مسار رأس المال متجها نحو السيليكون. اليوم وحده، سجلت هانمي سيميكوندكتور أكبر أرباح فصلية في تاريخها منذ التأسيس، بربح تشغيلي بلغ 130.3 مليار وون في الربع الثاني، بزيادة 51 بالمئة عن العام السابق، مدفوعا بالطلب على معدات المرحلة الأولى لتصنيع HBM4. وتخطط شركات الذاكرة الثلاث الكبرى لمضاعفة إنتاج HBM هذا العام أكثر من مرتين، ورغم ذلك ما زال الطلب يفوق العرض، لذا أعلنت مسبقا عن رفع الأسعار العام المقبل. بدأت SK هاينكس تقديم طلبات شراء المعدات لمصنعها Y1 في يونجين. ووصف الرئيس تشوي تاي وون هذا الأمر بأنه ليس دورة اقتصادية بل تطورا في الصناعة نفسها.</p>

<p>لكن كون المال يتدفق نحو الأجهزة لا يعني أن العائق كامن في الأجهزة أيضا. مهما كانت الرقاقة سريعة، فإذا لم يُحدَّد ما الذي يُسمح لها بفعله وإلى أي حد، فلن تستطيع صناعة خاضعة للتنظيم أن تخطو خطوة واحدة. وهنا يكمن سبب أن ما اشتراه اتحاد المصارف لم يكن أداء، بل معيارا.</p>

<h2 id="الصناعات-الخاضعة-للتنظيم-تشتري-الترتيب-قبل-القدرة">الصناعات الخاضعة للتنظيم تشتري الترتيب قبل القدرة</h2>

<p>يجدر الانتباه إلى أن خارطة طريق اتحاد المصارف تصدر على مستوى الاتحاد القطاعي، لا على مستوى مصرف واحد. فترتيب التبني ومعايير تقييم النماذج التي يضعها الاتحاد ستصبح المعيار الفعلي لدى المصارف الأعضاء. أي أن الصناعة بأكملها، لا جهة واحدة، ستُدخِل الذكاء الاصطناعي وفق القواعد نفسها. وقد فتحت الجهات التنظيمية المالية للتو استثناء في قواعد فصل الشبكات، ما يتيح استخدام الخدمات السحابية حتى داخل الشبكات الداخلية، وهو ما سيسرّع من ترسخ هذه القواعد.</p>

<p>وظهرت حركة من الطبيعة نفسها في القطاع العام أيضا. اختير ائتلاف يضم KT وNaver Cloud كجهة مرشحة مفضلة لمشروع تخطيط استراتيجي مبتكر لدى هيئة الموارد المعلوماتية الوطنية. وجوهر هذا المشروع هو أيضا التصنيف لا الميزات الجديدة. يتضمن فرز 693 نظام معلومات عام في المقر الرئيسي بدايجون، وتحديد أيها يبقى في مراكز البيانات العامة وأيها ينتقل إلى السحابة الخاصة، استنادا إلى درجة N2SF والأهمية والجدوى الاقتصادية والاستقرار. وهو إجراء تكميلي لإطار تشغيل الأنظمة الوطنية الذي أعيد تصميمه بعد حريق مركز دايجون في سبتمبر 2024.</p>

<p>الرسالة التي تحملها الحالتان واضحة. في الصناعات الخاضعة للتنظيم، الخطوة الأولى في التبني ليست النشر بل التصنيف. تحديد ما يمكن تفويضه، وإلى أي حد، يأتي قبل تحديد ما يجب فعله أولا. أما القدرة فمشكلة لاحقة.</p>

<p>يتباين هذا الحذر بوضوح مع سرعة الجمهور العام. ففي اليوم نفسه، تصدر تشات جي بي تي المرتبة الأولى من حيث نمو المستخدمين المحليين في النصف الأول من العام، ونال لقب التطبيق الوطني، بينما انضمت SK AX وTechnomatrix إلى فريق النخبة المكلف بنموذج SK تليكوم الخاص دوكباموه، ما سرّع التجارب في التصنيع والقطاع العام. وأطلقت أبيت أداة اختبار استراتيجيات تداول رجعيا في نسختها التجريبية، تتيح للمستخدمين التحاور مع الذكاء الاصطناعي للتحقق من استراتيجياتهم. فالأفراد والخدمات المتخصصة تندفع للأمام بهذه الطريقة، بينما تبطئ البنوك والقطاع العام سرعتها بدلا من ذلك لترسم الترتيب. هذا الفارق في الوتيرة ليس صدفة. فكلما كان لدى المؤسسة ما تخسره أكثر، كلما أدارت مقياس الاستقلالية بتأنٍّ أكبر.</p>

<h2 id="الاستقلالية-ليست-مفتاحا-بل-مقياس-متدرج">الاستقلالية ليست مفتاحا، بل مقياس متدرج</h2>

<p>فكيف تبدو إذن الحافة الأمامية للاستقلالية؟ كشفت SAP كوريا اليوم في سيول عن مخططها للمؤسسة المستقلة ذاتيا. والصورة هي أن وكلاء الذكاء الاصطناعي مدمجون في العمليات والبيانات، يستشعرون ويحكمون وينفذون من تلقاء أنفسهم. ويُنشَر المساعد الحواري جول في أكثر من خمسين موضعا تمتد عبر المالية والمشتريات وسلسلة التوريد والموارد البشرية وخدمة العملاء، وينسق كل مساعد أكثر من مئتي وكيل متخصص تحته لتنفيذ مهام دقيقة وضيقة النطاق. وقُدّمت سامسونج إلكترو ميكانيكس كمثال خفّض زمن توقف النظام من 144 ساعة إلى 34 ساعة، أي بنسبة 76 بالمئة، خلال هذا التحول، من دون إيقاف خطوط الإنتاج.</p>

<p>واللافت أن أحد المحاور الأربعة التي طرحتها SAP هو الحوكمة منذ البداية. فحتى الشركة التي ترسم أكثر الصور استقلالية تبيع الاستقلالية والتحكم كحزمة واحدة. وهذا هو جوهر الأمر. الاستقلالية ليست مفتاحا يُشغَّل ويُطفَأ. بل مقياس متدرج يحدد أي مهمة، وتحت موافقة من، وإلى أي حد يمكن للوكيل أن يعالجها بمفرده. وتفويض عمليات حساسة كالمالية والموارد البشرية وسلسلة التوريد يستلزم الامتثال لقانون حماية المعلومات الشخصية وقانون المعاملات المالية الإلكترونية، وقبل كل شيء إمكانية تتبع التدقيق كشرط مسبق. وكيفية تصميم العلاقة بين ثقافة الموافقات متعددة المراحل الخاصة بكوريا والتنفيذ المستقل للوكيل هي ما يحدد نجاح التبني من فشله.</p>

<h2 id="لماذا-لا-يُنتج-ضخ-المال-استراتيجية">لماذا لا يُنتج ضخ المال استراتيجية</h2>

<p>وظهر اليوم أيضا دليل في الاتجاه المعاكس. أعلنت KT أنها ستستثمر 18 تريليون وون في الاتصالات والذكاء الاصطناعي خلال السنوات الخمس المقبلة. منها 12 تريليون وون لتعزيز أعمال الاتصالات القائمة على مدى ثلاث سنوات، و6 تريليونات وون للبنية التحتية مثل مراكز بيانات الذكاء الاصطناعي والكابلات البحرية على مدى خمس سنوات. غير أن تقييم السوق كان باردا. إذ يشير النقد إلى أن قدرة KT التنافسية في النماذج والوكلاء الخاصة بها تراجعت فعليا، وأنها خسرت أيضا في مشروع الحكومة لنموذج الذكاء الاصطناعي السيادي التأسيسي. فضخ رأس مال هائل لم يترجَم تلقائيا إلى تحول نحو شركة منصة للتحول بالذكاء الاصطناعي.</p>

<p>يكشف هذا التباين هيكل أخبار اليوم. نقيض القدرة ليس العجز بل التحكم، ونقيض الإنفاق ليس الادخار بل التصميم. فالمال المنفَق على البنية التحتية لا يصبح استراتيجية ما لم يُترجَم، في طبقة التنفيذ، إلى استقلالية محكومة. وسبب رسم اتحاد المصارف لخارطة الطريق أولا، وقيام هيئة الموارد المعلوماتية الوطنية بتصنيف الدرجات أولا، هو إدراكهما لصعوبة هذه الترجمة.</p>

<h2 id="السيادة-ليست-مسألة-أين-تحفظها-بل-ماذا-تثبت">السيادة ليست مسألة أين تحفظها، بل ماذا تثبت</h2>

<p>القطعة الأخيرة تعيد كتابة تعريف السيادة. اختير برنامج شركة موريه المحلية للبنية التحتية للذكاء الاصطناعي، المصمم للأجهزة غير المتجانسة، كحالة ابتكارية في قمة الذكاء الاصطناعي من أجل الخير العالمية التي استضافها الاتحاد الدولي للاتصالات التابع للأمم المتحدة. ويجمع هذا البرنامج مسرّعات من شركات مصنّعة مختلفة، ليس فقط إنفيديا بل أيضا AMD وTenstorrent، ويشغّلها كموارد موحدة. والنقطة التي قيّمها الاتحاد الدولي للاتصالات لم تكن رقما في الأداء، بل المساهمة في تحويل منظومة مغلقة مرتبطة بأجهزة محددة إلى بنية مفتوحة ومستدامة.</p>

<p>فإذا فهمنا السيادة على أنها مسألة موقع فقط، أي إبقاء البيانات داخل حدود الدولة، فنحن لا نرى سوى نصف الصورة. فالسيادة الحقيقية هي أيضا مسألة إثبات عدم الارتباط بمورّد محدد. وهذا هو السياق الذي جعل منظمة دولية تصادق على انفتاح لا تتعثر فيه العمليات مهما كان المسرّع الذي تعمل عليه أو النموذج الذي تختاره. والتحكم الذي تريده الصناعات الخاضعة للتنظيم يقوم في النهاية على إمكانية الإثبات هذه نفسها.</p>

<h2 id="لذلك-بنينا-المقياس-المتدرج">لذلك بنينا المقياس المتدرج</h2>

<p>إذا جمعنا أخبار اليوم في سطر واحد، يصبح كالتالي: الصناعات الخاضعة للتنظيم تشتري التحكم قبل القدرة، والإثبات قبل الموقع، والترتيب قبل النشر. وباكسيس، السحابة الأصيلة للوكلاء من ThakiCloud، منتج فعلي مصمم خصيصا لمعاملة هذه المتطلبات كموارد من الدرجة الأولى، وقد أُطلق رسميا بالإصدار v1.1 الشهر الماضي.</p>

<p><img src="/assets/images/banks-buy-control-not-capability-diagram.svg" alt="بنية طبقة تنفيذ باكسيس التي تعامل الاستقلالية كمقياس متدرج لا كمفتاح" /></p>

<p><em>تمر المهام أولا عبر بوابة السياسات، ويُدار مقياس الاستقلالية من L0 إلى L3 بقدر ما تراكمت الثقة فقط. ويجري التنفيذ داخل صندوق عزل معزول، وتُسجَّل كل مرحلة في سجل تدقيق، ويعمل هذا كله داخل حدود سيادية محلية على بنية كوبرنيتيس. ويختار CostRouter النموذج الأمثل لكل مهمة من دون ارتباط بأي مورّد.</em></p>

<p>في باكسيس، تُغلَّف المهارات والأدوات التي يتعامل معها الوكيل كل منها كوحدة مستقلة، وتوضع السياسات وسجلات التدقيق جنبا إلى جنب فوقها. وهذا يعني أن ما تطلبه البنوك حتى قبل خارطة الطريق، أي تحديد ما يمكن تفويضه وإلى أي حد، وإمكانية تتبع التنفيذ لاحقا، ليسا ميزات إضافية بل جزء من الهيكل الأساسي. وتنقسم الاستقلالية إلى مراحل من L0 إلى L3. وهذا هو المقياس المتدرج الذي ذكرناه سابقا، منفَّذا كمفهوم تشغيلي فعلي. يمكنك البدء من مرحلة يوافق فيها إنسان على كل إجراء، ثم رفع المقياس تدريجيا لمهام محددة فقط اكتسبت الثقة.</p>

<p>تُنفَّذ المهام الحساسة داخل صندوق عزل معزول، ما يحد من نطاق أي حادث منذ البداية. وبنية تمنع تداعيات أي خطأ من تجاوز حدود العزل هي، إلى جانب سجل التدقيق، من أول ما تتحقق منه الصناعات الخاضعة للتنظيم قبل التبني. وحيث تلزم السيادة والتشغيل المحلي، تُشغَّل موارد وحدات معالجة الرسوميات وخدمة النماذج بشكل معزول فوق ai-platform القائمة على كوبرنيتيس. والأنظمة ذات الدرجات العالية التي لا يمكن إخراجها للخارج، كتلك الموجودة في هيئة الموارد المعلوماتية الوطنية، والقطاع المالي بمتطلباته الصارمة لفصل الشبكات، هي بالضبط ما يناسب هذا الموضع. والواجب الذي طلبه اتحاد المصارف، أي مقارنة النماذج وتقييمها، يتصل مباشرة بسياسة CostRouter التشغيلية في اختيار النموذج الأمثل لكل مهمة. وهذه هي النقطة التي يلتقي فيها الانفتاح غير المرتبط بأي نموذج مع إمكانية إثبات السيادة.</p>

<p>الآن، بينما ترسم SAP صورة المؤسسة المستقلة ذاتيا وتفكر البنوك في الترتيب الذي ستُدخِل به هذه الصورة، فإن القطعة الناقصة غالبا ليست نموذجا أقوى. بل طبقة تنفيذ قادرة على تشغيل استقلالية محكومة بأمان. وبالنسبة لمؤسسة تفضل إدارة مقياس متدرج بتأنٍّ على تشغيل مفتاح إضافي، فإن معرفة أن هذا المقياس، بمقبضه كاملا، جاهز ومنتظر بالفعل، ستقرّب نقطة الانطلاق قليلا.</p>

<h2 id="المصادر-المرجعية">المصادر المرجعية</h2>

<p>تم التحقق من الخلفية التنظيمية والمعيارية لهذا المقال من المصادر الأولية أدناه. أما أخبار اليوم المحلية المذكورة في المتن (أرباح شركات فردية، مناقصات، إعلانات) فهي مواد إخبارية عاجلة ولم تُربَط بروابط منفصلة.</p>

<ul>
  <li><a href="https://www.law.go.kr/lsInfoP.do?lsiSeq=268543">القانون الأساسي بشأن تطوير الذكاء الاصطناعي وبناء أساس الثقة (قانون الذكاء الاصطناعي الأساسي)، مركز المعلومات القانونية الوطنية</a>: أساس الاستجابة التنظيمية، ساري المفعول منذ يناير 2026</li>
  <li><a href="https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8%EB%B2%95">قانون حماية المعلومات الشخصية، مركز المعلومات القانونية الوطنية</a>: الشرط المسبق لحماية البيانات عند تفويض العمليات الحساسة</li>
  <li><a href="https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EC%A0%84%EC%9E%90%EA%B8%88%EC%9C%B5%EA%B1%B0%EB%9E%98%EB%B2%95">قانون المعاملات المالية الإلكترونية، مركز المعلومات القانونية الوطنية</a>: إطار التحكم والموافقة الخاص بالقطاع المصرفي</li>
  <li><a href="https://modelcontextprotocol.io/">بروتوكول سياق النموذج (MCP)</a>: المعيار المفتوح الذي يعامل استدعاءات أدوات الوكيل كمستوى تحكم من الدرجة الأولى</li>
  <li><a href="https://aiforgood.itu.int/">قمة الذكاء الاصطناعي من أجل الخير العالمية للاتحاد الدولي للاتصالات</a>: السياق الدولي الذي يوضح أن تبني الذكاء الاصطناعي في الصناعات الخاضعة للتنظيم يمر عبر الحوكمة والمعايير لا القدرة</li>
  <li><a href="https://eur-lex.europa.eu/eli/reg/2024/1689/oj">قانون الذكاء الاصطناعي الأوروبي (اللائحة (الاتحاد الأوروبي) 2024/1689)، EUR-Lex</a>: مثال عبر ولايات قضائية متعددة يقنن الاستقلالية في درجات مخاطر متدرجة</li>
  <li><a href="https://www.nist.gov/itl/ai-risk-management-framework">إطار إدارة مخاطر الذكاء الاصطناعي للمعهد الوطني للمعايير والتقنية NIST</a>: سابقة تنظيمية تؤسس إطار حوكمة قبل القدرة</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="agentops" /><category term="agent-governance" /><category term="sovereign-ai" /><category term="enterprise-ai" /><category term="autonomy-levels" /><category term="audit-log" /><category term="agent-native-cloud" /><category term="regulated-industry" /><summary type="html"><![CDATA[لم يطلب اتحاد المصارف الكوري نموذجا أكثر ذكاء، بل طلب ترتيبا لتبني الذكاء الاصطناعي. حين نفحص تحركات القطاعات الخاضعة للتنظيم اليوم عن قرب، يتضح أن نقطة الحسم الحقيقية في تبني الذكاء الاصطناعي هي التحكم لا القدرة.]]></summary></entry><entry xml:lang="ar"><title type="html">حذفنا 423 غيغابايت من GLM-5.2 دون تكميم: قياس الهدر في حقل الأس في BF16</title><link href="https://thakicloud.github.io/ar/llmops/lossless-bf16-compression/" rel="alternate" type="text/html" title="حذفنا 423 غيغابايت من GLM-5.2 دون تكميم: قياس الهدر في حقل الأس في BF16" /><published>2026-07-14T00:00:00+09:00</published><updated>2026-07-14T00:00:00+09:00</updated><id>https://thakicloud.github.io/ar/llmops/lossless-bf16-compression</id><content type="html" xml:base="https://thakicloud.github.io/ar/llmops/lossless-bf16-compression/"><![CDATA[<p><img src="/assets/images/lossless-bf16-compression-hero.png" alt="رسم توضيحي تجريدي لمكعبات زجاجية متراصة تُضغط دون خسارة إلى كتلة أصغر" /></p>

<h2 id="نظرة-عامة">نظرة عامة</h2>

<p>كل فريق خدَم نموذجا كبيرا مفتوح الأوزان محليا يعرف أن العائق الأول هو دائما الحجم. نموذج مثل GLM-5.2، بأكثر من 700 مليار معامل، يقترب من 1.4 تيرابايت في صيغة BF16 الخام، وتوزيعه على عدة وحدات GPU يجعل ذاكرة VRAM تكلفة مباشرة. وكان الجواب على هذه المشكلة دائما تقريبا هو التكميم: خفض 16 بت إلى 8 ثم إلى 4 بل إلى 2، مع التضحية بقليل من الجودة في الطريق.</p>

<p>هذا المقال موجه لقادة الهندسة المسؤولين عن تكلفة الاستدلال، وللممارسين الذين ينشرون النماذج محليا (on-premises)، ولعلماء البيانات في البيئات الخاضعة للتنظيم الذين لا يمكنهم فقدان بت واحد من الدقة. نشر مؤخرا باحث باسم brianbell-x أنه حذف 423 غيغابايت من GLM-5.2. صار 1403 غيغابايت يساوي 980 غيغابايت، والمثير أن الطريقة لم تكن تكميما. لم تكن تشذيبا ولا تقطيرا، بل ضغطا بلا خسارة يعيد بناء الأصل بت ببت عند فك الضغط. فإذا كان شيء بلا خسارة ومع ذلك يتقلص بنسبة 30 بالمئة، فهذا يعني أن الصيغة الأصلية كانت تهدر هذا القدر بالضبط.</p>

<p>بدل أن نأخذ الادعاء على محمل الثقة، قررنا التحقق منه مباشرة. فتحنا 490 مليون وزن مُدرّب فعلي من Qwen2.5-0.5B وقِسنا إنتروبيا حقل الأس في BF16، مؤكدين أن الثمانية بتات المخصصة تحمل فقط 2.64 بت من المعلومات الحقيقية. جاء الحد النظري للضغط بلا خسارة عند 33.5 بالمئة، وهو ما تطابق تقريبا مع 30.17 بالمئة التي حققها المؤلف الأصلي بترميز فعلي. يغطي هذا المقال تلك القياسات ويشرح لماذا يحدث التوفير ليس على القرص فحسب بل في VRAM أيضا.</p>

<h2 id="ما-هي-هذه-التقنية">ما هي هذه التقنية</h2>

<p>علينا أولا أن نرى كيف يخزّن BF16 رقما واحدا. يقسم BF16 (brain floating point 16) الستة عشر بت إلى ثلاثة أجزاء: بت إشارة واحد، و8 بتات أس، و7 بتات جزء عشري (mantissa). يحصل الأس على 8 بتات كاملة لأن BF16 مصمم للحفاظ على نطاق ديناميكي واسع مماثل لـ FP32، حتى يستطيع تمثيل قيم كبيرة جدا أو صغيرة جدا.</p>

<p>المشكلة أن أوزان نموذج مُدرّب بالكاد تستخدم هذا النطاق الواسع. في شبكة عصبية مدربة جيدا، تتجمع معظم الأوزان حول قيم صغيرة قرب الصفر. ونتيجة لذلك يتكتل حقل الأس حول حفنة من القيم، ومن بين 256 احتمالا تستطيع الثمانية بتات تمثيلها، لا يظهر فعليا سوى جزء ضئيل. هنا يكمن الهدر: تُخصَّص 8 بتات، لكن المعلومات المحمولة فعليا أقل بكثير.</p>

<p>فكرة الضغط بلا خسارة بسيطة. رمّز حقل الأس منخفض المعلومات بترميز إنتروبي إلى تمثيل قصير، واترك الثمانية بتات من الإشارة والجزء العشري كما هي لأنها شبه غير قابلة للضغط. يجمع تنفيذ المؤلف الأصلي الإشارة والأس في رمز من 4 بتات يشير إلى جدول بحث يضم أكثر 15 تركيبة أُس شيوعا. أما القيم النادرة غير الموجودة في الجدول فتُخزَّن منفصلة بصيغتها الكاملة. تلخّص الصورة التالية هذه العملية.</p>

<pre><code class="language-mermaid">flowchart TB
    A["وزن BF16 مُدرّب&lt;br/&gt;16 بت = إشارة 1 + أس 8 + جزء عشري 7"] --&gt; B["تحليل حقل الأس&lt;br/&gt;يظهر عدد قليل من 256 قيمة"]
    B --&gt; C["قياس إنتروبيا الأس&lt;br/&gt;تخصيص 8 بت -&gt; نحو 2.64 بت"]
    C --&gt; D["استبدال الإشارة+الأس برمز 4 بت&lt;br/&gt;أكثر 15 تركيبة شيوعا -&gt; جدول بحث"]
    D --&gt; E["الحفاظ على الجزء العشري 7 بت كما هو&lt;br/&gt;بلا خسارة بت ببت"]
    E --&gt; F["تخزين الأسات النادرة بصيغتها الكاملة&lt;br/&gt;مع الحفاظ على العنونة ثابتة العرض"]
    F --&gt; G["الوزن المضغوط&lt;br/&gt;نحو 10.6 بت لكل وزن (توفير نحو 33%)"]
</code></pre>

<p>يختلف هذا النهج جوهريا عن التكميم. فالتكميم يقتطع الجزء العشري أو يقرّب القيم، مسقِطا الدقة فعليا. أما الضغط بلا خسارة فلا يسقط شيئا. إنه يعيد كتابة المعلومات نفسها برمز أقصر فقط، فيعيد فك الضغط الأوزان الأصلية دون خطأ بت واحد. تنتمي أعمال حديثة مثل DFloat11 و ZipNN إلى العائلة نفسها. أفاد ZipNN أن حقل الأس في BF16 لأوزان نماذج اللغة المدربة يحمل نحو 2.6 بت فقط من إنتروبيا شانون ضمن تخصيصه البالغ 8 بت. ما أردنا معرفته هو ما إذا كان هذا الرقم يتكرر على نموذج حقيقي.</p>

<h2 id="قياس-إنتروبيا-الأس-بأنفسنا">قياس إنتروبيا الأس بأنفسنا</h2>

<p>للتحقق، فتحنا نموذج BF16 مُدرّبا حقيقيا واحدا في بيئة عمل معزولة. كان الهدف Qwen2.5-0.5B، وهو نموذج منشور فعلي بـ 490 مليون وزن. حللنا البنية الثنائية لملف safetensors مباشرة، وقرأنا كل مصفوفة BF16 كأعداد صحيحة من 16 بت، واستخرجنا الثمانية بتات الخاصة بالأس، وحسبنا توزيع القيم وإنتروبيا شانون. لم نستخدم أي تقدير من إطار عمل، بل الأرقام المستخرجة من بايتات المصفوفة الفعلية فقط.</p>

<p>في ما يلي شفرة القياس الأساسية، وهي الجزء الذي يرى قيمة BF16 كعدد صحيح من 16 بت ويقتطع حقل الأس.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="k">def</span> <span class="nf">bf16_exponent_bytes</span><span class="p">(</span><span class="n">raw</span><span class="p">:</span> <span class="n">np</span><span class="p">.</span><span class="n">ndarray</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">np</span><span class="p">.</span><span class="n">ndarray</span><span class="p">:</span>
    <span class="c1"># raw = قيم BF16 مرئية كـ uint16. الأس = البتات 14..7 (8 بت)
</span>    <span class="nf">return </span><span class="p">((</span><span class="n">raw</span> <span class="o">&gt;&gt;</span> <span class="mi">7</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">).</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">)</span>

<span class="c1"># حلّل ترويسة safetensors، اقرأ مصفوفات BF16 كـ uint16، واحسب
# إنتروبيا شانون من تكرار قيم الأس.
</span></code></pre></div></div>

<p>كانت النتيجة أكثر إثارة مما توقعنا. في ما يلي ما أظهره مسح عبر 290 مصفوفة BF16 بمجموع 494 مليون وزن.</p>

<table>
  <thead>
    <tr>
      <th>البند</th>
      <th>القيمة المقاسة</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>عدد مصفوفات BF16</td>
      <td>290</td>
    </tr>
    <tr>
      <td>إجمالي الأوزان</td>
      <td>494,032,768</td>
    </tr>
    <tr>
      <td>قيم الأس الظاهرة فعليا</td>
      <td>38 من أصل 256</td>
    </tr>
    <tr>
      <td>إنتروبيا شانون لحقل الأس</td>
      <td><strong>2.6386 بت</strong> (من 8 مخصصة)</td>
    </tr>
    <tr>
      <td>نصيب أكثر 3 أسات شيوعا</td>
      <td>نحو 72 بالمئة من كل الأوزان</td>
    </tr>
    <tr>
      <td>البت لكل وزن بعد الضغط</td>
      <td>16 بت -&gt; 10.64 بت</td>
    </tr>
    <tr>
      <td>التوفير النظري بلا خسارة</td>
      <td><strong>33.5 بالمئة</strong></td>
    </tr>
  </tbody>
</table>

<p>يستطيع حقل الأس تمثيل 256 قيمة، لكن ظهرت 38 فقط، وغطت أعلى 3 منها 72 بالمئة من كل الأوزان. كانت إنتروبيا شانون 2.6386 بت، مطابقة تقريبا لـ 2.6 بت التي أفاد بها ZipNN. بعبارة أخرى، كان حقل الأس البالغ 8 بت يحمل 2.64 بت فقط من المعلومات، والبتات الـ 5.36 المتبقية هدر خالص.</p>

<p>إزالة هذا الهدر بلا خسارة تخفض البت لكل وزن من 16 إلى 10.64، مع الحفاظ على الثمانية بتات من الإشارة والجزء العشري وضغط الأس حتى حده الإنتروبي. وكتوفير، هذا يعادل 33.5 بالمئة.</p>

<p><img src="/assets/images/lossless-bf16-compression-results.png" alt="مخطط لقياس Qwen2.5-0.5B يظهر أن حقل الأس في BF16 يستخدم فعليا 2.64 بت فقط، وأن ضغطه بلا خسارة يقلّص GLM-5.2 من 1403 غيغابايت إلى نحو 980 غيغابايت" /></p>

<p>بإسقاط هذه الـ 33.5 بالمئة على حجم GLM-5.2 (753B)، يصبح 1403 غيغابايت نحو 933 غيغابايت. أما القيمة التي حققها المؤلف الأصلي بترميز فعلي فكانت 980 غيغابايت، أي توفير 30.17 بالمئة. الفجوة البالغة نحو 3 نقاط مئوية بين حدنا النظري (33.5 بالمئة) والتنفيذ الفعلي (30.17 بالمئة) ليست صدفة. فمرمّزات الإنتروبيا الفعلية لا تبلغ حد شانون كاملا، ويجب تخزين قيم الأس النادرة بصيغتها الكاملة، ويجب أن تكون الرموز ثابتة العرض للسماح بالوصول العشوائي على GPU، وكل ذلك يضيف عبئا طفيفا. أن تتقارب النظرية والتنفيذ إلى هذا الحد دليل قوي على أن الادعاء الأصلي صحيح وأن النهج سليم.</p>

<h2 id="لماذا-تتقلص-vram-أيضا-على-gpu">لماذا تتقلص VRAM أيضا على GPU</h2>

<p>هنا النقطة الأسهل إساءة فهمها. معظم الضغط يتقلص على القرص فقط ويعود إلى حجمه الكامل لحظة تحميل النموذج على GPU، لأنه يجب فك ضغطه للحساب. لكن الـ 30 بالمئة في هذا الضغط بلا خسارة هي رقم VRAM لا رقم قرص. وهذا ما يجعل هذه التقنية مختلفة عن ضغط الملفات العادي.</p>

<p>السر في الرموز ثابتة العرض. لأن رمز كل وزن مضغوط بالعرض نفسه، يمكنك حساب موضع الوزن رقم N بالضبط دون فك ضغط. لا حاجة لتمرير فك تعبئة منفصل ولا لنسخة ثانية بالصيغة الأصلية. تقرأ نواة GPU البايتات المضغوطة مباشرة وتبحث عن كل رمز في جدول صغير محفوظ في المسجلات (registers) أثناء إجراء الضرب. الصيغة الكاملة من 16 بت لا توجد أبدا في VRAM. لذلك تظهر الـ 30 بالمئة في البصمة الفعلية للذاكرة، لا على القرص فحسب.</p>

<p>الأثر العملي كبير. خدمة نموذج 1403 غيغابايت تتطلب 18 بطاقة H100 سعة 80 غيغابايت على الأقل. ومع خفض الضغط بلا خسارة له إلى 980 غيغابايت، ينخفض ذلك إلى نحو 13. توفّر خمس وحدات GPU دون فقدان بت واحد من الجودة. إذا كان التكميم مقايضة للجودة بالذاكرة، فهذه التقنية أقرب إلى وجبة غداء مجانية. لكنها ليست مجانية تماما، ونتناول الثمن أدناه.</p>

<h2 id="الآثار-على-منتجات-thakicloud">الآثار على منتجات ThakiCloud</h2>

<p>هذه التقنية جذابة بشكل خاص من منظور ai-platform لدى ThakiCloud. الـ ai-platform بنية تحتية تخدم النماذج لبيئات عملاء متنوعة فوق Kubernetes وجدولة GPU المبنية على Kueue. كثير من العملاء المحليين يطلبون السحابة المحلية والسيادية، وفي تلك البيئات تكون كل وحدة GPU نفقة رأسمالية ومهلة توريد. يقلّل الضغط بلا خسارة عدد وحدات GPU المطلوبة دون التضحية بأي دقة، ما يجعله ورقة أسهل في الإقناع من التكميم أمام العملاء الحساسين للجودة في القطاعات المنظمة. في المال أو الرعاية الصحية، حيث تصبح قابلية إعادة إنتاج مخرجات النموذج خاضعة للتدقيق، يمكن أن يكون التطابق بت ببت متطلبا بحد ذاته.</p>

<p>الأثر أكبر في الإعدادات متعددة المستأجرين التي تخدم نماذج كبيرة بـ vLLM أو SGLang. استعادة 30 بالمئة من VRAM تتيح تركيب نافذة سياق أكبر على العتاد نفسه، أو تشغيل مزيد من الطلبات المتزامنة، أو تحميل نموذج أكبر على عقدة واحدة. تراكم هذا النوع من كفاءة الموارد بالضبط هو حيث ينافس ai-platform على تكلفة خدمة منخفضة. الضغط بلا خسارة محور متعامد مع التكميم و paged attention والتوازي التنسوري، فيُضاف مباشرة فوق التحسينات القائمة.</p>

<p>والخدمة منخفضة التكلفة تغذّي بدورها اقتصاديات الوكلاء. Paxis، وهو مستوى التحكم Agent-Native Cloud لدى ThakiCloud، يشغّل مئات المهارات في صناديق رمل معزولة ويمرّر كل فعل عبر بوابات سياسة وسجلات تدقيق، وهذه أحمال عمل الوكلاء تستدعي نماذج كبيرة مفتوحة الأوزان مرارا. وكلما انخفضت تكلفة وحدة الخدمة، أمكن تشغيل الوكلاء بجرأة أكبر، فتكون كفاءة موارد ai-platform ركيزة لاقتصاديات تشغيل Paxis.</p>

<h2 id="القيود-والاعتراضات">القيود والاعتراضات</h2>

<p>هذه التقنية ليست علاجا شاملا. أولا، فرضية انخفاض إنتروبيا الأس تصح فقط في النماذج المدربة جيدا. يجب أن تتجمع الأوزان قرب الصفر ليتكتل الأس، لذا فالنماذج غير المدربة بما يكفي، أو ذات التوزيعات الواسعة، أو المكمَّمة بشدة أصلا، ستشهد توفيرا أقل. كما أن قياسنا يأتي من نموذج واحد، فالأرقام الفعلية ستتغير بحسب البنية وطريقة التدريب.</p>

<p>ثانيا، فك رموز الضغط في الوقت الحقيقي يتطلب من نواة GPU معالجة البحث والضرب معا. وإن لم تُحسَّن تلك النواة جيدا، فقد ينتهي بك الأمر إلى توفير الذاكرة مع زيادة زمن الاستجابة. قد تعمل أسرع في أحمال العمل المقيدة بعرض نطاق الذاكرة، لكن هذا يعتمد بشدة على العتاد وتنفيذ النواة، لذا يجب قياس الأداء على GPU المستهدف قبل النشر.</p>

<p>ثالثا، بما أنه بلا خسارة، لا يستطيع هذا النهج بلوغ توفير الضغط الشديد مثل التكميم إلى 4 بت. توفير 30 بالمئة ممتاز، لكنه يخدم غرضا مختلفا عن التكميم الذي يتنازل عن قليل من الجودة ليتقلص 4 أضعاف. الاثنان متكاملان لا متنافسان، والجواب الواقعي يجمعهما: ضغط بلا خسارة حيث تكون الدقة حاسمة تماما، وتكميم حيث يوجد فسحة في الجودة.</p>

<p>أخيرا، تستند هذه النتيجة إلى تجربة عامة لباحث واحد وإلى إعادة إنتاج صغيرة النطاق من جانبنا. تطبيقها في الإنتاج يتطلب التحقق المستقل من التطابق بت ببت للضغط وإعادة البناء، ومن أداء النواة، ومن توفير VRAM الفعلي على النموذج المستهدف وحزمة الخدمة.</p>

<h2 id="المصادر">المصادر</h2>

<ul>
  <li>brianbell-x, “Lossless Model Compression Experiment”: <a href="https://brianbell-x.github.io/weight-compression/">https://brianbell-x.github.io/weight-compression/</a></li>
  <li>النموذج المقاس: Qwen/Qwen2.5-0.5B (Hugging Face)</li>
  <li>أعمال ذات صلة: ZipNN, DFloat11 (عائلة ترميز إنتروبيا الأس في BF16)</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;&quot;Seoul, Korea&quot;, &quot;email&quot;=&gt;&quot;info@thakicloud.co.kr&quot;, &quot;uri&quot;=&gt;nil, &quot;home&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Website&quot;, &quot;icon&quot;=&gt;&quot;fas fa-fw fa-link&quot;, &quot;url&quot;=&gt;&quot;https://thakicloud.co.kr&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/thakicloud&quot;}]}</name><email>info@thakicloud.co.kr</email></author><category term="llmops" /><category term="lossless-compression" /><category term="bf16" /><category term="quantization" /><category term="vram" /><category term="llmops" /><category term="self-hosting" /><category term="vllm" /><category term="paxis" /><summary type="html"><![CDATA[ادعى أحدهم أنه قلّص GLM-5.2 من 1403 غيغابايت إلى 980 غيغابايت. لا تكميم ولا تشذيب، بل ضغط بلا خسارة مطابق للأصل بت ببت. كان من الصعب تصديق ذلك، لذا فتحنا 490 مليون وزن من Qwen2.5-0.5B وقِسنا بأنفسنا إنتروبيا حقل الأس في BF16. اتضح أن الثمانية بتات المخصصة لا تحمل فعليا سوى 2.64 بت من المعلومات، ما يعني إمكانية إزالة نحو 33.5 بالمئة دون خسارة. يشرح هذا المقال من أين يأتي هذا الهدر، ولماذا يظهر التوفير ليس على القرص فحسب بل في ذاكرة VRAM أيضا، بالاستناد إلى بيانات مقاسة.]]></summary></entry></feed>