Trackio documentation
مسح المعلمات الفائقة
مسح المعلمات الفائقة
لا يتضمن Trackio عمدًا واجهة برمجة تطبيقات مخصصة للمسح (sweep). المسح هو مجرد حلقة Python عادية: تشغيل واحد لكل تكوين، مجمّعة بحيث يمكن للوحة المعلومات والاستعلامات التعامل مع المسح كوحدة واحدة. هذا يبقي المسح تحت سيطرتك الكاملة — أي استراتيجية بحث يمكنك كتابتها (أو طلب كتابةها من وكيل برمجي) تعمل، دون الحاجة إلى تعلم أي شيء جديد.
تجمع هذه الصفحة وصفات للحالات الشائعة.
النمط
كل وصفة أدناه هي نسخة معدلة من نفس المكونات الثلاثة:
- تشغيل واحد لكل تكوين — استدعِ init() مرة واحدة لكل تجربة.
group— اضبطه على معرّف مسح (sweep) بحيث تبقى جميع تجارب مسح واحد معًا (انظر تجميع التشغيلات).config— تسجيل المعلمات الفائقة، حتى تكون النتائج قابلة للمقارنة لاحقًا.
import trackio
def train(config: dict, group: str, name: str) -> float:
trackio.init(project="my_project", name=name, group=group, config=config)
final_loss = None
for epoch in range(10):
final_loss = ... # your actual training step
trackio.log({"loss": final_loss, "epoch": epoch})
trackio.finish()
return final_lossالبحث الشبكي
قم بترتيب جميع عناصر الضرب الديكارتي الكامل لمساحة البحث باستخدام itertools.product:
import itertools
search_space = {
"lr": [1e-2, 1e-3, 1e-4],
"batch_size": [32, 128],
}
best = None
for values in itertools.product(*search_space.values()):
config = dict(zip(search_space.keys(), values))
name = "grid-" + "-".join(f"{k}={v}" for k, v in config.items())
loss = train(config, group="grid-search", name=name)
if best is None or loss < best[1]:
best = (config, loss)
print(f"best config: {best[0]} (loss {best[1]:.3f})")البحث العشوائي
استخدام تكوينات عشوائية بدلاً من تعدادها — وهو عادةً استخدام أفضل للميزانية نفسها عندما تكون بعض المعلمات الفائقة أكثر أهمية بكثير من غيرها. قم بتبديل مولّد الأرقام العشوائية (Seed) حتى تكون عملية المسح قابلة للتكرار:
import random
N_TRIALS = 20
rng = random.Random(42)
best = None
for trial in range(N_TRIALS):
config = {
"lr": 10 ** rng.uniform(-5, -1),
"batch_size": rng.choice([16, 32, 64, 128, 256]),
}
loss = train(config, group="random-search", name=f"random-{trial}")
if best is None or loss < best[1]:
best = (config, loss)التحسين البايزي باستخدام Optuna
لاستراتيجيات بحث أذكى، استخدم مكتبة مخصصة ودع Trackio يتولى التتبع. باستخدام Optuna (pip install optuna)، يصبح كل تجربة (trial) تشغيلًا واحدًا في Trackio:
import optuna
def objective(trial):
config = {
"lr": trial.suggest_float("lr", 1e-5, 1e-1, log=True),
"batch_size": trial.suggest_categorical("batch_size", [16, 32, 64, 128]),
}
return train(config, group="optuna-sweep", name=f"optuna-{trial.number}")
study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=20)
print("best:", study.best_params, study.best_value)عرض نتائج المسح
في لوحة التحكم (trackio show)، تُجمَّع التّنفيذات التي تتشارك group معًا في الشريط الجانبي، مما يتيح تفعيل أو تعطيل المسح كوحدة واحدة ومقارنة تنفيذاته على الرسوم البيانية نفسها. وبما أن كل تجربة تسجّل معامِلاتها الفائضة في config، فإن المسوحات مناسبة أيضًا بشكل طبيعي لمقارنة إعدادات التنفيذ جنبًا إلى جنب.
استعلام عن أفضل تكوين
بما أن كل شيء موجود في SQLite، فإن سؤال “أي تكوين فاز؟” هو استعلام. يُخزَّن مجموعة التشغيل داخل ملف JSON الخاص بالتكوين تحت المفتاح _Group:
trackio query project --project "my_project" --sql "
SELECT m.run_name,
json_extract(m.metrics, '$.loss') AS final_loss
FROM metrics m
JOIN configs c ON c.run_name = m.run_name
WHERE json_extract(c.config, '$._Group') = 'grid-search'
AND m.id = (SELECT MAX(id) FROM metrics WHERE run_name = m.run_name)
ORDER BY final_loss ASC
LIMIT 5"أضف --json للحصول على مخرجات قابلة للقراءة آليًا. راجع مخطط التخزين والاستعلامات المباشرة للاطلاع على المخطط الكامل.
تشغيل عمليات المسح باستخدام وكيل برمجي
تُعدّ عمليات المسح مهمة طبيعية يمكن تفويضها: فالحلقة ميكانيكية، ويمنح Trackio الوكلاء وصولاً برمجياً إلى النتائج (سطر الأوامر مع --json، وواجهة برمجة التطبيقات بلغة بايثون، وSQL مباشرة). يكفي أن يكون الأمر بسيطاً كالتالي:
نفّذ بحثًا عشوائيًا على lr (توزيع لوغاريتمي غير منتظم، من 1e-5 إلى 1e-1) وbatch_size (16–256) لسكربت التدريب الخاص بي. أنشئ تجربة Trackio واحدة لكل تجربة ضمن المجموعة “sweep-aug30” بإجمالي 20 تجربة، ثم استعلم عن النتائج وأبلغ عن أفضل ثلاث إعدادات.
يكفي أن يكتب الوكيل الحلقة، ثم يشغّلها، ثم يقرأ النتائج. راجع تشغيل تجارب تعلّم الآلة بالوكلاء لمعرفة كيفية هيكلة حلقة التغذية الراجعة الكاملة، بما في ذلك التنبيهات والمراقبة.
مثال قابل للتنفيذ
يتوفر سكربت كامل ومستقل يحتوي على الشبكة والوصفات العشوائية في examples/sweep-recipes.py.