Trackio documentation
مخطط التخزين والاستعلامات المباشرة
مخطط التخزين والاستعلامات المباشرة
تخزّن Trackio كل مشروع في قاعدة بيانات SQLite خاصة به، ويمكنها تصدير تلك البيانات إلى parquet للمزامنة، ومساحات Spaces الثابتة، والتحليل المباشر. توثّق هذه الصفحة مخطط SQLite المباشر، وتخطيط parquet المشتق، والأمر الجديد trackio query لتنفيذ استعلامات SQL للقراءة فقط.
مكان تخزين البيانات
- توجد قواعد بيانات المشاريع المحلية في
TRACKIO_DIR، والتي تكون افتراضيًا~/.cache/huggingface/trackio. - يُخزَّن كل مشروع كملف SQLite منفصل:
{project}.db. - تُخزَّن الوسائط والملفات المرفوعة تحت
TRACKIO_DIR/media/. - يُكتب كل مسار (trace) أيضًا كملف جلسة وكيل قابل للعرض على Hub تحت
TRACKIO_DIR/traces/(على Space، بادئةtraces/الخاصة بالحاوية). هذه ملفات عرض مخصصة لعارض مسارات الوكلاء على Hub؛ بينما تبقى جدولtracesهو المرجع المعتمد. راجع المسارات (Traces). - عند المزامنة مع Hugging Face، يقوم Trackio بتصدير ملفات parquet من قاعدة بيانات SQLite قبل الرفع.
استعلام البيانات مباشرة
استخدم سطر الأوامر عندما تحتاج إلى استعلام شامل لا تغطيه أوامر trackio list أو trackio get بالفعل:
trackio query project --project "my-project" --sql "SELECT run_name, MAX(step) AS last_step FROM metrics GROUP BY run_name ORDER BY last_step DESC"أضف --json للحصول على مخرجات قابلة للقراءة آليًا:
trackio query project --project "my-project" --sql "SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name" --jsonيعمل الأمر نفسه مع مساحة (Space) عن بُعد:
trackio query project --project "my-project" --sql "SELECT COUNT(*) AS num_alerts FROM alerts" --space username/my-space --jsonيقبل trackio query فقط استعلامات SELECT وWITH للقراءة فقط، واستعلامات PRAGMA الآمنة للمخطط، بما في ذلك قراءة PRAGMA user_version.
مخطط SQLite
يُعرَّف المخطط الحي في trackio/sqlite_storage.py بواسطة SQLiteStorage.init_db().
المقاييس
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
timestamp | TEXT | طابع زمني بصيغة ISO |
run_name | TEXT | معرّف التشغيل |
step | INTEGER | خطوة التدريب |
metrics | TEXT | كتلة JSON تحتوي على قيم المقاييس المسجلة |
log_id | TEXT | مفتاح إزالة التكرار الاختياري المضاف بواسطة الترحيل الإضافي |
space_id | TEXT | علامة مزامنة معلقة اختيارية أُضيفت بواسطة هجرة تراكمية |
الفهارس:
idx_metrics_run_stepعلى(run_name, step)idx_metrics_run_timestampعلى(run_name, timestamp)idx_metrics_log_idفهرس جزئي فريد علىlog_ididx_metrics_pendingفهرس جزئي علىspace_id
إعدادات
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
run_name | TEXT | معرّف التشغيل |
config | TEXT | كتلة JSON تحتوي على إعدادات التشغيل |
created_at | TEXT | طابع زمني بصيغة ISO |
الفهارس والقيود:
UNIQUE(run_name)idx_configs_run_nameعلى(run_name)
system_metrics
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
timestamp | TEXT | طابع زمني بصيغة ISO |
run_name | TEXT | معرّف التشغيل |
metrics | TEXT | كتلة JSON تحتوي على مقاييس النظام |
log_id | TEXT | مفتاح إزالة التكرار الاختياري المضاف بواسطة الترحيل الإضافي |
space_id | TEXT | علامة مزامنة معلقة اختيارية أُضيفت بواسطة هجرة تراكمية |
الفهارس:
idx_system_metrics_run_timestampعلى(run_name, timestamp)idx_system_metrics_log_idفهرس جزئي فريد علىlog_id- فهرس جزئي
idx_system_metrics_pendingعلىspace_id
تتبعات
| عمود | النوع | ملاحظات |
|---|---|---|
id | TEXT | المفتاح الأساسي |
run_id | TEXT | معرّف تشغيل مستقر |
timestamp | TEXT | طابع زمني بصيغة ISO وقت تسجيل التتبع |
run_name | TEXT | اسم العرض للتنفيذ |
step | INTEGER | خطوة التدريب أو التسجيل |
key | TEXT | المفتاح المستخدم في حمولة trackio.log() |
trace_index | INTEGER | الموضع الذي سُجّلت فيه المسارات كقائمة |
messages | TEXT | رسائل JSON بأسلوب OpenAI |
metadata | TEXT | بيانات وصفية لتتبع JSON |
search_text | TEXT | النص المسطّح المستخدم في بحث التتبع |
log_id | TEXT | مفتاح إزالة التكرار الاختياري لسجل المصدر |
space_id | TEXT | علامة مزامنة معلقة اختيارية |
spans | TEXT | مدد تنفيذ JSON؛ القيمة الافتراضية هي [] |
الفهارس:
idx_traces_run_stepعلى(run_id, step)idx_traces_run_timestampعلى(run_id, timestamp)idx_traces_searchعلىsearch_text
project_metadata
| عمود | النوع | ملاحظات |
|---|---|---|
key | TEXT | المفتاح الأساسي |
value | TEXT | قيمة البيانات الوصفية |
pending_uploads
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
space_id | TEXT | مساحة الوجهة |
run_name | TEXT | اسم تشغيل اختياري |
step | INTEGER | خطوة اختيارية |
file_path | TEXT | المسار المحلي المطلق |
relative_path | TEXT | مسار وسائط نسبي |
created_at | TEXT | طابع زمني بصيغة ISO |
تنبيهات
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
timestamp | TEXT | طابع زمني بصيغة ISO |
run_name | TEXT | معرّف التشغيل |
title | TEXT | عنوان التنبيه |
text | TEXT | نص التنبيه الاختياري |
level | TEXT | info أو warn أو error |
step | INTEGER | خطوة تدريب اختيارية |
alert_id | TEXT | مفتاح إزالة التكرار الاختياري |
الفهارس:
idx_alerts_runعلى(run_name)idx_alerts_timestampعلى(timestamp)idx_alerts_alert_idفهرس جزئي فريد علىalert_id
artifacts
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
name | TEXT | اسم الأداة |
type | TEXT | فئة حرة مثل model أو dataset |
description | TEXT | وصف اختياري |
created_at | TEXT | طابع زمني بصيغة ISO |
الفهارس والقيود:
UNIQUE(name)
artifact_versions
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
artifact_id | INTEGER | المراجع artifacts.id |
version | INTEGER | رقم تسلسلي يبدأ من 0 |
manifest_digest | TEXT | ملخص سداسي عشري SHA-256 لملف JSON الرسمي |
manifest | TEXT | كتلة JSON تحوي قائمة إدخالات البيان مع path وdigest وsize وref الاختياري |
metadata | TEXT | بيانات وصفية JSON اختيارية |
size_bytes | INTEGER | الحجم الإجمالي لمدخلات قائمة إصدار (مجموع size) بالبايت |
producer_run_id | TEXT | معرّف اختياري للتشغيل المُنتج |
producer_run_name | TEXT | اسم اختياري للتشغيل المُنتج |
created_at | TEXT | طابع زمني بصيغة ISO |
الفهارس والقيود:
UNIQUE(artifact_id, version)UNIQUE(artifact_id, manifest_digest)
artifact_aliases
| عمود | النوع | ملاحظات |
|---|---|---|
artifact_id | INTEGER | المراجع artifacts.id |
alias | TEXT | اسم مستعار مثل latest |
artifact_version_id | INTEGER | مرجع artifact_versions.id |
الفهارس والقيود:
PRIMARY KEY (artifact_id, alias)
run_artifact_links
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
run_id | TEXT | معرّف تشغيل اختياري |
run_name | TEXT | اسم تشغيل اختياري |
artifact_version_id | INTEGER | مرجع artifact_versions.id |
direction | TEXT | input أو output |
created_at | TEXT | طابع زمني بصيغة ISO |
الفهارس والقيود:
CHECK(direction IN ('input', 'output'))idx_run_artifact_links_runعلى(run_id, run_name)idx_run_artifact_links_versionعلى(artifact_version_id)idx_run_artifact_links_uniqueفهرس فريد على(run_id, artifact_version_id, direction)
جداول السجل
قواعد بيانات Registry — وهي مشاريع تُسمّى registry-<name>، وتُنشأ بواسطة Api.create_registry — تحتوي على الجداول القياسية المذكورة أعلاه بالإضافة إلى الجداول الأربعة أدناه، والمعرّفة في trackio/registry_storage.py بواسطة RegistryStorage.init_registry_db(). تأتي أرقام إصدارات المجموعات من collections.next_version، وهو يتقدّم فقط: لا يُعاد استخدام إصدار المجموعة أبداً، حتى بعد فكّ الارتباط. كما أن كل تعديل على السجلّ يضيف صفّاً إلى registry_events ضمن نفس المعاملة.
collections
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
name | TEXT | اسم المجموعة، UNIQUE |
type | TEXT | نوع الأداة الواحدة الذي تقبله المجموعة |
description | TEXT | وصف اختياري |
next_version | INTEGER | عداد أحادي الاتجاه لأرقام إصدارات المجموعة |
created_at | TEXT | طابع زمني بصيغة ISO |
collection_links
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
collection_id | INTEGER | المراجع collections(id) |
collection_version | INTEGER | رقم الإصدار داخل المجموعة (v0، v1، …) |
source_project | TEXT | المشروع الذي سُجّلت فيه إصدار الأداة المرتبطة |
source_artifact | TEXT | اسم الأداة المرتبطة |
source_version | INTEGER | نسخة العنصر المرتبط |
source_space_id | TEXT | المساحة التي تحتوي على الإصدار الأصلي، NULL عندما يكون محليًا |
source_bucket_id | TEXT | الدلو الذي يحتوي على النسخة المصدرية، NULL عندما تكون محلية |
created_at | TEXT | طابع زمني بصيغة ISO |
قيود:
UNIQUE(collection_id, source_project, source_artifact, source_version)— يُربط إصدار المصدر مرة واحدة كحد أقصى لكل مجموعةUNIQUE(collection_id, collection_version)
collection_aliases
| عمود | النوع | ملاحظات |
|---|---|---|
collection_id | INTEGER | المراجع collections(id) |
alias | TEXT | اسم مستعار |
link_id | INTEGER | المراجع collection_links(id) |
قيود:
PRIMARY KEY (collection_id, alias)— نسخة واحدة لكل مستعار في كل مجموعة
registry_events
| عمود | النوع | ملاحظات |
|---|---|---|
id | INTEGER | المفتاح الأساسي |
event_uid | TEXT | <compact-utc>-<writer>-<seq>، فريد؛ يرتّب الأحداث ترتيبًا كليًا عبر الكتاب ويجعل إعادة التشغيل غير قابلة للتكرار |
ts | TEXT | طابع زمني بصيغة ISO |
kind | TEXT | create، link، promote، update، أو unlink |
payload | TEXT | كتلة JSON تصف التحوّل |
السجل هو الشكل الرسمي للقيود: الجداول أعلاه هي طيّ له. مخزن القيود المدعوم بالحاويات يخزّن الأحداث نفسها ككائن واحد لكل حدث (انظر دليل القيود) ويحوّل هذه الجداول محليًا.
كيف تُخزَّن حمولات المقاييس
- تُخزَّن مقاييس المستخدم كنص JSON في
metrics.metrics. - تُخزَّن مقاييس النظام كنص JSON في
system_metrics.metrics. - يُخزَّن تكوين التشغيل كنص JSON في
configs.config. - تقوم واجهات برمجة التطبيقات الأعلى مستوى في Trackio بإلغاء تسلسل هذه الكتل JSON قبل إعادتها.
نمط الاستعلام المباشر الشائع:
trackio query project --project "my-project" --sql "SELECT timestamp, step, metrics FROM metrics WHERE run_name = 'run-1' ORDER BY step DESC LIMIT 5"مثال على فحص المخطط:
trackio query project --project "my-project" --sql "PRAGMA table_info(metrics)"تخطيط Parquet
يستمد Trackio ملفات parquet من SQLite عن طريق تسطيح أعمدة JSON إلى أعمدة عادية.
تصدير ملفات parquet محلية
SQLiteStorage.export_to_parquet() يكتب:
{project}.parquetمنmetrics{project}_system.parquetمنsystem_metrics{project}_configs.parquetمنconfigs{project}_traces.parquetمنtraces{project}_{table}.parquetلكل جدول من جداول المخرجات (artifacts،artifact_versions،artifact_aliases،run_artifact_links)
تحتفظ ملفات parquet المسطحة بالأعمدة الهيكلية مثل timestamp وrun_name وstep، ثم تضيف عمودًا واحدًا لكل مفتاح موجود في حمولة JSON.
التصدير إلى Static Space ومجموعات البيانات
SQLiteStorage.export_for_static_space() يكتب:
metrics.parquetaux/system_metrics.parquetaux/configs.parquetaux/traces.parquetaux/artifacts.parquet،aux/artifact_versions.parquet،aux/artifact_aliases.parquet، وaux/run_artifact_links.parquetruns.jsonsettings.json
ينسخ النشر الثابت ملفات الوسائط إلى media/ وملفات الحزم إلى artifacts/blobs/sha256/{prefix}/{digest} إلى جانب هذه التصديرات، بحيث يمكن للوحة التحكم المخصصة للمتصفح فقط تقديم تنزيلات الحزم مباشرةً من مجموعة البيانات أو الدلو.
هذا هو التخطيط المستخدم للمساحات الثابتة والمجموعات البيانات المصدَّرة.
أمثلة استعلامات مفيدة
قوائم الجداول:
trackio query project --project "my-project" --sql "SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name"ابحث عن أحدث خطوة لكل تشغيل:
trackio query project --project "my-project" --sql "SELECT run_name, MAX(step) AS last_step FROM metrics GROUP BY run_name ORDER BY last_step DESC"فحص التنبيهات الأخيرة:
trackio query project --project "my-project" --sql "SELECT timestamp, run_name, level, title, step FROM alerts ORDER BY timestamp DESC LIMIT 20"فحص الإعدادات المخزنة:
trackio query project --project "my-project" --sql "SELECT run_name, created_at, config FROM configs ORDER BY created_at DESC"إصدارات المخطط والهجرة
تسجّل قاعدة بيانات كل مشروع إصدار مخططها في PRAGMA user_version:
trackio query project --project "my-project" --sql "PRAGMA user_version"SQLiteStorage.init_db() يرفع قاعدة البيانات إلى SCHEMA_VERSION (المعرّفة في trackio/sqlite_storage.py) كلما فُتحت للكتابة، وينقل خادم Trackio كل قاعدة بيانات مشروع عند بدء تشغيله. قواعد البيانات المكتوبة قبل وجود نظام الإصدارات تُبلّغ عن الإصدار 0 وتُرفع إلى الإصدار 1 عبر عبارات CREATE TABLE IF NOT EXISTS وALTER TABLE ... ADD COLUMN الإضافية في init_db(). يمنح الإصدار 2 قواعد البيانات المكتوبة قبل Trackio 0.24 قيمة run_id في كل جدول مرتبط بتشغيل: إذ كانت تلك الإصدارات تحدد التشغيل باسمه فقط، لذا يصبح كل اسم تشغيل تشغيلًا واحدًا بمعرّف جديد.
لتغيير المخطط أو إعادة كتابة البيانات الموجودة بطريقة لا تستطيع تلك العبارات التعبير عنها، أضف خطوة إلى _SCHEMA_MIGRATIONS وزِد قيمة SCHEMA_VERSION:
def _split_loss_column(cursor):
cursor.execute("ALTER TABLE metrics ADD COLUMN loss REAL")
cursor.execute("UPDATE metrics SET loss = json_extract(metrics, '$.loss')")
SCHEMA_VERSION = 3
_SCHEMA_MIGRATIONS = {2: _migrate_add_run_ids, 3: _split_loss_column}_SCHEMA_MIGRATIONS[n] يحدّث قاعدة البيانات من الإصدار n - 1 إلى n. يُنفَّذ كل خطوة في نقطة حفظ خاصة بها معًا مع رفع رقم الإصدار، بحيث إذا فشلت خطوة ما تبقى قاعدة البيانات عند آخر إصدار اكتمل. تُترك قاعدة البيانات التي يكون إصدارها أحدث مما تعرفه Trackio قيد التشغيل دون أي تغيير.
يعتمد trackio bump على هذا: بعد إعادة تشغيل مساحة على النسخة المحلية من Trackio، يتحقق من أن كل قاعدة بيانات مشروع تُبلّغ عن SCHEMA_VERSION المحلي. ينفّذ اختبار النهاية إلى النهاية في tests/e2e-spaces/test_space_bump.py كل هجرة على بيانات كُتبت بواسطة Trackio 0.21.0 و 0.37.1.
ملاحظات حول الاستقرار
لا يزال Trackio في مرحلة تجريبية. تم توثيق المخطط هنا حتى يتمكن البشر والوكلاء من الاستعلام عنه مباشرة، لكن الإصدارات المستقبلية قد تطوّر المخطط وتتطلب هجرات أو إعادة توليد قواعد البيانات المحلية.
Update on GitHub