実際の検証記録¶
2026-10-11: GPU レンタルのおすすめを追加(Zhichuan Cloud の招待リンク)¶
| チェック項目 | 実際の結果 |
|---|---|
| 内容 | ホームページに「GPU を借りる:著者が使っている Zhichuan Cloud」を追加。3.1 節に「どこで借りるか」(価格、新規ユーザー向けクーポン、インスタンスの選び方、データディスクとミラーソースの使用感)を追加。0.4 節の準備表のアカウント行と予算行を人民元の例に変更。いずれも招待リンクと招待コード zt4f01m0 を記載し、著者の招待リンクであることを明示したうえで、クーポンの受け取りルールを説明 |
| 価格の出典 | ユーザー提供の 2026-10-11 のページのスクリーンショット:RTX 4090D 24 GB の従量課金 ¥1.25/時間、日額 ¥29、週額 ¥200、月額 ¥800。招待ルールはユーザー提供の招待ページのスクリーンショットによる。gpuhome.cc はクライアントサイドでレンダリングされるページで、内蔵ブラウザでは空白で開いたため、直接確認はできなかった |
| 回帰テスト / 電子書籍 | 106 passed。mkdocs build --strict は成功し、52 ページ、27,728 件のリンクとリソースのチェックが通過 |
| 価格のスクリーンショット | ユーザー提供のレンタルページのスクリーンショットを images/gpuhome-rtx4090d-price-2026-10-11.png に変換し、ホームページと 3.1 節の価格表の下に埋め込み |
2026-10-11: ホームページに著者紹介を追加。対象読者を ML 以外の開発者に変更¶
| チェック項目 | 実際の結果 |
|---|---|
| 内容 | ホームページに「著者について」(プロフィール、X、微信公式アカウント、小紅書、2 つの QR コード)を追加。ホームページ、チュートリアル冒頭、README、サイト説明、CLAUDE.md の対象読者を「ML を専門としておらず、LoRA ファインチューニングをゼロから学びたい開発者」に変更。第 1 章のタイトルと「バックエンドのたとえ」を一般的な開発のたとえに変更 |
| 画像 | images/author-wechat-qrcode.jpg。小紅書の QR コードは名刺のスクリーンショットから切り出して images/author-xiaohongshu-qrcode.jpg とした。book/build.py は images/ 以下の PNG と JPG の両方を公開するようになった |
| 回帰テスト / 電子書籍 | 106 passed。mkdocs build --strict は成功し、52 ページ、27,716 件のリンクとリソースのチェックが通過。ローカルプレビューを目視確認し、デスクトップ幅とスマートフォン幅でレイアウトに問題なし |
2026-10-11: ノートブック 13 節を curl による呼び出しに切り替え¶
| チェック項目 | 実際の結果 |
|---|---|
| 内容 | ノートブック 13 節から Python の例を外し、curl 5 組に置き換え:ヘルスチェック、最小リクエスト、学習時と同じ形式のリクエスト(system = ロール + 学年帯 + ファクトカード)、マルチターン、ストリーミング。チュートリアル 5.5 節にも同じ「まず curl で直接呼び出す」を追加し、元の Python と SDK の例は残した |
| リクエストボディ | 2 つの JSON ファイルは build_messages で生成。Qwen トークナイザーで数えるとシングルターンのリクエストの prompt_tokens は 395。heredoc はこのマシンの bash で実際に実行し、生成されたファイルはすべて有効な JSON |
| テスト | test_tutorial.py に curl のテストを追加:モデル名が --served-model-name と一致すること、temperature=0、ストリーミングの例があること、ファイル内の messages が build_messages の出力と同一であること。Python の呼び出し例は plan.md から読み込んで実行するようになった。106 passed |
| 電子書籍 / バンドル | mkdocs build --strict は成功し、52 ページ、27,708 件のリンクとリソースのチェックが通過。GPU アップロード用バンドルを再ビルド |
| 未確認 | 実際の vLLM サーバーからの curl の応答 |
2026-10-11: RTX 4090 での初の 1 Epoch 完全学習(ユーザーが GPU ホストで実測)¶
| チェック項目 | 実際の結果 |
|---|---|
| 環境 | RTX 4090 24 GB(ドライバー 580.119.02、最大 CUDA 13.0)。イメージ 2.7.1-CUDA12.6-Py3.11-Ubuntu22。公式の PyTorch インデックスに到達できなかったため、torch は国内ミラーからインストール |
| 読み込み | NF4 のベースモデルを読み込んだ後、nvidia-smi の表示は 4353 MiB |
| 学習 | runs/science-002、72/72 ステップ、所要時間 26:19。平均学習 loss 2.233。ステップごとの学習 loss は最初/最後で 5.813 → 1.55 |
| 検証 loss | ステップ 12/24/36/48/60/72 で 2.506 / 2.186 / 2.034 / 1.976 / 1.961 / 1.960。Mean Token Accuracy は 0.462 → 0.573 |
| 失敗からの教訓 | それ以前に 2 回、カーネルを再起動せずに学習セルを再実行したため、学習済みのモデルの上で学習が続いてしまった:学習 loss は約 0.5 まで下がり、検証 loss は 2.3 まで戻った(過学習)。runs/science-001 は削除 |
| ドキュメント | 曲線のスクリーンショットを images/loss-curve-rtx4090-2026-10-11.png として保存し、区間ごとの解説とともに 4.5 節に追加。book/build.py は images/ 以下のすべての PNG を公開するようになった |
| 未確認 | ステップ 8 の完了記録(ピーク VRAM、アダプターファイル)、LoRA を無効にしたベースモデルの検証 loss、ステップ 10 の回答比較、マージと vLLM |
2026-10-10: 公式の PyTorch インデックスに到達できない場合の Alibaba Cloud ミラーへのフォールバック¶
| チェック項目 | 実際の結果 |
|---|---|
| きっかけ | GPU ホストで pip install torch==2.8.0 --index-url https://download.pytorch.org/whl/cu126 を実行すると Network is unreachable で失敗した(ユーザーの実際の出力) |
| ミラーの確認 | 開発マシンから mirrors.aliyun.com/pytorch-wheels を照会:cu126 ディレクトリに torch-2.8.0+cu126-cp311-manylinux_2_28_x86_64 がある。cu129 ディレクトリには vLLM 0.21.0 が必要とする torch 2.11.0、torchaudio 2.11.0、torchvision 0.26.0 の cp311 Linux パッケージがある(依存バージョンは PyPI 上の vLLM 0.21.0 のメタデータによる)。GPU ホストでミラーから実際にインストールしたことはまだない |
| ドキュメント | 3.3 節、5.4 節、ノートブックのデプロイセル、GPU_UPLOAD_README.md に -f https://mirrors.aliyun.com/pytorch-wheels/... によるフォールバックコマンドを追加。GPU アップロード用バンドルを再ビルド(31 ファイル、3.89 MiB) |
| 回帰テスト / 電子書籍 | 105 passed。mkdocs build --strict は成功し、52 ページ、27,600 件のリンクとリソースのチェックが通過 |
2026-10-10: 3.3 節でアップロード用バンドルの中身を説明¶
| チェック項目 | 実際の結果 |
|---|---|
| 内容 | 3.3 節にパッケージングのコマンドと「アップロード用バンドルの中身」を追加:unzip -l で実際に一覧表示された 31 ファイルをもとに書いたディレクトリツリーと用途、さらにバンドルに含まれないものとその入手元の一覧。requirements-train.txt のコメントにあった古い節番号を 3.1 に変更 |
| バンドル | tools/build_gpu_zip.py で再ビルド:31 ファイル、3.89 MiB |
| 回帰テスト / 電子書籍 | 105 passed。mkdocs build --strict は成功し、52 ページ、27,594 件のリンクとリソースのチェックが通過 |
2026-10-10: 第 2 章の後半を整理¶
| チェック項目 | 実際の結果 |
|---|---|
| 内容 | 2.4 節に「マルチターン会話は複数回学習されるのか?」とマルチターンの履歴がどう積み重なるかを追加。旧 2.6〜2.11 は、2.6 七つのステップの振り返り、2.7 データの変更と差し替え、2.8 任意のローカルチェックに再編。重複していた観察用の質問の説明を削除(4.5 節にすでにある)。レビュー要件は 6.1 節へ、CLI スナップショットの説明は 4.6 節へ、few-shot の選び方の説明は 6.4 節へ移動。関連する節番号の参照を更新 |
| 回帰テスト | 105 passed(チュートリアルから重複していた例のコマンド lab.prepare/lab.audit を 2 つ削除。どの CLI にも少なくとも 1 つは例が残っている) |
| 電子書籍 | mkdocs build --strict は成功。52 ページ、27,561 件のローカルリンクとリソースのチェックが通過 |
2026-10-10: 「なぜファクトカードが必要か」を追加¶
| チェック項目 | 実際の結果 |
|---|---|
| 内容 | 2.2 節に「なぜファクトカードが必要か:よくある 3 つの疑問」を追加(ベースモデルが常識をすでに知っているのになぜカードが必要か。カードは入力であって学習対象ではなく、学習後にモデルがカードを覚えていることを当てにはできない。なぜ学習時にも含める必要があるか)。あわせて data/README.md も更新。0.1 節と 2.5 節にそこへの案内を追加。2.1 節の表の下に「それでも val セットが必要な理由」を追加 |
| 回帰テスト | 107 passed |
| 電子書籍 | mkdocs build --strict は成功。52 ページ、27,594 件のローカルリンクとリソースのチェックが通過。ローカルプレビューを目視確認し、第 2 章の引用ブロックと比較表は問題なく表示される |
2026-10-10: dataset.json を train/val/test の並列配置に変更(schema 4)¶
| チェック項目 | 実際の結果 |
|---|---|
| データ変換 | トップレベルを facts、train、val、test の 4 つの並列な配列に変更。会話から split フィールドを削除し、内容は変更なし。lab.data --allow-draft --formal の出力は {'train': 500, 'val': 50, 'test': 50} |
| 読み込みロジック | lab.data.tag_splits が所属する配列に基づいてメモリ上で split を付与する。旧来の episodes レイアウトや、自前の split を持つ会話はどちらもエラーになる。validate、prepare、infer は変更なし |
| CLI スナップショット | 固定した Qwen トークナイザーで lab.prepare --allow-draft --formal を実行:9 ファイル、train 1150 件と val 115 件の SFT サンプル。val.episodes.jsonl の 50 会話はすべて split: val |
| ドキュメント | 2.2 節に「ファクトカードの役割と使われる場所」(検証、プロンプトの組み立て、ノートブック、スナップショット、A/B/C 推論、ブラインド評価、デプロイ後の呼び出し)を追加。data/README.md、README、GPU アップロードの説明もあわせて更新 |
| 回帰テスト | 107 passed(新しいテスト 3 件:並列配置、旧レイアウトの拒否、ノートブックの D1 読み込み) |
| 電子書籍 | mkdocs build --strict は成功。52 ページ、27,571 件のローカルリンクとリソースのチェックが通過。GPU アップロード用バンドルを再ビルド(31 ファイル、3.88 MiB) |
2026-10-10: 章の並べ替え。「発展と参考」の折りたたみを削除¶
| チェック項目 | 実際の結果 |
|---|---|
| 構成 | 旧第 0〜13 章を第 0〜8 章 + 付録に統合:0 目標と準備(新たに書いた全体のワークフロー、2 台のマシンの連携方法、準備チェックリスト)、1 概念、2 学習データ(旧第 3〜5 章)、3 GPU、4 学習、5 デプロイ、6 品質評価(旧第 8〜9 章)、7 コスト・トラブルシューティング・受け入れ確認、8 開発者向けリファレンス(旧第 11 章と第 13 章)。サイドバーは 1 階層のフラットな目次にし、本文中の折りたたみブロックは通常の小節にした |
| 新しい解説 | 第 2〜6 章の冒頭にそれぞれ「この章の概要」ボックス(やること/必要なもの/得られるもの/所要時間)を追加。2.5 節に固定した Qwen トークナイザーで実際にレンダリングした day-night-01:0 を追加(408 トークン、教師信号の対象は 22 トークン)。4.1 節で 1 ステップの内部で何が起きているかを説明。第 5 章の冒頭に API リクエストの経路の図を追加 |
| 参照の更新 | plan.md、ノートブック、README、GPU_UPLOAD_README、todo.md、book/README.md の章番号を新しい番号に更新。GPU アップロード用バンドルを再ビルド(31 ファイル、3.88 MiB) |
| 回帰テスト | 103 passed |
| 電子書籍 | mkdocs build --strict は成功。52 ページ、28,089 件のローカルリンクとリソースのチェックが通過。ローカルプレビューを目視確認し、第 0、2、4、5 章の図と概要ボックスは問題なく表示される |
2026-10-04: デプロイの学習に重点を置いた改訂¶
| チェック項目 | 実際の結果 |
|---|---|
| 学習量 | ノートブックはサンプル数からステップ数を計算:train 1150 サンプル ÷ 勾配累積 16 → 72 ステップ(1 Epoch)。val 115 サンプルでの eval loss(12 ステップごと)と loss-curve.png を追加 |
| データの整理 | 662 件の回答から、連結時に残った不要な半角スペースを除去。increase_depth_when_requested、ask_for_evidence_without_blame、explain_then_invite_exploration の回答をそれぞれ 60 件書き直し。lab.data --allow-draft --formal は通過 |
| 実際のトークナイズ | 固定した Qwen トークナイザーで再生成:train 1150、val 115。最長 550 トークン、平均 459 トークン、教師信号の対象は平均 36 トークン |
| CLI のドラフトゲート | lab.train --allow-draft で Epoch の比較を実行でき、manifest には draft が記録される。候補の凍結とテストセットでの推論には引き続きレビュー済みデータが必要 |
| デプロイの章 | 第 10 章に KV キャッシュの見積もり(1 トークンあたり 144 KiB)、パラメータの説明、アダプターのマウント、OpenAI SDK によるストリーミング呼び出し、vllm bench serve による負荷テスト、本番投入のチェックリストを追加 |
| 呼び出し例 | ローカルの API の例は build_messages を使うようになり、プロンプトが学習時と一致する。引き続き test_tutorial.py が一時的な HTTP サーバーに対して実行している |
| GPU アップロード用バンドル | 新しい tools/build_gpu_zip.py でビルド:31 ファイル、約 3.88 MiB、重みは含まない。出力が残っているノートブックのパッケージングは拒否する |
| 回帰テスト | 103 passed(極小の CPU モデルで実行したノートブックの eval セルと loss 曲線セルを含む) |
| 電子書籍 | mkdocs build --strict は成功。57 ページ、28,387 件のローカルリンクとリソースのチェックが通過。メインナビゲーションを 学習の道筋 → 概念 → GPU → 学習 → デプロイ に変更 |
| 初心者向けの読みやすさ(2026-10-08) | 第 2 章を 8 節構成の段階的な概念講義に書き直し(モデルのディレクトリ、トークンの具体例、loss の値の感覚、diff にたとえた LoRA、7 つのライブラリの役割分担)。第 6 章に nvidia-smi/ドライバー/CUDA の節と Jupyter の操作表を追加。第 4 章のガバナンスに関する内容は発展的な内容として折りたたんだ。ノートブックのすべてのコードセルに「実行後に表示されるもの」とパラメータごとの表(BitsAndBytesConfig、generate、LoraConfig、SFTConfig)を追加。ノートブック内の出力の期待値は見積もりであり、実際の GPU での実行結果と照合する必要がある |
このラウンドでも RTX 4090 での実行は行っていません。72 ステップの実際の所要時間と VRAM、vLLM 0.21 の起動ログ、vllm bench serve のパラメータと結果は、すべて GPU ホストでの実測を待つ必要があります。
2026-09-29: 小学生向けの理科探究、学習用会話 500 件¶
| チェック項目 | 実際の結果 |
|---|---|
| 編集可能な単一のデータソース | data/dataset.json:ファクトカード 60 枚。train 500、val 50、test 50。会話あたり 2〜3 ターン |
| カバー範囲 | 5 つのカテゴリそれぞれに 100/10/10 の会話。train は 1〜2 年、3〜4 年、5〜6 年がそれぞれ 167、167、166 会話 |
| 生成方法 | 50 の学習用トピックそれぞれに 10 通りの教え方の流れ。知識、誤解、たとえの限界、観察、追加の質問をトピックごとに書き、それを組み合わせて完全な会話にした。トピック内で一部の回答が再利用されているため、500 件の独立した知識問題ではない |
| データの状態 | すべて synthetic/draft。35 枚のカードには参照元を読んだ記録があり、25 枚はまだ保留扱い。個々の事実、子どもにとっての読みやすさ、実際の探究効果はいずれもまだレビュー待ち |
| 教師信号の件数 | train の回答ターゲット 1150 件、val/test はそれぞれ 115 件。学習でフィルタするのは train のみ |
| 参照カードの独立性 | 事実は独立した要約として書き直した。対応する事実のテキストに、アシスタントのターゲット全文がそのまま含まれている例は見つからなかった。ただし、意味的な類似をすべて排除できたわけではない |
| 実際のトークナイズとマスク | 固定した Qwen トークナイザーと実際の TRL collator で 1150/1150 サンプルが合格、最長 553 トークン。最初のサンプルは 408 トークンで、教師信号の対象位置は 22 |
| データスナップショット | 最終版は data/processed/science-v3 に対応し、自動生成ファイルは 9 個。v1/v2 はこのラウンドの整理過程で生じた古いスナップショットで、正式に使う場合はソースデータから prepare をやり直すこと |
| 入力と分離 | grade_band はプロンプトに入る。behavior/review/source_url は入らない。同じトピック・同じ事実は split をまたげない。未来の Q&A は漏れない |
| 評価プロトコル | B/C は同じ入力を保つ。few-shot の例は 3 つの学年帯をすべてカバーすることを優先し、train からのみ取る。ブラインド評価では学年帯を保持し、bootstrap はトピック単位でクラスタリングする。各評価セットに含まれる独立したトピックは 5 つだけ |
| ノートブックとチュートリアル | 46 セル/コードセル 16、出力は空、各セルに解説付き。理科の観察用の質問、データの説明、正式な比較、vLLM、中国語の API の例は同期している |
| 実験ディレクトリ | 新しいシナリオのデフォルトは runs/science-001。旧シナリオの lesson/gpu ディレクトリとの混同を避けるため |
| 回帰テスト | 101 passed、10 warnings。極小の CPU LoRA の更新/保存/再読み込み/マージと、チュートリアルの API リクエストおよび履歴の受け渡しを含む |
| リリースの範囲 | このラウンドでは実際の 4B の CUDA 学習も vLLM も、子どもを対象とした調査も実行していない。ローカルのチェックでは、LoRA がプロンプト全体を使うベースラインを上回ることは証明できない |
電子書籍と GPU ZIP の最終ビルドおよび整合性チェックは、このラウンドの成果物とともに完了しました。以下はすべて過去のバージョンの記録であり、旧シナリオや旧件数は現在のデータを表すものではありません。
2026-09-29: 単一ファイルのデータと D1〜D7 の使用箇所の注記¶
| チェック項目 | 実際の結果 |
|---|---|
| データの統合 | data/dataset.json に元のファクトカード 10 枚、会話 30 件、参照回答 60 件とすべてのメタデータを格納。移行前後でオブジェクトは同一で、重複していた 2 つのソース JSONL ファイルは削除 |
| メインの入口 | ノートブックは単一ファイルを直接読み込んでメモリ上でサンプルを構築し、processed ディレクトリには依存しない。D1〜D7 で読み込み、フィルタ、コンテキスト、ターゲット、トレーナー、ラベル、保存先を示す |
| 学習内容 | 実際の固定した Qwen トークナイザーでノートブックのサンプル生成セルを実行。60 件の prompt/completion/input_ids/completion_mask はすべて旧 seed-v2 と一致。最初のサンプルは引き続き 302 トークンで、教師信号の対象位置は 53 |
| リーク防止 | テストで、val/test が学習に入らないこと、現在のターゲットと未来のターンがプロンプトに入らないこと、履歴が正しく保持されることを確認。出典 URL とレビューのフィールドはモデルの入力として使われない |
| 回帰テスト | 95 passed, 0 skipped, 10 warnings。実際の極小 CPU LoRA の学習、保存、再読み込み、マージとチュートリアルの API の例が通過 |
| ノートブックの形式 | nbformat の検証が通過。46 セル/コードセル 16。すべてのコードセルの下に解説があり、配布時の出力は空 |
| 実験の振り返り | 学習前にメモリ上のデータを runs/<実験名>/dataset.json に保存し、そのコピーの SHA-256 を manifest に記録する。普段編集するのは data/dataset.json だけ |
| CLI | data/prepare は --input data/dataset.json に変更。発展的な実験では必要に応じてスナップショットを生成する。過去の seed-v1/v2 と runs は残した |
| アップロード用バンドル | 31 ファイル、約 3.82 MiB。ソースデータは 1 部のみで、processed の中間ファイルは含まない。展開後に会話 30 件と学習ターゲット 60 件を確認し、ファイルはソースとバイト単位で同一 |
| 軽量 CLI | Torch を含まない .venv-data で、--input を使って単一ファイルのデータを prepare。生成された 60 サンプルは旧スナップショットと一致。その後、実際の TRL collator による mask/EOS/padding のチェックも通過 |
| 電子書籍 | 厳格ビルドが成功。54 ページ、5,987 件のローカルリンクとリソースのチェックが通過。データのページには完全な会話 1 件とそれが参照する事実を表示し、旧来の 2 ファイル構成のソースページは削除 |
10 件の warning は、引き続き極小モデルの PEFT 設定パスとチェックポイントのタイムスタンプの順序に由来するものです。このラウンドでは RTX 4090 での実際の 4B の CUDA 学習も vLLM サービスも実行していません。データとローカルのコード検証は、モデル品質の向上を示すものではありません。
以下は以前のバージョンの記録です。旧来のデータの入口とファイル数については、この節の記載が正となります。
2026-09-29: 電子書籍・ノートブック・コードの最終的な対応チェック¶
| チェック項目 | 実際の結果 |
|---|---|
| 全体の回帰テスト | 91 passed, 0 skipped, 10 warnings。ノートブックの実際の極小学習の実行と、チュートリアルの API の例のローカル HTTP チェックを含む |
| チュートリアルのコマンド | README、データの説明、本文にある lab.* コマンドはすべて対応する実際の CLI パーサーを通過。残っているどの CLI にも実行可能な例がある |
| 入口と説明 | 第 13 章は既存のモジュールと項目ごとに対応。発展用の学習環境への切り替えと、A/B/C のデータとプロンプトの違いを補った。ノートブックと第 10 章のデプロイ/呼び出しのコードはブロックごとに一致 |
| ソースの同期 | 学習の付録は実際の 2 つの学習モジュールと一致。ビルド時に古い自動生成のソースページとダウンロード用のコピーを削除 |
| 整理 | lab/client.py と古いテストを削除。教材にある標準ライブラリの API の例を代わりに直接テストするようにした。正式な比較、ブラインド評価、再開、エクスポートで引き続き使う CLI は残した |
| ダウンロードのバージョン | 初回の Hugging Face からのダウンロードで新しい revision を取得してしまうことがある問題を修正。3 つのダウンロード元はすべてチュートリアルで固定したバージョンを使い、古いバージョンのディレクトリが黙って書き換えられることはない |
| 実際のデータ | 固定した Qwen トークナイザーと TRL collator で seed-v2 を再確認。教師信号の範囲、EOS、padding は 60/60 サンプルで合格 |
| GPU アップロード用バンドル | 38 ファイル、約 3.85 MiB に更新。展開後、凍結データから 60 件の学習サンプルが得られる。古いクライアントは削除 |
| 電子書籍と配布用バンドル | 厳格ビルドが成功。55 ページ、4,880 件のローカルリンクとリソースが通過。GPU ZIP の 37 個のソースファイルと汎用ソース ZIP の 53 個のファイルは現在のファイルとバイト単位で一致。汎用ソース ZIP は展開後に単独でビルドでき、リンクチェックも通過 |
| ドキュメント内のスニペット | Bash ブロック 32 個、Python ブロック 3 個、JSON ブロック 10 個が構文チェックを通過。SSH トンネルのアドレス/ポートのプレースホルダーは本文の指示どおりに置き換えてからチェックし、リモートホストには接続していない |
以上がローカルで検証できる対応関係です。10 件の warning は、極小モデルの PEFT 設定パスとチェックポイントのタイムスタンプの順序に由来します。RTX 4090 には接続していないため、実際の 4B のダウンロード、CUDA/NF4 学習、品質レビュー、vLLM サービスが通過したと主張することはできません。また、このラウンドでは GitHub Pages のワークフローも公開していません。
以下の記録は以前のバージョンに対応します。ファイル数、入口、テスト数については、この節の記載が正となります。
2026-09-29: 教育用ノートブックの書き直しと国内からのダウンロード¶
| チェック項目 | 実際の結果 |
|---|---|
| 全体の回帰テスト | 51 passed, 0 skipped, 10 warnings。ローカルのポートのテストは待ち受けが許可された環境で実行 |
| ノートブックの形式 | 公式の nbformat の検証が通過。44 セルで、そのうち 15 が Python のコードセル。各セルの下に目的と理由があり、配布時の出力は空 |
| ノートブックの実コード | 実際のコードセルを抽出し、極小の Qwen3 CPU モデルで LoRA 設定、TRL の教師信号チェック、2 ステップの学習、保存、再読み込み、生成、マージ、完全なモデルの再読み込みを実行。再読み込み後の logits は一致し、マージ後の logits は許容誤差内で一致 |
| デバイスの境界 | CPU テストで置き換えているのは CUDA のデバイス/精度の設定だけで、学習をコマンドの戻り値でシミュレートしてはいない。CPU でのマージが自動的に GPU へ移されないよう、PEFT の読み込みデバイスを明示的に固定。CLI のマージも同様に修正 |
| ダウンロード元 | ModelScope 1.34.0 で設定/トークナイザーのファイル 9 個を実際にダウンロードし、それぞれ SHA-256 で固定した HF の revision と一致。実際の Qwen トークナイザーのフィンガープリントは seed-v2 と一致 |
| 重みへのアクセス可否 | 3 つの safetensors シャードそれぞれから 64 バイトを読み込み、いずれも HTTP 206 が返った。Content-Range の合計サイズは凍結した manifest と一致。8 GB の重み全体はダウンロードしていない |
| ダウンロード失敗への保護 | ローカルキャッシュの一部欠落、同じサイズの破損ファイル、リモートのバージョン変更、トークナイザーの変更、バージョンロックの保護、ミラーのエンドポイント、オフラインでの整合性チェックをテスト |
| 電子書籍 | 第 6 章は環境と国内からのダウンロード、第 7 章は直接の学習に対応、第 10 章ではエクスポート、vLLM、ローカルでのシングルターン/マルチターン呼び出しを説明。厳格ビルドとローカルリンクのチェックが通過 |
| アップロード用バンドル | 39 ファイル、約 3.85 MiB。展開後、凍結した 60 サンプルが揃っており、ノートブック/コード/ダウンロードロックと依存関係は同期している。環境、キャッシュ、完全な重み、学習結果は含まない |
| 整理 | 旧来のノートブック用サブプロセス補助モジュール、任意のワークフロー切り替え、結果 ZIP の自動パッケージングを削除。正式な評価や学習の再開などでチュートリアルが引き続き使う CLI は残した |
参考資料:ModelScope のモデルリポジトリ、vLLM 0.21 の GPU インストール、IPython カーネルの登録。ユーザーが提供した Zhihu の記事 はセキュリティ認証が発生して本文を読めませんでした。ミラーのエンドポイントは SDK と公式ドキュメントで確認しており、記事全文を読んだとは主張しません。
10 件の warning は、極小モデルの PEFT 設定パスとチェックポイントのタイムスタンプの順序に由来します。テストの結果、PEFT のデフォルトの自動デバイス配置では CPU でのマージが CPU 以外へ移されてしまうことがわかりました。現在はデバイスを明示的に指定しており、全体の回帰テストは通過しています。ユーザーの RTX 4090 には接続していません。実際の 4B のダウンロード、CUDA/NF4 学習、品質レビュー、vLLM サービスは、まだそのホストで実行していません。vLLM は別の環境を使います。まずホストのドライバーが CUDA 12.9 をサポートしていることを確認してください。
以下は以前のバージョンの過去の記録です。旧来のノートブックのワークフローは、この書き直しで置き換えられています。
2026-09-29: GPU ノートブックとチュートリアルの入口¶
| チェック項目 | 実際の結果 |
|---|---|
| 全体の回帰テスト | 46 passed, 0 skipped, 6 warnings。ノートブックのサブプロセスの中断時のクリーンアップ、エラーの戻り値、出力の保護、ファイルの構文、ダウンロードの一貫性、audit の結果しかない場合のパッケージング拒否のチェックを新たに追加 |
| ノートブックの形式 | notebooks/01_gpu_train.ipynb は公式の nbformat の検証を通過。33 セル(コードセル 18)。配布ファイルの実行回数と出力は空 |
| セルの流れ | 実際のローカル Jupyter カーネルで、デフォルトのワークフローとすべての任意のワークフローを、シミュレートしたコマンド結果を使って実行。呼び出しの引数は実際の CLI パーサーで検証し、結果の読み込み、回答の HTML エスケープ、ZIP バックアップが通過。インストール、ダウンロード、GPU 計算はすべてテストダブルを使用 |
| 電子書籍 | 第 6 章はノートブックをメインの入口とし、第 7 章と第 10 章が対応する手順を示す。厳格ビルドとローカルリンクのチェックが通過し、ノートブックのダウンロードファイルはソースファイルと一致 |
| GPU アップロード用バンドル | llm-lora-tutorial-gpu.zip を 37 ファイル、約 3.84 MiB に更新。ZIP の整合性、展開後のインポート、凍結した 60 件の学習サンプルのチェックが通過。ノートブックとその実行補助モジュールを含み、完全な重みやローカル環境は含まない |
ユーザーのスクリーンショットにあった「token-audit.json しかないのに結果 ZIP を生成できてしまう」問題を再現し、ステップ 13 を修正しました。現在はパッケージングを許可する前に、A/B/C の回答、10 ステップの学習記録、アダプターファイルを確認します。デフォルトと任意のワークフローはローカルカーネルでのシミュレーションチェックを再び通過し、GPU アップロード用バンドルも更新しました。ユーザーのマシンにある既存のノートブックは別途同期する必要があります。
このラウンドではユーザーの RTX 4090 に接続しておらず、4B の重み全体もダウンロードしておらず、実際の GPU 学習も実行していません。ノートブックのワークフローのシミュレーションと CPU での極小学習の回帰テストで検証できるのは、ローカルで確認できる範囲だけです。実際の CUDA、NF4、VRAM、時間、学習品質は、引き続き GPU で実行した記録を待つ必要があります。6 件の warning は、既存の極小モデルの保存とチェックポイントのタイムスタンプの順序に由来します。HTTP のテストは、一時的なローカルポートが許可された環境で完了しました。
2026-09-26: データとチュートリアルの簡素化¶
| チェック項目 | 実際の結果 |
|---|---|
| 全体の回帰テスト | 38 passed, 0 skipped, 6 warnings。新旧のデータバンドル、セットの欠落、データ閲覧ページ、既存の極小学習のチェックを含む |
| 軽量なデータ環境 | .venv-data を作成し、requirements-data.txt に従って Transformers 4.57.3 と Jinja2 3.1.6 およびその依存関係をインストール。torch、trl、peft、datasets、accelerate がインストールされていないことを確認 |
| 軽量環境でのデータ準備 | 会話 30 件と学習サンプル 60 件を生成。manifest にある 5 ファイルは、フル CPU 環境で生成した seed-v2 とバイト単位で同一 |
| データバンドルの構成 | 新しい schema=2 は計 6 ファイル。旧 seed-v1 の 13 ファイルは残しており、整合性チェックも通過 |
| データと教師信号 | ソースデータの内容は変更なし。実際の Qwen トークナイザーと TRL collator で 60/60 サンプルが合格。レポートは runs/token-audit-v2.json |
| 本の中の例 | 故宮博物院の例は実際の最初のレコードから取ったもの。palace-01:0 は合計 302 トークンで、コンテキスト位置 249、教師信号の対象位置 53 |
| ドキュメント内のコード | README、チュートリアル、データの説明にある Bash ブロック 30 個、Python ブロック 2 個、埋め込みの Python スニペット 1 個、JSON ブロック 10 個が構文チェックを通過。学習コードの付録はソースと一致 |
| 電子書籍のビルド | mkdocs build --strict は成功。HTML 51 ページ、4192 件のローカルリンクとリソースのチェックが通過 |
| ブラウザでの確認 | データの章をデスクトップ幅と 390px のスマートフォン幅で確認。長い JSON は自動で折り返され、横方向へのはみ出しはなく、EOS のフィールドは完全に表示される。ソースデータのページは目的と最初のレコードを先に表示し、生テキスト全体はデフォルトで折りたたまれている |
最初の軽量環境での実行で、チャットテンプレートに Jinja2 が不足していることがわかりました。依存関係を追加した後、準備は成功しました。モデルの計算ライブラリが利用できないという Transformers の警告は、この環境では想定どおりで、トークナイズとテンプレートのレンダリングはどちらも正常に動作します。HTTP のテストは一時的なローカルポートが許可された環境で完了しており、サンドボックスの待ち受け制限をテストのスキップで回避してはいません。
6 件の warning は、極小モデルの保存設定とチェックポイントのタイムスタンプの順序に由来するもので、以前の検証と同じ種類です。今回検証したのはデータ処理、CPU での学習の仕組み、本の Web ページだけです。4B の GPU 学習は実行しておらず、レビューで承認された候補会話もありません。
2026-09-23: 最初の検証記録¶
最初の実行記録を以下に残しています。
環境¶
- ローカルは Darwin 25.3.0 arm64、Python 3.11.15。
- テストには一時的な分離環境
/tmp/beijing-lora-envを使い、システムの Python は変更していない。 - Torch 2.8.0、Transformers 4.57.3、TRL 0.24.0、PEFT 0.18.0、Accelerate 1.11.0、Datasets 4.3.0、pytest 8.4.2。
- インストール済みの 52 パッケージで
uv pip checkが通過。これは bitsandbytes のない Mac の CPU 環境であり、Linux CUDA の組み合わせが立ち上がったと主張する根拠にはならない。
実行済み¶
| チェック項目 | 結果 |
|---|---|
python -m pytest -q tests の全体実行 |
27 passed, 0 skipped, 6 warnings、今回は約 3.92 秒 |
| CLI のエントリポイント | download/data/prepare/audit/train/infer/evaluate/merge/client の 9 つすべてで --help が成功 |
| Python の構文 | lab と tests のすべてのファイルがパースできる |
| チュートリアルの静的チェック | Bash のコードブロック 31 個、完全な Python のコードブロック 2 個、JSON の例 1 個の構文と、すべてのローカル Markdown リンクが通過 |
| 生データ | カード 10 枚、会話 30 件、ターゲット回答 60 件、5 つのカテゴリそれぞれに 6 会話。すべて draft |
| 実際の Qwen トークナイザー | 固定した revision。設定とトークナイザーをダウンロードし、4B の重みはダウンロードしていない |
| データ準備 | seed-v1、train=30 会話、展開後 60 サンプル。val/test は空 |
| 実際の TRL collator による audit | 60/60 で教師信号の範囲が正しく、EOS はちょうど 1 つ。長さの異なる 2 サンプルをまとめて padding を確認 |
| トークン長 | 全長 285〜382。ターゲットの教師信号の長さは EOS を含めて 18〜54。これは現在の seed の値であり、正式なデータの見積もりではない |
| 極小モデルの学習 | ランダムに初期化したごく小さな Qwen3 で、実際の Torch/PEFT/TRL を使って 2 ステップ実行。変化したのは LoRA のパラメータだけ |
| 極小モデルの再開とマージ | 計 4 ステップを計画し、ステップ 2 で保存。4 まで再開。再読み込み後の logits は一致し、マージ後の logits は許容誤差内で一致 |
| HTTP クライアント | 一時的なローカルサーバーで、履歴、正常な応答、503、エラー構造、不正な JSON を検証。タイムアウトの境界もテスト |
| 評価と整合性 | ブラインド評価のペアリング、スコアの欠落、同点、会話単位のクラスタリング。アダプターの設定を変えるとフィンガープリントが変わる。改変された準備出力は拒否される |
モデルの revision:cdbee75f17c01a7cc42f958dc650907174af0554。
トークナイザーのフィンガープリント:5cc703e3e68312a345b0aa88aed16fd37eb4ca2d871900402275514280124405。
現在のローカルの詳細な記録は runs/token-audit.json と data/processed/seed-v1/manifest.json にあります。これらは再生成可能な生成ファイルです。コード変更中に作られた CPU の中間データバンドルは一時ディレクトリへ移し、最終的な seed-v1 は現在のプロンプトのコードで再ビルドしました。
テスト中に遭遇した問題¶
- HTTP のテストは、当初サンドボックスの待ち受け制限で失敗した。ローカルポートが許可された環境で再実行したところ通過しており、テストの削除やスキップはしていない。
- 会話が 1 件だけのときに幅ゼロの不確実性区間が表示される問題を修正:会話が 2 件未満の場合は空の区間を返す。
- アダプターのフィンガープリントにはパラメータファイルと設定の両方を含めているため、alpha だけを変えても凍結チェックを通過することはできない。
- モデルファイルのハッシュ計算はストリーミング読み込みを使い、数 GB のシャードを RAM にコピーしないようにしている。
- 6 件の warning は、極小のランダムモデルに事前学習済みの設定パスがないことと、短時間で保存されたチェックポイントのファイルのタイムスタンプが当てにならないことに由来する。チェックポイントを数値のステップ順に並べることで再開は成功しており、これらの警告は抑制していない。
未実行のため、通過したとは主張できないもの¶
- 30 会話を 1 件ずつ人手/独立にレビューすること。現在、承認済みの会話はない。
- カード 30 枚と正式な会話 150 件への拡張とレビュー。
- 4B モデルの重みのダウンロード、Linux CUDA/bitsandbytes の立ち上げ、実際の QLoRA。
- GPU での 10 ステップのスモークテスト、20 サンプルでの過学習、1 Epoch、r8/r16 の比較。
- 実際の生成品質、事実の裏付け率、ブラインド評価の勝率、GPU の VRAM/時間/コスト。
- 実際の 4B の BF16 マージ、vLLM のイメージ取得/起動、実際のモデルの API と負荷。
CPU の極小モデルによるテストは、4B の実験の代わりにはなりません。項目を 1 つ完了するたびに対応するログ/結果を添付して todo を更新してください。実際に実行していない指標は空欄のままにします。