Intel iGPU で Florence-2 を動かしてみた (第1回 : Windows環境構築とIntel最適化編)
0. はじめに
2024年7月に、MicrosoftがFlorence-2を公開しました。
ざっくりの解説は、こちらをご覧ください。
その存在を知った時は、いろんな意味で衝撃だったのですが、画像アノテーション案件において、セグメンテーションの作業効率を上げるために、こんな使い方をしたいと思いました。
Florence-2 に text prompt を与えて特定の物体を検出させ、矩形の座標を得る。(バッチ処理)
Segment Anything Model 2 (SAM2) に box prompt を与えて物体領域を検出させ、mask情報を得る。(バッチ処理)
対象画像とmask情報をFastLabelに読み込み、自動アノテーションされた状態を用意する。(バッチ処理)
FastLabelで、セグメンテーションの修正作業を行なう。(アノテーターによる逐次作業)
2.の部分が、これまで4回に分けて紹介したお話です。(バッチ処理のところは、未着手だけど。)
というわけで、これから3回に分けて、1.のお話をしたいと思います。
1. 前提条件
SAM2用に構築した環境に、Florence-2に必要なものを追加しました。
ここでいうSAM2用とは、これのこと。
なので、SAM2には必要だけど、Florence-2には不要なものも含まれているはずですが、ご容赦を。
そして、こんな環境です。
Windows 10 もしくは Windows 11 (注: WSL2は意義も含め未検証です)
Intel CPU (注: AMDでは稼働しません!)
Intel GPU (注: AMDやNVIDIAでは稼働しません!)
MinicondaのPython (注: pipは使いません!)
OpenVINO
VS Code
SAM2に必要だった各種ライブラリ
Florence-2に必要な各種ライブラリ (これから説明します!)
2. 各種ライブラリのインストール
SAM2用の環境で、しこたまインストール済みなので、追加分はこれだけでした。
ちなみに、py312_ovはMinicondaで作った仮想環境名なので、ご自身の仮想環境名と置き換えて解釈してください。
(py312_ov) > conda install conda-forge::transformers
(py312_ov) > conda install conda-forge::timm
(py312_ov) > conda install conda-forge::einops
3. サンプルコードの説明
3.1) 概要
SAM2と同じ流れなんですが、ざっと、こんな感じです。
Florence-2の学習済みモデルをダウンロードする。
OpenVINO IR形式に変換する。
3.2) OpenVINO提供のユーティリティ
要になる処理をユーティリティとして提供してくれているので、それをダウンロードします。
import requests
from pathlib import Path
if not Path("ov_florence2_helper.py").exists():
r = requests.get(
url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/florence2/ov_florence2_helper.py"
)
open("ov_florence2_helper.py", "w").write(r.text)
if not Path("notebook_utils.py").exists():
r = requests.get(
url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py"
)
open("notebook_utils.py", "w").write(r.text)
もしかしたら、ov_florence2_helper.pyのダウンロードに失敗するかもしれません。
画面出力用の絵文字が多用されていて、私の環境では「あんたの文字コードに適合してない」みたいなエラーが出ました。
同じ症状に遭遇したら、URLをクリックしてブラウザで開き、そこから保存してください。
3.3) OpenVINO IRの保存場所とモデルの選択
こんな階層にしました。
現フォルダ
model
Florence-2
Florence-2-base
Florence-2-large
Florence-2-base-ft
Florence-2-large-ft
Florence-2はパラメータ数に応じて2種類の学習済みモデルがあり、かつ、それぞれにFLD-5Bという巨大なデータセットで事前学習したモデルと、それを下流タスク用にファインチューニングしたモデルがあるため、全部で4種類あります。
通常用途であれば、ファインチューニング版の方が良いのではないでしょうか。
ちなみに、私のPCでは、baseとbase-ftしか動きませんでした。
# model_name = "Florence-2-base" # Pretrained model with FLD-5B
# model_name = "Florence-2-large" # Pretrained model with FLD-5B
model_name = "Florence-2-base-ft" # Finetuned model on a collection of downstream tasks
# model_name = "Florence-2-large-ft" # Finetuned model on a collection of downstream tasks
model_id = "microsoft/" + model_name # ov_florence2_helper.pyが想定している値なので変えない
model_path = Path("model") # modelの保存場所
model_path.mkdir(exist_ok=True)
model_path = model_path / "Florence-2" # Florence-2の各modelの保存場所
model_path.mkdir(exist_ok=True)
model_path = model_path / model_name # 選択したmodelの保存場所
model_path.mkdir(exist_ok=True)
3.4) モデルのダウンロードと OpenVINO IR への変換
SAM2用と異なり、ユーティリティが優れているというか、たった2行で終わってしまいます。
from ov_florence2_helper import convert_florence2
convert_florence2(model_id, model_path)
で、私のPCでは、largeとlarge-ftは変換時にエラーが出て、途中で放棄されてしまいました。原因不明です。
4. 成果物
無事に変換が終わると、前述したmodelフォルダの下に、主に以下の10ファイルができています。(SAM2用と違って、他にもごちゃごちゃ出来てました。)
decoder.xml
decoder.bin
decoder_with_past.xml
decoder_with_past.bin
encoder.xml
encoder.bin
image_embedding.xml
image_embedding.bin
text_embedding.xml
text_embedding.bin
XMLファイルには、モデルの構成のようなものが記述されています。
BINファイルには、パラメータをバイナリ形式にしたものが保存されています。
ちなみに、デフォルトだとパラメータはFP32(32bit浮動小数点)からFP16(16bit浮動小数点)に精度が落とされています。
この辺りの話は、SAM2用の環境構築で書いた話と同じです。
5. 次回は
今回の説明で変換したOpenVINO IR形式のモデルを使って、実際に物体検出をしてみましょう。