まさかの日記

最近まともな文章しか書けなくなってきました

2026/03

---


先日、Twitterを眺めていたら面白いリポジトリが紹介されているのを見つけた。


「LINE Harness OSS」というもので、一言で言うとLステップ(LINE公式アカウントのマーケティング自動化ツール、月額2万円〜)のオープンソースクローンだ。しかも「Claude Codeから自然言語で全操作できる」設計になっている。


「来週セミナー参加者に3日前と前日にリマインド送って」


これをClaude Codeにそのまま打ち込むと実行されるらしい。月額0円で。


最初の感想は「すごいな」だったのだが、プロジェクト名に「Harness(ハーネス)」という言葉が使われているのが気になった。AI関連の話題でよく見かける言葉なのに、自分はなんとなくしか意味を理解していなかった。せっかくなので調べてみることにした。



---


ハーネスとは何か



ハーネスという言葉の語源は馬具だ。馬の体に装着して、力を制御しながら人間の意図通りに動かすための道具。この「力を制御しながら活かす」というニュアンスがそのままAI分野に持ち込まれている。


調べてみると、ひとことで「ハーネス」と言ってもいくつかの文脈があることがわかった。



まず古典的な意味でのテストハーネス。ソフトウェア開発でいうJUnitやpytestのような、自動テストを実行するための基盤。これはAIが登場するずっと前からある概念だ。


次に、LLMの評価ハーネス。EleutherAIが開発した「lm-evaluation-harness」が有名で、異なるLLMを同じ条件でベンチマーク測定するための統一実行環境だ。ChatGPTとClaudeを「同じ物差し」で比較するときに使われる。


そして最近急速に広まっているのが、AIエージェントハーネスだ。LangChainやAutoGenのような、AIモデルに外部ツールを繋いで複雑なタスクを実行させるための制御基盤がこれにあたる。



---


「ハーネスエンジニアリング」という概念



調べていて一番面白かったのが、「ハーネスエンジニアリング」という言葉だ。


プロンプトエンジニアリング(モデルへの指示を最適化する技術)やコンテキストエンジニアリング(文脈の整理)という概念はよく知られている。ハーネスエンジニアリングはその上位レイヤーで、「AIが動く実行環境そのものを設計する技術」だという。


わかりやすい例えがある。


モデルをCPUとするなら、コンテキスト窓はRAM、AIエージェントはアプリケーション、そしてハーネスはOSだ。


プロンプトを磨くことはアプリの最適化に似ている。でも本当に重要なのは、そのアプリが動くOSをきちんと設計することだ。ハーネスエンジニアリングはそういう話らしい。


このアナロジーは個人的にすごく腑に落ちた。



---


LINE Harnessが「ハーネス」を名乗る理由



元のリポジトリに戻ると、LINE Harnessという名前の意味がよくわかる。


LINEという既存のプラットフォーム(馬)に、Claude Codeという騎手を乗せるための制御層(馬具)を作った、ということだ。


ユーザーはいつも通りLINEを使う。オペレーターも見慣れた管理画面を使う。ただし裏でClaudeが動いていて、自然言語で全部操作できる。


「AIを導入した感」を出さずにAIを使える、というのがこのアーキテクチャの強みだと思う。Lステップが月額2万円で提供していた機能を、Claude CodeというOSの上に組み立て直した、そういうプロジェクトだ。



---


コールセンターへの示唆



自分はコールセンターの現場でAI活用を考えているのだが、この話は直接つながってくる。


「AIを導入する」と言うとき、自前のAIチャットボットを作ることを想像しがちだ。でもハーネスという発想で考えると、「既存の業務フローにAIをどう組み込むか」という話になる。


オペレーターが使うシステムはそのままで、その裏でLLMが応答の要約や品質評価をする。管理者がCRMを開くといつも通りの画面があるが、AIが自動でタグ付けやスコアリングをしている。


これが現実的なAI導入の姿かもしれない。全部作り直すのではなく、今あるシステムに「ハーネスをつける」。



---


自分のRPi5システムもハーネスだった



余談だが、最近自宅でRaspberry Pi 5にNVIDIA RTX 5060 Tiを接続して、ローカルLLMを動かすシステムを作った。


Macで動いているスクリプトが毎時TwitterのタイムラインをフェッチしてRPi5に投げ、ローカルモデル(qwen3:1.7b)がGPUを使って投稿をスコアリングし、重要そうなものだけObsidianに書き出す。


これもある意味、ハーネスエンジニアリングだと思う。LLMを「入れた」のではなく、既存のワークフローにLLMを「繋いで制御する層」を作った。


「ハーネス」という言葉を知ってから、自分がやっていたことの解像度が上がった気がした。


---


参考リンク
LINE Harness OSS: https://github.com/Shudesu/line-harness-oss
ハーネスエンジニアリングとは(CodeZine): https://codezine.jp/article/detail/23340
speakerdeck ハーネスエンジニアリングの時代: https://speakerdeck.com/tame/aiezientoshi-dai-nohanesuenziniaringutoha

GPT、LoRA、SFT、DPO……ChatGPTの裏側にある技術を「読む」だけでなく「実際に動かして理解したい」と思い、2026年に出たばかりの書籍『作ってわかる大規模言語モデルの仕組み』(日経BP)に挑戦しました。

環境はRaspberry Pi 5にRTX 5060 Ti(VRAM 16GB)を接続したローカルGPUマシンです。結論から言うと、全9ノートブックがエラーなく動作しました。その中で特に「おっ」と思った場面を3つ紹介します。

■ 夏目漱石を学習させたGPTが明治っぽい文章を生成した

第3章では青空文庫の「吾輩は猫である」(32万文字)を使って、GPTをゼロから学習させます。パラメータ数はわずか13Mという小さなモデルです。

学習は5000ステップ、時間にして約15分で完了しました。Loss(誤差)の変化はこんな感じです。

ステップ0:Loss 8.07 ステップ1000:Loss 2.25 ステップ3000:Loss 0.37 ステップ5000:Loss 0.20

きれいに収束していきます。そして「吾輩は」というプロンプトを与えると、こんなテキストが出てきました。

--- 吾輩は「それで朗読会さ。せんだってトチメンボーを御馳走した時にね。その話しが出たよ。何でも第二回には知名の文士を招待して大会をやるつもりだから、先生にも是非御臨席を願いたいって。それから僕が今度も近松の世話物をやるつもりかいと聞くと… ---

単語の選び方や文体が明治時代の小説らしい雰囲気になっています。13Mパラメータの小さなモデルがこれだけ再現できるというのが驚きでした。

■ 全パラメータの0.64%だけ学習するLoRAの不思議

第4章ではLoRA(Low-Rank Adaptation)というファインチューニング手法を試します。

使ったモデルはrinna/japanese-gpt2-medium(336Mパラメータ)ですが、LoRAでは全パラメータのうち学習するのは2.16M、つまりたったの0.64%です。残りの99.36%は一切変更しません。

データは青空文庫5000サンプル、学習時間は約5分。それで「吾輩は猫である。名前はまだ無い。」というプロンプトに対してこんな文章が出てきます。

--- 猫と申します。私は先日、ある人から、ある本を貸してもらったのですが、そこに書いてあった事を読んだ時にとても気になったので質問します。一つ一つの事柄について、自分が理解していなくては話にならないのでしょうか? ---

0.64%しか触っていないのに流暢な日本語が出てくる。「これがLoRAが流行っている理由か」と実感できる場面でした。

■ SFTのビフォーアフターが一番わかりやすかった

第5章のSFT(教師ありファインチューニング)は、AIの振る舞いがガラッと変わる様子が一番わかりやすかったです。

チューニング前のモデルに「What is the capital of Japan?」と聞くとこう返ってきます。

--- The Japanese government has a long history of using money to finance its own military. The first major example was in 1848 when it used $1,000 for an army unit... ---

全然答えていません。ところがSFTで指示応答データを1回学習させると、こう変わります。

--- The capital, Tokyo ---

たった1回のトレーニングで「質問に答える」という振る舞いが身につく。ChatGPTが普通に質問に答えてくれる裏側に、こういう工程があるんだと腑に落ちました。

■ 環境構築について

書籍はGoogle Colab前提で書かれているため、ローカルで動かすにはいくつか変更が必要でした。主な作業は以下の3点です。

・Google Driveマウント部分を削除してローカルパスに変更 ・chapter02のTransformerはVRAMに合わせてモデルを軽量化(embedding_dim 512→256、layer 6→3) ・chapter05はtrlのバージョン(0.9.6)に合わせてAPIを調整

RTX 5060 Ti(16GB)があれば、deepspeedなしで全章動かせます。

■ まとめ

この本はTransformerの実装から始まり、GPT学習、LoRA、SFT、DPOまでを段階的に手を動かしながら学べる構成になっています。「読んで理解する」と「動かして理解する」は全然違うと改めて感じました。

特にSFTのビフォーアフターとLoRAの0.64%という数字は、実際に動かさないと実感しにくいと思います。LLMの仕組みを体で理解したい方にはおすすめの一冊です。

書籍:作ってわかる大規模言語モデルの仕組み(日経BP、2026年) Amazon:https://www.amazon.co.jp/dp/4296205250/

「OpenClawのmemory searchってEmbeddingとか自分で設定しないといけないの?それともファイル置いておけば勝手にインデックスしてくれるの?」 という疑問を、Claude・ChatGPT・Perplexityの3つに並列で投げて調べてみました。

結論:ファイルを置くだけでOK

3つのAI共通の答えは明快でした。 Embeddingは裏でやってくれる。自分で設定しなくても動く。 具体的には:
  • memory/ ディレクトリにMarkdownファイルを置くと自動で監視・インデックス化される
  • ファイルを変更してから1.5秒後に自動で再インデックスが走る
  • Embeddingプロバイダーを指定しなくても、フォールバック順に自動選択してくれる
  • インデックスは ~/.openclaw/memory/.sqlite にSQLiteとして保存

検索の仕組み:ハイブリッド方式

単純なベクトル検索ではなく、ベクトル検索(70%)+キーワード検索(BM25 30%)のハイブリッドになっています。 意味的に近いものはベクトルで拾い、キーワードが一致するものはBM25で補う構造です。10,000チャンク規模で100ms未満という数字も出ており、実用的な速度です。

Embeddingプロバイダーのフォールバック順

何も設定しない場合、以下の順で自動選択されます:
local → OpenAI → Gemini → Voyage → Mistral
APIキーを用意したくない場合は provider: "local" を指定してOllamaで動かすことも可能です。

実際に試す順序

Step 1:まずゼロコンフィグで試す

memory/ディレクトリにMarkdownを置くだけ

状態確認

memory status --deep

検索テスト

docker compose run --rm openclaw-cli memory search --query "テストクエリ"

Step 2:精度を上げたいなら明示的に設定

agents:
  defaults:
    memorySearch:
      provider: "openai"
      model: "text-embedding-3-small"
      sync: { watch: true }

Step 3:APIキーを使いたくないならローカル

agents:
  defaults:
    memorySearch:
      provider: "local"
      local:
        modelPath: "all-MiniLM-L6-v2"

Step 4:大量ファイル(1万以上)になったら

candidateMultiplier: 4 以上に設定するとパフォーマンスが改善します。

各AIの独自観点

3つのAIで微妙に違う観点が出てきたのも面白かったです。 Claudeは「ハイブリッド検索の比率が調整可能」という点に着目。ローカルEmbeddingでAPIキー不要運用できることも強調していました。 ChatGPTは「データ品質がクリティカル」という指摘が印象的でした。ゴミを入れたらゴミが出る、という当たり前だけど大事な話。組織導入時はデータクレンジング工程が必要とのこと。 Perplexityが一番実践的で、具体的なYAML設定やCLIコマンドをそのまま出してくれました。Embeddingキャッシュを50,000エントリ(約73MB)に設定する最適化情報なども。

まとめ

OpenClawのmemory searchは「難しい設定なし、ファイルを置けば動く」が基本設計です。Embeddingの知識がなくても使い始められるのは敷居が低くていいですね。 精度にこだわりたくなったら provider: "openai" を設定、APIキーを使いたくなければOllamaでローカル運用、という段階的な使い方ができます。 --- この記事はClaude・ChatGPT・Perplexityへの並列調査結果をもとに作成しました。

実施日: 2026-03-20

テスト環境

  • マシン: Raspberry Pi 5 16GB + RTX-5060Ti 16GB
  • Ollama: ローカルGPU実行

テスト項目

1. 日本語会話(AI社会影響の良い点・悪い点) 2. 論理推論(素数ジェネレータ実装) 3. コーディング(Pythonジェネレータ) 4. 創作・表現(春の朝の俳句) ---

結果サマリー

| モデル | サイズ | 平均速度 | 合計時間 | 推論精度 | 創作 | 安定性 | |--------|--------|----------|----------|----------|------|--------| | qwen3:8b | ~5.2GB | 最速 | — | ★★ (誤答あり) | ★★★ | ★★ | | qwen3.5:9b | ~6.6GB | 49.9 tok/s | 477秒 | ★★★ | ★★ | ★★ | | gemma3:12b | ~8.1GB | 41.1 tok/s | 626秒 | ★★★ | ★★★ | ★★★ |

---

詳細結果

qwen3.5:9b vs gemma3:12b

| タスク | qwen3.5:9b | gemma3:12b | |--------|-----------|-----------| | 日本語会話 | 50.9 tok/s (23.9s) | 41.3 tok/s (45.5s) | | 論理推論 | 49.6 tok/s (145.2s) | 41.3 tok/s (192.5s) | | コーディング | 49.6 tok/s (123.4s) | 40.5 tok/s (206.0s) | | 創作・表現 | 49.4 tok/s (184.1s) | 41.3 tok/s (182.2s) | | 平均 | 49.9 tok/s | 41.1 tok/s |

qwen3.5:9b の注意点

  • thinkingモードにより創作タスクで空回答になることがある
  • /no_think プレフィックスで解決可能(速度: 35.5 tok/s)
  • 推論精度は高い

gemma3:12b の特徴

  • 全タスク安定完走
  • コード中の関数名まで日本語化するユニークな挙動
  • 説明が非常に丁寧・詳細
  • RPi5での速度は実用十分
---

総合推薦

| 用途 | 推薦モデル | 理由 | |------|-----------|------| | 総合 | gemma3:12b | 品質・安定性・完走率が最高 | | バランス | qwen3.5:9b | 速度と精度のバランスが良い | | 速度重視 | qwen3:8b | 最速だが推論誤答リスクあり |

---

第2回テスト: 高速モデル評価(~100 tok/s 狙い)

実施日: 2026-03-20

結果サマリー

| モデル | サイズ | 平均速度 | 日本語品質 | コーディング | 創作 | 総合評価 | |--------|--------|----------|------------|--------------|------|----------| | qwen3:1.7b | 1.4GB | 87.1 tok/s | ★★★ | ★★★ | ★★★ | ★★★ | | smollm2:1.7b | 1.8GB | ~108 tok/s* | ★ (支離滅裂) | ★★ | タイムアウト | ★ | | llama3.2:3b | 2.0GB | 82.4 tok/s | ★★ (英単語混入) | ★★ (範囲固定) | ★★ | ★★ | | gemma3:4b | 3.3GB | 41.1 tok/s | ★★★ | ★★★ | ★★★ | ★★★ | | phi4-mini:3.8b | 2.5GB | 32.8 tok/s | ★★★ | ★★★ | ★★★ | ★★ |

*smollm2は日本語会話・コーディングのみ完走(創作タイムアウト)

詳細

| タスク | qwen3:1.7b | smollm2:1.7b | llama3.2:3b | gemma3:4b | phi4-mini:3.8b | |--------|-----------|-------------|------------|----------|--------------| | 日本語会話 | 43.9 tok/s | 60.9 tok/s | 33.3 tok/s | 8.7 tok/s | 2.9 tok/s | | 論理推論 | 108.9 tok/s | 156.2 tok/s | 105.1 tok/s | 59.9 tok/s | 15.5 tok/s | | 創作・表現 | 108.4 tok/s | タイムアウト | 108.7 tok/s | 54.7 tok/s | 80.1 tok/s |

各モデルの特記事項

  • qwen3:1.7b: 速度・品質のバランスが最良。thinkingモデルだが /no_think で安定。87 tok/s は実用十分
  • smollm2:1.7b: 最速クラス(156 tok/s)だが日本語品質が壊滅的。日本語用途には不向き
  • llama3.2:3b: 日本語文に英単語が混入、コードのrange固定など品質に難あり
  • gemma3:4b: 品質は高いが日本語会話が8.7 tok/sと極端に遅い(初回ロード?要再テスト)
  • phi4-mini:3.8b: 全体的に遅い(平均32.8 tok/s)。RPi5では実用的でない
---

総合推薦(全テスト統合)

| 用途 | 推薦モデル | 理由 | |------|-----------|------| | 高速・実用バランス | qwen3:1.7b | 87 tok/s、品質十分、1.4GBと軽量 | | 品質重視 | gemma3:12b (削除済) | 全タスク安定、41 tok/s | | 速度のみ重視 | smollm2:1.7b | 150+ tok/s だが日本語品質× |

結論

100 tok/s クラスで日本語が実用的に使えるモデルは qwen3:1.7b が現時点のベストアンサー。 smollm2:1.7b は速度だけなら上回るが日本語品質が壊滅的で実用不可。 87 tok/s が RPi5 CPU推論での現実的な上限と思われる。

Quintとは?

Quint は、システムの「仕様」を実行可能なコードとして書き、バグがないかを自動検証してくれるツールです。 プログラムのバグを見つける方法といえば「テスト」が一般的ですが、テストは「思いついたケースしか確認できない」という限界があります。 Quintは「どんな状況でもこのルールが破れないか?」を自動で大量にシミュレーションしてくれます。

インストール

Node.jsが入っていればnpmで一発です。
npm install -g @informalsystems/quint

やってみた:銀行の送金システム

銀行でアリスとボブがお金を送り合うシステムを考えます。 「どんな送金を繰り返しても、お金の総量(200円)は変わらないはず」 これをQuintで書くとこうなります:
module bank {
  var alice: int
  var bob: int

action init = all { alice' = 100, bob' = 100 }

action aliceToBob = all { alice >= 10, alice' = alice - 10, bob' = bob + 10 }

action bobToAlice = all { bob >= 10, bob' = bob - 10, alice' = alice + 10 }

action step = any { aliceToBob, bobToAlice }

// 不変条件:お金の総量は常に200円 val totalIsConserved = alice + bob == 200 }

バグを仕込んで検出させる

bob' = bob + 10bob' = bob + 20(10円送ったのに20円増える)に変えてみます。
quint run bank.qnt --invariant=totalIsConserved
結果:
[State 0] { alice: 100, bob: 100 }
[State 1] { alice:  90, bob: 120 }

[violation] Found an issue

1回の送金で即バグ検出。 合計が200円→210円に増えていることを見つけてくれました。 バグを直して再実行すると、何万回試しても [ok] No violation found になります。

どんな用途に向いている?

分散システムやブロックチェーンのプロトコル設計に特に向いています。Solana・Cosmos・Matter Labs(ZKSync)など、バグが致命的になるシステムで実際に使われています。 「特定の順序でリクエストが来たときだけ起きるバグ」は手書きテストでは見つけにくいですが、Quintのような仕様検証ツールなら機械的に探せます。 オープンソース(Apache 2.0)なので、興味があればぜひ試してみてください。

RPi5上でAIエージェント(OpenClaw + Claude)を動かして、メールやMastodonの返信を自動生成させているのだが、「AIが勝手に送信する」のはさすがに怖い。というわけで「返信案を作る → Discordに通知 → 人間がOKしたら送信」という流れを整備した。

以前の構成(自動返信)

Gmailの未読メールをAIが読んで、返信文を考えて、そのまま送信する、という完全自動だった。5分ごとにcronが走っていた。 実際のところ、しばらく使ってみると「まあ大丈夫かな」という場面が多かったのだが、やはり何か間違えたときのリスクが気になる。

新しい構成(Human in the Loop)

[cron 30分ごと]
  ↓
未読メール/Mastodon新着をチェック
  ↓
AIが返信案を作成
  ↓
承認待ちファイルに保存(IDを発行)
  ↓
Discordに通知
  「📧 返信案があります [ID: a1b2c3d4]
   From: ○○さん
   件名: ○○について
   ---
   (返信文)
   ---
   → 送信OKなら「メール送信 a1b2c3d4」と言ってください」
  ↓
自分がDiscordで「メール送信 a1b2c3d4」と返信
  ↓
AIが実際に送信
Mastodonも同様で、返信案をDiscordに出してもらって、内容を確認してからOKを出す。

実装

承認待ちの管理は pending_approvals.json というファイルで。
[
  {
    "id": "a1b2c3d4",
    "type": "email",
    "draft": "お世話になっております...",
    "meta": {
      "thread_id": "xxxxx",
      "subject": "○○について",
      "from": "someone@example.com"
    },
    "created_at": "2026-03-12T22:00:00"
  }
]
pending_manager.py というスクリプトでIDの追加・一覧・削除ができる。cronジョブはこれを使って案を追加するだけで、実際の送信はDiscordでの指示を受けた後にメインのClaudeが実行する。

感想

「AIが勝手に動く」より「AIが案を出して人間が判断する」ほうが、精神的にも楽だし、実際の精度も上がる気がする。間違いを事前に止められるし、AIの文章のクセも学習できる。 完全自動化は夢だが、今のところはこの半自動スタイルがちょうどいい。

Claude Codeを自動化・非インタラクティブ環境で使う場合、通常のOAuthトークン(8〜12時間で失効)では不便です。 claude setup-token コマンドを使うと、約1年間有効な長期トークンを発行できます。

手順

1. 長期トークンを発行

claude setup-token
ブラウザでAnthropicにログインし、表示されたトークンをコピーします。

2. OpenClawに登録する場合

openclaw models auth paste-token --provider anthropic
コピーしたトークンをペーストすれば完了です。

通常トークンとの違い

  • 通常のOAuthトークン:8〜12時間で失効、自動リフレッシュあり
  • setup-tokenで発行したトークン:約1年間有効、リフレッシュ不要
サーバー上のBot・cronジョブ・CI環境など、長期間無人で動かしたい場合に便利です。

注意点

有効期限が切れた場合は、同じ手順でトークンを再発行してください。Anthropicは公式に有効期限を明記していませんが、内部的には約1年とされています。

最近、MacBook AirでDiscordに常駐させていたOpenClaw(AIエージェント)をRaspberry Pi 5に移行した。合わせてGmailの自動返信システムも整備したので、構成をまとめておく。

やったこと

1. OpenClawのDiscord接続をRPi5に移行

OpenClawはDiscord/Slack等のチャットに常駐するAIエージェントフレームワーク。もともとMacBookで動かしていたが、MacをスリープさせるたびにBotが落ちるのが不便だった。 RPi5(IP: Tailscale経由で接続)にOpenClawがすでに入っていたので、MacのOpenClaw設定からDiscordのBotトークンをコピーし、RPi側のOpenClawに設定。Mac側はDiscordを無効化して再起動することで、Bot接続をRPi5に完全移管した。

2. RPi5にgogcliをセットアップ

gogcliはGmail/Calendar/Drive等をCLIで操作できるGo製ツール。MacではHomebrewでインストールしていたが、RPi5(Debian Linux, arm64)にはHomebrewがないためソースからビルドした。

GoでCross-compile or RPi上でビルド

git clone https://github.com/steipete/gogcli cd gogcli go build -o ~/bin/gog ./cmd/gog
OAuth認証はヘッドレス環境のため工夫が必要だった。gog auth addを実行するとランダムポートでローカルサーバーを起動し、OAuth callbackを待つ。MacブラウザからアクセスできるようSSHポートフォワーディングを使い:
ssh -L :127.0.0.1: masaka@rpi5
Googleの認証後、認証コードを手動でトークンに交換してRPi側のキーリングに保存する方法を取った。 RPi5はヘッドレスでD-Busが動いていないため、gogのキーリングはファイルバックエンドを使用:
export GOG_KEYRING_BACKEND=file
export GOG_KEYRING_PASSWORD=

3. Gmail自動返信システムをRPi5で稼働

OpenClawのcronジョブ機能で5分ごとに未読メールをチェックし、AIが返信文を生成して自動送信するシステムを構築。 フロー: 1. gog gmail search "in:inbox is:unread" で未読メールを取得 2. メール本文を取得・要約・返信文生成 3. gog gmail send --reply-to-message-id で直接送信 4. gog gmail thread modify --remove=UNREAD で既読化 5. Discordに「返信済み」の報告 cronジョブはRPi5のOpenClaw上で動くため、Discordへの通知もRPi5が担当。Mac側のcronは無効化した。

構成まとめ

Discord
  ↕
RPi5 (OpenClaw)
  ├── Discord Bot(24時間稼働)
  ├── Cronジョブ: gmail-checker(5分おき)
  │     └── gog gmail → 未読検知 → AI返信生成 → 自動送信 → Discord報告
  └── ~/bin/gog(gogcli, ファイルキーリング認証)

MacBook Air ├── Discord: 無効 └── gmail-checker cron: 無効(RPiに移管済み)

ポイント

  • ヘッドレスLinuxでのOAuth:D-Busなし環境ではGOG_KEYRING_BACKEND=fileを使う
  • SSHポートフォワーディングでOAuth callback:RPiで起動したgog authのコールバックをMacブラウザで受け取る
  • OpenClawのcron機能:エージェントを定期実行するのに便利。--session isolatedでセッション分離できる
  • gog gmail send--reply-to-message-idで返信スレッドに乗せて送信できる
24時間稼働のAIメール自動返信が低コスト(RPi5の消費電力は数ワット)で実現できた。


下記設定を投入し経過観察中。

## GPU 安定化

### 問題
**Xid 79 "GPU has fallen off the bus"** — アイドル中(24W、42°C)でも発生。
PCIe x1 接続で ASPM L0s 省電力モードが原因で PCIe リンクが切断される。

### 適用した対策

1. **`/boot/firmware/cmdline.txt`**
   ```
   pcie_aspm=off nvidia.NVreg_EnableGpuFirmware=0
   ```

2. **`/etc/modprobe.d/nvidia-power.conf`**
   ```
   options nvidia NVreg_DynamicPowerManagement=0
   options nvidia NVreg_EnableGpuFirmware=0
   ```

3. **`/boot/firmware/config.txt`**
   ```
   dtparam=pciex1_gen=3
   ```
   (既存設定)

4. **`/etc/systemd/system/nvidia-pcie-fix.service`**
   - 起動時に sysfs で L0s/L1 ASPM を無効化
   - setpci でルートポートの ASPM も無効化

5. **`/etc/systemd/system/nvidia-persistence.service`**
   ```
   ExecStart=/usr/bin/nvidia-smi -pm 1
   ExecStart=/usr/bin/nvidia-smi -pl 150
   ```
   - 電力上限 150W (Min: 150W / Max: 180W のため 100W は不可)

Raspberry Pi 5(以下RPi5)にNVIDIA RTX 5060 Ti(Blackwellアーキテクチャ)をPCIe接続してNVIDIAドライバーをセットアップしました。最終的にはnvidia-smiが動いたので、ハマったポイントと解決の流れをまとめます。

---

やりたいこと

| やりたいこと | 方法 | |-------------|------| | とりあえずGPUを認識させたい | nvidia-smi で確認 | | LLM(Ollama)をGPUで動かしたい | ollama をインストールして ollama run gpt-oss:20b など | | CUDA動作確認 | CUDAツールキット13.0系(SBSA版)をインストールして nvcc --version | | Vulkanで動作確認(CUDAより簡単) | llama.cpp をVulkanビルドして実行 |

まずnvidia-smiが通るかどうかを確認しました。

---

最初のエラー

masaka@rp5:~ $ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
Make sure that the latest NVIDIA driver is installed and running.

ドライバーのユーザースペース部分はインストールされているけど、カーネルモジュールが正しくロードされていない状態でした。

---

トラブルシューティング手順

Step 1:現状診断

以下のコマンドで状態を確認しました。

uname -r
cat /etc/os-release | head -5
lspci | grep -i nvidia
lsmod | grep nvidia
sudo dmesg | grep -i nvidia | tail -20

よくある原因

❶ カーネルが16K(デフォルト)のまま

RPi OSのデフォルトは16Kページカーネルですが、mariobalanicaのパッチは4Kカーネルでしか動きません

uname -r

→ 6.x.x-v8 なら4K(OK)、16k が付いていたら要変更

修正:

sudo nano /boot/firmware/config.txt

末尾に追記

kernel=kernel8.img sudo reboot

❷ カーネルモジュールが未インストール or ビルド失敗 lsmod | grep nvidia で何も出ない場合はモジュールが未インストール。mariobalanicaのパッチ済みモジュールをビルドします。
sudo apt install -y build-essential linux-headers-$(uname -r) git

git clone --branch non-coherent-arm-fixes \ https://github.com/mariobalanica/open-gpu-kernel-modules.git ~/open-gpu-kernel-modules

cd ~/open-gpu-kernel-modules make modules -j$(nproc) sudo make modules_install -j$(nproc) sudo depmod -a sudo reboot

❸ Proprietaryドライバーが入っている(RTX 5060 TiにはNG)

RTX 5060 Ti(Blackwellアーキテクチャ)は必ずOpenドライバーが必要です。

dpkg -l | grep nvidia
sudo apt purge '^nvidia-.*'
sudo apt autoremove
❹ ドライバーバージョンとカーネルモジュールのバージョン不一致 .runでインストールしたユーザースペース側とカーネルモジュール側が同じバージョンでないと通信エラーになります。
cat /proc/driver/nvidia/version 2>/dev/null
modinfo nvidia 2>/dev/null | grep ^version

---

解決:nvidia-smiが正常動作

上記の手順(基本的にガイド通り)を踏んで再起動したところ、nvidia-smiが通りました。

masaka@rp5:~ $ nvidia-smi
Sun Mar  8 19:05:09 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 5060 Ti     Off |   00000001:01:00.0 Off |                  N/A |
|  0%   28C    P8              9W /  180W |       1MiB /  16311MiB |      0%      Default |
+-----------------------------------------+------------------------+----------------------+

| 項目 | 結果 | |------|------| | GPU | NVIDIA GeForce RTX 5060 Ti | | ドライバー | 580.95.05(Open GPUカーネルモジュール) | | CUDA | 13.0 | | VRAM | 約16GB | | 温度 | 28°C(アイドル) | | 消費電力 | 9W / 180W(アイドル) |

---

次のステップ

  • Ollamaインストールして ollama run gpt-oss:20b でLLM推論
  • CUDAツールキット13.0系(SBSA版)インストールして nvcc --version 確認
  • llama.cppをVulkanビルドして動作確認

以下、今回購入したものです。これ以外に作業用のUSBケーブルやHDMIモニタが必要だけどこれだけあればできます

※ラズパイOSのフラッシュメモリへの書き込みは自分でやる必要があります。

このページのトップヘ