Trackio documentation
Chạy các thí nghiệm ML với Agents
Chạy các thí nghiệm ML với Agents
Trackio được thiết kế từ đầu để hỗ trợ thử nghiệm ML tự động do các tác nhân LLM điều khiển. Hướng dẫn này bao gồm cách cấu trúc mã huấn luyện, cấu hình cảnh báo và kết nối vòng phản hồi để một tác nhân có thể khởi chạy các thí nghiệm, giám sát chúng, phản ứng với các vấn đề và lặp lại trên các siêu tham số — tất cả mà không cần sự can thiệp của con người.
Tại sao chọn Trackio cho Agents?
Hầu hết các công cụ theo dõi thí nghiệm đều giả định rằng một con người đang xem bảng điều khiển. Trackio cung cấp cho các tác tử quyền truy cập lập trình cấp cao thông qua nhiều kênh:
- CLI với đầu ra JSON — mọi lệnh
trackiođều hỗ trợ--json, giúp việc phân tích trong bất kỳ ngôn ngữ nào trở nên đơn giản - API Python —
trackio.Api()cung cấp quyền truy cập trực tiếp vào các run, metrics và alerts - HTTP API / MCP — bảng điều khiển Trackio cung cấp các điểm cuối API của Gradio và có thể chạy dưới dạng máy chủ MCP để các LLM gọi trực tiếp các công cụ
- Cảnh báo bằng webhook — các tác nhân có thể chèn các lệnh gọi
trackio.alert()giống như các lệnh in và truy vấn chúng sau đó sincefiltering — cơ chế lấy dữ liệu mới hiệu quả cho các cảnh báo mới mà không cần đọc lại toàn bộ lịch sử
Vòng phản hồi của Agent
Một vòng lặp thử nghiệm tự động điển hình trông như sau:
┌─────────────────────────────────────┐
│ 1. Agent writes training script │
│ with trackio.init(), log(), │
│ and alert() calls │
├─────────────────────────────────────┤
│ 2. Agent launches the script │
├─────────────────────────────────────┤
│ 3. Agent polls for alerts and │
│ metrics while training runs │
├─────────────────────────────────────┤
│ 4. Agent reads results, decides │
│ next hyperparameters │
├─────────────────────────────────────┤
│ 5. Agent writes a new script │
│ and repeats from step 1 │
└─────────────────────────────────────┘Phần còn lại của hướng dẫn này sẽ đi qua từng bước với mã cụ thể.
Bước 1: Cấu trúc mã huấn luyện cho các tác tử
Điểm mấu chốt là một agent có thể chèn các lệnh gọi trackio.alert() theo cách tương tự như việc chèn các câu lệnh print() để gỡ lỗi. Cảnh báo có cấu trúc chặt chẽ hơn các câu lệnh in: chúng có tiêu đề, mô tả tùy chọn, mức độ nghiêm trọng, và được lưu trữ tự động cũng như có thể truy vấn được.
Dưới đây là một script huấn luyện được viết theo cách một agent sẽ viết, với các cảnh báo tại mọi điểm ra quyết định:
import trackio
import torch
trackio.init(
project="cifar10-hparam-search",
name="run-lr0.001-bs64",
config={
"learning_rate": 0.001,
"batch_size": 64,
"optimizer": "adamw",
"epochs": 50,
"weight_decay": 1e-4,
},
)
model = build_model()
optimizer = torch.optim.AdamW(
model.parameters(), lr=0.001, weight_decay=1e-4
)
best_val_loss = float("inf")
patience_counter = 0
patience_limit = 5
for epoch in range(50):
train_loss = train_one_epoch(model, train_loader, optimizer)
val_loss, val_acc = evaluate(model, val_loader)
trackio.log({
"train_loss": train_loss,
"val_loss": val_loss,
"val_accuracy": val_acc,
"learning_rate": optimizer.param_groups[0]["lr"],
})
# Alert on loss divergence
if train_loss > 10.0:
trackio.alert(
title="Training diverged",
text=f"train_loss={train_loss:.4f} at epoch {epoch}. "
"Learning rate is likely too high.",
level=trackio.AlertLevel.ERROR,
)
break
# Alert when validation stops improving
if val_loss < best_val_loss:
best_val_loss = val_loss
patience_counter = 0
torch.save(model.state_dict(), "best_model.pt")
else:
patience_counter += 1
if patience_counter >= patience_limit:
trackio.alert(
title="Early stopping triggered",
text=f"No improvement for {patience_limit} epochs. "
f"Best val_loss={best_val_loss:.4f} at epoch "
f"{epoch - patience_limit}.",
level=trackio.AlertLevel.WARN,
)
break
# Alert on overfitting
if epoch > 10 and (train_loss < 0.1 and val_loss > 1.5):
trackio.alert(
title="Overfitting detected",
text=f"train_loss={train_loss:.4f} vs val_loss={val_loss:.4f}. "
"Consider adding regularization or reducing model capacity.",
level=trackio.AlertLevel.WARN,
)
# Alert on good results
if val_acc > 0.93:
trackio.alert(
title="High accuracy reached",
text=f"val_accuracy={val_acc:.4f} at epoch {epoch}.",
level=trackio.AlertLevel.INFO,
)
trackio.alert(
title="Training complete",
text=f"Final val_loss={val_loss:.4f}, val_accuracy={val_acc:.4f}. "
f"Best val_loss={best_val_loss:.4f}.",
level=trackio.AlertLevel.INFO,
)
trackio.finish()Các cảnh báo ở đây không chỉ dành cho con người — chúng là các tín hiệu có cấu trúc mà tác tử sẽ đọc sau đó để quyết định hành động tiếp theo.
Hướng dẫn cho Cảnh báo Thân thiện với Agent
- Sử dụng
ERRORcho các điều kiện cần dừng chạy (divergence, NaN loss, out of memory). - Sử dụng
WARNcho các điều kiện cho thấy cần thay đổi siêu tham số (quá khớp, dừng sớm, hội tụ chậm). - Dùng
INFOcho các mốc quan trọng (đào tạo hoàn tất, đạt độ chính xác cao, lưu checkpoint). - Đưa các giá trị số vào
textđể tác nhân có thể phân tích và suy luận về chúng. - Bao gồm các gợi ý có thể thực hiện trong
text(ví dụ: “Learning rate có thể quá cao”) để giúp agent quyết định cần thay đổi gì.
Bước 2: Chạy script
Agent có thể khởi chạy script trong một tiến trình con hoặc tiến trình nền. Trong hầu hết các framework agent, việc này đơn giản chỉ là chạy một lệnh shell:
python train.py
Nếu agent đang sử dụng LLM kết nối MCP, nó cũng có thể khởi chạy các script thông qua một công cụ shell.
Bước 3: Giám sát trong quá trình huấn luyện
Trong khi quá trình huấn luyện đang chạy, tác nhân sẽ truy vấn các cảnh báo và chỉ số. Cờ --since giúp việc này hiệu quả hơn — chỉ các cảnh báo mới kể từ lần kiểm tra trước được trả về.
Phân quyền qua CLI
# First poll — get all alerts
trackio get alerts --project "cifar10-hparam-search" --run "run-lr0.001-bs64" --json
# Subsequent polls — only new alerts
trackio get alerts --project "cifar10-hparam-search" --since "2025-06-15T14:30:00" --jsonPhân quyền thông qua API Python
import trackio
from datetime import datetime, timezone
api = trackio.Api()
last_check = None
while training_is_running():
alerts = api.alerts(
"cifar10-hparam-search",
run="run-lr0.001-bs64",
since=last_check,
)
if alerts:
last_check = alerts[0]["timestamp"] # alerts are sorted newest-first
for a in alerts:
print(f"[{a['level'].upper()}] {a['title']}: {a['text']}")
if a["level"] == "error":
# Stop the run and re-plan
handle_error(a)
time.sleep(30)Phân quyền thông qua MCP
Nếu bảng điều khiển Trackio đang chạy dưới dạng máy chủ MCP, tác nhân có thể gọi trực tiếp công cụ get_alerts thông qua giao thức MCP. Xem Trackio dưới dạng API và Máy chủ MCP để biết hướng dẫn thiết lập.
Bước 4: Đọc kết quả và quyết định các bước tiếp theo
Sau khi một lượt chạy kết thúc, tác nhân đọc toàn bộ kết quả:
# Get run summary (metrics, config, step count)
trackio get run --project "cifar10-hparam-search" --run "run-lr0.001-bs64" --json
# Get the loss curve
trackio get metric --project "cifar10-hparam-search" --run "run-lr0.001-bs64" --metric "val_loss" --json
# Get all alerts (the most useful signal for decision-making)
trackio get alerts --project "cifar10-hparam-search" --run "run-lr0.001-bs64" --jsonCác cảnh báo cung cấp một bản tóm tắt ngắn gọn về những gì đã xảy ra trong quá trình huấn luyện. Thay vì phân tích hàng nghìn giá trị chỉ số, tác nhân có thể đọc một vài cảnh báo để hiểu:
- Chạy có phân kỳ không? → Giảm tốc độ học
- Nó có bị overfit không? → Thêm regularization hoặc giảm capacity
- Nó có dừng sớm không? → Các siêu tham số đang ở khoảng hợp lý nhưng có thể cần tinh chỉnh
- Đạt độ chính xác cao? → Cấu hình này đang hoạt động tốt
Bước 5: Lặp lại trên các siêu tham số
Agent sử dụng các cảnh báo từ lần chạy trước để chọn các siêu tham số mới. Dưới đây là một ví dụ cụ thể về logic ra quyết định mà agent có thể tuân theo:
import json
import subprocess
import trackio
api = trackio.Api()
# Read alerts from the last run
alerts = api.alerts("cifar10-hparam-search", run="run-lr0.001-bs64")
# Read the config from the last run
runs = api.runs("cifar10-hparam-search")
last_run = [r for r in runs if r.name == "run-lr0.001-bs64"][0]
config = last_run.config
# Decision logic based on alerts
new_config = dict(config)
for alert in alerts:
if "diverged" in alert["title"].lower():
new_config["learning_rate"] = config["learning_rate"] * 0.1
elif "overfitting" in alert["title"].lower():
new_config["weight_decay"] = config.get("weight_decay", 1e-4) * 10
elif "early stopping" in alert["title"].lower():
new_config["learning_rate"] = config["learning_rate"] * 0.5
elif "high accuracy" in alert["title"].lower():
# This config is good — try fine-tuning
new_config["learning_rate"] = config["learning_rate"] * 0.5
new_config["epochs"] = config["epochs"] + 20Sau đó, agent tạo một script huấn luyện mới với cấu hình đã cập nhật và khởi chạy nó, lặp lại vòng lặp.
So sánh các lần chạy
Sau một số lần lặp lại, tác nhân có thể so sánh tất cả các lần chạy trong dự án:
# List all runs
trackio list runs --project "cifar10-hparam-search" --json
# Get a summary of each run
trackio get run --project "cifar10-hparam-search" --run "run-lr0.001-bs64" --json
trackio get run --project "cifar10-hparam-search" --run "run-lr0.0001-bs64" --jsonHoặc trong Python:
api = trackio.Api()
runs = api.runs("cifar10-hparam-search")
for run in runs:
alerts = run.alerts()
errors = [a for a in alerts if a["level"] == "error"]
warns = [a for a in alerts if a["level"] == "warn"]
infos = [a for a in alerts if a["level"] == "info"]
print(f"{run.name}: {len(errors)} errors, {len(warns)} warnings, {len(infos)} info")Gửi Cảnh Báo Đến Tác Nhân Qua Webhooks
Nếu framework agent của bạn có một endpoint HTTP hoặc có thể nhận tin nhắn từ Slack/Discord, bạn có thể sử dụng webhooks để đẩy cảnh báo đến agent theo thời gian thực thay vì dùng polling:
trackio.init(
project="cifar10-hparam-search",
webhook_url="https://hooks.slack.com/services/T.../B.../xxx",
)Nhờ đó, các cảnh báo sẽ được gửi đến kênh Slack mà tác nhân theo dõi, khép kín vòng phản hồi mà không cần bất kỳ thao tác truy vấn (polling) nào. Xem Hướng dẫn về Cảnh báo để biết các bước thiết lập chi tiết cho Slack và Discord.
Ví dụ đầy đủ: Tìm kiếm siêu tham số tự động
Dưới đây là một ví dụ hoàn chỉnh, tự chứa, kết nối tất cả các phần. Script này chạy một tìm kiếm lưới siêu tham số đơn giản với các quyết định dựa trên cảnh báo tự động:
import trackio
import random
import time
def run_experiment(config):
"""Simulate a training run. Replace with real training code."""
run = trackio.init(
project="auto-hparam-search",
config=config,
)
lr = config["learning_rate"]
best_val_loss = float("inf")
patience = 0
for epoch in range(config["epochs"]):
# Simulated metrics — replace with real training
noise = random.gauss(0, lr * 10)
train_loss = max(0.01, 1.0 / (epoch + 1) + noise)
val_loss = train_loss + random.uniform(0, 0.3)
val_acc = max(0, min(1, 1.0 - val_loss + random.uniform(-0.05, 0.05)))
trackio.log({
"train_loss": train_loss,
"val_loss": val_loss,
"val_accuracy": val_acc,
})
if train_loss > 5.0:
trackio.alert(
title="Training diverged",
text=f"train_loss={train_loss:.4f}, lr={lr}",
level=trackio.AlertLevel.ERROR,
)
break
if val_loss < best_val_loss:
best_val_loss = val_loss
patience = 0
else:
patience += 1
if patience >= 5:
trackio.alert(
title="Early stopping",
text=f"Best val_loss={best_val_loss:.4f}",
level=trackio.AlertLevel.WARN,
)
break
time.sleep(0.05)
trackio.alert(
title="Run complete",
text=f"Final val_loss={val_loss:.4f}, val_acc={val_acc:.4f}, "
f"best_val_loss={best_val_loss:.4f}",
level=trackio.AlertLevel.INFO,
)
trackio.finish()
return run.name
def analyze_and_decide(api, project, run_name, config):
"""Read alerts from a run and suggest new hyperparameters."""
alerts = api.alerts(project, run=run_name)
new_config = dict(config)
for alert in alerts:
title = alert["title"].lower()
if "diverged" in title:
new_config["learning_rate"] *= 0.1
elif "early stopping" in title:
new_config["learning_rate"] *= 0.5
elif "run complete" in title and "val_acc" in (alert.get("text") or ""):
# Slight refinement
new_config["learning_rate"] *= 0.8
new_config["epochs"] += 10
return new_config
api = trackio.Api()
project = "auto-hparam-search"
config = {
"learning_rate": 0.01,
"batch_size": 64,
"epochs": 30,
}
for iteration in range(5):
print(f"\n--- Iteration {iteration + 1} ---")
print(f"Config: {config}")
run_name = run_experiment(config)
config = analyze_and_decide(api, project, run_name, config)Ví dụ này tự chứa và sử dụng các chỉ số mô phỏng. Thay thân hàm run_experiment bằng mã huấn luyện thực tế của bạn và mẫu mã vẫn giữ nguyên.
Sử dụng Alerts với Transformers và TRL
Khi sử dụng report_to="trackio" với Trainer của Hugging Face, TrackioCallback tích hợp sẵn sẽ tự động xử lý trackio.init(), trackio.log() và trackio.finish(). Vì trackio.init() được gọi trước khi quá trình huấn luyện bắt đầu, nên run hiện tại đã được thiết lập và trackio.alert() sẽ hoạt động từ bất kỳ callback nào khác trong cùng một tiến trình.
Để thêm cảnh báo, hãy viết một TrainerCallback nhỏ và truyền nó vào Trainer thông qua callbacks=:
Transformers
import trackio
from transformers import Trainer, TrainerCallback, TrainingArguments
class AlertCallback(TrainerCallback):
def on_log(self, args, state, control, logs=None, **kwargs):
if "trackio" not in args.report_to or logs is None:
return
loss = logs.get("loss")
if loss is not None and loss > 5.0:
trackio.alert(
title="Training loss spike",
text=f"loss={loss:.4f} at step {state.global_step}. "
"Consider lowering the learning rate.",
level=trackio.AlertLevel.ERROR,
)
def on_evaluate(self, args, state, control, metrics=None, **kwargs):
if "trackio" not in args.report_to or metrics is None:
return
eval_loss = metrics.get("eval_loss")
if eval_loss is not None and eval_loss > 2.0:
trackio.alert(
title="High eval loss",
text=f"eval_loss={eval_loss:.4f} at step {state.global_step}.",
level=trackio.AlertLevel.WARN,
)
trainer = Trainer(
model=model,
args=TrainingArguments(
report_to="trackio",
project="my-project",
output_dir="./output",
num_train_epochs=3,
eval_strategy="steps",
eval_steps=100,
),
train_dataset=train_dataset,
eval_dataset=eval_dataset,
callbacks=[AlertCallback()],
)
trainer.train()Một agent tạo ra mã này chỉ cần định nghĩa lớp AlertCallback với các điều kiện phù hợp, sau đó thêm nó vào danh sách callbacks. Mẫu này giống nhau bất kể mô hình hay tập dữ liệu.
TRL
Cách tiếp cận tương tự cũng hoạt động với các trainer của TRL như GRPOTrainer hoặc SFTTrainer. Dưới đây là một ví dụ về học tăng cường với cảnh báo về sự sụp đổ phần thưởng và phân kỳ KL:
import trackio
from transformers import TrainerCallback
class RLAlertCallback(TrainerCallback):
def on_log(self, args, state, control, logs=None, **kwargs):
if "trackio" not in args.report_to or logs is None:
return
reward = logs.get("train/reward")
if reward is not None and reward < -1.0:
trackio.alert(
title="Reward collapse",
text=f"reward={reward:.4f} at step {state.global_step}. "
"Consider lowering the learning rate or checking the "
"reward model.",
level=trackio.AlertLevel.ERROR,
)
kl = logs.get("train/kl")
if kl is not None and kl > 10.0:
trackio.alert(
title="KL divergence too high",
text=f"kl={kl:.4f} at step {state.global_step}. "
"The policy is drifting too far from the reference model.",
level=trackio.AlertLevel.WARN,
)
completion_length = logs.get("train/completion_length")
if completion_length is not None and completion_length < 5.0:
trackio.alert(
title="Completions too short",
text=f"Mean completion length={completion_length:.1f} tokens. "
"The model may be collapsing to short outputs.",
level=trackio.AlertLevel.WARN,
)Sau đó, truyền nó vào bất kỳ trình huấn luyện TRL nào:
from trl import GRPOTrainer, GRPOConfig
trainer = GRPOTrainer(
model=model,
config=GRPOConfig(
report_to="trackio",
project="rl-experiment",
output_dir="./output",
),
train_dataset=dataset,
callbacks=[RLAlertCallback()],
)
trainer.train()Mẹo dành cho các Agent khi viết Callback cho Cảnh báo
- Giữ các điều kiện đơn giản. Mỗi khối
ifnên kiểm tra một chỉ số so với một ngưỡng. Điều này giúp tác nhân dễ dàng thêm, xóa hoặc điều chỉnh các điều kiện giữa các lần chạy. - Bao gồm giá trị chỉ số và bước trong
text. Điều này cung cấp cho agent các con số cụ thể để suy luận khi quyết định các siêu tham số tiếp theo. - Bao gồm các gợi ý có thể thực hiện được. Những câu như “Hãy cân nhắc giảm learning rate” giúp agent quyết định thay đổi gì tiếp theo.
- Sử dụng
on_evaluatecho các chỉ số đánh giá. Các chỉ số đánh giá chỉ có sẵn trongon_evaluate, không có trongon_log. Các chỉ số huấn luyện nhưlossxuất hiện trongon_log.
Tóm tắt các thực hành tốt nhất
Sử dụng cảnh báo như các tín hiệu có cấu trúc, không chỉ là thông báo. Bao gồm các giá trị số và các gợi ý có thể thực thi trong
textđể tác nhân có thể phân tích và hành động dựa trên chúng.Sử dụng các mức độ nghiêm trọng một cách nhất quán.
ERROR= dừng lại và thay đổi cách tiếp cận.WARN= điều chỉnh tham số.INFO= đạt được cột mốc.Thực hiện poll với
sinceđể đạt hiệu quả cao. Lưu lại timestamp của cảnh báo cuối cùng bạn đã xử lý và truyền nó dưới dạngsinceở lần poll tiếp theo để tránh đọc lại các cảnh báo cũ.Giữ tất cả các lần chạy trong cùng một dự án. Điều này cho phép tác nhân so sánh các lần chạy cạnh nhau và xem toàn bộ lịch sử những gì đã được thử.
Ghi log cấu hình với mỗi lần chạy. Luôn truyền
config=vàotrackio.init()để agent có thể đọc lại các siêu tham số nào đã tạo ra kết quả nào.Sử dụng CLI với
--jsoncho các script của agent. Đầu ra JSON đáng tin cậy để phân tích và sẽ không bị lỗi nếu định dạng đọc được bằng người dùng thay đổi.Hãy cân nhắc MCP cho tích hợp chặt chẽ. Nếu framework agent của bạn hỗ trợ MCP, việc chạy
trackio show --mcp-servercho phép agent gọi trực tiếp các công cụ của Trackio mà không cần khởi tạo các tiến trình con.