دوز مباشرة للمحتوى الرئيسي
دروس فالذكاء الاصطناعي

شغّل GLM-5.3 Flash EXL3 على جوج ديال أنظمة NVIDIA DGX Spark

تعلّم كيفاش تثبّت، تهيّأ، تشغّل، تختبر، وتضبط GLM-5.3 Flash EXL3 على جوج ديال أنظمة NVIDIA GB10 DGX Spark. هاد الدليل كيغطي بيئة التشغيل بجوج العُقد، وفكّ الترميز التخميني DFlash2، وذاكرة التخزين المؤقت MLA KV بصيغة fp8، والطلبات المتوافقة مع OpenAI، والتخزين المؤقت ديال البادئات، وقياس الأداء، واختبار العزل الاختياري، وقيود الإعدادات المهمة.

شغّل GLM-5.3 Flash EXL3 على جوج أنظمة NVIDIA DGX Spark

نظرة عامة

GLM-5.3 Flash EXL3 لـ 2x DGX Sparks هو وصفة نشر وطبقة vLLM لتقديم نسخة EXL3/TR3 مكمّمة بـ 4 bpw من GLM-5.3 Flash عبر جوج أنظمة NVIDIA GB10. كيوفّر API متوافق مع OpenAI فالمنفذ 8888، وكيقدّم الموديل بالمعرّف GLM-5.3-Flash-EXL3.

الوصفة كتستعمل التوازي على مستوى الموتر، برتبة وحدة فكل جهاز. وكتجمع بين الخبراء الموجّهين EXL3 المعبّئين، وkernels أصلية ديال sm_121a، وذاكرة KV متناثرة MLA بصيغة fp8، وCUDA graphs، وفكّ ترميز توقّعي DFlash2 بسبعة tokens مسودّة.

الـ checkpoint المستعمل افتراضياً هو Mia-AiLab/GLM-5.3-Flash-EXL3-TR3-4bpw، وهو mirror عمومي مطابق بالبايت للنسخة المشار ليها ديال Brandon Music. فيه تقريباً 164 GiB موزّعة على 120 shard. مستودع الموديل عندو الرخصة ديالو، بينما scripts ديال التقديم وoverlay مرخّصين بـ MIT.

علاش الـ overlay ضروري

صورة ARM64 القياسية ديال GLM-5.3 vLLM كتقدر تحمّل هاد الـ checkpoint، ولكن كتفشل فـ أول forward pass حيث GLM-5.3 Flash كيستعمل NoPE MLA، بينما backend ديال sparse-MLA المتاح فـ SM12x كيتوقّع هندسة معبّأة مختلفة. الـ overlay كيزيد padding للـ latent ديال NoPE، اللي حجمو 512 بُعد، باش يوافق الهندسة المطلوبة من FLASHINFER_MLA_SPARSE_SM120 بلا ما يبدّل حاصل الضرب QK.

وكيسجّل حتى طريقة quantization خدامة ديال EXL3. بهاد الشكل، الخبراء الموجّهين كيبقاو فـ التمثيل المعبّأ ديالهم trellis وSUH وSVH وMCG بلا ما يتوسّعو لـ BF16. ملي كيكون المسار المدموج مفعّل، كل layer كيستعمل launch واحد ديال exllamav3_ext.exl3_moe.

الـ overlay كيوفّر كذلك integration خاص بـ GLM مع DFlash2، ومن ضمنو التقاط hidden states مساعد ديال EAGLE3، وsliding-window attention ديال المسودّة اللي كيشترك فـ slots ديال MLA KV ديال الهدف، وattention غير سببي داخل block ديال المسودّة التوقّعية.

المزايا الرئيسية

  • خدمة متوافقة مع OpenAI: vLLM كيقدّم /v1/chat/completions وendpoints مرتبطة بها على head node.
  • Tensor parallelism على جوج nodes: النشر كيستعمل --nnodes 2 و--tensor-parallel-size 2.
  • أوزان EXL3 مدموجة: الـ checkpoint ديال 4 bpw حجمو تقريباً 164 GiB للتحميل، وكيظهر بحجم 176 GB فـ لوحة الجودة المشار ليها.
  • فك ترميز توقّعي DFlash2: الموديل ديال المسودّة الافتراضي هو incoai/GLM-5.3-Flash-DFlash2 مع k=7.
  • سياق طويل: الحد الأقصى الافتراضي لطول الموديل هو 900,000 token، مدعوم بـ pool ديال MLA بصيغة fp8 كيوصل حسب التقرير لـ 982,612 token فـ إعداد الذاكرة الموثّق.
  • دعم الوسائط المتعددة: إدخالات الصور والفيديو مفعّلة، مع حد افتراضي فكل prompt ديال أربع صور وفيديو واحد.
  • تحليل الأدوات والاستدلال: الـ launcher كيفعّل الاختيار التلقائي للأدوات، وparsers متوافقين مع GLM لاستدعاءات الأدوات والاستدلال.
  • تخزين prefix مؤقتاً: يمكن إعادة استعمال prefixes المحاذاة مع block ملي كاتبقى hashes المعنية فـ cache.
  • إزالة اختيارية لاتجاه الرفض: ABLIT=1 كيدير تعديل فـ الذاكرة على أوزان مختارة native BF16 ديال إسقاط المخرجات وقت التحميل.

متطلبات العتاد والبرمجيات

هاد الوصفة مصمّمة بالخصوص لجوج أنظمة NVIDIA GB10 من فئة DGX Spark، مربوطين عبر CX7 fabric الموثّق. ماشي نشر عام لوحدة GPU وحدة.

  • جوج أنظمة NVIDIA GB10، مع تقريباً 180 GiB ديال التخزين الحر فكل node للإعداد الأولي.
  • Docker متاح بلا sudo فالجهازين بجوج.
  • SSH بلا كلمة سر من head node للـ worker.
  • hf أو huggingface-cli، وcurl، وrsync منصّبين على head.
  • واجهات الشبكة CX7 وأجهزة RDMA مضبوطة مزيان فالجهازين.
  • بلاصة ديال Hugging Face cache قادرة تستوعب الـ checkpoint الموزّع على 120 shard وموديل DFlash2 اللي حجمو تقريباً 2.3 GiB.

خلّي إعدادات واجهة CX7 وHCA ديال المستودع كيف ما هي، إلا إلا كانت التوصيلات الفيزيائية مختلفة. الـ README كينبّه أن NCCL ما يقدرش يستعمل aliases ديال loopback 10.0.0.x، وقد يعلّق أثناء ncclCommInitRank إلا كانت إعدادات fabric غير صحيحة.

تثبيت النشر وإعداده

1. نسخ المستودع

git clone https://github.com/MiaAI-Lab/GLM-5.3-Flash-EXL3-2x-DGX-Sparks.git
cd GLM-5.3-Flash-EXL3-2x-DGX-Sparks

2. إنشاء ملف البيئة

cp .env.example .env

عدّل .env إلا كانت الأجهزة ما كتستعملش العناوين أو أسماء الحسابات الافتراضية ديال الوصفة. أهم الإعدادات هي:

  • HEAD_IP=10.0.0.1 للـ head node وvLLM master.
  • WORKER_IP=10.0.0.2 للـ Spark الثاني.
  • WORKER_USER إلا كان حساب SSH مختلف بين nodes.
  • WORKER_HOME إلا كان home ديال worker أو مكان Hugging Face cache مختلف.
  • PORT=8888 لمستمع API.

الـ launcher كينشئ .env من .env.example تلقائياً إلا ما كانش موجود. القيم اللي كتتحدّد مباشرة قبل الأمر عندها الأولوية على القيم الموجودة فالملف.

3. اختيارياً، حضّر الأوزان

./download.sh

هاد الأمر كيحمّل checkpoint ديال EXL3 وموديل DFlash2 لـ Hugging Face cache ديال head node. ما كيشغّلش Docker، وما كيتاصلش بالـ worker، وما كيديرش مزامنة للملفات. استعملو إلا بغيتي تكمل تحميل الموديل اللي حجمو تقريباً 164 GiB قبل ما يكون الـ worker واجد.

باش تحدّث الملفات المخزّنة مؤقتاً بشكل صريح، شغّل:

REFRESH_WEIGHTS=1 ./download.sh

تجنّب إعادة التحميل بلا داعي. كلّ من download.sh وstart.sh كيتخطّاو المستودعات اللي راه كاملة من قبل.

4. شغّل الرتبتين والـ API

./start.sh

سكريبت التشغيل كيدير التسلسل التالي:

  1. كيتحقّق من Docker وSSH والمساحة المتوفّرة فالقرص فالجوج ديال العُقد.
  2. كيحمّل الصورة العمومية ghcr.io/miaai-lab/glm-5.3-flash-2x-dgx-sparks:exl3 فالـ head.
  3. كينقل صورة الحاوية للـ worker ملي كيكون الـ digest ديالها تبدّل.
  4. كيحمّل ملفات الموديل الناقصة لذاكرة Hugging Face المؤقّتة ديال الـ head.
  5. كيساوي الـ cache مع الـ worker باستعمال rsync.
  6. كيشغّل الرتبة 1 فالوضع بلا واجهة على الـ worker.
  7. كيشغّل الرتبة 0 والـ API المتوافق مع OpenAI فالـ head.
  8. كيبقى يراقب نقطة الصحة حتى يكمل تحميل الموديل والإحماء.

المهلة الافتراضية للاستعداد هي 3,600 ثانية، حيث إن تحميل الأوزان والتقاط رسومات CUDA يقدرو ياخدو وقت مهم.

5. تفقّد الحالة والسجلات

./start.sh status
./start.sh logs
./start.sh logs worker

وقّف الجوج ديال الحاويات بهاد الأمر:

./start.sh stop

وتقدر حتى تستعمل ./stop.sh.

صيفط طلب محادثة بسيط

فعقدة الـ head، عنوان الـ API الأساسي هو http://127.0.0.1:8888/v1. وبالعناوين الموثّقة ديال الشبكة المحلية، تقدر الآلات الأخرى تستعمل http://10.0.0.1:8888/v1.

curl -s http://127.0.0.1:8888/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "GLM-5.3-Flash-EXL3",
    "messages": [
      {"role": "user", "content": "Explain tensor parallelism briefly."}
    ],
    "chat_template_kwargs": {
      "enable_thinking": false
    }
  }'

القيمة ديال model فالطلب خاصّها تطابق الاسم المقدَّم، والاسم الافتراضي هو GLM-5.3-Flash-EXL3. التفكير مفعّل افتراضياً. باش تطفّيه، حطّ chat_template_kwargs فالمستوى الأعلى ديال طلب JSON كيف ما مبيّن الفوق.

ما تصيفطش كائن extra_body متداخل حرفياً عبر HTTP الخام. فـ OpenAI Python SDK، ‏extra_body هو خيار ديال الـ SDK، والمحتوى ديالو كيندمج فالطلب فالمستوى الأعلى.

إعدادات التوليد ديال نقطة التحقّق تقدر تعطي temperature=1.0 وtop_p=0.95. حدّد قيم أخذ العينات فكل طلب ملي تحتاج سلوك مختلف.

فهم بيئة التشغيل الافتراضية

الإعدادات الافتراضية ديال النشر منسّقة عن قصد. تبديل مكوّن واحد يقدر يخلّي تركيبة النواة غير صالحة أو ينقص من نسبة قبول التخمين.

  • الأوزان: Mia-AiLab/GLM-5.3-Flash-EXL3-TR3-4bpw، مع الرجوع لمستودع Brandon Music ملي كتكون النسخة المرآتية غير متوفّرة أو ناقصة.
  • التوازي: جوج عُقد وحجم التوازي التنسوري هو جوج، باستعمال منفّذ المعالجة المتعدّدة.
  • التكميم: exl3، مع خبراء موجّهين ومعبّئين، وأوزان أصلية كثيفة، ومشتركة مع الخبراء، والانتباه، والتضمين، ورأس الإخراج.
  • ذاكرة KV المستهدفة: fp8، وممثّلة داخلياً بصيغة fp8_ds_mla المعبّأة.
  • التخمين: DFlash2 بسبعة رموز تخمينية، والتوازي التنسوري ديال المسودة مضبوط على واحد.
  • ذاكرة KV ديال المسودة: اختيار تلقائي، والنتيجة هي BF16 للموديل الكثيف ديال المسودة بدل تخطيط MLA ديال الهدف.
  • الانتباه: sparse MLA للهدف، وFLASH_ATTN مختار تلقائياً لانتباه مسودة DFlash2.
  • السياق: MAX_MODEL_LEN=900000.
  • التزامن: MAX_NUM_SEQS=4.
  • التهيئة المسبقة: MAX_NUM_BATCHED_TOKENS=1024.
  • استعمال الذاكرة: GPU_MEM_UTIL=0.87.

بدّل أوضاع فكّ الترميز بالتخمين

DFlash2 هو الافتراضي وكيستعمل incoai/GLM-5.3-Flash-DFlash2. باش ترجع لمسار MTP ديال نقطة التحقّق بجوج رموز تخمينية، عاود التشغيل بهاد الأمر:

SPEC_METHOD=mtp ./start.sh restart

البيئة كتدعم حتى SPEC_METHOD=none. التوازي التنسوري الافتراضي لمسودة DFlash2 هو واحد، وهاد الشي كيخلّي موديل المسودة الصغير فالرتبة 0 وكيجنّب تواصل CX7 فكل خطوة ديال المسودة.

ما تفرضش TRITON_ATTN على DFlash2. حسب القياسات اللي فالـ README، هاد الواجهة الخلفية خلات الانتباه سببي داخل كتلة المسودة، وتسبّبات فهبوط القبول فالمواضع التخمينية اللاحقة. خلّي انتباه المسودة بلا تحديد باش SM121 يختار FLASH_ATTN.

إعداد ذاكرة KV والسياق الطويل

خاص ذاكرة KV المستهدفة تبقى fp8. فهاد المعمارية، نواة sparse-MLA كتقبل fp8_ds_mla المعبّأة؛ أما BF16 فما عندهاش نواة sparse متوافقة، ونوى NVFP4 ديال KV كتطبّق على dense MHA وماشي على sparse MLA.

مع DFlash2، ودعم الرؤية، واستعمال الذاكرة بنسبة 0.87، والحد الأقصى لطول الموديل 900,000، كايذكر الـ README تجمّعاً بسعة 982,612 رمز، باستعمال تقريباً 15.67 GiB لـ fp8 MLA. هاد الشي كيوفّر تقريباً 1.09 مرة سعة طلب واحد كامل من 900,000 رمز. إعداد أصلي بمليون رمز ما زال ما كيتخصّصش بالإعداد الموثّق.

خلّي هاد الإعدادات كيف ما هي إلا كنت كتختبر تغييراً مقصوداً فبيئة التشغيل:

KV_CACHE_DTYPE=fp8
GPU_MEM_UTIL=0.87
MAX_MODEL_LEN=900000
MAX_NUM_BATCHED_TOKENS=1024
SKIP_MM_PROFILING=1
LIMIT_MM={"image":4,"video":1}

SKIP_MM_PROFILING=1 مهم، حيث إن تحديد الموارد لمدخل وهمي بأقصى حجم للصورة والفيديو يقدر يعمّر الذاكرة الموحّدة. والـ README كينبّه حتى إلى أن رفع حدّ الرموز المجمّعة إلى 8,192 كيحمّل مسار indexer top-k ديال GB10 فوق طاقتو أثناء تشغيل السياق الطويل.

كيفاش كيتصرّف التخزين المؤقّت للبادئات

الكاش ديال الـPrefix مفعّل، ولكن واجهة OpenAI API باقية بلا حالة. خاصّ الكليان يعاود يصيفط تاريخ المحادثة كامل فكل دورة. vLLM كيحسب هاش ديال الـprefix اللي تصيفط، وقد يعاود يستعمل البلوكات المخزّنة إلا كانت مازال متوفّرة.

  • غير التوكنات المحاذية للبلوكات كيتحسبو كـhits حسب مدير كاش MLA الموثّق.
  • MAX_NUM_SEQS=4 كيسمح بأربع عمليات توليد خدامة فآن واحد؛ ماشي حجز لأربع جلسات محادثة دائمة.
  • ما كاينش ضمانة أن المحادثات اللي ما فيهاش نشاط تبقى مخزّنة فالكاش.
  • التفعيلات ديال محادثة وحدة ما كتتخلّطش مع محادثة أخرى.
  • محادثة قديمة تقدر تحتاج prefill جديد من بعد ما يطرد workload آخر الـprefix ديالها من الكاش.

الاختبار المباشر فـREADME عاود استعمل 3,584 توكن من متابعة فيها 7,760 توكن، يعني تقريباً 46 فالمية من الـprompt. اعتابر كاش الـprefix تسريع انتهازي وماشي تخزين دائم للجلسات.

قياس أداء الـdecode

المستودع فيه tests/bench_decode.py باش يقيس streaming decode ويفحص التماسك. شغّل اختبار العدّ المنظّم بهاد الأمر:

python3 tests/bench_decode.py \
  --phase structured \
  --structured \
  --runs 5 \
  --max-tokens 400 \
  --skip-coherence \
  --out /tmp/glm53-structured.json

وشغّل اختبار شرح hash-map بالنثر بهاد الأمر:

python3 tests/bench_decode.py \
  --phase prose \
  --runs 5 \
  --max-tokens 400 \
  --skip-coherence \
  --out /tmp/glm53-prose.json

حسب البروتوكول الموثّق فـREADME، مع warmup وKV فارغ، الـworkload المنظّم وصل لـ62.9 توكن فالثانية مع concurrency واحد، و103.3 توكن فالثانية كمجموع مع concurrency جوج، و146.5 توكن فالثانية كمجموع مع concurrency ربعة. الأداء كيتعلّق بزاف بمدى قبول التنبؤات الاستباقية: الوسيط فالمختبر كان 61.7 توكن فالثانية فالخروج المنظّم، ولكن 26.9 فالنثر. الاختبارات المختلطة أو ديال السياق الطويل، بحوالي 60,000 حتى 100,000 توكن مخزّنة، تسجلات فيها سرعة بين 24 و27 توكن فالثانية.

هاد الأرقام كتخصّ بالضبط إعداد جوج GB10، وأنواع الـprompt، والإعداد ديال temperature-zero، والتفكير المعطّل، وDFlash2 k=7، وعمليات توليد فيها 400 توكن المذكورة فـREADME. ما خاصّهاش تتفسّر كضمانات عامة للإنتاجية.

اختياري: إزالة اتجاه الرفض

المستودع يقدر يطبّق إزالة اتجاه الرفض وقت تحميل الأوزان بلا ما يعاود يكتب أو يعاود يكمّم checkpoint ديال EXL3. فعّلو بهاد الشكل:

ABLIT=1 ./start.sh restart
./start.sh logs | grep ablit

الوصفة الافتراضية كتعدّل كل self_attn.o_proj الأصلي بصيغة BF16 فالطبقات من 15 حتى 45. الطبقات من 0 حتى 14 كيبقاو بلا تغيير وكيخدمو كمرساة للسلامة. المقياس الافتراضي هو ABLIT_ALPHA=3.0؛ وإلا حطّيتيه فـ1.0 كيتطبّق إسقاط عادي كيحيد المركّبة اللي فالاتجاه المعطى.

من بين الإعدادات المفيدة:

  • ABLIT=0 أو قيمة ما معمّراش باش تبقى الأوزان الأصلية بلا تغيير.
  • ABLIT_DIRECTION=dealign للاتجاه الافتراضي المنشور.
  • ABLIT_LAYERS=15-45 باش تحدّد النطاق الشامل ديال الطبقات المعدّلة.
  • ABLIT_ALPHA=3.0 لمقياس الإسقاط.
  • ABLIT_INCLUDE_MTP=1 باش تدخل بلوك MTP ديال الـcheckpoint ملي كيكون MTP مستعمل.

نتائج الجودة ديال KLD فـREADME تقاست بلا إزالة الاتجاه. تفعيلها كيبدّل سلوك الرفض وقد يأثّر على التماسك أو قبول التنبؤات الاستباقية، حيث إن drafter ديال DFlash2 كيبقى بلا تغيير بينما خرجات الهدف كتتبدّل. إلا نقص التماسك، فالـREADME كيقترح تنقص ABLIT_ALPHA أولاً.

مسارات متقدمة لتشغيل الخدمة

منين كتكون الصورة وكاش الموديل موجودين فالجوج ديال الماكينات، تقدر تتجاوز نقل البيانات المتكرر:

SKIP_DOWNLOAD=1 SKIP_SYNC=1 ./start.sh

باش تخلي صورة الـcontainer المحلية وتتجاوز جميع عمليات السحب والتنزيل والمزامنة:

SKIP_PULL=1 SKIP_DOWNLOAD=1 SKIP_SYNC=1 ./start.sh restart

باش تعاود تبني الـoverlay من المستودع الحالي بلا ما تستعمل الصورة العمومية:

BUILD=1 SKIP_DOWNLOAD=1 SKIP_SYNC=1 ./start.sh restart

وتقدر حتى تبني Dockerfile مباشرة:

docker build -t glm53-flash-sm121:local .

سكريبت التشغيل كيدير عادةً self-check ديال GPU overlay قبل ما يصيفط الصورة للـworker. ما تستعملش SKIP_OVERLAY_VERIFY=1 إلا إلا كنت باغي عمداً تتجاوز داك الفحص.

تحذيرات مهمّة فالإعدادات

  • ما تمرّرش --moe-backend marlin. هاد النشر كيستعمل أوزان EXL3 والطريقة ديالو الخاصة فترتيب الخبراء.
  • ما تضبطش كاش KV ديال الهدف على NVFP4 أو BF16. خليه KV_CACHE_DTYPE=fp8.
  • ما تثبّتش attention ديال المسودة الاستباقية على TRITON_ATTN.
  • ما تعوّضش الصورة القديمة glm53-flash-sm121:v8 ديال نشر NVFP4/Ray.
  • ما تبدّلش tensor parallelism، وعدد العقد، وCX7 pins، أو USE_HOST_NCCL بلا دراسة. هادو كاملين جزء أساسي من الوصفة ديال العقدتين.
  • ما تمسحش كاش الـcheckpoint ديال Hugging Face وما تعاودش تكمّمو إلا إلا كنت ناوي تنزّل الموديل كامل من جديد.
  • ما تعطلش احتياطات profiling ديال الوسائط المتعددة بلا ما تحسب استعمال unified memory.
  • ما توجّهش ABLIT_DIRECTION لمتجه ديال checkpoint ما عندوش علاقة بلا ما تتحقق من hidden size ديالو.

حلّ المشاكل

الخدمة ما كتولّيش healthy أبداً

فتّش فالجوج ديال الـlogs باستعمال ./start.sh logs و./start.sh logs worker. تحقّق من SSH بلا كلمة سر، والمساحة المتوفّرة فالقرص، وصلاحيات Docker، واكتمال الكاش، وأسماء واجهات CX7. تحميل الأوزان الأولي والتقاط graph كياخدو الوقت، لذلك خلّي timeout الافتراضي ديال الجاهزية يسالي غير من بعد ما تراجع التقدّم فالـlogs.

NCCL كيتعلّق أثناء تهيئة الرتب

تأكّد من HEAD_CX7_IF وWORKER_CX7_IF وHEAD_CX7_IB وWORKER_CX7_IB. الإعدادات الافتراضية الموثّقة مرتبطة بالمنافذ الفيزيائية ديال المختبر، وقد تحتاج تبدّلها إلا كان التوصيل بالكابلات مختلف.

العامل ما قادرش يوصل لـ GHCR

العامل ما كيحتاجش ولوج مباشر لـ GHCR. الرأس كيسحب الصورة العمومية وكيحوّلها عبر SSH. إلا واجه الرأس حدود المعدّل ديال الوصول المجهول، عيّن GHCR_USER وGHCR_TOKEN.

الفكّ التخميني بطيء بشكل غير متوقّع

تأكّد باللي SPEC_METHOD=dflash وDFLASH_TOKENS=7، وأن الانتباه ديال المسودة ما مفروضش على TRITON_ATTN. وخاصك تذكّر حتى أن أداء الفكّ التخميني كيختلف حسب نوع الخرج: التسلسلات المنظمة بزاف تقدر يكون عندها قبول أعلى بزاف من النثر غير المقيّد.

الخلاصة

هاد المشروع كيحوّل جوج أنظمة NVIDIA GB10 لسيرفر GLM-5.3 Flash متوافق مع OpenAI برتبتين، باستعمال أوزان EXL3 مدمجة، وتخزين fp8 sparse-MLA المؤقت، وفكّ تخميني DFlash2. أسرع طريقة هي تحافظ على الإعدادات الافتراضية الموفّرة ديال الشبكة وKV والانتباه والتكميم، وتطلق الخدمة بـ ./start.sh، ومن بعد تتحقّق من النشر عبر نقطة نهاية الحالة، وواجهة الدردشة، والسجلات، واختبارات فكّ الترميز المرفقة.