zxell.ai
開発記録 / review26
この記録は、プロジェクトの作業報告(報告 → アーキテクトの回答)を公開用に編集したものです。サーバ運用・セキュリティに関わる部分を省略しています(編集方針)。

review26: S ベースライン完走 — test PPL en 22 / de 29 / fr 22 / ja 132、4 言語の生成サンプル、フェーズ 1 の完了判定とフェーズ 2 へ

作成日: 2026-10-11 対象: 10/10 に起動した S(29.1M)ベースライン(シャード v4、90,000 ステップ)の完走報告。test 評価と生成サンプルはお客様に 3060 で実行していただき、結果をそのまま引用する。

要旨

  1. 完走: 90,000 ステップ / 29.5 億トークン / 21 時間 24 分(見積り 21 時間)。学習 loss は 10.78 → 3.2
  2. 成績(初見データ test、言語別パープレキシティ): en 22.1 / fr 21.9 / de 29.1 / ja 132.0、全体 33.0。val とほぼ同じ値で過学習なし
  3. 生成: en / de / fr は文法的に整ったニュース調の文を出す。ja は英語混じりで崩れる — 数値(ja 132)と目視が一致
  4. フェーズ 1 の完了判定: 達成(判断ポイント「S がまともな文を生成し、評価が自動で回ること」は en/de/fr で満たし、評価は自動化済み)。ただし日本語は「弱点」として定量的に確定 — フェーズ 2 以降の設計課題に(5 章)
  5. この結果が 分散学習の比較対象(物差し)になる。成功基準「劣化 10% 以内」の具体的な閾値を 6 章に

1. 完走ログ

{"step": 89960, "loss": 3.3066, "lr": 6.0000279611533744e-05, "grad_norm": 1.427, "tok_per_s": 38298, "elapsed_s": 76970}
{"step": 89970, "loss": 3.1114, "lr": 6.000015984931814e-05, "grad_norm": 1.452, "tok_per_s": 38298, "elapsed_s": 76979}
{"step": 89980, "loss": 3.2312, "lr": 6.000007335437363e-05, "grad_norm": 1.45, "tok_per_s": 38298, "elapsed_s": 76987}
{"step": 89990, "loss": 3.2589, "lr": 6.0000020126710894e-05, "grad_norm": 1.577, "tok_per_s": 38298, "elapsed_s": 76995}
{"step": 90000, "loss": 3.1602, "lr": 6.000000016633646e-05, "grad_norm": 1.516, "tok_per_s": 38298, "elapsed_s": 77004}
{"step": 90000, "eval": "val_full", "all": 32.33, "en": 20.18, "de": 28.88, "fr": 21.8, "ja": 132.2}
done: 90000 steps, 2949.12M tokens, 77050s
項目値
モデルS: 6 層 / d_model 384 / 6 head / ctx 1024、29.1M パラメータ(うち埋め込み 18.4M)
データシャード v4、train 5.51B トークンのうち 2.95B を 1 回ずつ(0.53 エポック)
学習batch 32 × 1024、AdamW、lr 6e-4 → 6e-5(cosine)、bf16、RTX 3060
所要77,050 秒 = 21 時間 24 分、平均 38,300 トークン/秒
終盤の学習 loss3.1〜3.3(PPL ≈ 24)
損失曲線と言語別 val PPL

(上: 学習 loss。薄線が生値、太線が 50 点移動平均。下: 500 ステップごとの val PPL、対数軸。最終点は val 全量)

val PPL の推移(抜粋):

{'step': 500,   'all': 384.59, 'en': 186.68, 'de': 367.7,  'fr': 221.68, 'ja': 2635.84}
{'step': 5000,  'all': 62.13,  'en': 33.9,   'de': 57.38,  'fr': 39.82,  'ja': 322.37}
{'step': 20000, 'all': 44.88,  'en': 26.01,  'de': 41.54,  'fr': 30.17,  'ja': 198.28}
{'step': 45000, 'all': 38.31,  'en': 22.73,  'de': 34.95,  'fr': 26.12,  'ja': 163.26}
{'step': 70000, 'all': 33.51,  'en': 20.48,  'de': 30.61,  'fr': 22.84,  'ja': 135.95}
{'step': 90000, 'all': 32.33,  'en': 20.18,  'de': 28.88,  'fr': 21.8,   'ja': 132.2}   ← val 全量

最初の 5,000 ステップで大半が決まり、その後は緩やかに改善し続けている(終盤でも下がり止まっていない = まだ学習の余地がある)。

2. test の言語別パープレキシティ(最終成績)

{
  "ckpt": "runs/S_baseline/ckpt_final.pt",
  "step": 90000,
  "split": "test",
  "ctx": 1024,
  "result": {
    "all": {"ppl": 33.03639638530772, "tokens": 15790080},
    "en":  {"ppl": 22.0779424901173,  "tokens": 4947836},
    "de":  {"ppl": 29.058653769872706, "tokens": 3995807},
    "fr":  {"ppl": 21.946490973796574, "tokens": 3888980},
    "ja":  {"ppl": 132.03231031373687, "tokens": 2957457}
  }
}
言語valtest学習データ中の比率(トークン)
en20.1822.0861.6%
fr21.8021.9511.0%
de28.8829.0623.9%
ja132.20132.033.5%
全体32.3333.04—

3. 生成サンプル(そのまま引用)

$ python sample.py runs/S_baseline/ckpt_final.pt --sp ~/sp_bpe_48k.model --prompt "The central bank" --tokens 80 --n 2
--- sample 0 (step 90000) ---
The central bank will produce 10% of a percentage point of GDP growth in 2020. The growth rate for the U.S. economy is 6.7% and China is 6.5% below the pre-pandemic level of 7.2%. The Japanese economy is forecast to post growth of 7.2% in 2020.
--- sample 1 (step 90000) ---
The central bank is the largest economy in the world, and the biggest economy is the poorest. The greenback will last for one-third of GDP, and a third of the economy, and the government will have to implement some government reforms. The Chinese economy’s population will shrink, thanks to the weakening domestic economy, and have grown quickly in recent years, according to the International Monetary Fund
$ python sample.py ... --prompt "Die Bundesregierung" --tokens 80 --n 2
--- sample 0 (step 90000) ---
Die Bundesregierung will dieses Gesetz vor dem Bundesrat vorstellen. Die Pläne gehen bereits seit zwei Wochen von einem „tazistischen Deal“ aus. Die Bundesregierung will das Gesetz vor dem Bundesrat vorstellen. Die Bundesregierung will das Gesetz vor dem Bundesrat vorstellen. Die Bundesregierung will dieses Gesetz vor dem Bundesrat vorstellen. Die Bundesregierung will das Gesetz vor dem Bundesrat vorstellen. Die Bundesregierung will das Gesetz vor dem Bundesrat vorstellen
--- sample 1 (step 90000) ---
Die Bundesregierung hat bereits ein neues Einfuhrverbot für automobiles aus Deutschland erlassen. Die Pläne zur Einführung einer Einfuhrschrittung von 20 Prozent der deutschen Autoproduktion werden ausgenommen. Das Bundeskabinett hat auch das Bundesverkehrsministerium dazu aufgefordert, die Bezahlung von 20 Prozent des Gastgewerbe zu erlassen. Das Vergaberecht wird in 25 Jahren ab
$ python sample.py ... --prompt "Le gouvernement" --tokens 80 --n 2
--- sample 0 (step 90000) ---
Le gouvernement veut mettre en place un nouveau plan de soutien de la part des pays pour les milieux rotungssaisifs et aider à réduire les inégalités. Une mesure va notamment sur la place de l'Union européenne à l'usage des fonds pour les jeunes pays d'Amérique du Nord. Le programme du gouvernement «est un outil de coopération et de coordination entre les pays pour contribuer à réduire les
--- sample 1 (step 90000) ---
Le gouvernement britannique veut faire 20 % de revenus d’Alzheimer Selon le think tank Lechmax, les « gilets jaunes » pourraient représenter 10 % de la population mondiale. La semaine dernière, les Etats-Unis ont publié des « documentaires » dans lequel ils s’occuperont de la marque. Ce week-end, les Etats-Unis ont annoncé le 2
$ python sample.py ... --prompt "○○首相は" --tokens 80 --n 2
--- sample 0 (step 90000) ---
○○首相は27日、過去最多の105人に tobaccoの scandalsをpresseoire先のホテルからの「Go To 2019」に現れる際、「Go To 2020」と「Go To 2020」に定めるとした。 2020 appear以来、4年ぶり3回目の米朝首脳会談で、27年間の指導者の狙いは「Go
--- sample 1 (step 90000) ---
○○首相は記者団に対し「GAFORTAGE 5月10日の時点で、国際社会のifthや、%、日本はWW=TGAの Italian Caterpillarなどで、各種は地域の地域でのcussionsを判断していく」と述べました。

読み取り

4. フェーズ 1 の完了判定

roadmap 6 章の判断ポイント「S がまともな文を生成し、評価が自動で回ること」に対して:

判定項目結果
S がまともな文を生成するen / de / fr: 達成(文法的・文体的に自然なニュース文)。ja: 未達(英語混じりで崩れる)
評価が自動で回る達成(500 ステップごとの言語別 val PPL、終了時の val 全量、test は eval.py 1 コマンド)
損失曲線・生成品質のベースライン記録達成(本書 + S_baseline_curves.png + log.jsonl・ckpt_final.pt をサーバに保全)

フェーズ 1 は完了と判定します。 ja の未達は「モデルの作りの問題」ではなく「データ量 3.5%」の帰結で、フェーズ 1 の目的(単一マシンでのベースライン確立)はむしろja の弱さを定量化できたことで果たされています。 ja をどう扱うかは 5 章の論点としてフェーズ 2 以降に持ち越します。

5. 日本語への対応(論点・フェーズ 2 の設計と並行して決める)

現状の ja は「データ 0.197B トークン = 全体の 3.5%、1 記事平均 230 トークン」。取れる手は 3 系統:

案内容効果の見込みコスト
A. ja の重み付けサンプリング学習時に ja を含む窓を 2〜3 倍の頻度で引く(シャードは変えず、サンプラで制御)ja PPL の改善。他言語は僅かに悪化(総トークンの数 % 分)小(data.py の変更。ただしシャード内で言語が混在しているので「記事単位の言語別シャード」を別途作る方が素直)
B. 学習を長くする現状 0.53 エポック → 2〜3 エポック(90k → 300k ステップ、3060 で 3 日)全言語が改善。ja も曲線がまだ下がっているので効くGPU 時間のみ
C. モデルを大きくする(M: 122M)容量を増やす。roadmap のフェーズ 3 で M は使う予定全言語が改善。ja は容量より量が律速なので効きは限定的3060 で約 1 週間(review22 3 章)

推奨: フェーズ 2(分散 MVP)は S のまま進め、ja 対策はフェーズ 3 で M に移る際に A + B を組み合わせる。フェーズ 2 の目的は「分散方式がベースラインと同等の損失に到達するか」の検証なので、ベースラインの条件を変えない方が比較が素直です。

6. 分散学習の「物差し」としての閾値

成功基準 1.2「単一マシン学習の同規模モデル比で劣化 10% 以内」を、本ベースラインに対して具体化すると(同じ S・同じ総トークン 2.95B・同じシャード v4 で学習した分散版の test PPL が、以下を超えないこと):

言語ベースライン test PPL許容上限(+10%)
全体33.0436.3
en22.0824.3
de29.0632.0
fr21.9524.1
ja132.03145.2

フェーズ 2(FedAvg)/ フェーズ 3(DiLoCo + Δ 圧縮)の各方式は、この表に対して判定します。 val の推移(1 章の抜粋)も、途中経過の比較に使えるよう log.jsonl を保全しました。

7. 成果物の保全

ファイル場所
最終チェックポイント ckpt_final.pt(349MB、モデル+optimizer 状態)サーバ(3060 にも原本)
学習ログ log.jsonl(9,181 行: loss 10 ステップごと、val 評価 180 回)同上
構成 config.json同上
損失曲線・PPL 推移の図1 章の図

チェックポイントは重みの公開対象外(確定事項 6)なので、サーバ内の保全のみ。フェーズ 2 の初期重みは、比較のためベースラインと同じ「ゼロから」で始めます(このチェックポイントは比較対象としてのみ使う)。

8. 確認事項

  1. フェーズ 1 を「完了」と判定してよいですか?(4 章。ja の未達は 5 章の論点として持ち越し)
  2. フェーズ 2 の着手: 次回、分散 MVP の設計書(review27)を出します。内容は「クライアント v1 の train タスクを zxell_model による本物の局所学習に置き換える」「サーバ側で Δ を集約して重みを更新(FedAvg)」「1050 向けにシャード内トークン範囲のタスク」「2 台(3060 + 1050)で S を学習し、6 章の閾値と比較」。方針に異論があれば先にお聞かせください。
  3. ja 対策(5 章)は推奨どおり「フェーズ 3 で M に移る際に A + B」でよいですか? フェーズ 2 で先に試したい場合はその旨を。
  4. 3060 の runs/S_baseline/ はそのまま残してください(サーバにも複製済みですが、二重化の意味で)。

9. 次の作業予定

  1. フェーズ 2 設計書(review27): タスク payload の設計(シャード名 + トークン範囲 + H ステップ + 基準重みバージョン)、クライアント側の局所学習(zxell_model 呼び出し、Δ の算出と POST)、サーバ側の集約(FedAvg、重みバージョン発行)、ステイルネスと離脱の扱い、ダッシュボードへの学習状況表示
  2. 実装順: サーバ集約 → クライアント局所学習 → 3060 単独で分散経路のスモーク(1 台 FedAvg = ベースラインと同じ結果になるはず)→ 1050 を追加して 2 台
  3. 並行して: sample.py に反復ペナルティ、log.jsonl の可視化スクリプトを zxell_model/plot_run.py として整備(今回は手元で作図)
← review25目次