症状
先日、ある問題が起きた。とりあえずClaudeに相談した。
エッジデバイスで機械学習モデルを推論したときに、出力がおかしいという問題が発生した。
最初はエッジデバイスの問題かと思った。
切り分けのために、エッジデバイスを使わずに、直接推論した。結果、同じ出力だった。
PCでの推論は量子化なしのonnxモデルを使用。
エッジデバイスはonnxを量子化して、そのエッジデバイス専用の形式に変換したものを使用。
出力が同じなら、エッジデバイスが壊れているわけではない。
つまり、エッジデバイスについては考えなくていい。
原因はまだ分からない。けど、とりあえずエッジデバイスは除外できるよね、という話。
期待した返答は肯定だった。
「その通りです。エッジデバイスは除外できます。次の調査に進みましょう。」
しかし、Claudeの返答はこれ(一部抜粋)。
この推論は概ね妥当です。
**ただし「エッジデバイスのことは考えなくていい」は少し言い過ぎかもしれません**
理由は、この比較でわかったのは「量子化・変換・実機が原因ではない」ということだけで、原因が**両方のパスに共通する部分**にあることまでしかわかっていないからです。共通部分としては、たとえば以下が候補として残ります。
- 前処理(リサイズ方法、正規化、色チャンネル順序 RGB/BGR、入力テンソルのshapeなど)
- 後処理(ラベルマッピング、argmaxの取り方、閾値処理など)
- 入力データ自体(テスト画像やサンプルが想定と違う)
- 元モデル(PyTorch/TensorFlow等)からONNXへのエクスポート時の問題(オペレータの非対応、動的shapeの扱いミスなど)
???
何がおかしいか分かります?
「エッジデバイスのことは考えなくていい」は少し言い過ぎ
Claudeは「エッジデバイスについては考えなくていい」という結論を否定している。
つまり、「エッジデバイスはまだ疑うべきだ」と言っていることになる。
その理由を見てみよう。
原因が**両方のパスに共通する部分**にあることまでしかわかっていないから
原因が両方に共通する部分にある。例えば、前処理、後処理、入力データなど。
……それってつまり、「原因はエッジデバイスではない」と言ってる!
自己矛盾だ。
極端に単純化すると、
エッジデバイスが原因かもしれない
なぜなら、エッジデバイスが原因ではないから
と言っているのと同じだ。
他のLLMだとどうなる?
この奇妙な返答には悩まされた。
「なんでこんな無茶苦茶なことになったんだ?Claudeの性能が悪い?」
他のLLMでも試してみた。(出力は一部だけ取り出している)
Gemini
「エッジデバイスの故障や、そこへの変換処理自体が原因ではない」という切り分けができたのは大きな前進ですね!
ただ、**「エッジデバイス(およびその周辺の処理)について完全に考えなくていいか」というと、実はまだ油断できない盲点**がいくつか隠れています。
「PC(FP32/量子化なし)」と「エッジ(量子化あり)」の出力が**同じようにバグっている**ということは、原因は以下の2つのどちらかに絞られます。
1. **PCとエッジで「共通している部分」に原因がある(学習コード、前処理、後処理など)**
2. **PCとエッジで「別々の原因」があり、たまたま同じような異常出力になっている**
同じだ!
「まだ油断できない盲点」が隠れていると言う。
ひとつ目の「盲点」はClaudeと全く同じ。つまり、自己矛盾。
ふたつ目も苦しい。
PCとエッジで「別々の原因」があり、たまたま同じような異常出力になっている
これは例えるならこう。
AさんとBさんが同じレストランで食事をしました。
数時間後、2人とも激しい下痢になりました。
このとき、
「実はAさんは朝食で腐った牛乳を飲んでいた。一方、Bさんはノロウイルスに感染していた。そして、たまたま同じ日に下痢になっただけ」
と言っているようなもの。
ありえなくはない。
でも、「同じレストランでの食事」を疑うほうが、ずっと自然だ。
ChatGPT
はい、その切り分けから言えることは概ねそのとおりです。
一方で、「エッジデバイスについては考えなくていい」と断言するのは少し強すぎます。
ChatGPTも否定してきた。
ただし、理由は書かれていなかった。
聞いてみよう。
『「エッジデバイスについては考えなくていい」と断言するのは少し強すぎます。』
それはなぜ?
すると、返ってきたのがこれ。
「エッジデバイスについては考えなくていい」と言い切ると、
* 入力データがPCと完全に同じか
* 前処理・後処理がPCと完全に同じ実装か
* エッジデバイスへのモデル変換で意図しない変更が起きていないか
といった点まで不要だと受け取られる可能性があります。
ようするに、こう言っている。
エッジデバイス以外の共通部分を調べる必要がある
つまり、「エッジデバイスについては考えなくていい」ということだ。
反論しているようで、実際には肯定している。
なんということだ。
Claudeが特別悪いわけじゃなかった。
同じ罠に、GeminiもChatGPTも、そしておそらく全てのLLMが落ちる。
解決策
たった一文だけ追加する。
(問題の説明)
つまり、エッジデバイスについては考えなくていい。
他に考えるべき原因は?
すると、Claudeの回答はこう変わった。
推論結果が「PC上の非量子化ONNX」と「エッジデバイス上の量子化・専用形式変換モデル」で一致しているという切り分けは非常に良いですね。
これにより「量子化」「専用形式への変換」「エッジデバイスのハードウェア/ドライバ」が原因である可能性は排除できます。
つまり、両者に共通する部分にバグがあると考えられます。
いい感じだ。
ちゃんと「エッジデバイスについては考えなくていい」という前提を受け入れている。
その上で次に考えるべき原因を挙げている。
つまり、意図をハッキリ伝えるべきということだ。
最初のプロンプトは、「何をしてほしいのか」書いていなかった。
頭の中ではこう考えていた。
よし、エッジデバイスは候補から消せた。
原因候補を考えてもらおう。もちろん、エッジデバイス以外で。
それをプロンプトにも書くべきだったわけだ。
他のLLMでも効果はある?
Gemini
Geminiでも試してみた。
エッジデバイスとPC(量子化なしONNX)でまったく同じ「おかしい出力」が出たということは、ご指摘の通りエッジデバイスのハードウェアや、そこへの変換(量子化など)が原因である可能性は極めて低いです。素晴らしい切り分けです。
この場合、原因は「モデルそのもの」か「モデルに入力する前後の処理(データ)」のどちらかに絞られます。
これもいい感じだ。
「素晴らしい切り分け」とまで言っている。
最後にChatGPT。
ChatGPT
その切り分けから言えることは、
* **エッジデバイス固有の実装やハードウェアが原因である可能性はかなり低い**
* **モデル自体、または推論までの共通部分に原因がある可能性が高い**
ということです。
ただし、「エッジデバイスについては完全に考えなくていい」とまでは断言できません。PCとエッジで**同じ入力・同じ前処理・同じモデル**で本当に同じ結果になっていることが前提です。
ChatGPT??
ChatGPTだけまだおかしなことを言っている。
「他に考えるべき原因は?」だけでは、まだ意図が曖昧だったみたい。
もっとハッキリ書いてみよう。
(問題の説明)
つまり、エッジデバイスについては考えなくていい。
エッジデバイスが原因じゃないことは分かったから、それ以外の中から原因を考えて。
ChatGPT
その切り分けで分かったことはかなり大きいです。
「量子化・エッジデバイス固有の実装」が原因である可能性はかなり低いので、原因はPC側と共通の部分にあります。
やっと直った。
結論
今回の原因は、LLMの推論能力が低かったからではない。
私の意図が伝わっていなかった。
頭の中では、
エッジデバイスは除外できた。
次は、それ以外の原因を考えて。
と思っていた。
でも、それをプロンプトには書いていなかった。
たった一文、
他に考えるべき原因は?
を追加しただけで、LLMが意図どおりに答えてくれた(ChatGPTは除く)。
たった一文で、回答がガラッと変わることもある。
LLMへの指示はハッキリ書こう!