超小型なVLM、Moondreamを試す(基礎編)
マルチタスクなVLM、Moondreamを試す
超小型なのにしっかりと画像認識ができるMoondreamというモデルを試してみました。
基礎編ではMoondreamの速度や性能の確認、応用編では画像検索への応用を試してみます。
Moondreamとは
パラメータサイズが0.5B, 1.9Bという超小型なVLM(Vision-Language Model)です。
一つのモデルで以下4つのタスクに対応しています。
- キャプション生成(画像の説明)
- 画像への質問-回答(VQA)
- 物体抽出
- ポイント(クリック位置の指示)
以下の図は別のモデル(SmolVLM)の記事ものですが、最もパラメータ小さいところにあるのがわかります。
画像に対応したモデルでここまで小型かつ汎用的なものは少なく、なかなかに注目なモデルかと思っています。
まだまだ活発に開発中のようなので現時点でできるものを見ていきます。
(特にインターフェイス周りはいろいろ変わりそう。GPU対応とかも)
セットアップ
今回はGoogle ColaboratoryかつGPUなしで動かすことを前提に記載していきます。
後ほど速度も計測しますが、GPUなら一瞬、CPUでも割と現実的な範囲の時間で応答してくれます。
セットアップ方法は大きく2つあります
- moondreamモジュールもしくはソースコードから導入
- transformers+HuggingFaceを利用
今回は公式のサンプルに倣ってtransformersを使わない方式で導入してみますが、いくつか注意点があるのでまとめます。(GPUを利用したい場合は現段階ではtransformersからの導入が楽です。)
モデルのダウンロード
まず利用するモデルを手元にダウンロードしておきます。
こちらで4つのモデルが公開されています。
今回は0.5Bでint8のモデルを利用してみます。ほかのモデルも同様の手順で利用可能です。
ここからどうぞ:
Colab上からは
!wget -O moondream-0_5b-int8.mf.gz https://huggingface.co/vikhyatk/moondream2/resolve/9dddae84d54db4ac56fe37817aeaeb502ed083e2/moondream-0_5b-int8.mf.gz?download=true
!gunzip moondream-0_5b-int8.mf.gz
モジュールインストール
moondreamモジュールをインストールします。
!pip install moondream
とやればインストールはできるのですが、注意点あり。
現在のmoondreamではtransfromersの少し古いバージョンがインストールされるようです。
そのためColaboratory上でインストールすると、もともとインストールされているものが古くなり、他にtransformersなどを使ったコードがある場合、影響が出る可能性があります。
実際に記事の(応用編)で他のモデルと併用しようとした場合に動かしたかったモデルが動かなくなったりもしました。
そこで、今回はソースコードから必要な部分だけインストールしてバージョン問題を回避します。
!pip install onnxruntime
!git clone https://github.com/vikhyat/moondream.git
!(cd moondream/clients/python && pip install .)
(わりと小手先の回避なので、プロダクトへの利用などではご注意ください。。。)
動作検証
基本動作
サンプル画像を用意して、動作を確認します。
コードはほぼ公式通り
import moondrem as md
from PIL import Image
image = Image.open("sample.png")
model = md.vl(model="moondream-0_5b-int8.mf")
# 画像のエンコード
encoded_image = model.encode_image(image)
# 解析実行部分
caption = model.caption(encoded_image)["caption"]
print("Caption:", caption)
出力:
A vibrant yellow rubber duck is sitting on a blue surface, possibly water. The duck has a cheerful expression with a big, friendly smile. The background is a soft pink color with a subtle speckled pattern. The image is framed by a thin, dark-colored border.
日本語訳 by DeepL:
鮮やかな黄色のゴム製アヒルが青い水面(おそらく水)に座っている。アヒルの表情は明るく、人懐っこい満面の笑み。背景は柔らかいピンク色で、微妙な斑点模様があります。画像は細い濃い色の縁取りで縁取られている。
キャプション生成を動かしたところ、大体30秒程度で応答がありました。
処理は大きく2段階あり、画像をエンコードする部分とLLMが応答する部分です。
それぞれの実行時間を計測したところ、
経過時間 | |
---|---|
エンコード | 17.18秒 |
解析部分 | 10.97秒 |
新しい画像をどんどん処理する場合はこの2つの合計の時間が必要ですが、一つの画像に対して多くの質問を投げる場合などはエンコード済みの画像をキャッシュしておけばエンコードの時間は省略できそうです。
画像サイズと速度比較
画像のサイズによりどの程度のエンコード時間が変化するかを計測します。
同じ画像をサイズを変えながらエンコードした結果がこちら。
画像サイズ | エンコード時間 |
---|---|
1024px | 44.04秒 |
512px | 21.59秒 |
256px | 18.45秒 |
画像サイズに大きく依存してそうです。512px程度まで圧縮してモデルに渡すのが良さそうですね。
レスポンス量と速度比較
captionにしてもqueryにしても、出力される文字量によって速度は大きく変化します。
ワンフレーズで応答させるとかなり高速ですね。
Q. Explain this location and situation.(この場所と状況を説明せよ)
A. The image depicts a serene scene of a white swan gracefully floating on a calm body of water. The sun is setting, casting a warm glow that illuminates the water and the surrounding area. The sky is painted in hues of orange and pink, adding to the tranquil atmosphere. The swan is positioned towards the right side of the image, with the sun's reflection visible on the water's surface. The background features a mix of trees and bushes, with some branches appearing bare, possibly indicating the transition from the day to night. The water appears calm and undisturbed, contributing to the peaceful ambiance of the scene.
穏やかな水面に優雅に浮かぶ白鳥の穏やかな情景が描かれている。沈みゆく太陽が水面と周囲を暖かく照らしている。空はオレンジとピンクで彩られ、静謐な雰囲気をさらに高めている。白鳥は画像の右側に位置し、水面に太陽の反射が見える。背景には木々や茂みが混在し、いくつかの枝は裸のように見えるが、これは昼から夜への移り変わりを示しているのだろう。水面は穏やかで、乱れもなく、平和な雰囲気を醸し出している。
28.237秒
Q. What kind of animal is this?(これはどんな動物ですか?)
A. The image features a swan, which is a large and elegant bird.
白鳥は大きくて優雅な鳥である。
3.525秒
Q. How many birds?(何羽?)
A. 1
0.611秒
まとめ
今回はキャプション生成とVQAを見ていますが、これに加え物体検出やポイントの指示もできるのは驚きです。このモデルと同等以下のサイズのモデルで物体検出だけができるモデルは色々ありそうですが、VQAができるものはほとんどないんじゃないかと思います。
このようなローカルやモバイルデバイスで動かすことを想定した小型のモデルはどんどん発展&応用されていくと思いますので注目したいですね。
次の応用編ではVQAを応用した検索というのを試してみます。
Discussion