Amazon SageMaker JumpStartを使用した対話型ビジュアル言語処理

Amazon SageMaker JumpStartを活用した対話型ビジュアル言語処理術

視覚言語処理(VLP)は生成型AIの最前線であり、言語知能、ビジョン理解、処理を包括するマルチモーダル学習の進化を推進しています。大規模言語モデル(LLM)と大量のマルチモーダリティデータでトレーニングされた対照的な言語-画像の事前トレーニング(CLIP)と組み合わせることで、視覚言語モデル(VLM)は特に画像キャプション、物体検出とセグメンテーション、視覚的な質問応答などのタスクに優れています。その使用例は、メディアエンターテイメントから医療診断、製造業における品質保証まで、さまざまなドメインにわたります。

VLPの主な強みは、事前トレーニングされたVLMとLLMを効果的に活用することで、タスク固有の変更を必要とせずにゼロショットまたはフューショットの予測を実現し、カジュアルなマルチラウンドの対話を通じて広範なスペクトルの画像を分類することです。また、Grounded Segment Anythingによる補完を受けたVLPは、物体検出とセグメンテーションに特に優れた視覚認識の能力を示しています。ドメイン固有のデータを使用してVLMとLLMをさらに微調整することで、精度を向上させ、幻想を緩和することができる潜在的な可能性があります。ただし、他の新興技術と同様に、モデルの複雑さの管理、さまざまなモダリティの調和、一貫性のある評価基準の策定にはまだ課題が残っています。

NOMIC for OBELICS、HuggingFaceM4 for IDEFICS、GradioのCharles Bensimon、Amazon Polly for TTSに感謝します

この記事では、Amazon SageMaker JumpStartを使用して現代の生成型AIモデルと組み合わせてVLPのプロトタイピングの技術的なニュアンスを探求します。マルチラウンドの対話を通じて、命令指向のゼロショットおよびフューショットのビジョン言語処理の機能を強調し、その多様性に焦点を当てて、より広範なマルチモーダルコミュニティの興味を引きつけることを目指します。デモの実装コードは、次のGitHubリポジトリで入手できます。

ソリューション概要

提案されたVLPソリューションは、最新の生成型AIモジュールのスイートを統合して正確なマルチモーダルの出力を生成します。アーキテクチャの中心には、ビジュアルおよびテキストデータストリームのデコードに不可欠な、微調整されたVLMとLLMがあります。モデル推論レイヤーにはTGIフレームワークが支えとなり、堅牢な統合と容易なアクセスを実現するRESTful APIを提供します。オーディトリなデータ処理を補完するために、Whisper ASRもRESTful APIで提供されており、ストリームライン化された音声からテキストへの変換を可能にしています。画像からテキストのセグメンテーションなどの複雑な課題に対処するために、コンテナ化されたGrounded Segment Anythingモジュールを使用し、テキスト駆動の物体検出とセグメンテーションのためのGrounded DINOSegment Anything Model(SAM)メカニズムと連携させます。また、DistilBERTによってシステムをさらに洗練させ、対話によるマルチクラス分類プロセスを最適化します。これらのコンポーネントを組み合わせることで、LangChain処理パイプラインが織り成す、テキストまたは音声入力の解析、ユーザーの意図の把握、関連するサービスへの方法論的なサブタスクの割り当てが得意な高度なメカニズムが実現されます。これらの操作の合成により、ピンポイントでコンテキストに適したマルチモーダルな回答が提供されます。

以下の図は、対話ガイド付きVLPソリューションのアーキテクチャを示しています。

テキスト生成の推論

テキスト生成の推論(TGI)は、Hugging Faceが開発したオープンソースのツールキットであり、LLMおよびVLMをデプロイするために使用されます。テンソル並列処理、モデル並列処理、ダイナミックバッチングを使用した高性能なテキスト生成を実現し、ファルコンやLlama V2などの主要なオープンソースLLM、およびIDEFICSなどのVLMといった最新のHugging Face LLMモジュールを活用します。AWSのお客様は、Amazon SageMaker上で最新のHugging Faceモジュールを使用したLLMのデプロイを行うことができます。これにより、事前構築されたSageMaker DLCを介してHugging FaceハブからLLMをシームレスにデプロイすることができます。この推論のセットアップにより、優れたパフォーマンスが提供されるだけでなく、重いGPUインフラストラクチャの管理の必要性もなくなります。さらに、推論エンドポイントの自動スケーリング、強化されたセキュリティ、組み込みのモデルモニタリングなどの高度な機能も提供されます。

TGIは、従来の推論方法よりも最大100倍高速なテキスト生成速度を提供し、増加したリクエストを効率的に処理することができます。その設計はさまざまなLLMとの互換性を確保しており、オープンソースであるため、テックコミュニティ向けに高度な機能を民主化しています。TGIの汎用性はドメインを横断し、チャットボットの向上、機械翻訳の改善、テキストの要約、詩からコードまでさまざまなコンテンツの生成に向けられています。それゆえ、TGIはテキスト生成の課題に対する包括的な解決策として浮上しています。TGIはPythonで実装され、PyTorchフレームワークを使用しています。オープンソースであり、GitHubで利用可能です。また、PEFTをサポートしており、より高速なパフォーマンスのためのQLoRAとロジットワーピングをサポートしており、生成されたテキストの属性(長さや多様性など)を制御することができますが、基礎となるモデルを変更する必要はありません。

次のDockerfileからカスタマイズされたTGI Dockerコンテナを直接構築し、そのコンテナイメージをAmazonのElastic Container Registry(ECR)にプッシュして推論展開することができます。以下のコードを参照してください:

%%sh# Dockerイメージの名前とECR上のコンテナのAmazonリソース名を定義しますcontainer_name="tgi1.03"region=`aws configure get region`account=`aws sts get-caller-identity --query "Account" --output text`full_name="${account}.dkr.ecr.${region}.amazonaws.com/${container_name}:latest"# ECRからログインコマンドを取得し、直接実行しますaws ecr get-login-password --region ${region}|docker login --username AWS \    --password-stdin ${account}.dkr.ecr.${region}.amazonaws.com# ローカルでTGIのDockerイメージをビルドしますdocker build . -f Dockerfile -t ${container_name}docker tag ${container_name} ${full_name}docker push ${full_name}

TGIを使用したLLM推論

この記事のVLPソリューションは、LLMをLangChainと連携させ、より正確な意図の分類のために連想されたサブタスクをトリガーする思考の連鎖(CoT)アプローチを利用しています。CoTはクエリを処理して意図を識別し、クエリの目標を達成するために関連するサブタスクをトリガーします。Llama-2-7b-chat-hf(ライセンス契約)は、会話コンテキスト向けに設計されたLlama-2シリーズのスリム化バージョンです。Llama-2-7b-chat-hfの推論は、TGIコンテナイメージによって実現され、APIを介して利用可能です。

Llama-2-7b-chat-hfの推論には、ピークパフォーマンスを達成するためにg5.2xlarge(24G VRAM)が推奨されます。より堅牢なLLMを必要とするアプリケーションには、Llama-v2-13bモデルがg5.12xlarge(96G VRAM)インスタンスに適しています。Llama-2-70bモデルの場合、GPU [2xlarge](bitsandbytes量子化を使用する)またはg5.48xlargeを検討してください。bitsandbytes量子化を使用すると、必要な推論GPU VRAMを50%削減することができます。

TGIコンテナイメージを使用してSageMaker DLCを使用すると、Llama-2-7b-chat-hfを推論展開することができます(以下のコードを参照)。また、Dockerコンテナを使用して、g5.2xlargeインスタンスで概念実証のためのクイックなローカル推論を立ち上げることもできます。

import jsonfrom time import gmtime, strftimefrom sagemaker.huggingface import get_huggingface_llm_image_urifrom sagemaker.huggingface import HuggingFaceModelfrom sagemaker import get_execution_role# 前提条件:ユニークなモデル名を作成するmodel_name = 'Llama-7b-chat-hf' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())# SageMakerプリビルドDLC TGI v1.03のllmイメージuriを取得するtgi_image_ecr_uri = get_huggingface_llm_image_uri(  "huggingface",  version="1.0.3")# モデルとエンドポイントの設定パラメータを定義するhf_config = {  'HF_MODEL_ID': "meta-research/Llama-2-7b-chat-hf", # Hugging Face HubのモデルIDに対応  'SM_NUM_GPUS': json.dumps(number_of_gpu),   'MAX_TOTAL_TOKENS': json.dumps(1024),   'HF_MODEL_QUANTIZE': "bitsandbytes", # VRAM要件を減らすために量子化を使用します。不要な場合はコメントアウトしてください。}# SageMakerプリビルドDLC TGIイメージURIを使用してHuggingFaceModelを作成するm_llm_model = HuggingFaceModel(  role=get_execution_role(),  image_uri=tgi_image_ecr_uri,  env=hf_config)# モデルをデプロイするllm = sm_llm_model.deploy(  initial_instance_count=1,  instance_type="ml.g5.2xlarge",  container_startup_health_check_timeout=300, # 秒単位。モデルをロードするための5分間を許可する。)# 推論ペイロードを定義するprompt="""<|prompter|>How to select a right LLM for your generative AI project?<|endoftext|><|assistant|>"""# llmのハイパーパラメータpayload = {  "inputs": prompt,  "parameters": {    "best_of": 1,    "decoder_input_details": true,    "details": true,    "do_sample": true,    "max_new_tokens": 20,    "repetition_penalty": 1.03,    "return_full_text": false,    "seed": null,    "stop": [      "photographer"    ],    "temperature": 0.5,    "top_k": 10,    "top_p": 0.95,    "truncate": null,    "typical_p": 0.95,    "watermark": true  },  "stream": false}# エンドポイントへのリクエストを送信するresponse = llm.predict(payload)

LLMを微調整しカスタマイズする

SageMaker JumpStartは、パラメータ効率の高いファインチューニング(PEFT)の使用例を示す多数のノートブックサンプルを提供しています。QLoRAを使用したLLMのトレーニングとファインチューニングを含みます。QLoRAは、事前学習済みモデルの重みを静的な状態で保持し、Transformer構造の各層にトレーニング可能なランク分解行列を導入します。この方法により、ダウンストリームのタスクに必要なトレーニング可能なパラメータの数を大幅に減らすことができます。

また、直接的な好みの最適化 (DPO) も試してみることができます。DPOは、報酬モデルの設定、LLMからのサンプル抽出、または広範なハイパーパラメータの調整の必要性を排除します。最近の研究では、DPOのファインチューニングはセンチメント生成の管理においてRLHFを超え、要約や単一の会話応答の品質を向上させることが示されています。さらに、セットアップや教育の際に非常に簡単に行うことができます。DPOトレーニングプロセスには以下の3つの主要なステップがあります(詳細についてはGitHubのリポジトリを参照):

  1. 事前学習済みのベースLLMを教師ありファインチューニングして、ファインチューニングされたLLMを作成します。
  2. ファインチューニングされたモデルを使用してDPOトレーナーを実行し、強化学習モデルを作成します。
  3. DPOからアダプターシンをベースLLMモデルにマージしてテキスト生成推論を行います。

マージされたモデルをTGIコンテナイメージを使用して推論に展開することができます。

ビジュアル言語モデル

ビジュアル言語モデル(VLM)は、ビジョンと言語のモダリティを組み合わせたもので、一般化において改善された効果を示しており、ゼロショット提示や少数ショット提示と指示によるさまざまな実用的なユースケースにつながっています。VLMは通常、画像エンコーダー、テキストエンコーダー、両方のエンコーダーからの情報を統合する戦略の3つの主要な要素で構成されています。これらの主要な要素は、損失関数がモデルアーキテクチャと学習戦略の両方に基づいて設計されているため、密接に結びついています。最先端のVLMはCLIP/ViT(OpenCLIPなど)やLLM(Llama-v1など)を使用し、Wikipedia、LAION、Public Multimodal Datasetなどの複数の公開データセットでトレーニングされています。

このデモでは、IDEFICS-9b-instructと呼ばれる事前訓練済みモデルを使用しました。このモデルはHuggingFaceM4によって開発されたもので、IDEFICS-9bのファインチューニング版です。ファインチューニングはFlamingoで用意されたトレーニングプロセスに従い、二つの事前訓練済みモデル(laion/CLIP-ViT-H-14-laion2B-s32B-b79Kとhuggyllama/llama-7b)と変更されたトランスフォーマーブロックを組み合わせて行われました。IDEFICS-9bはOBELIC、Wikipedia、LAION、PMDのマルチモーダルデータセットに対して、合計1500億トークンと1.582億の解像度224×224の画像を使用してトレーニングされました。IDEFICS-9bは、有効なバッチサイズ131万のLlama-7bに基づいています。IDEFICS-9b-instructは、生成AIを使用して拡張された6,800万のマルチモダリティの教示データセットを使用して、すべてのパラメータ(ビジョンエンコーダー、言語モデル、クロスアテンション)を解凍し、ファインチューニングされました。ファインチューニングデータセットには、以下のサンプリング率で事前トレーニングデータが含まれています:画像テキストペアの5.1%とOBELICSマルチモーダルウェブ文書の30.7%。

トレーニングソフトウェアは、Hugging Face TransformersとAccelerateをベースに構築され、トレーニングにはDeepSpeed ZeRO-3、データローディングにはWebDatasetImage2DataSetsが使用されています。IDEFICS-9bの事前訓練には、128個のNvidia A100 GPUsを使用して350時間、IDEFICS-9b-instructのファインチューニングには、128個のNvidia A100 GPUsを使用して70時間かかりました。いずれもAWSのp4.24xlargeインスタンスで実行されました。

Amazon SageMakerを使用すると、IDEFICS-9b-instructをg5.2xlargeインスタンスにシームレスに展開して推論タスクを実行できます。以下のコードスニペットは、カスタマイズされたTGI Dockerイメージと統合されたカスタムディープラーニングローカルコンテナを起動する方法を示しています。

%%shllm_model='HuggingFaceM4/idefics-9b-instruct'docker_rt_name='idefics-9b-instruct'docker_image_name='tgi1.03'docker run --gpus="1,2,3,4" --shm-size 20g -p 8080:80 --restart unless-stopped --name ${docker_rt_name} ${docker_image_name} --model-id ${llm_model}# LLM APIをcurlを使用してテストするcurl -X 'POST' \
  'http://<hostname_or_ip>:8080/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{          "inputs": "User:![](http://<image_url>/image.png)この画像を作成したデバイスは何ですか?この画像の主な臨床目的を説明してください。この画像を基にした放射線報告書を作成できますか?<end_of_utterance>", \
  "parameters": {                "best_of": 1,    "decoder_input_details": true,   \            "details": true,    "do_sample": true,    "max_new_tokens": 20,  \            "repetition_penalty": 1.03,    "return_full_text": false,    \            "seed": null,    "stop": [      "photographer"    ],    \            "temperature": 0.5,    "top_k": 10,    "top_p": 0.95,   \            "truncate": null,    "typical_p": 0.95,    "watermark": true  },  \        "stream": false \        }'

自分の独自のドメイン固有データと指示を使用して、IDEFICSや他のVLM(Open Flamingoなど)を微調整できます。多モダリティデータセットの準備については、次のREADMEを参照してください。微調整の詳細については、次の微調整スクリプトを参照してください。

チェーンオブソートによる意図分類

一枚の絵は千語に匹敵するため、VLMは与えられた画像と質問から正確なキャプションを生成するためのガイダンスが必要です。私たちはフューショットプロンプティングを使用してコンテキスト内の学習を可能にし、モデルをより良いパフォーマンスに誘導するためにプロンプトでデモンストレーションを提供します。デモンストレーションは、モデルに応答を生成してほしい後続の例において、誘導として機能します。

標準的なフューショットプロンプティングは多くのタスクに対してうまく機能しますが、特により複雑な推論タスクに取り組む場合には完全なテクニックではありません。フューショットプロンプティングのテンプレートだけでは信頼性のある応答は得られません。問題をステップごとに分解し、モデルにそれを示すことが助けになるかもしれません。最近では、チェーンオブソート(CoT)プロンプティングが導入され、より複雑な算術、常識的な思考、および象徴的な推論タスクを扱うために普及しました

CoTは、LLMを使用して「ステップごとに考えましょう」というプロンプトでデモンストレーションを生成することにより、人の手作業を排除します。ただし、この自動プロセスでも生成されたチェーンには誤りが含まれる場合があります。誤りの影響を軽減するためには、多様性のあるデモンストレーションが重要です。この投稿ではAuto-CoTを提案し、多様性を持った質問をサンプリングし、それに基づいてデモンストレーションの推論チェーンを生成します。CoTには2つの主要なステージがあります:

  • 質問クラスタリング – 与えられたデータセットの質問をいくつかのクラスタに分割します
  • デモンストレーションサンプリング – 各クラスタから代表的な質問を選択し、ゼロショットCoTとシンプルなヒューリスティクスを使用してその推論チェーンを生成します

以下のコードスニペットをご覧ください:

from langchain.llms import HuggingFaceTextGenInferencefrom langchain import PromptTemplate, LLMChaininference_server_url_local = <Your_local_url_for_llm_on_tgi:port>llm_local = HuggingFaceTextGenInference(    inference_server_url=inference_server_url_local,    max_new_tokens=512,    top_k=10,    top_p=0.95,    typical_p=0.95,    temperature=0.1,    repetition_penalty=1.05,     template = """次のコンテキストの一部を使用して、最後の質問に答えてください。答えがわからない場合は、わからないと答えるだけで、回答をでっち上げないでください。最大で10個のサブタスクを細かく詳細に記載し、できるだけ控えめな答えにしてください。前回の問い合わせを複製しないように、明確さのために繰り返しを避けてください。これにより、正確かつ詳細な回答が得られます。質問:{question}回答:質問の意図を理解し、{question}をサブタスクに分解してください。"""prompt = PromptTemplate(    template=template,     input_variables= ["question"])llm_chain_local = LLMChain(prompt=prompt, llm=llm_local)llm_chain_local("この画像の性質を説明してください。それは本物だと思いますか?")

自動音声認識

VLPソリューションには、OpenAIのWhisperという自動音声認識(ASR)モデルが組み込まれており、オーディオクエリを処理します。Whisperは、SageMaker JumpStartを使用してテンプレートを介して簡単に展開することができます。SageMaker JumpStartは、簡単なセットアップ、高性能、スケーラビリティ、信頼性で知られており、優れた音声駆動型アプリケーションを作成する開発者にとって理想的です。以下のGitHubのリポジトリでは、SageMakerのリアルタイム推論エンドポイントを活用してWhisperを細かく調整し、インスタントの音声-to-テキスト変換のためにホストする方法を示し、SageMakerホスティングと生成モデルのシナジーを紹介しています。

別の方法として、ahmetonerによって開発されたGitHubからDockerfile.gpuを直接ダウンロードすることもできます。このDockerfileには、事前に設定されたRESTful APIが含まれています。その後、Dockerイメージを構築し、GPUパワードのAmazonElastic Compute Cloud(EC2)インスタンス上でコンテナを実行して、迅速な概念実証を行うことができます。以下のコードを参照してください:

%%shdocker_iamge_name = 'whisper-asr-webservice-gpu'docker build -f Dockerfile.gpu -t ${docker_iamge_nam}docker run -d --gpus all -p 8083:9000 --restart unless-stopped -e ASR_MODEL=base ${docker_iamge_nam}curl -X 'POST' \  'http://<asr_api_hostname>:<port>/asr?task=transcribe&encode=true&output=txt' \      -H 'accept: application/json' \      -H 'Content-Type: multipart/form-data' \      -F 'audio_file=@dgvlp_3_5.mp3;type=audio/mpeg'

提供された例では、ポート8083がWhisper APIをホストするために選択されており、受信ネットワークセキュリティルールがアクティブになっています。テストするには、Webブラウザをhttp://<IP_or_hostname>:8083/docsに直接アクセスし、ASRエンドポイントへのPOSTリクエストテストを開始します。または、指定されたコマンドを実行するか、whisper-liveモジュールを使用してAPIの接続性を検証します。

!pip install whisper-livefrom whisper_live.client import TranscriptionClientclient = TranscriptionClient("<whisper_hostname_or_IP>", 8083, is_multilingual=True, lang="zh", translate=True)client(audio_file_path) # 音声ファイルを使用client() # マイクロフォンを使用して変換

マルチクラスのテキスト分類とキーワード抽出

マルチクラス分類は、テキストプロンプトによるオブジェクト検出とセグメンテーションにおいて重要な役割を果たします。 Stanford Sentiment Treebank(SST2)データセットを最適化したDistilBERT-base-uncasedの洗練されたチェックポイントであるdistilbert-base-uncased-finetuned-sst-2-englishモデル。このモデルは、開発セットで91.3%の精度を達成し、対応するbert-base-uncasedは92.7%の精度を誇っています。Hugging Face Hubでは、1,000以上の事前学習済みテキスト分類モデルにアクセスできます。より高い精度を求める場合、SageMaker JumpStartは、カスタム注釈付きデータセットを使用してDistilBERTを細かく調整するためのテンプレートを提供します。

import torchfrom transformers import pipelinedef mclass(text_prompt, top_k=3, topics = ['Mask creation', 'Object  detection',         'Inpainting', 'Segmentation', 'Upscaling', 'Creating an image from another one', 'Generating:q an image from text'],         model='distilbert-base-uncased-finetuned-sst-2-english'):            device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')    # ドイツの仮説のテンプレートと帰結/矛盾の潜在的な候補を定義する    template_de = 'トピックは {}'    # Hugging Faceのパイプライン抽象化    pipe = pipeline(task='zero-shot-classification', model=model, tokenizer=model, device=device)    # テストケースでパイプラインを実行する    prediction = pipe(text_prompt, topics, hypothesis_template=template_de)    # 予測された上位3つのトピック(ゼロショットモード)    return zip(prediction['labels'][0:top_k], prediction['scores'][0:top_k])top_3_intend = mclass(text_prompt=user_prompt_str, topics=['Others', 'Create image mask', 'Image segmentation'], top_k=3) 

<p>キーワード抽出プロセスでは、<a href=”https://github.com/MaartenGr/KeyBERT”>KeyBERT</a>モジュールが使用され、BERTの埋め込みを活用してクエリで指定されたオブジェクトに密接に関連するキーワードとキーフレーズを生成する、スムーズかつユーザーフレンドリーな方法です。</p><pre><code># キーワード抽出from keybert import KeyBERTkw_model = KeyBERT()words_list = kw_model.extract_keywords(docs=<user_prompt_str>, keyphrase_ngram_range=(1,3))</code></pre><h2 id=”text-prompt-driven-object-detection-and-classification”>テキストプロンプト駆動のオブジェクト検出と分類</h2><p>VLPソリューションでは、テキストの意味を解析し、テキストプロンプトからアクションとオブジェクトを識別することで、ダイアログによるオブジェクト検出とセグメンテーションを実現します。<a href=”https://github.com/IDEA-Research/Grounded-Segment-Anything”>Grounded-SAM</a>は、IDEA-Researchが作成したオープンソースのパッケージであり、テキスト入力の画像から任意のものを検出およびセグメンテーションするための非常に強力なパイプラインを構築するために、<a href=”https://github.com/IDEA-Research/GroundingDINO”>Grounding DINO</a>とSegment Anythingの強みを組み合わせています。</p><p>以下の図は、Grounded-SAMがテキスト入力を理解してオブジェクトを検出およびインスタンスセグメンテーションする方法を示しています。</p><p><img src=”https://ai.miximages.com/d2908q01vomqb2.cloudfront.net/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59/2023/10/26/dgvlp_3.jpg”/></p><p><a href=”/?s=SAM”>SAM</a>は堅牢なセグメンテーションモデルとして際立っていますが、高品質のオブジェクトマスクを生成するにはバウンディングボックスやポイントなどのプロンプトが必要です。Grounding DINOはゼロショットの検出器として優れており、自由形式のテキストプロンプトを使用して高品質のボックスとラベルを作成します。これらの2つのモデルを組み合わせると、テキスト入力のみで任意のオブジェクトを検出およびセグメンテーションするという驚異的な能力が提供されます。Pythonのユーティリティスクリプト<a href=”https://github.com/alfredcs/immersion_day_labs/blob/main/genai/dino_sam_inpainting.py”>dino_sam_inpainting.py</a>はGrounded-SAMの手法を統合するために開発されました。</p><pre><code>!pip install git+https://github.com/facebookresearch/segment-anything.gitimport dino_sam_inpainting as Ddef dino_sam(image_path, text_prompt, text_threshold=0.4, box_threshold=0.5, output_dir=’/temp/gradio/outputs’): config_file = ‘GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py’ # モデルの設定ファイルのパスを変更 grounded_checkpoint = ‘./models/groundingdino_swint_ogc.pth’ # モデルのパスを変更 sam_checkpoint = ‘./models/sam_vit_h_4b8939.pth’ sam_hq_checkpoint = ” # 高品質の場合は、sam_hq_vit_h.pthのようなチェックポイントを使用 use_sam_hq = ” output_dir = ‘/tmp/gradio/outputs’ device = ‘cuda’ # ディレクトリを作成 os.makedirs(output_dir, exist_ok=True) # 画像をロード image_pil, image = D.load_image(image_path) # モデルをロード model = D.load_model(config_file, grounded_checkpoint, device=device) output_file_name = f'{format(os.path.basename(image_path))}’ # 生の画像を表示 image_pil.save(os.path.join(output_dir, output_file_name)) # grounding dinoモデルを実行 boxes_filt, pred_phrases = D.get_grounding_output( model, image, text_prompt, box_threshold, text_threshold, device=device ) # SAMを初期化 if use_sam_hq: predictor = D.SamPredictor(D.build_sam_hq(checkpoint=sam_hq_checkpoint).to(device)) else: predictor = D.SamPredictor(D.build_sam(checkpoint=sam_checkpoint).to(device)) image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) predictor.set_image(image) size = image_pil.size H, W = size[1], size[0] for i in range(boxes_filt.size(0)): boxes_filt[i] = boxes_filt[i] * torch.Tensor([W, H, W, H]) boxes_filt[i][:2] -= boxes_filt[i][2:] / 2 boxes_filt[i][2:] += boxes_filt[i][:2] boxes_filt = boxes_filt.cpu() transformed_boxes = predictor.transform.apply_boxes_torch(boxes_filt, image.shape[:2]).to(device) masks, _, _ = predictor.predict_torch( point_coords = None, point_labels = None, boxes = transformed_boxes.to(device), multimask_output = False, ) # 出力画像を描画 plt.figure(figsize=(10, 10)) plt.imshow(image) for mask in masks: D.show_mask(mask.cpu().numpy(), plt.gca(), random_color=True) for box, label in zip(boxes_filt, pred_phrases): D.show_box(box.numpy(), plt.gca(), label) output_file_name = f'{format(os.path.basename(image_path))}’ plt.axis(‘off’) plt.savefig( os.path.join(output_dir, f’grounded_sam_{output_file_name}’), bbox_inches=”tight”, dpi=300, pad_inches=0.0 ) D.save_mask_data(output_dir, masks, boxes_filt, pred_phrases) return f’grounded_sam_{output_file_name}’ filename = dino_sam(image_path=<image_path_str>, text_prompt=<object_name_str>, output_dir=<output_image_filename_path_str>, box_threshold=0.5, text_threshold=0.55)</code></pre>

HQ-SAMを選択してSAMをアップグレードし、高品質なゼロショットセグメンテーションを実現できます。詳細については、以下の論文とGitHub上のコードサンプルを参照してください。

VLP処理パイプライン

VLP処理パイプラインの主な目的は、さまざまなモデルの強みを組み合わせ、VLPに特化した複雑なワークフローを作成することです。このセットアップでは、視覚、テキスト、音声のドメインを横断するトップレベルのモデルの統合を重視していることを強調することが重要です。パイプラインの各セグメントはモジュール化されており、単独で使用するか、組み合わせて使用することが容易です。さらに、この設計は柔軟性を確保し、より高度なモデルでコンポーネントを置き換えたり、スレッド処理や信頼性のある実装とのエラーハンドリングをサポートすることができます。

以下の図は、VLPパイプラインのデータフローとサービスコンポーネントを示しています。

VLPパイプラインの探索においては、オープンテキスト形式からのテキストプロンプトとマイクからのカジュアルな音声入力の両方を処理できるパイプラインを設計しました。音声処理はWhisperによって容易に行われ、多言語の音声認識と翻訳が可能です。転写されたテキストは意図の分類モジュールに送られ、プロンプトの意味的なエッセンスを識別します。これはLangChainによって推進されるCoTエンジンと連動し、より詳細な情報検索と生成のために主な意図を細かいサブタスクに分解します。入力から画像処理が推論される場合、パイプラインはキーワード抽出プロセスを開始し、元の画像で検出されたオブジェクトとクロスリファレンスを行い、上位N個のキーワードを選択します。その後、これらのキーワードはGrounded-SAMエンジンにルーティングされ、バウンディングボックスを生成します。これらのバウンディングボックスは、ソースイメージ内の各個別オブジェクトインスタンスをピンポイントで示す精密なセグメンテーションマスクを生成するSAMモデルに供給されます。最後のステップでは、マスクとバウンディングボックスを元の画像に重ね合わせ、マルチモーダルな出力として表示される処理済みの画像を生成します。

入力クエリが画像を解釈する場合、パイプラインはLLMを介してサブタスクを組織化し、ターゲットとなるゴールでクエリを洗練させます。その後、結果はVLM APIに送られ、フューショットの指示、入力画像のURL、再表現されたテキストプロンプトが添えられます。応答として、VLMはテキストの出力を提供します。VLPパイプラインは、Pythonベースのワークフローパイプラインまたは代替のオーケストレーションユーティリティを使用して実装することができます。このようなパイプラインは、洗練された一連のモデルを順次連鎖して操作し、結構な構造化モデリング手順で完結します。パイプラインはデモ目的でGradioエンジンと統合されます:

def vlp_text_pipeline(str input_text, str original_image_path, chat_history):   intent_class = intent_classification(input_text)   key_words = keyword_extraction(input_text)   image_caption = vlm(input_text, original_image_path)   chat_history.append(image_caption)   if intent_class in {supported intents}:        object_bounding_box = object_detection(intent_class, key_words, original_image_path)        mask_image_path = image_segmentation(object_bounding_box, key_words, original_image_path)        chat_history.append(mask_image_path)   return chat_history    def vlp_voice_pipeline(str audio_file_path, str original_image_path, chat_history):   asr_text = whisper_transcrib(audio_file_path)   chat_history.append(asr_text, original_image_path, chat_history)   return chat_history    chat_history = map(vlp_pipelines, input_text, original_image_path, chat_history) \               if (audio_file_path is None) \               else map(vlp_voice_pipelines, original_image_path, chat_history)

制限事項

VLPの事前トレーニング済みのVLMモデルを使用したVLPは、画像理解において有望な潜在能力を示しています。言語に基づくオブジェクト検出とセグメンテーションに加えて、VLPは合理的な品質の有用な出力を生成することができます。しかし、VLPはまだ一貫性のない結果、画像からの詳細の欠落、さらには見せかけることもあります。また、モデルは事実に基づかないテキストを生成する可能性があり、事実に正確な情報を生成するために頼るべきではありません。参照される事前トレーニング済みのVLM、SAM、またはLLMモデルのいずれも、ドメイン固有の本番グレードのアプリケーションのためにトレーニングまたは調整されていないため、このソリューションは生活や物質的損失への影響を及ぼす可能性のあるミッションクリティカルなアプリケーションには適していません

迅速なエンジニアリングにより、IDEFICSモデルはテキストのヒントに従って追加の詳細を認識することがあります。しかし、その結果は一貫性がなく信頼性に欠けるものとなっています。会話中にユーザーがそれらを強調しても、不正確さを維持し続け、修正することができないか、あるいはしたくないことがあります。Swin-ViTとDualToken-ViTのようなCNNベースのモデルを統合し、Llama-v2のようなより高度なモデルを使ったトレーニングを行い、バックボーンモデルを強化することで、これらの制約のいくつかを解消する可能性があります。

次のステップ

VLPソリューションは注目される進歩を遂げています。先を見据えると、VLPソリューションを進めるためのいくつかの主要な機会があります:

  • 動的なプロンプト指示とフュージョン学習のヒントを統合することを優先しましょう。これらの改善により、より正確なAIフィードバックが可能になります。
  • 意図分類チームは、オープンなプロンプトからより微妙なドメイン固有の意図を把握するため、分類器の改善に注力するべきです。正確なユーザー意図を理解する能力は重要です。
  • 推論パイプラインに思考ツリーモデルを実装しましょう。この構造により、明示的な推論ステップが行われ、サブタスクが完了します。
  • 主要なモデルに対してファインチューニングの取り組みを行いましょう。ファインチューニングを通じて、VLM、LLM、SAMモデルを主要な産業やユースケースに適用することが重要です。

謝辞

この記事の洞察に感謝し、フィードバックとレビューをしてくれたVivek MadanさんとAshish Rawatさんに謝意を表します。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

Microsoft BingはNVIDIA Tritonを使用して広告配信を高速化

Jiusheng Chen氏のチームは加速しました。 彼らは、NVIDIA Triton Inference ServerをNVIDIA A100 Tensor Core GPUで実行する...

機械学習

「プリズマーに会いましょう:専門家のアンサンブルを持つオープンソースのビジョン-言語モデル」

最近の多くのビジョン言語モデルは、非常に注目すべき多様な生成能力を示しています。しかし、通常、それらは膨大なモデルと...

人工知能

7つの最高の履歴書ビルダーAIツール

これらのAI履歴書ビルダーツールは、人々の90%以上よりも優れた文章を書き、100%の人々よりも速く作成します

データサイエンス

サムスンはAIとビッグデータを採用し、チップ製造プロセスを革新します

世界的なメモリチップメーカーであるSamsung Electronics Co.は、最先端の人工知能(AI)とビッグデータ技術を活用して、チッ...

人工知能

デヴオプスにおけるジェネレーティブAI:ピークなデヴオプスパフォーマンスを実現するスマートな(そして効果的な)方法

ジェネレーティブAIがDevOpsでチームワークを改善し、手続きを迅速化し、よりアジャイルかつ効率的な職場を作り出す方法を調...

機械学習

ロボットが「グリップ」のアップグレードを取得:AO-Graspがロボットに物を落とさない技術を教えます!

近年、ロボットは製造業から医療まで、様々な産業でますます使用されています。しかし、彼らのタスクを遂行する効果は、環境...