Ultralytics YOLO27:
Get Started

Vertex AI で Ultralytics の事前学習済み YOLO モデルをデプロイして推論する#

このガイドでは、Ultralytics の事前学習済み YOLO26 モデルをコンテナ化し、その推論サーバーを FastAPI で構築して、推論サーバーとともに Google Cloud Vertex AI にモデルをデプロイする方法を説明します。実装例では YOLO26 の物体検出タスクを取り上げますが、同じ原則はその他の YOLO タスクにも適用できます。

始める前に、Google Cloud Platform(GCP)プロジェクトを作成する必要があります。新規ユーザーは GCP クレジットとして 300 ドル分を無料で利用できます。この金額があれば、セットアップを実行してテストするのに十分であり、トレーニングやバッチ推論、ストリーミング推論など、ほかの YOLO26 のユースケースにも後から拡張できます。

学習内容#

  1. FastAPI を使用して、Ultralytics YOLO26 モデルの推論バックエンドを作成します。
  2. Docker イメージを保存するための GCP Artifact Registry リポジトリを作成します。
  3. モデルを含む Docker イメージをビルドし、Artifact Registry にプッシュします。
  4. Vertex AI にモデルをインポートします。
  5. Vertex AI エンドポイントを作成し、モデルをデプロイします。
コンテナ化したモデルをデプロイする理由
  • Ultralytics によるモデルの完全な制御: 前処理、後処理、レスポンス形式を完全に制御しながら、カスタム推論ロジックを使用できます。
  • 残りの処理は Vertex AI が担当: 自動スケーリングに対応しながら、コンピューティングリソース、メモリ、GPU の構成を柔軟に設定できます。
  • GCP とのネイティブな連携とセキュリティ: Cloud Storage、BigQuery、Cloud Functions、VPC 制御、IAM ポリシー、監査ログをシームレスに設定できます。

前提条件#

  1. マシンに Docker をインストールします。
  2. Google Cloud SDK をインストールし、gcloud CLI を使用するための認証を行います。
  3. このガイドでは公式の Ultralytics Docker イメージを拡張する必要があるため、Ultralytics Docker クイックスタートガイドを一通り確認することを強くおすすめします。

1. FastAPI で推論バックエンドを作成する#

まず、YOLO26 モデルの推論リクエストを処理する FastAPI アプリケーションを作成します。このアプリケーションで、モデルの読み込み、画像の前処理、推論(予測)ロジックを処理します。

Vertex AI コンプライアンスの基礎#

Vertex AI では、コンテナに次の 2 つのエンドポイントを実装する必要があります。

  1. Health エンドポイント(/health): サービスの準備ができたら、HTTP ステータス 200 OK を返す必要があります。

  2. Predict エンドポイント(/predict): base64 エンコードされた画像とオプションのパラメーターを含む、構造化された予測リクエストを受け付けます。エンドポイントの種類に応じて、ペイロードサイズの上限が適用されます。

    /predict エンドポイントへのリクエストペイロードは、次の JSON 構造に従う必要があります。

    {
        "instances": [{ "image": "base64_encoded_image" }],
        "parameters": { "confidence": 0.5 }
    }

プロジェクトのフォルダー構成#

ビルドの大部分は Docker コンテナ内で行われ、Ultralytics が事前学習済み YOLO26 モデルも読み込むため、ローカルのフォルダー構成はシンプルにできます。

YOUR_PROJECT/
├── src/
│   ├── __init__.py
│   ├── app.py              # Core YOLO26 inference logic
│   └── main.py             # FastAPI inference server
├── tests/
├── .env                    # Environment variables for local development
├── Dockerfile              # Container configuration
├── LICENSE                 # AGPL-3.0 License
└── pyproject.toml          # Python dependencies and project config
重要なライセンスに関する注意事項

Ultralytics YOLO26 のモデルとフレームワークは AGPL-3.0 ライセンスで提供されており、重要なコンプライアンス要件があります。ライセンス条項への準拠方法について、Ultralytics のドキュメントを必ずお読みください。

依存関係を含む pyproject.toml を作成する#

プロジェクトを簡単に管理するため、次の依存関係を含む pyproject.toml ファイルを作成します。

[project]
name = "YOUR_PROJECT_NAME"
version = "0.0.1"
description = "YOUR_PROJECT_DESCRIPTION"
requires-python = ">=3.10,<3.13"
dependencies = [
   "ultralytics>=8.4.0",
   "fastapi[all]>=0.89.1",
   "uvicorn[standard]>=0.20.0",
   "pillow>=9.0.0",
   "loguru",
]

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
  • FastAPI サーバーの実行には uvicorn を使用します。
  • FastAPI サーバーでのログ記録には loguru を使用します。
  • 画像処理には pillow を使用しますが、PIL 画像だけに限定されるわけではありません。Ultralytics はほかにも多くの形式に対応しています。

Ultralytics YOLO26 で推論ロジックを作成する#

プロジェクトの構成と依存関係を設定したので、YOLO26 の中核となる推論ロジックを実装できます。Ultralytics Python API を使用して、モデルの読み込み、画像処理、予測を行う src/app.py ファイルを作成します。

# src/app.py

from ultralytics import YOLO

# Model initialization and readiness state
model_yolo = None
_model_ready = False

def _initialize_model():
    """Initialize the YOLO model."""
    global model_yolo, _model_ready

    try:
        # Use pretrained YOLO26n model from Ultralytics base image
        model_yolo = YOLO("yolo26n.pt")
        _model_ready = True

    except Exception as e:
        print(f"Error initializing YOLO model: {e}")
        _model_ready = False
        model_yolo = None

# Initialize model on module import
_initialize_model()

def is_model_ready() -> bool:
    """Check if the model is ready for inference."""
    return _model_ready and model_yolo is not None

コンテナの起動時にモデルを一度読み込み、すべてのリクエストで共有します。モデルの推論負荷が高くなる場合は、後の手順で Vertex AI にモデルをインポートする際に、メモリの多いマシンタイプを選択することをおすすめします。

次に、pillow を使用して入力画像と出力画像を処理するユーティリティ関数を 2 つ作成します。YOLO26 は PIL 画像にネイティブ対応しています。

def get_image_from_bytes(binary_image: bytes) -> Image.Image:
    """Convert image from bytes to PIL RGB format."""
    input_image = Image.open(io.BytesIO(binary_image)).convert("RGB")
    return input_image
def get_bytes_from_image(image: Image.Image) -> bytes:
    """Convert PIL image to bytes."""
    return_image = io.BytesIO()
    image.save(return_image, format="JPEG", quality=85)
    return_image.seek(0)
    return return_image.getvalue()

最後に、物体検出を処理する run_inference 関数を実装します。この例では、モデルの予測結果からバウンディングボックス、クラス名、信頼度スコアを抽出します。この関数は、後続の処理やアノテーションに使用する検出結果と生の結果を含む辞書を返します。

def run_inference(input_image: Image.Image, confidence_threshold: float = 0.5) -> Dict[str, Any]:
    """Run inference on an image using YOLO26n model."""
    # Check if model is ready
    if not is_model_ready():
        print("Model not ready for inference")
        return {"detections": [], "results": None}

    try:
        # Make predictions and get raw results
        results = model_yolo.predict(
            imgsz=640, source=input_image, conf=confidence_threshold, save=False, augment=False, verbose=False
        )

        # Extract detections (bounding boxes, class names, and confidences)
        detections = []
        if results and len(results) > 0:
            result = results[0]
            if result.boxes is not None and len(result.boxes.xyxy) > 0:
                boxes = result.boxes

                # Convert tensors to numpy for processing
                xyxy = boxes.xyxy.cpu().numpy()
                conf = boxes.conf.cpu().numpy()
                cls = boxes.cls.cpu().numpy().astype(int)

                # Create detection dictionaries
                for i in range(len(xyxy)):
                    detection = {
                        "xmin": float(xyxy[i][0]),
                        "ymin": float(xyxy[i][1]),
                        "xmax": float(xyxy[i][2]),
                        "ymax": float(xyxy[i][3]),
                        "confidence": float(conf[i]),
                        "class": int(cls[i]),
                        "name": model_yolo.names.get(int(cls[i]), f"class_{int(cls[i])}"),
                    }
                    detections.append(detection)

        return {
            "detections": detections,
            "results": results,  # Keep raw results for annotation
        }
    except Exception as e:
        # If there's an error, return empty structure
        print(f"Error in YOLO detection: {e}")
        return {"detections": [], "results": None}

必要に応じて、Ultralytics 組み込みのプロットメソッドを使用し、バウンディングボックスとラベルで画像にアノテーションを付ける関数を追加できます。予測レスポンスでアノテーション済み画像を返す場合に便利です。

def get_annotated_image(results: list) -> Image.Image:
    """Get annotated image using Ultralytics built-in plot method."""
    if not results or len(results) == 0:
        raise ValueError("No results provided for annotation")

    result = results[0]
    # PIL 出力で Ultralytics 組み込みの plot メソッドを使用する
    return result.plot(pil=True)

FastAPI で HTTP 推論サーバーを作成する#

YOLO26 の中核となる推論ロジックができたので、それを提供する FastAPI アプリケーションを作成できます。Vertex AI が必要とするヘルスチェックエンドポイントと予測エンドポイントも実装します。

まず、src/main.py を作成してインポートを追加し、FastAPI アプリを作成して、Vertex AI 用のログを設定します。Vertex AI は stderr をエラー出力として扱うため、ログを stdout に出力する方法が適しています。

# src/main.py

import sys

from fastapi import FastAPI
from loguru import logger

app = FastAPI()

# ロガーを設定する
logger.remove()
logger.add(
    sys.stdout,
    colorize=True,
    format="<green>{time:HH:mm:ss}</green> | <level>{message}</level>",
    level=10,
)
logger.add("log.log", rotation="1 MB", level="DEBUG", compression="zip")

Vertex AI の要件に完全に準拠するには、必要なエンドポイントを環境変数で定義し、リクエストのサイズ上限を設定します。本番環境へのデプロイには、プライベート Vertex AI エンドポイントの使用をおすすめします。これにより、強固なセキュリティとアクセス制御に加えて、リクエストペイロードの上限を引き上げることができます(パブリックエンドポイントの 1.5 MB に対し、10 MB)。

# Vertex AI の環境変数
AIP_HTTP_PORT = int(os.getenv("AIP_HTTP_PORT", "8080"))
AIP_HEALTH_ROUTE = os.getenv("AIP_HEALTH_ROUTE", "/health")
AIP_PREDICT_ROUTE = os.getenv("AIP_PREDICT_ROUTE", "/predict")

# リクエストサイズの上限(プライベートエンドポイントは 10 MB、パブリックエンドポイントは 1.5 MB)
MAX_REQUEST_SIZE = 10 * 1024 * 1024  # 10 MB をバイト数で指定

リクエストとレスポンスを検証するため、Pydantic モデルを 2 つ追加します。

# リクエスト/レスポンス用の Pydantic モデル
class PredictionRequest(BaseModel):
    instances: list
    parameters: Optional[Dict[str, Any]] = None

class PredictionResponse(BaseModel):
    predictions: list

モデルの準備状況を確認するため、ヘルスチェックエンドポイントを追加します。これは Vertex AI で重要です。専用のヘルスチェックがない場合、オーケストレーターはランダムなソケットに ping を送信するため、モデルが推論可能な状態かどうかを判定できません。成功時には 200 OK、失敗時には 503 Service Unavailable を返す必要があります。

# ヘルスチェックエンドポイント
@app.get(AIP_HEALTH_ROUTE, status_code=status.HTTP_200_OK)
def health_check():
    """Health check endpoint for Vertex AI."""
    if not is_model_ready():
        raise HTTPException(status_code=503, detail="Model not ready")
    return {"status": "healthy"}

これで、推論リクエストを処理する予測エンドポイントを実装する準備が整いました。画像ファイルを受け取り、推論を実行して結果を返します。画像は base64 エンコードする必要があり、その分ペイロードのサイズが最大 33% 増加する点に注意してください。

@app.post(AIP_PREDICT_ROUTE, response_model=PredictionResponse)
async def predict(request: PredictionRequest):
    """Prediction endpoint for Vertex AI."""
    try:
        predictions = []

        for instance in request.instances:
            if isinstance(instance, dict):
                if "image" in instance:
                    image_data = base64.b64decode(instance["image"])
                    input_image = get_image_from_bytes(image_data)
                else:
                    raise HTTPException(status_code=400, detail="Instance must contain 'image' field")
            else:
                raise HTTPException(status_code=400, detail="Invalid instance format")

            # Extract YOLO26 parameters if provided
            parameters = request.parameters or {}
            confidence_threshold = parameters.get("confidence", 0.5)
            return_annotated_image = parameters.get("return_annotated_image", False)

            # Run inference with YOLO26n model
            result = run_inference(input_image, confidence_threshold=confidence_threshold)
            detections_list = result["detections"]

            # Format predictions for Vertex AI
            detections = []
            for detection in detections_list:
                formatted_detection = {
                    "class": detection["name"],
                    "confidence": detection["confidence"],
                    "bbox": {
                        "xmin": detection["xmin"],
                        "ymin": detection["ymin"],
                        "xmax": detection["xmax"],
                        "ymax": detection["ymax"],
                    },
                }
                detections.append(formatted_detection)

            # Build prediction response
            prediction = {"detections": detections, "detection_count": len(detections)}

            # Add annotated image if requested and detections exist
            if (
                return_annotated_image
                and result["results"]
                and result["results"][0].boxes is not None
                and len(result["results"][0].boxes) > 0
            ):
                annotated_image = get_annotated_image(result["results"])
                img_bytes = get_bytes_from_image(annotated_image)
                prediction["annotated_image"] = base64.b64encode(img_bytes).decode("utf-8")

            predictions.append(prediction)

        logger.info(
            f"Processed {len(request.instances)} instances, found {sum(len(p['detections']) for p in predictions)} total detections"
        )

        return PredictionResponse(predictions=predictions)

    except HTTPException:
        # Re-raise HTTPException as-is (don't catch and convert to 500)
        raise
    except Exception as e:
        logger.error(f"Prediction error: {e}")
        raise HTTPException(status_code=500, detail=f"Prediction failed: {e}")

最後に、FastAPI サーバーを実行するためのアプリケーションエントリーポイントを追加します。

if __name__ == "__main__":
    import uvicorn

    logger.info(f"Starting server on port {AIP_HTTP_PORT}")
    logger.info(f"Health check route: {AIP_HEALTH_ROUTE}")
    logger.info(f"Predict route: {AIP_PREDICT_ROUTE}")
    uvicorn.run(app, host="0.0.0.0", port=AIP_HTTP_PORT)

これで、YOLO26 の推論リクエストを処理できる完全な FastAPI アプリケーションができました。依存関係をインストールしてサーバーを実行すれば、uv などを使ってローカルでテストできます。

# Install dependencies
uv pip install -e .

# Run the FastAPI server directly
uv run src/main.py

サーバーをテストするには、cURL を使用して /health エンドポイントと /predict エンドポイントの両方にリクエストを送信します。テスト画像を tests フォルダーに配置します。次に、ターミナルで以下のコマンドを実行します。

# Test health endpoint
curl http://localhost:8080/health

# Test predict endpoint with base64 encoded image
curl -X POST -H "Content-Type: application/json" -d "{\"instances\": [{\"image\": \"$(base64 -i tests/test_image.jpg)\"}]}" http://localhost:8080/predict

検出されたオブジェクトを含む JSON レスポンスが返されます。最初のリクエストでは、Ultralytics が YOLO26 モデルを取得して読み込むため、少し時間がかかります。

2. アプリケーションで Ultralytics Docker イメージを拡張する#

Ultralytics は、アプリケーションイメージのベースとして使用できる Docker イメージを複数提供しています。これらには Ultralytics と必要な CUDA ライブラリが含まれているため、その上にアプリケーションを追加するだけで済みます。

Ultralytics YOLO モデルの機能を最大限に活用するには、GPU 推論向けに CUDA 最適化イメージを選択してください。ただし、タスクに CPU 推論で十分な場合は、CPU 専用イメージを選択してコンピューティングリソースを節約することもできます。

  • Dockerfile: YOLO26 のシングル GPU/マルチ GPU のトレーニングと推論向けに CUDA 最適化されたイメージです。
  • Dockerfile-cpu: YOLO26 の推論向け CPU 専用イメージです。

アプリケーション用の Docker イメージを作成する#

プロジェクトのルートに Dockerfile を作成し、次の内容を記述します。

# Extends official Ultralytics Docker image for YOLO26
FROM ultralytics/ultralytics:latest

ENV PYTHONUNBUFFERED=1

# Install FastAPI and dependencies
RUN uv pip install --system fastapi[all] uvicorn[standard] loguru

WORKDIR /app
COPY src/ ./src/
COPY pyproject.toml ./

# Install the application package
RUN uv pip install --system -e .

RUN mkdir -p /app/logs
ENV PYTHONPATH=/app/src

# Port for Vertex AI
EXPOSE 8080

# Start the inference server
ENTRYPOINT ["python", "src/main.py"]

この例では、公式の Ultralytics Docker イメージ ultralytics:latest をベースとして使用しています。このイメージには YOLO26 モデルと必要な依存関係がすべて含まれています。サーバーのエントリーポイントは、FastAPI アプリケーションをローカルでテストしたときと同じです。

Docker イメージをビルドしてテストする#

次のコマンドで Docker イメージをビルドできます。

docker build --platform linux/amd64 -t IMAGE_NAME:IMAGE_VERSION .

IMAGE_NAME と IMAGE_VERSION を希望する値に置き換えます。たとえば、yolo26-fastapi:0.1 のように指定します。Vertex AI にデプロイする場合は、linux/amd64 アーキテクチャ向けにイメージをビルドする必要があります。Apple Silicon 搭載 Mac やその他の非 x86 アーキテクチャのマシンでイメージをビルドする場合は、--platform パラメーターを明示的に設定する必要があります。

イメージのビルドが完了したら、Docker イメージをローカルでテストできます。

docker run --platform linux/amd64 -p 8080:8080 IMAGE_NAME:IMAGE_VERSION

Docker コンテナでポート 8080 上に FastAPI サーバーが起動し、推論リクエストを受け付ける状態になりました。先ほどと同じ cURL コマンドを使用して、/health エンドポイントと /predict エンドポイントの両方をテストできます。

# Test health endpoint
curl http://localhost:8080/health

# Test predict endpoint with base64 encoded image
curl -X POST -H "Content-Type: application/json" -d "{\"instances\": [{\"image\": \"$(base64 -i tests/test_image.jpg)\"}]}" http://localhost:8080/predict

3. Docker イメージを GCP Artifact Registry にアップロードする#

コンテナ化したモデルを Vertex AI にインポートするには、Docker イメージを Google Cloud Artifact Registry にアップロードする必要があります。Artifact Registry リポジトリをまだ作成していない場合は、先に作成してください。

Google Cloud Artifact Registry にリポジトリを作成する#

Google Cloud Console で Artifact Registry ページを開きます。Artifact Registry を初めて使用する場合は、先に Artifact Registry API を有効にするよう求められることがあります。

Google Cloud Artifact Registry repository creation

  1. 「リポジトリを作成」を選択します。
  2. リポジトリ名を入力します。希望するリージョンを選択し、特別な変更が必要な場合を除いて、ほかのオプションはデフォルト設定のままにします。
注

リージョンの選択は、Enterprise 以外のユーザーが利用できるマシンや一部のコンピューティング制限に影響する場合があります。詳しくは、Vertex AI の公式ドキュメントをご覧ください。Vertex AI の割り当てと上限

  1. リポジトリを作成したら、PROJECT_ID、ロケーション(リージョン)、リポジトリ名をシークレット保管庫または .env ファイルに保存します。後で Docker イメージにタグを付け、Artifact Registry にプッシュする際に必要になります。

Docker を Artifact Registry に認証する#

作成した Artifact Registry リポジトリに対して Docker クライアントを認証します。ターミナルで次のコマンドを実行します。

gcloud auth configure-docker YOUR_REGION-docker.pkg.dev

イメージにタグを付けて Artifact Registry にプッシュする#

Docker イメージにタグを付け、Google Artifact Registry にプッシュします。

イメージには一意のタグを使用する

イメージを更新するたびに一意のタグを使用することをおすすめします。Vertex AI を含む多くの GCP サービスは、自動バージョン管理とスケーリングにイメージタグを使用するため、セマンティックバージョニングや日付ベースのタグを使用するのが適切です。

Artifact Registry リポジトリの URL を使ってイメージにタグを付けます。先ほど保存した値でプレースホルダーを置き換えてください。

docker tag IMAGE_NAME:IMAGE_VERSION YOUR_REGION-docker.pkg.dev/YOUR_PROJECT_ID/YOUR_REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION

タグを付けたイメージを Artifact Registry リポジトリにプッシュします。

docker push YOUR_REGION-docker.pkg.dev/YOUR_PROJECT_ID/YOUR_REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION

処理が完了するまでお待ちください。Artifact Registryリポジトリにイメージが表示されます。

Artifact Registryでイメージを操作する方法について詳しくは、Artifact Registryのドキュメントをご覧ください:イメージのプッシュとプル。

4. Vertex AIにモデルをインポートする#

先ほどプッシュしたDockerイメージを使用して、モデルをVertex AIにインポートします。

  1. Google Cloudのナビゲーションメニューで、Vertex AI > Model Registryに移動します。または、Google Cloud Consoleの上部にある検索バーで「Vertex AI」を検索します。

    Vertex AI Model Registry import interface

  2. [Import]をクリックします。

  3. [Import as a new model]を選択します。

  4. リージョンを選択します。Artifact Registryリポジトリと同じリージョンを選択できますが、リージョン内で利用できるマシンタイプとクォータに基づいて選択してください。

  5. [Import an existing model container]を選択します。

    Vertex AI import model dialog

  6. [Container image]フィールドで、先ほど作成したArtifact Registryリポジトリを参照し、先ほどプッシュしたイメージを選択します。

  7. 下にスクロールして[Environment variables]セクションに移動し、FastAPIアプリケーションで定義したpredictエンドポイントとhealthエンドポイント、およびポートを入力します。

    Vertex AI environment variables configuration

  8. [Import]をクリックします。Vertex AIがモデルを登録し、デプロイの準備を整えるまで数分かかります。インポートが完了すると、メール通知が届きます。

5. Vertex AI Endpointを作成してモデルをデプロイする#

Vertex AIにおけるEndpointとModelの違い

Vertex AIの用語では、エンドポイントはデプロイ済みモデルを指します。これは、推論リクエストを送信するHTTPエンドポイントを表すためです。一方、モデルはModel Registryに保存されたトレーニング済みのMLアーティファクトを指します。

モデルをデプロイするには、Vertex AIでEndpointを作成する必要があります。

  1. Vertex AIのナビゲーションメニューで、Endpointsに移動します。モデルのインポート時に使用したリージョンを選択して、Createをクリックします。

    Vertex AI create endpoint interface

  2. [Endpoint name]を入力します。

  3. [Access]については、Vertex AIではプライベートVertex AIエンドポイントの使用が推奨されています。セキュリティ上のメリットに加え、プライベートエンドポイントを選択するとペイロードの上限が高くなりますが、エンドポイントへのアクセスを許可するためにVPCネットワークとファイアウォールルールを設定する必要があります。詳しい手順については、Vertex AIのドキュメントのプライベートエンドポイントを参照してください。

  4. [Continue]をクリックします。

  5. [Model settings]ダイアログで、先ほどインポートしたモデルを選択します。これで、モデルのマシンタイプ、メモリ、GPUの設定を行えます。高い推論負荷が見込まれる場合は、適切なYOLO26のパフォーマンスを確保し、I/Oのボトルネックを防ぐために、十分なメモリを割り当ててください。

  6. [Accelerator type]で、推論に使用するGPUタイプを選択します。どのGPUを選べばよいかわからない場合は、CUDAに対応したNVIDIA T4から始めることができます。

リージョンとマシンタイプのクォータ

一部のリージョンではコンピューティングのクォータが非常に限られているため、そのリージョンで特定のマシンタイプやGPUを選択できない場合があります。これが重要な要件である場合は、クォータに余裕のあるリージョンにデプロイ先を変更してください。詳しくは、Vertex AIの公式ドキュメントをご覧ください:Vertex AIのクォータと上限。

  1. マシンタイプを選択したら、Continueをクリックします。この時点で、Vertex AIのモデルモニタリングを有効にできます。これはモデルのパフォーマンスを追跡し、動作に関するインサイトを提供する追加サービスです。この設定は任意で、追加費用が発生するため、ニーズに応じて選択してください。Createをクリックします。

Vertex AIによるモデルのデプロイには数分かかります(リージョンによっては最大30分)。デプロイが完了すると、メール通知が届きます。

6. デプロイしたモデルをテストする#

デプロイが完了すると、Vertex AIからモデルをテストするためのサンプルAPIインターフェースが提供されます。

リモート推論をテストするには、提供されたcURLコマンドを使用するか、デプロイ済みモデルにリクエストを送信する別のPythonクライアントライブラリを作成します。画像を/predictエンドポイントに送信する前に、画像をbase64にエンコードする必要があります。

Vertex AI endpoint testing with cURL

最初のリクエストには少し時間がかかります

ローカルでのテストと同様に、最初のリクエストには少し時間がかかります。実行中のコンテナでUltralyticsがYOLO26モデルを取得して読み込む必要があるためです。

Ultralyticsを使用して、Google Cloud Vertex AIに事前学習済みYOLO26モデルを正常にデプロイしました。

よくある質問#

  • はい。ただし、まずVertex AIと互換性のあるTensorFlow、Scikit-learn、XGBoostなどの形式にモデルをエクスポートする必要があります。Google Cloudでは、変換プロセスの概要を含む、Vertex上で.ptモデルを実行するためのガイドを提供しています:Vertex AIでPyTorchモデルを実行する。

    この方法ではVertex AIの標準サービングレイヤーのみを使用し、Ultralyticsフレームワークの高度な機能はサポートされない点にご注意ください。Vertex AIはコンテナ化されたモデルを完全にサポートし、デプロイ設定に応じて自動的にスケーリングできるため、別の形式に変換することなく、Ultralytics YOLOモデルの全機能を活用できます。

  • FastAPIは推論ワークロードで高いスループットを実現します。非同期処理に対応しているため、メインスレッドをブロックせずに複数の同時リクエストを処理できます。これは、コンピュータービジョンモデルのサービングにおいて重要です。

    FastAPIによるリクエストとレスポンスの自動検証は、本番環境の推論サービスで発生するランタイムエラーを減らします。入力形式の一貫性が重要な物体検出APIでは、特に有効です。

    FastAPIによる推論パイプラインへの計算オーバーヘッドは最小限であるため、モデル実行や画像処理タスクに利用できるリソースが増えます。

    FastAPIはSSE(サーバー送信イベント)にも対応しており、推論結果のストリーミングに役立ちます。

  • これはGoogle Cloud Platformの柔軟性を高める機能であり、使用するサービスごとにリージョンを選択する必要があります。Vertex AIにコンテナ化されたモデルをデプロイする場合、最も重要なのはModel Registryのリージョン選択です。この選択によって、モデルのデプロイに使用できるマシンタイプとクォータが決まります。

    さらに、構成を拡張して予測データや結果をCloud StorageまたはBigQueryに保存する場合は、レイテンシーを最小限に抑え、データアクセスの高いスループットを確保するため、Model Registryと同じリージョンを使用する必要があります。

コメント