インテル® Gaudi® 2 アクセラレーターで CLIP を使いこなすための究極ガイド

https://www.intel.com/content/www/us/en/developer/articles/technical/ultimate-guide-to-using-clip-with-intel-gaudi2.html

このページは、roboflow.com に掲載されたブログ記事をもとにしています。
https://blog.roboflow.com/openai-clip/

事前学習言語画像モデルである Contrastive Language Image Pretraining (CLIP) アーキテクチャーは、現在のコンピューター・ビジョンの基盤です。CLIP アーキテクチャーによって埋め込みモデルの学習処理を実行すれば、画像や映像の分類、検索拡張生成 (RAG)、画像類似度演算などに適用できます。
https://blog.roboflow.com/openai-clip/
https://blog.roboflow.com/what-is-retrieval-augmented-generation

OpenAI が発表した CLIP アーキテクチャーには、大規模データセットで修正が加えられた複数の公開チェックポイントがあります。最初の CLIP モデルは OpenAI がリリースしたものですが、その後、Apple や Meta AI をはじめ、多くの企業が独自の CLIP モデルに学習処理を行いました。ただし、いずれのモデルも特定用途にチューニングされているわけではなく、汎用ユースケースを目的に学習処理されています。

インテル® Gaudi® 2 アクセラレーターは、Hugging Face Transformers と組み合わせたり、アクセラレーター内蔵の最適化機能によって、プロジェクション層の学習処理をカスタムの CLIP モデル用に実行できます。この CLIP モデルを、該当のデータセットに紐づけられている特定ドメインに関連するコンセプトを理解させるようにエンコードすることも可能です。

このページでは、インテル® Gaudi® 2 アクセラレーターを使用して CLIP のプロジェクション層をトレーニングする方法と、モデルを準備して実装するまでの手順を説明します。また、このページで構築したモデルの学習処理や推論にかかる時間もお伝えしますので、ユーザーの皆さんには学習と実装にどの程度のパフォーマンスを期待できるのか検討していただけます。

余計な説明は省いて、とにかく始めてみましょう。

CLIP とは？
Contrastive Language Image Pretraining (CLIP) は、OpenAI が開発したマルチモーダルのビジョン・モデル・アーキテクチャーで、埋め込み画像 / テキストの算出に使用できます。CLIP モデルは画像とテキストのペアで学習処理を行い、これらのペアを埋め込みモデルの学習処理に用いて、画像コンテンツ間の関連性を、画像と関連付けられたテキスト・キャプションを参照しながら学習します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/23d580ed-978f-4b19-8e73-226283221366.png)

出典: OpenAI
https://openai.com/research/clip?ref=blog.roboflow.com

CLIP モデルは企業向けアプリケーションの大半に適応可能です。例えば、次のような用途が考えられます。
　• 工場の部品組立ラインでの画像分類
　• メディアアーカイブの動画分類
　• 画像コンテンツの大規模なリアルタイム・モデレーション
　• 大規模モデル学習処理前の画像重複排除
　• その他、多種多様な用途

ハードウェアによっては CLIP モデルを数 FPS で処理できます。インテル® Gaudi® 2 アクセラレーターなど AI 開発用に設計されたハードウェアは、CLIP モデルの実行に最適です。例えばインテル® Gaudi® 2 アクセラレーター 1 基では、20 分間に 66,211 CLIP ベクトル演算を処理することができました。このスピードはリアルタイム・アプリケーションの多くに十分対応でき、チップ数を追加すれば、さらにパフォーマンスを高めることができます。

OpenAI が公開しているチェックポイントなど、すぐに実装可能な CLIP モデルの場合、大半のインスタンスで良好な結果が得られるものの、特定用途や企業の機密データを必要とする独自のユースケースには当てはまりません。このような用途では、カスタムの CLIP モデルの学習処理が有効です。

＜インテル® Gaudi® 2 アクセラレーターを使用した CLIP モデルの学習方法＞
カスタムの CLIP モデルは、ユースケースの機能に応じて画像を分類する専用データセットで学習処理を行います。例えば、学習処理したモデルの用途としては、在庫のある製造部品の分類、製品の欠陥検出、ランドマークの識別などが挙げられ、すべてのユースケースで適切なデータセットを入手できることが前提条件となります。

CLIP モデルの学習には、以下の用意が必要です。
　1. 画像データセット
　2. 各画像の内容を説明した詳細なキャプション

キャプションは数センテンスの長さのもので、各画像に何が描かれているかを明確に記述している必要があります。

CLIP モデルの学習方法の 1 つは、CLIP のような vision-language モデルの学習処理をサポートしている Hugging Face Transformers を使用することです。Hugging Face Transformers はインテルとのパートナーシップを通じ、Optimum Habana Transformers の拡張機能によってインテル® Gaudi® 2 アクセラレーター上での学習 / 推論パフォーマンスを加速させます。このページの例では Transformers ライブラリーと Optimum Habana Transformers を活用し、COCO データセットによってモデルの学習処理を実行します。

【ステップ 1: Optimum Habana 学習スクリプトをダウンロードして、依存関係をインストールする】
インテル® Gaudi® アクセラレーターを使用して CLIP を開始するには、まず Optimum Habana GitHub リポジトリーから必要なスクリプトをダウンロードします。
https://github.com/huggingface/optimum-habana/blob/main/examples/contrastive-image-text/?ref=blog.roboflow.com

Optimum Habana GitHub リポジトリーのクローンを作成して、Optimum Habana ライブラリーをインストールしてください。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/66ab0798-02d0-4c97-84a5-23b1bf712f6a.png)

次に、examples/contrastive-image-text フォルダーに移動します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/7af323af-90b6-4aa2-baed-77e20d2f922b.png)

このフォルダーには、ここで使用するすべての学習スクリプトが含まれており、以降のステップでの作業ディレクトリーとなります。
次に、プロジェクトの依存関係をインストールします。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/a3a89b08-1295-4eb3-945c-cfbf9ae17940.png)

モデルの学習に使用する Hugging Face Transformers ライブラリーも同様にインストールしてください。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/55e232fb-9cd8-4e56-97cf-88e0920dfe93.png)

【ステップ 2: データセットをダウンロードして設定する】
CLIP モデルの学習には、画像データセットと各画像に対応するキャプションが必要です。キャプションには、画像に何が描かれているかをモデルが理解できる十分な情報が記述されていなければなりません。

ここでは COCO データセットを用いて CLIP モデルの学習処理を実行します。このデータセットには 10 万を超える画像のビジュアル・キャプションが含まれています。
https://cocodataset.org/?ref=blog.roboflow.com#home

Hugging Face チームは、AI 学習処理向けに設計されたインテル® Gaudi® 2 アクセラレーターを使用して CLIP モデルをトレーニングするスクリプトを用意しました。このスクリプトは COCO json フォーマットのデータセットを取り込み、CLIP モデルの学習処理を実行します。ここではデフォルトの COCO データセットを使用しますが、どの画像セットでも、COCO json フォーマットの json ファイルで指定されていれば、CLIP モデルの学習に使用可能です。COCO json フォーマットについての詳細は、Microsoft COCO データセットのページを参照してください。
https://cocodataset.org/?ref=blog.roboflow.com#format-data

データセット内の画像には、以下のとおり COCO json フォーマットの機能が必要です。
["image_id"、"caption_id"、"caption"、"height"、"width"、"file_name"、"coco_url"、"image_path"、"id"]

必要なサブセットには、train、test、valid のデータセットが含まれます。

CLIP データセットを作業ディレクトリー内のサブディレクトリーにあるインテル® Gaudi® 2 アクセラレーターにダウンロードしてください (optimum-habana/examples/contrastive-image-text)。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/afb96486-23d3-43bf-90d7-3245e910b550.png)

データセットのダウンロードが完了すると、CLIP モデルの学習処理を開始できます。

【ステップ 3: model_stub.py を作成する】
Hugging Face スクリプトでは、事前学習済みのテキスト & ビジョン用エンコーダーを使用して、CLIP のような vision-text デュアル・エンコーダーをトレーニングします。モデルのプロジェクション層をトレーニングする前に、まずはデュアル・エンコーダーで必要な重みとモデル設定をダウンロードします。そのため、model_stub.py と呼ばれる Python ファイルを新たに 1 つ作成して、以下のコードを追加してください。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/2fdb6033-52fe-4053-9c07-be9a889de5a4.png)

このコードを実行すると、CLIP モデルが読み込まれ、clip-roberta サブディレクトリーに事前学習済みの vision-text エンコーダーが保存されます。次に、roberta-base tokenizer (テキストをトークンに変換) と対応するキャプションによってプロジェクション層をチューニングします。以下のとおり model_stub.py コードを実行し、事前学習済みのモデルをダウンロード / 保存してください。

【ステップ 4: モデルをトレーニングする】
事前学習済みモデルが準備できたところで、以下のコマンドいずれかによって単一 HPU または複数 HPU 上でモデルの学習処理を実行します。

単一 HPU でのトレーニング
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/e905d74b-16aa-48e3-9ba4-5fe3aae9f13b.png)

複数 HPU でのトレーニング
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/d52758fc-ccfe-4bcc-95a2-eaf8c63ca8e0.png)

＜インテル® Gaudi® 2 アクセラレーター CLIP 学習ベンチマーク＞
インテル® Gaudi® 2 アクセラレーターに実装する CLIP 学習処理のパフォーマンスを評価するために、COCO データセットを使用して学習ジョブを単一 HPU で実行しました。学習ジョブの開始から完了までにかかった時間を time コマンドで記録しています。このトレーニング時間にデータセットの初期化は含まれますが、COCO データセットはトレーニング開始前にダウンロード済みのため、データのダウンロードにかかる時間は含まれません。

COCO データセット全体と 3 エポックに及ぶモデルの学習処理に 15 分 1 秒かかりました。ここでは CLIP モデルをゼロからトレーニングしているわけではありません。正確に言うと、プロジェクション層をカスタムのデータセットで「チューニング」し、CLIP モデルが新データをもとに新しい概念を「学習」できるようにしています。

＜インテル® Gaudi® 2 アクセラレーターへの CLIP の実装方法＞
このセクションでは、ここまで事前学習したモデルを使用して、インテル® Gaudi® 2 アクセラレーターでの推論をサポートしている CLIP のようなモデルを実装する方法を説明します。

ステップ 1: CLIP 推論スクリプトを記述する
インテル® Gaudi® 2 アクセラレーターでの推論用にチューニングした CLIP モデルの実装を開始するには、このモデルで CLIP ベクトル演算を処理する推論スクリプトが必要です。

このスクリプトは、ゼロショット画像分類、動画分類、データセットの重複排除、画像検索など、幅広いユースケースに調整できます。これらのユースケースの一部は「本番稼働用にモデルを準備する」のセクションで簡単に触れており、すでに Roboflow によって記述されたコードの参照先が提供されていますが、

ひとまずここでは、このモデルを使用し CLIP でベクトル演算を実行するスクリプトを作成してください。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/6d2e2086-5196-450d-ac10-c66d3ea1c98e.png)

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/675f0a2a-b7d5-4674-b875-745c63786a76.png)

これはテキストと画像の埋め込みを演算処理する機能を定義するコードです。また、image.jpeg と呼ばれる画像の埋め込みを演算処理して、結果をコンソールに出力します。

コードを実行すると、モデルの演算処理が問題なく完了したことが示され、CLIP 埋め込みが返されます。

ステップ 2: 本番稼働用にモデルを準備する
これでモデルの設定が完了しました。このモデルを使用するカスタムのロジックを記述して、業務の課題を解決します。
企業で CLIP を活用できる場面は数多くあり、例えば次のような用途が考えられます。

• データセットの重複排除: 学習に使えるように、データセットから重複した画像を検出して除外。重複排除によって、データ分割の際にデータセットを検証し、学習処理に重複した画像が含まれることがなくなるため、トレーニング品質の低下を防ぐことができます。また、効率を下げる要因となる、モデルが同じ画像を複数サンプルで学習することがないようにします。

• 画像検索: セマンティック画像検索エンジンを作成。ユーザーはテキストや画像で画像ライブラリーを検索できるようになります。関連する画像を大量のコーパスの中から見つけるのに最適です。例えばニュース配信部門では、セマンティック画像検索を活用して、記事に関連する画像を見つけることができます。

• 画像分類: 1 枚の画像に単一または複数のラベルを割り当て。画像分類は、コンシューマー向けアプリケーション (例えば、撮影した野生動物の写真からその動物の特性を調べるアプリ) や、コンテンツ・モデレーションなどに活用できます。

• 動画分類: 映像内に特定シーンが含まれているかを識別。例えば、スクリーンに異なる外観 / 特徴が映し出される場面のタイムスタンプを割り出すなど、メディアのインデックス作成に最適です。また、配信に不適切な NSFW コンテンツが含まれていないかの判定に動画分類を活用することもできます。

• 検索拡張生成 (RAG): RAG ベースのシステムで、候補となる画像の検索に CLIP を使用可能。GPT-4 のような大規模マルチモーダル・モデル (LMM) とビジョンを統合する RAG システムなどもその 1 つです。
Roboflow チームでは、インテル® Gaudi® 2 アクセラレーターと CLIP による企業向けアプリケーションの構築に参考になるチュートリアルを用意しました。

• インテル® Gaudi® 2 AI アクセラレーターに CLIP 画像検索エンジンを構築
https://blog.roboflow.com/image-search-engine-gaudi2/

• インテル® Gaudi® 2 AI アクセラレーターでマルチモーダルのモデル学習を実行する CLIP 企業データセットの構築
https://blog.roboflow.com/deduplicate-dataasets-clip-gaudi2/

• インテル® Gaudi® 2 AI アクセラレーターにマルチモーダルの CLIP 動画解析を実装
https://blog.roboflow.com/multimodal-video-analysis-gaudi2/

【インテル® Gaudi® 2 アクセラレーター CLIP 推論ベンチマーク】
Roboflow チームは、1 基のインテル® Gaudi® アクセラレーターに 66,211 枚の画像に対する CLIP ベクトル演算を実装し、性能ベンチマークを測定しました。デフォルトのまま使える CLIP モデルなので、皆さんのシステムで Transformers 対応モデルがどのように動くのか、すぐに理解できるはずです。

標準的なベンチマーク測定の結果を示すために、モデル性能が一様ではないファインチューニング済みのモデルではなく、すぐに使える CLIP モデルを選択しました。

ベンチマーク測定の結果、1 基のインテル® Gaudi® 2 AI アクセラレーターで、CLIP 重みはデフォルトのまま 66,211 画像の CLIP ベクトル演算を 20 分 11 秒で処理できることが示されています。細かく刻むと、1 分当たり約 3,310 CLIP ベクトル演算、つまり 1 秒に約 55.2 CLIP ベクトル演算処理できるということです。

このパフォーマンスは、CLIP ベクトル演算を必要とするバッチ処理やリアルタイムのアプリケーションに最適です。

＜まとめ＞
Contrastive Language Image Pretraining (CLIP) は、ゼロショット画像、動画分類、セマンティック検索、データセットの重複排除、検索拡張生成 (RAG) など、画像に関連する多様なアプリケーションに活用できる埋め込みモデルです。

このページでは、インテル® Gaudi® 2 アクセラレーターに CLIP を実装する方法を詳しく解説しました。Hugging Face Transformers ライブラリーを使用した CLIP モデルの学習手順にも触れ、COCO json フォーマットでデータセットを読み込み、プロジェクション層の学習処理を行って、カスタムのデータセットから情報をエンコードしています。

最後にインテル® Gaudi® 2 アクセラレーターを使用して CLIP モデルの推論を実行する方法を説明し、データセットの重複排除や動画分類など、具体的なユースケースに活用できる参考用のガイドも紹介しています。

製品およびパフォーマンスに関する情報
性能は、使用状況、構成、その他の要因によって異なります。詳細については、https://www.Intel.com/PerformanceIndex/ (英語) を参照してください。

関連情報：
インテル® Gaudi® 3 アクセラレーター
https://www.intel.co.jp/content/www/jp/ja/products/details/processors/ai-accelerators/gaudi.html