Ultralytics YOLO27: ウェイトリストに登録する。
Get Started
Ultralytics Platformで構築する·デプロイとモニタリング·レッスン 7/10
レッスン中級

エンドポイントをデプロイして呼び出す

42か所のリージョンから専用エンドポイントを作成し、トラフィックに合わせてサイズを設定します。コールドスタート、429エラー、無効なキーに対応するクライアントから呼び出します。

ゼロまでスケールする無料エンドポイントでは、最初のリクエストへの応答に最大1分かかることがあり、単純なクライアントではユーザー向けのタイムアウトにつながります。キーが漏えいすると、削除後も使い続けられます。このレッスンでは、最適なモデルをデプロイし、エンドポイントのサイズを慎重に選び、本番環境のすべての統合に必要な小さなクライアントを作成します。

成果

モデルを専用エンドポイントにデプロイし、トラフィックパターンに基づいて無料またはカスタムサイズを選択できます。また、コールドスタートと429エラーには再試行し、実際のエラーでは即座に失敗するクライアントから呼び出せます。

短期集中コース
すでに使い方をご存じの方は、こちらをご覧ください。
  1. モデルの Deploy タブで、レイテンシが最も低いリージョンのDeployをクリックします。

  2. まずは無料の1 vCPU、2 GiBサイズを利用し、安定したリアルタイムトラフィックがある場合のみカスタムサイズにしてください。

  3. デプロイに紐付いたキーを使い、サーバーから /predict を呼び出します。429エラーやタイムアウトはバックオフを伴って再試行します。

  4. 新しいモデルは Replace model でリリースします。URL、リージョン、キーは変わりません。

実践的

共有推論または専用エンドポイント#

すべてのモデルはPlatformの共有推論APIを通じてすでに呼び出すことができ、テストに適しています。本番トラフィックには専用エンドポイントを使用します。

共有推論専用エンドポイント
サービスPlatformユーザー間で共有単一テナントで1モデル
リージョンデータリージョン(US、EU、またはAP)42か所のリージョンから選択
レート制限キーごとに1分あたり20リクエスト直接呼び出しにPlatformの制限なし
リクエストサイズ約4.5 MB32 MB、リクエストあたり最大1時間(動画にも対応)
認証任意のワークスペース API キーデプロイメントに紐付けられたキーのみ

エンドポイントを作成してサイズを設定する#

モデルの Deploy タブを開きます。ブラウザーが全42リージョン(南北アメリカ14、ヨーロッパ13、アジア太平洋12、中東・アフリカ3)へのレイテンシを測定し、その値でテーブルを並べ替えます。

Ultralytics PlatformのモデルのDeployタブ。リージョンのピンが表示された世界地図と、測定レイテンシ順に並び、各行にDeployボタンがあるRegion Latencyテーブル

呼び出し元に最も近い行の Deploy をクリックし、CPU、メモリ、料金、生成された名前(yolo26n-iowa など)を確認して、Create Deployment をクリックします。プロフィールのDeploymentsタブにある New Deployment から開始することもできます。

Ultralytics PlatformのNew Deploymentダイアログ。モデルセレクター、レイテンシテーブル付きのリージョンミニマップ、1 vCPUと2 GiBに設定されたCPUとメモリ

トラフィックパターンに応じたサイズ設定:

トラフィック規模費用
バッチジョブ、社内ツール、断続的に負荷が高まるデモデフォルトは1 vCPU、2 GiB。ゼロまでスケールしますすべてのプランで無料
コールドスタートを待てない、安定したリアルタイムトラフィックカスタムサイズ(1~8 vCPU、2~32 GiB)で、ウォーム状態のインスタンスを1つ維持利用可能になってから停止するまで、アイドル時間も含めて時間単位で課金されます。アイオワでは1 vCPU、4 GiBで約$0.12/時です
複数の大陸にいるユーザー独自のルーターの背後にリージョンごとに1つのエンドポイント各エンドポイントはサイズに応じて課金

Ultralytics PlatformのNew Deploymentダイアログ。リージョンレイテンシテーブルと、カスタムサイズの1 vCPU、4 GiBに設定されたCPUおよびメモリセレクター

プランごとのデプロイメント数は、Freeで3、Proで10、Enterpriseで無制限です。停止中のエンドポイントも数に含まれます。バッジが Ready になると、エンドポイントでトラフィックを受け付けます。

実例:本番環境に耐えるクライアント#

Ultralytics Platformのexp-3-los-angelesデプロイメントページ。リクエスト、エラー率、P95レイテンシのカード、ロケーションマップ、コピー可能なエンドポイントURLがあるEndpointカード、料金を含むDeployment Information

各エンドポイントには https://predict-<id>-<hash>-<region>.a.run.app のようなURLがあり、/predict(POST)、/health、インタラクティブな /docs ページを提供します。作成時に紐付けられたAPIキーのみを受け付けます。ワークスペースのオーナーには、そのキーがデプロイメントの Predict タブの Docs にあらかじめ入力され、Python、JavaScript、cURLのスニペットとともに表示されます。スニペットはリクエストを1回送るだけです。本番コードでは、コールドスタートやインスタンスの高負荷にも対処する必要があります。

import os
import time
from collections import Counter

import httpx

URL = "https://YOUR_DEPLOYMENT_URL.run.app/predict"
HEADERS = {"Authorization": f"Bearer {os.environ['ULTRALYTICS_API_KEY']}"}  # the deployment's bound key, server-side only

def predict(client, path, conf=0.25, attempts=4):
    """POST one image; retry timeouts, 429, and 5xx with backoff; fail fast on other errors."""
    for attempt in range(attempts):
        try:
            with open(path, "rb") as f:
                r = client.post(URL, headers=HEADERS, data={"conf": conf}, files={"file": f}, timeout=90)
            if r.status_code < 400:
                return r.json()
            if r.status_code != 429 and r.status_code < 500:
                r.raise_for_status()  # 401 wrong key, 413 too large: retrying won't help
            wait, reason = float(r.headers.get("Retry-After", 2**attempt)), r.status_code
        except httpx.TimeoutException:  # a scaled-to-zero endpoint can take up to a minute to wake
            wait, reason = 2**attempt, "timeout"
        print(f"attempt {attempt + 1}: {reason}, retrying in {wait:.0f} s")
        time.sleep(wait)
    raise RuntimeError(f"endpoint still unavailable after {attempts} attempts")

with httpx.Client() as client:
    response = predict(client, "bus.jpg")
for image in response["images"]:
    counts = Counter(d["name"] for d in image["results"])
    print(f"{sum(counts.values())} objects {dict(counts)} in {image['speed']['inference']:.1f} ms")

ローカルスタブでテストしました。このスタブは 429 に一度応答した後、エンドポイントのレスポンス形式で bus.jpg に対する実際のYOLO26nの結果を返します。

attempt 1: 429, retrying in 2 s
5 objects {'bus': 1, 'person': 4} in 34.9 ms

重要な判断ポイントを1行ずつ見ていきます。

  • timeout=90 は最大約1分のコールドスタートに対応します。一般的なHTTPクライアントのデフォルトのタイムアウトは、これより大幅に短く設定されています。
  • 429と5xxは再試行されます。エンドポイントから送信された場合は Retry-After に従います。各エンドポイントは単一のインスタンスでリクエストを処理し、負荷が高い場合は 429 で負荷を抑えます。
  • その他の4xxエラーは即座に失敗します。 401 はキーの誤り、413 は32 MBを超えるボディを意味し、どちらも再試行しても解決しません。
  • レスポンスには、images に画像(または動画フレーム)ごとに1つのエントリーが含まれます。各エントリーには results(class、name、confidence、box と x1、y1、x2、y2)と、ミリ秒単位の speed が含まれます。

任意のフォームフィールドは conf(デフォルト0.25)、iou(0.7)、imgsz(モデルのトレーニングサイズ)、動画用の vid_stride、0~1の座標用の normalize=true です。cURLの場合、各フィールドを1行で指定します。

curl -X POST "https://YOUR_DEPLOYMENT_URL.run.app/predict" \
  -H "Authorization: Bearer $ULTRALYTICS_API_KEY" \
  -F "file=@bus.jpg" -F "conf=0.25" -F "iou=0.7" -F "imgsz=640"

URLを変えずに新しいバージョンをリリースする#

デプロイメントページの Replace model では、同じワークスペース内で学習が完了した別のモデルに切り替えられます。新しいモデルの準備ができるまでは古いモデルが引き続きリクエストを処理し、URL、リージョン、キーは変わりません。ロールアウトに失敗した場合は、以前のモデルが引き続き稼働します。ロールバックは、以前のモデルを指定して同じ操作を行うだけなので、そのモデルはプロジェクト内に保持してください。Update configuration ではその場でサイズを変更でき、Stop ではURLを維持したまま課金を一時停止できます。

一部の変更には新しいエンドポイントが必要です。リージョンは固定されているため、移動するには削除して再作成する必要があり、新しいURLになります。また、カスタムドメインには対応していません。呼び出し元に一貫したブランド名のホスト名が必要な場合は、独自のゲートウェイを前段に配置してください。Platformの外部で実行するには、モデルをエクスポート(デプロイメント用にエクスポート)するか、Triton Inference Serverの背後でセルフホストしてください。

よくある落とし穴#

API キーがブラウザーに含まれてしまう

症状: エンドポイントに、原因を特定できないトラフィックが届いています。対処法: キーを Web アプリやモバイルアプリに含めず、バックエンドからエンドポイントを呼び出してください。紐付けられたキーを削除または無効化しても、そのキー文字列を引き続き受け付けるため、エンドポイントは保護されません。アクセスを取り消すには、デプロイを停止または削除し、新しいキーを紐付けて新たにデプロイしてください。

夜間の無通信後、最初のリクエストがタイムアウトする

症状: 朝一番のリクエストは失敗しますが、再試行すると成功します。対処法: デフォルトサイズのエンドポイントは、インスタンス数がゼロまでスケールします。タイムアウトを少なくとも 90 秒に設定するか、予想されるトラフィックの前に /health 呼び出しでエンドポイントをウォームアップするか、すべてのリクエストに高速な応答が必要な場合はカスタムサイズに切り替えてください。

大きな動画が拒否される

症状: アップロードが 413 で失敗します。対処法: 専用エンドポイントが受け付けるリクエストボディの上限は 32 MB です。長い動画は短いクリップに分割するか、サンプリングしたフレームを送信し、vid_stride を渡してサーバー側でフレームをスキップしてください。

試してみる

最も低レイテンシのリージョンに、デフォルトサイズで最良のモデルをデプロイします。サーバーまたはターミナルから client.py を使って呼び出し、エンドポイントのページを開かずに1時間アイドル状態にした後のリクエストと、その直後のリクエストの所要時間を測定します。最後に、モデルを次点のモデルに置き換え、同じURLから新しいモデルの結果が返ることを確認します。

完了条件
以下のすべてを満たすと、レッスンは完了です。
  • client.py はエンドポイントからオブジェクト数を出力します。

  • コールド状態とウォーム状態のリクエストを測定し、月額費用とともにサイズ設定の判断を記録しました。

  • モデルの置き換えが完了し、同じURLから新しいモデルの結果が返されました。

解答を表示

錠剤のラインカメラの回答例:v2-finetune を europe-west1(ドイツ工場からのレイテンシが最も低いサン=ギスラン)にデフォルトサイズでデプロイします。1時間アイドル状態にした後のコールドリクエストは38秒で、90秒のタイムアウト内に収まります。ウォーム状態のリクエストは0.3秒です。シフト中、ラインのPLCは30秒ごとにフレームを送信するため、エンドポイントはシフト中ずっとウォーム状態を保ち、コールドスタートが発生するのは最初のフレームだけです。各シフトの2分前にラインコントローラーから /health を呼び出せば、コールドスタートも解消できるため、無料のデフォルトサイズを維持できます。これにより、カスタムの1 vCPU、4 GiBインスタンスと比べて月額約90ドルを節約できます。モデルを v1-baseline に戻すと、同じURLから v1 の結果が返されます。最後に、もう一度 v2 に置き換えます。

次のステップ

稼働を開始しました。次に、エンドポイントまたはモデルの異常を検知する2つのチェックを作成します。