Add repeatable Ollama memory snapshots
This commit is contained in:
@@ -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
|
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 ووجود الدليل ثم يزيل الملفات من الفهرس:
|
اختبار استرجاع RAG يستخدم مجموعة صغيرة من ملفات عربية مؤقتة عبر API، ويقيس Hit@1/3 وMRR ووجود الدليل ثم يزيل الملفات من الفهرس:
|
||||||
|
|
||||||
|
|||||||
@@ -149,7 +149,7 @@
|
|||||||
## المرحلة 7 — تقييم النماذج والتدريب
|
## المرحلة 7 — تقييم النماذج والتدريب
|
||||||
|
|
||||||
- [x] إنشاء مجموعة أولية من خمسة أسئلة عربية/برمجية مع معايير مراجعة بشرية وفحوص شكل/قيمة محدودة، ومشغّل يسجل الأجوبة ووقت كل طلب واسم أداة الوكيل في JSON. تجربة واحدة على Gemma 4 E2B وQwen 2.5 1.5B وحُفظت النتائج في `evals/results/` (2026-10-02).
|
- [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، وإمكانية التشغيل التجاري. لا نعتمد وصف «مفتوح» وحده كإثبات سماح تجاري؛ نراجع الرخصة الرسمية لكل إصدار.
|
- اختيار النماذج حسب الرخصة، الجودة، اللغة، دعم الأدوات، كمية VRAM، وإمكانية التشغيل التجاري. لا نعتمد وصف «مفتوح» وحده كإثبات سماح تجاري؛ نراجع الرخصة الرسمية لكل إصدار.
|
||||||
- تحسين أولي عبر prompts وRAG والأدوات؛ هذه غالبًا تعالج نقص المعرفة أو القدرة على الفعل دون تغيير أوزان النموذج.
|
- تحسين أولي عبر prompts وRAG والأدوات؛ هذه غالبًا تعالج نقص المعرفة أو القدرة على الفعل دون تغيير أوزان النموذج.
|
||||||
- عند توفر GPU مناسب: تجربة LoRA/QLoRA على بيانات مرخصة ومنقحة، ومقارنة النتائج بالمجموعة المرجعية قبل اعتماد adapter.
|
- عند توفر GPU مناسب: تجربة LoRA/QLoRA على بيانات مرخصة ومنقحة، ومقارنة النتائج بالمجموعة المرجعية قبل اعتماد adapter.
|
||||||
|
|||||||
@@ -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."
|
||||||
|
}
|
||||||
@@ -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."
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user