🛤️

wandbの代わりに実験追跡ライブラリのtrackioを使用する

に公開

2025年7月29日に、突如として公開されたTrackioの紹介です。バージョンは0.2.2です。
なお公式からIntroducing Trackio: A Lightweight Experiment Tracking Library from Hugging FaceとしてHugging Face Blogに公開されています。

trackioの特徴としては、軽量で、無料でローカルとHugging Face Spacesとの統合が可能であり、簡単にチームメンバーに共有できる点です。ソースコードも1,000行未満とシンプルで拡張性も高いです。

一方で、まだベータ版であり、アーティファクト管理や動画像などの複雑な可視化はサポートされていません。issueに挙げてもらえればサポートするとのことです(現時点でも動画像のサポートを希望するissueがあります)。

とりあえずtrackioを使ってみましょう!

1. trackioを使ってみる

trackioはPyPI上で公開されているため pip install trackio などでインストール可能です。今回はPythonのプロジェクト管理ツールであるuvを用いてインストールします。

uv init trackio-project
cd trackio-project
uv add trackio
. .venv/bin/activate

次に公式の例に従ってランダムな値でloggingしてみましょう。main.pyなどを以下で編集してください。

main.py
import trackio
import random
import time

runs = 3
epochs = 8

def simulate_multiple_runs():
    for run in range(runs):
        trackio.init(project="fake-training", config={
            "epochs": epochs,
            "learning_rate": 0.001,
            "batch_size": 64
        })
        for epoch in range(epochs):
            train_loss = random.uniform(0.2, 1.0)
            train_acc = random.uniform(0.6, 0.95)
            val_loss = train_loss - random.uniform(0.01, 0.1)
            val_acc = train_acc + random.uniform(0.01, 0.05)
            trackio.log({
                "epoch": epoch,
                "train_loss": train_loss,
                "train_accuracy": train_acc,
                "val_loss": val_loss,
                "val_accuracy": val_acc
            })
            time.sleep(0.2)
        trackio.finish()

simulate_multiple_runs()

以下で実行します。

python main.py 

ローカルで結果を見る場合はログに記載されている通りtrackio show --project "fake-training"としてtrack show --project <プロジェクト名>で実行してみます。

trackio show --project "fake-training"

するとURLから、以下のようなダッシュボードを起動することができます。

UIから様々な操作ができます。例えば、RunsType to filter...からRun名の部分文字列検索ができたり、X-axisから横軸の指定を変えたりすることができます。

なおX-axisepochを選択すると以下のエラーで選択できません。おそらく自分でソースコードを修正する必要があります。

ValueError: The column label 'epoch' is not unique.

このログはローカルでの~/.cache/huggingface/trackio/にdbファイルとして保存されています。例えばsqlite3pandasで以下のように中身を確認することができます。

import os
import sqlite3

import pandas as pd

with sqlite3.connect(os.path.expanduser("~/.cache/huggingface/trackio/fake-training.db")) as conn:
    df = pd.read_sql_query("SELECT * FROM metrics", conn)
display(df.head(1))
id timestamp run_name step metrics
0 1 2025-08-01T00:20:25.281701 dainty-sunset-0 0 {"epoch": 0, "train_loss": 0.4877028653183684, "train_accuracy": 0.7315046173930162, "val_loss": 0.4593433246841751, "val_accuracy": 0.7649127420864412}

2. transformersでreport_to="trackio"を指定する

transformersのv4.54.0からreport_to="trackio"としてtrackioにloggingすることが可能になりました。実際に試してみましょう。

必要なパッケージをインストールします。transformersが学習できる環境であれば問題ないです。

uv add torch "transformers>=4.54.0" datasets accelerate pynvml

そして以下をtrain.pyとして保存して実行します。

train.py
from functools import partial

from datasets import load_dataset
from transformers import (
    AutoModelForSequenceClassification,
    AutoTokenizer,
    Trainer,
    TrainingArguments,
)


def tokenize_fn(batch, tokenizer):
    return tokenizer(
        batch["text"], padding="max_length", truncation=True, max_length=128
    )


dataset = load_dataset("imdb")
train_dataset = dataset["train"].shuffle(seed=42).select(range(500))
valid_dataset = dataset["test"].shuffle(seed=42).select(range(200))

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained(
    "bert-base-uncased",
    num_labels=2,
)

train_dataset = train_dataset.map(
    partial(tokenize_fn, tokenizer=tokenizer), batched=True
)
valid_dataset = valid_dataset.map(
    partial(tokenize_fn, tokenizer=tokenizer), batched=True
)

training_args = TrainingArguments(
    output_dir="./results",
    eval_strategy="epoch",
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=3,
    learning_rate=5e-5,
    logging_steps=10,
    save_strategy="epoch",
    report_to="trackio",
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=valid_dataset,
    tokenizer=tokenizer,
)

trainer.train()
python train.py

特徴としてはreport_to="trackio"と指定している点です。

学習が無事終了すればtrackioのレポートを見ましょう。projectはhuggingfaceとして保存されていると思います。

trackio show --project "huggingface"

すると以下のように表示されます。lossの情報やGPUのメモリの使用率などのシステム情報も自動でloggingします(これはtrackioの実装というよりtransformers側でサポートしていると思われます)。

プロジェクト名を変える場合は環境変数のTRACKIO_PROJECTを定義する、run名を変える場合はTrainingArgumentsrun_name=<run名>を指定することでできます。run_name="exp001"を指定して以下を実行しましょう。

TRACKIO_PROJECT="bert-imdb" python train.py

以下を実行して、正しく表示されてRunsexp001があれば問題ありません。

trackio show --project "bert-imdb"

3. Hugging Face Spacesにログを共有する

trackioはHugging Face Spaces上でログを共有する機能があります、がこれは自分の環境ではうまく言っていないので後日書き足します。もしやり方がわかった方がいればコメントしてもらえると助かります。

以下で奮闘中...

https://x.com/colum2131/status/1950801562051248528

4. 感想

触ってみた感想としては、シンプルな実験追跡サービスとしてMLエンジニアとしては、そうそうこれで十分だよね、という感じがします。Hugging Face Spacesとの統合で、チーム間でも金銭的なコストが発生せず共有できるのは魅力的ですし、transformersの連携は既に行われており各深層学習フレームワークに組み込まれたら選択肢として考えるツールだと思います。

一方でまだベータ版ということもあり、一部実装が仕様なのかバグなのかあまりわからず、機能としても最低限なため、現状transformers以外で使う選択肢はなさそうです。となると個人的には、個人使用はwandbで、チームで使用するときにコスト感として問題があればtrackioかmlflowを検討するのかなと思います。OSSであることに希望があり、今後様々な機能やユーザーケース、各フレームワークでのサポートが積極的に行なっていけばwandbと並ぶ選択肢にはなるのかなと思いました。

Discussion