From 249be589fca75900930b136b6a1af0c15a06191e Mon Sep 17 00:00:00 2001 From: Hamza Ayed Date: Sat, 3 Oct 2026 18:11:22 +0300 Subject: [PATCH] Add repeatable Ollama memory snapshots --- SovereignAI-Starter/README.md | 4 +- SovereignAI-Starter/ROADMAP.md | 2 +- .../ollama_runtime_2026-10-03_180846.json | 24 +++++++++ .../ollama_runtime_2026-10-03_180934.json | 39 +++++++++++++++ .../scripts/capture_ollama_runtime.ps1 | 49 +++++++++++++++++++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180846.json create mode 100644 SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180934.json create mode 100644 SovereignAI-Starter/scripts/capture_ollama_runtime.ps1 diff --git a/SovereignAI-Starter/README.md b/SovereignAI-Starter/README.md index 2aa07a0..0bc73b8 100644 --- a/SovereignAI-Starter/README.md +++ b/SovereignAI-Starter/README.md @@ -101,7 +101,9 @@ python scripts/run_model_eval.py --model gemma4:e2b --warmup python scripts/run_model_eval.py --model qwen2.5:1.5b-instruct-q4_K_M --warmup ``` -الـAPI يجب أن يكون شغالًا على `127.0.0.1:8000` والنماذج مختارة/مثبتة محليًا. يطلب المشغّل جلسة loopback محلية مؤقتة ويلغيها بعد التقييم. `--warmup` يرسل سؤال إحماء واحدًا قبل قياس الحالات، والتقرير يسجل زمن الإحماء وملخص متوسط/وسيط/أقل/أعلى زمن. كل نتيجة تحفظ في `evals/results/`. المراجعة البشرية الأولية تستخدم مقياسًا من 0 إلى 2 لكل سؤال: 0 إخفاق، 1 جزئي، 2 مستوفٍ للمعيار؛ مرّة واحدة من خمسة أسئلة لا تكفي لقرار نهائي، ولا تقيس استهلاك الذاكرة حتى الآن. +الـAPI يجب أن يكون شغالًا على `127.0.0.1:8000` والنماذج مختارة/مثبتة محليًا. يطلب المشغّل جلسة loopback محلية مؤقتة ويلغيها بعد التقييم. `--warmup` يرسل سؤال إحماء واحدًا قبل قياس الحالات، والتقرير يسجل زمن الإحماء وملخص متوسط/وسيط/أقل/أعلى زمن. كل نتيجة تحفظ في `evals/results/`. المراجعة البشرية الأولية تستخدم مقياسًا من 0 إلى 2 لكل سؤال: 0 إخفاق، 1 جزئي، 2 مستوفٍ للمعيار؛ مرّة واحدة من خمسة أسئلة لا تكفي لقرار نهائي. + +لقطة الذاكرة الحالية على Windows تُلتقط بـ`powershell -ExecutionPolicy Bypass -File scripts/capture_ollama_runtime.ps1`. تحفظ الأداة حالة Ollama المحمّلة من `/api/ps` وأحجام عمليات `llama-server`؛ إنها لقطة لحظية وليست قياس ذروة، ولا تربط PID بعينه بالنموذج. اختبار استرجاع RAG يستخدم مجموعة صغيرة من ملفات عربية مؤقتة عبر API، ويقيس Hit@1/3 وMRR ووجود الدليل ثم يزيل الملفات من الفهرس: diff --git a/SovereignAI-Starter/ROADMAP.md b/SovereignAI-Starter/ROADMAP.md index d2dd183..6235a43 100644 --- a/SovereignAI-Starter/ROADMAP.md +++ b/SovereignAI-Starter/ROADMAP.md @@ -149,7 +149,7 @@ ## المرحلة 7 — تقييم النماذج والتدريب - [x] إنشاء مجموعة أولية من خمسة أسئلة عربية/برمجية مع معايير مراجعة بشرية وفحوص شكل/قيمة محدودة، ومشغّل يسجل الأجوبة ووقت كل طلب واسم أداة الوكيل في JSON. تجربة واحدة على Gemma 4 E2B وQwen 2.5 1.5B وحُفظت النتائج في `evals/results/` (2026-10-02). -- تكرار التقييم مع إجابات مرجعية ومراجعين/درجات بشرية، وقياس استهلاك الذاكرة واعتماد مقارنة قابلة للتكرار. (2026-10-03: أُعيد تشغيل المجموعة بعد إصلاحات الوكيل على Gemma 4 E2B وQwen 2.5 1.5B مع warmup؛ كلاهما 5/5 طلبات بلا أخطاء و4/4 فحوص تلقائية ضيقة. Gemma متوسط 14.61 ثانية (وسيط 12.91؛ 0.03–25.93)، وQwen متوسط 7.00 (وسيط 5.80؛ 0.03–18.48). تقريران `evals/results/gemma4_e2b_2026-10-03_175827.json` و`evals/results/qwen2.5_1.5b-instruct-q4_K_M_2026-10-03_180307.json`. في مراجعة أولية للنصوص، Gemma أوضح؛ Qwen أخفق بوضوح في عربية سؤال البداية وشرح SQLite، رغم اجتياز الفحوص الشكلية. لم تُسجل درجات بشرية بعد. قياس عملية Ollama المفردة (120.7MB private/87MB working عقب Gemma، ثم 109.3/74.2MB بعد تبديل النموذج) لا يشمل بالضرورة عامل النموذج أو ذاكرة الأوزان، فلا يُعد peak RAM صالحًا. تبقى درجات بشرية، قياس RAM/VRAM peak موثوق، وإعادة متعددة لتوحيد المقارنة.) الجولة السابقة كانت Gemma 8/10 بمتوسط 16.32 ثانية وQwen 5/10 بمتوسط 8.93 ثانية. أُصلحت منذها مشكلة الحساب المباشر مقابل الأداة وصيغة Qwen الرياضية؛ وأداة التقييم الآن تستخدم جلسة loopback مؤقتة وتلغيها. +- تكرار التقييم مع إجابات مرجعية ومراجعين/درجات بشرية، وقياس استهلاك الذاكرة واعتماد مقارنة قابلة للتكرار. (2026-10-03: أُعيد تشغيل المجموعة بعد إصلاحات الوكيل على Gemma 4 E2B وQwen 2.5 1.5B مع warmup؛ كلاهما 5/5 طلبات بلا أخطاء و4/4 فحوص تلقائية ضيقة. Gemma متوسط 14.61 ثانية (وسيط 12.91؛ 0.03–25.93)، وQwen متوسط 7.00 (وسيط 5.80؛ 0.03–18.48). تقريران `evals/results/gemma4_e2b_2026-10-03_175827.json` و`evals/results/qwen2.5_1.5b-instruct-q4_K_M_2026-10-03_180307.json`. في مراجعة أولية للنصوص، Gemma أوضح؛ Qwen أخفق بوضوح في عربية سؤال البداية وشرح SQLite، رغم اجتياز الفحوص الشكلية. لم تُسجل درجات بشرية بعد. أُضيف `scripts/capture_ollama_runtime.ps1` لالتقاط Ollama `/api/ps` وعمليات التشغيل: ظهرت Gemma بحجم محمّل 6,733,158,152 بايت وQwen بحجم 1,169,980,128 بايت، وكلاهما `size_vram=0` (CPU). اللقطتان `evals/results/ollama_runtime_2026-10-03_180846.json` و`...180934.json`. القياس لحظي لا peak؛ لا يربط PID بالنموذج ولم تتوفر قراءة إجمالي/متاح RAM بسبب رفض CIM. تبقى مراجعة بشرية، قياس ذروة موثوق ومتكرر، وإعادة عدة جولات.) الجولة السابقة كانت Gemma 8/10 بمتوسط 16.32 ثانية وQwen 5/10 بمتوسط 8.93 ثانية. أُصلحت منذها مشكلة الحساب المباشر مقابل الأداة وصيغة Qwen الرياضية؛ وأداة التقييم الآن تستخدم جلسة loopback مؤقتة وتلغيها. - اختيار النماذج حسب الرخصة، الجودة، اللغة، دعم الأدوات، كمية VRAM، وإمكانية التشغيل التجاري. لا نعتمد وصف «مفتوح» وحده كإثبات سماح تجاري؛ نراجع الرخصة الرسمية لكل إصدار. - تحسين أولي عبر prompts وRAG والأدوات؛ هذه غالبًا تعالج نقص المعرفة أو القدرة على الفعل دون تغيير أوزان النموذج. - عند توفر GPU مناسب: تجربة LoRA/QLoRA على بيانات مرخصة ومنقحة، ومقارنة النتائج بالمجموعة المرجعية قبل اعتماد adapter. diff --git a/SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180846.json b/SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180846.json new file mode 100644 index 0000000..ffb7708 --- /dev/null +++ b/SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180846.json @@ -0,0 +1,24 @@ +{ + "collected_at_local": "2026-10-03T18:08:46.3401488+03:00", + "source": "http://127.0.0.1:11434/api/ps", + "loaded_models": [ + { + "name": "gemma4:e2b", + "model": "gemma4:e2b", + "loaded_size_bytes": 6733158152, + "vram_size_bytes": 0, + "parameter_size": "5.1B", + "quantization": "Q4_K_M", + "context_length": 4096, + "expires_at": "2026-10-03T18:12:14.9381872+03:00" + } + ], + "llama_server_processes": [ + { + "process_id": 41288, + "working_set_bytes": 3017682944, + "private_bytes": 3743903744 + } + ], + "note": "Point-in-time snapshot, not peak memory. Process-to-model mapping and total host RAM are not asserted." +} diff --git a/SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180934.json b/SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180934.json new file mode 100644 index 0000000..d8073bd --- /dev/null +++ b/SovereignAI-Starter/evals/results/ollama_runtime_2026-10-03_180934.json @@ -0,0 +1,39 @@ +{ + "collected_at_local": "2026-10-03T18:09:34.5489107+03:00", + "source": "http://127.0.0.1:11434/api/ps", + "loaded_models": [ + { + "name": "qwen2.5:1.5b-instruct-q4_K_M", + "model": "qwen2.5:1.5b-instruct-q4_K_M", + "loaded_size_bytes": 1169980128, + "vram_size_bytes": 0, + "parameter_size": "1.5B", + "quantization": "Q4_K_M", + "context_length": 4096, + "expires_at": "2026-10-03T18:14:33.40604+03:00" + }, + { + "name": "gemma4:e2b", + "model": "gemma4:e2b", + "loaded_size_bytes": 6733158152, + "vram_size_bytes": 0, + "parameter_size": "5.1B", + "quantization": "Q4_K_M", + "context_length": 4096, + "expires_at": "2026-10-03T18:12:14.9381872+03:00" + } + ], + "llama_server_processes": [ + { + "process_id": 41288, + "working_set_bytes": 3017682944, + "private_bytes": 3743903744 + }, + { + "process_id": 55716, + "working_set_bytes": 1193771008, + "private_bytes": 1283440640 + } + ], + "note": "Point-in-time snapshot, not peak memory. Process-to-model mapping and total host RAM are not asserted." +} diff --git a/SovereignAI-Starter/scripts/capture_ollama_runtime.ps1 b/SovereignAI-Starter/scripts/capture_ollama_runtime.ps1 new file mode 100644 index 0000000..8ed2817 --- /dev/null +++ b/SovereignAI-Starter/scripts/capture_ollama_runtime.ps1 @@ -0,0 +1,49 @@ +[CmdletBinding()] +param( + [string]$OllamaUrl = 'http://127.0.0.1:11434', + [string]$OutputPath = '' +) + +$ErrorActionPreference = 'Stop' +$endpoint = $OllamaUrl.TrimEnd('/') + '/api/ps' +$runtime = Invoke-RestMethod -Uri $endpoint -TimeoutSec 15 +$models = @($runtime.models | ForEach-Object { + [ordered]@{ + name = $_.name + model = $_.model + loaded_size_bytes = $_.size + vram_size_bytes = $_.size_vram + parameter_size = $_.details.parameter_size + quantization = $_.details.quantization_level + context_length = $_.context_length + expires_at = $_.expires_at + } +}) +$runners = @(Get-Process -Name 'llama-server' -ErrorAction SilentlyContinue | ForEach-Object { + [ordered]@{ + process_id = $_.Id + working_set_bytes = $_.WorkingSet64 + private_bytes = $_.PrivateMemorySize64 + } +}) + +$report = [ordered]@{ + collected_at_local = [DateTimeOffset]::Now.ToString('o') + source = $endpoint + loaded_models = $models + llama_server_processes = $runners + note = 'Point-in-time snapshot, not peak memory. Process-to-model mapping and total host RAM are not asserted.' +} + +if (-not $OutputPath) { + $resultsDirectory = Join-Path $PSScriptRoot '..\evals\results' + $stamp = Get-Date -Format 'yyyy-MM-dd_HHmmss' + $OutputPath = Join-Path $resultsDirectory "ollama_runtime_$stamp.json" +} + +$resolvedOutput = [System.IO.Path]::GetFullPath($OutputPath) +$outputDirectory = Split-Path -Parent $resolvedOutput +New-Item -ItemType Directory -Force -Path $outputDirectory | Out-Null +$report | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $resolvedOutput -Encoding utf8 +Write-Output "Saved runtime snapshot: $resolvedOutput" +Write-Output ("Loaded models: {0}; llama-server processes: {1}" -f $models.Count, $runners.Count)