Rockchip の公式ツールキット rknn-llm で Qwen2-VL-2B-Instruct を RK ボード向けに変換しています。第一歩は、リポジトリ同梱のマルチモーダル demo スクリプトで Vision 塔を ONNX にエクスポートすること。ところがこれが動きませんでした。自分のコードではなく、公式スクリプトが、同じリポジトリの新しいスクリプトが前提とする世代の transformers で落ちます。
バージョンごとに追った結果がこちらです。
| transformers | 結果 |
|---|---|
| 5.8.0 |
AttributeError — エクスポートスクリプトは model.visual を読むが、5.x では model.model.visual に移動済み |
| 4.57.0 |
TypeError — VisionAttention が position_embeddings を無条件にアンパックするが、スクリプトの呼び方では None が返る |
| 4.54.x | 同じく不可 — position_embeddings が None のとき rotary_pos_emb から導出する互換処理が、この世代で削除済み |
| 4.51.3 |
動作 — ソース確認で self.visual と互換処理の両方が存在 |
つまりエクスポートスクリプトは 4.54 より前の契約で書かれていて、量子化スクリプトの方は 5.x のモジュール構成(model.model.language_model)でもう書かれている。同じリポジトリで半分新しく、半分古い。どちらの半分がどの transformers を欲しがるかは、どこにも書かれていません。結局、Vision エクスポート用に 4.51.3(+ torch 2.6.0)、量子化の埋め込み生成用に 5.8.0 と、二つの環境を並行して使う形になりました。
切り分けで守ったルールは二つです。
-
上流スクリプトにパッチを当てない、モデルにモンキーパッチをしない。
.visualのエイリアスを仕掛ける方法も最初に試しましたが、属性エラーは通っても注意機構の契約で結局落ちました。仮に「動いて」も、埋め込みの流れを変える細工はサイレントに誤った埋め込みを生み、後続のベンチマーク全体を汚染しかねません。バージョン固定だけで解きました。 - 雰囲気ではなくソースで確認する。 4.51.3 という答えは、各世代の transformers ソースを読んで二つの条件を確認し、実際のエクスポートで検証して出したものです。
結果、Vision 塔はきれいにエクスポートできました。ONNX グラフ 53MB+重み 2,661,085,184 バイト、onnx.checker 通過です。
次は量子化と RKLLM エクスポート、そして本題のボード実測(Vision エンコードの per-call 時間、prefill/decode の tokens/s)と、中国語の看板・OCR 系を含む 24 問の品質チェックです。