Ultralytics를 사용하여 Vertex AI에서 사전 훈련된 YOLO 모델을 배포하여 추론합니다.
이 가이드에서는 Ultralytics를 사용하여 사전 훈련된 YOLO11 모델을 컨테이너화하고, 이를 위한 FastAPI 추론 서버를 구축하고, Google Cloud Vertex AI에 추론 서버와 함께 모델을 배포하는 방법을 보여줍니다. 예제 구현에서는 YOLO11의 객체 감지 사용 사례를 다루지만 다른 YOLO 모드를 사용하는 데에도 동일한 원리가 적용됩니다.
시작하기 전에 Google Cloud Platform (GCP) 프로젝트를 만들어야 합니다. 신규 사용자는 무료로 사용할 수 있는 GCP 크레딧 $300를 받게 되며, 이 금액은 학습, 배치 및 스트리밍 추론을 포함하여 다른 YOLO11 사용 사례로 확장할 수 있는 실행 설정을 테스트하기에 충분합니다.
무엇을 배우게 될까요?
- FastAPI를 사용하여 Ultralytics YOLO11 모델을 위한 추론 백엔드를 생성합니다.
- Docker 이미지를 저장할 GCP Artifact Registry 저장소를 생성합니다.
- 모델이 포함된 Docker 이미지를 빌드하고 Artifact Registry에 푸시합니다.
- Vertex AI에서 모델을 가져옵니다.
- Vertex AI 엔드포인트를 생성하고 모델을 배포합니다.
컨테이너화된 모델을 배포해야 하는 이유
- Ultralytics를 통한 전체 모델 제어: 전처리, 후처리 및 응답 형식에 대한 완전한 제어를 통해 사용자 정의 추론 로직을 사용할 수 있습니다.
- Vertex AI가 나머지를 처리합니다: 자동 크기 조정이 가능하며, 컴퓨팅 리소스, 메모리 및 GPU 구성을 유연하게 설정할 수 있습니다.
- 기본 GCP 통합 및 보안: Cloud Storage, BigQuery, Cloud Functions, VPC 컨트롤, IAM 정책 및 감사 로그를 통해 원활하게 설정할 수 있습니다.
필수 조건
- 머신에 Docker를 설치합니다.
- Google Cloud SDK를 설치하고 gcloud CLI 사용을 위해 인증합니다.
- 이 가이드를 따라 하는 동안 공식 Ultralytics Docker 이미지 중 하나를 확장해야 하므로 Ultralytics용 Docker 퀵스타트 가이드를 먼저 살펴보는 것이 좋습니다.
1. FastAPI로 추론 백엔드를 만듭니다.
먼저 YOLO11 모델 추론 요청을 처리할 FastAPI 애플리케이션을 생성해야 합니다. 이 애플리케이션은 모델 로딩, 이미지 전처리 및 추론(예측) 로직을 처리합니다.
Vertex AI 규정 준수 기본 사항
Vertex AI는 컨테이너가 두 개의 특정 엔드포인트를 구현할 것으로 예상합니다.
- 건강 엔드포인트(
/health
): HTTP 상태를 반환해야 합니다.200 OK
서비스가 준비되면. -
예측 엔드포인트(
/predict
): 구조화된 예측 요청을 수락합니다. base64 인코딩 이미지 및 선택적 매개변수. 페이로드 크기 제한 엔드포인트 유형에 따라 적용됩니다.다음에 대한 요청 페이로드
/predict
엔드포인트는 다음 JSON 구조를 따라야 합니다.{ "instances": [{ "image": "base64_encoded_image" }], "parameters": { "confidence": 0.5 } }
프로젝트 폴더 구조
대부분의 빌드는 Docker 컨테이너 내부에서 수행되며, Ultralytics는 사전 훈련된 YOLO11 모델도 로드하므로 로컬 폴더 구조를 간단하게 유지할 수 있습니다.
YOUR_PROJECT/
├── src/
│ ├── __init__.py
│ ├── app.py # Core YOLO11 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 YOLO11 모델 및 프레임워크는 중요한 규정 준수 요구 사항이 있는 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.3.0",
"fastapi[all]>=0.89.1",
"uvicorn[standard]>=0.20.0",
"pillow>=9.0.0",
]
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
uvicorn
FastAPI 서버를 실행하는 데 사용됩니다.pillow
이미지 처리에 사용되지만 PIL 이미지에만 국한되지는 않습니다. Ultralytics는 다음을 지원합니다. 기타 다양한 형식.
Ultralytics YOLO11로 추론 로직 생성
이제 프로젝트 구조와 종속성이 설정되었으므로 핵심 YOLO11 추론 로직을 구현할 수 있습니다. 다음을 만듭니다. src/app.py
Ultralytics python API를 사용하여 모델 로딩, 이미지 처리 및 예측을 처리할 파일입니다.
# 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 pre-trained YOLO11n model from Ultralytics base image
model_yolo = YOLO("yolo11n.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
YOLO11은 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 YOLO11n model."""
global model_yolo
# 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]
# Use Ultralytics built-in plot method with PIL output
return result.plot(pil=True)
FastAPI로 HTTP 추론 서버 생성
이제 핵심 YOLO11 추론 로직이 있으므로 FastAPI 애플리케이션을 만들어 제공할 수 있습니다. 여기에는 Vertex AI에 필요한 상태 확인 및 예측 엔드포인트가 포함됩니다.
먼저 Vertex AI에 필요한 import를 추가하고 로깅을 구성합니다. Vertex AI는 stderr를 오류 출력으로 처리하므로 로그를 stdout으로 파이프하는 것이 좋습니다.
import sys
from loguru import logger
# Configure logger
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.5MB 대신 10MB)을 확보할 수 있습니다.
# Vertex AI environment variables
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")
# Request size limit (10 MB for private endpoints, 1.5 MB for public)
MAX_REQUEST_SIZE = 10 * 1024 * 1024 # 10 MB in bytes
요청 및 응답 유효성 검사를 위한 두 개의 Pydantic 모델을 추가합니다.
# Pydantic models for request/response
class PredictionRequest(BaseModel):
instances: list
parameters: Optional[Dict[str, Any]] = None
class PredictionResponse(BaseModel):
predictions: list
모델 준비 상태를 확인하기 위해 상태 확인 엔드포인트를 추가합니다. 이는 Vertex AI에 중요합니다., 전용 상태 확인이 없으면 오케스트레이터가 임의 소켓에 ping을 보내고 모델이 추론을 위한 준비가 되었는지 확인할 수 없습니다. 상태 확인은 다음을 반환해야 합니다. 200 OK
성공을 위해 503 Service Unavailable
실패 시:
# Health check endpoint
@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 YOLO11 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 YOLO11n 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
):
import base64
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: {str(e)}")
raise HTTPException(status_code=500, detail=f"Prediction failed: {str(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)
이제 YOLO11 추론 요청을 처리할 수 있는 완전한 FastAPI 애플리케이션이 있습니다. 예를 들어 uv를 사용하여 종속성을 설치하고 서버를 실행하여 로컬에서 테스트할 수 있습니다.
# Install dependencies
uv pip install -e .
# Run the FastAPI server directly
uv run src/main.py
서버를 테스트하려면 다음을 모두 쿼리할 수 있습니다. /health
및 /predict
cURL을 사용하여 엔드포인트. 테스트 이미지를 다음 위치에 넣으세요. 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가 YOLO11 모델을 가져와 로드해야 하므로 약간의 지연이 예상됩니다.
2. Ultralytics Docker 이미지를 애플리케이션으로 확장합니다.
Ultralytics는 애플리케이션 이미지의 기반으로 사용할 수 있는 여러 Docker 이미지를 제공합니다. Docker는 Ultralytics와 필요한 GPU 드라이버를 설치합니다.
Ultralytics YOLO 모델의 모든 기능을 사용하려면 GPU 추론에 최적화된 CUDA 이미지를 선택해야 합니다. 그러나 CPU 추론으로도 작업에 충분하다면 CPU 전용 이미지를 선택하여 컴퓨팅 리소스를 절약할 수 있습니다.
- Dockerfile: YOLO11 단일/다중 GPU 훈련 및 추론을 위해 CUDA에 최적화된 이미지입니다.
- Dockerfile-cpu: YOLO11 추론을 위한 CPU 전용 이미지입니다.
애플리케이션을 위한 Docker 이미지 생성
파일 만들기 Dockerfile
프로젝트 루트에서 다음 내용으로:
# Extends official Ultralytics Docker image for YOLO11
FROM ultralytics/ultralytics:latest
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1
# Install FastAPI and dependencies
RUN uv pip install fastapi[all] uvicorn[standard] loguru
WORKDIR /app
COPY src/ ./src/
COPY pyproject.toml ./
# Install the application package
RUN uv pip install -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
기반으로 사용됩니다. 여기에는 이미 YOLO11 모델과 필요한 모든 종속성이 포함되어 있습니다. 서버의 진입점은 로컬에서 FastAPI 애플리케이션을 테스트하는 데 사용했던 것과 동일합니다.
Docker 이미지 빌드 및 테스트
이제 다음 명령으로 Docker 이미지를 빌드할 수 있습니다.
docker build --platform linux/amd64 -t IMAGE_NAME:IMAGE_VERSION .
다음을 대체하십시오. IMAGE_NAME
및 IMAGE_VERSION
예를 들어 원하는 값을 사용합니다. yolo11-fastapi:0.1
다음을 위해 이미지를 빌드해야 합니다. linux/amd64
Vertex AI에 배포하는 경우 아키텍처입니다. --platform
Apple Silicon Mac 또는 다른 비 x86 아키텍처에서 이미지를 빌드하는 경우 파라미터를 명시적으로 설정해야 합니다.
이미지 빌드가 완료되면 Docker 이미지를 로컬에서 테스트할 수 있습니다.
docker run --platform linux/amd64 -p 8080:8080 IMAGE_NAME:IMAGE_VERSION
이제 Docker 컨테이너가 포트에서 FastAPI 서버를 실행하고 있습니다. 8080
, 추론 요청을 수락할 준비가 되었습니다. 다음을 모두 테스트할 수 있습니다. /health
그리고 /predict
이전과 동일한 cURL 명령으로 엔드포인트:
# 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를 먼저 활성화하라는 메시지가 표시될 수 있습니다.
- Create Repository를 선택합니다.
- 리포지토리 이름을 입력하세요. 필요한 경우 특정 설정을 변경해야 하는 경우가 아니라면 원하는 지역을 선택하고 다른 옵션은 기본 설정을 사용하세요.
참고
리전 선택은 Enterprise 사용자가 아닌 경우 머신 가용성 및 특정 컴퓨팅 제한에 영향을 줄 수 있습니다. 자세한 내용은 Vertex AI 공식 문서(Vertex AI 할당량 및 제한)에서 확인할 수 있습니다.
- 리포지토리가 생성되면 PROJECT_ID, 위치(지역) 및 리포지토리 이름을 비밀 볼트에 저장하거나
.env
파일. Docker 이미지를 Artifact Registry에 태그하고 푸시하려면 나중에 필요합니다.
Artifact Registry에 Docker 인증
방금 생성한 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에서 모델을 가져올 수 있습니다.
-
Google Cloud 탐색 메뉴에서 Vertex AI > 모델 레지스트리로 이동합니다. 또는 Google Cloud Console 상단의 검색 창에서 "Vertex AI"를 검색합니다.
-
가져오기를 클릭합니다.
- Import as a new model을 선택합니다.
- 리전을 선택합니다. Artifact Registry 리전과 동일한 리전을 선택할 수 있지만, 머신 유형 및 할당량 가용성에 따라 선택해야 합니다.
-
Import an existing model container를 선택합니다.
-
컨테이너 이미지 필드에서 이전에 생성한 Artifact Registry 저장소를 찾아 방금 푸시한 이미지를 선택합니다.
-
환경 변수 섹션으로 스크롤하여 predict 및 health 엔드포인트와 FastAPI 애플리케이션에서 정의한 포트를 입력합니다.
-
가져오기를 클릭합니다. Vertex AI는 모델을 등록하고 배포를 준비하는 데 몇 분 정도 걸립니다. 가져오기가 완료되면 이메일 알림을 받게 됩니다.
5. Vertex AI 엔드포인트를 생성하고 모델을 배포합니다.
Vertex AI의 엔드포인트 대 모델
Vertex AI 용어에서 엔드포인트는 추론 요청을 보내는 HTTP 엔드포인트를 나타내므로 배포된 모델을 의미하는 반면 모델은 모델 레지스트리에 저장된 학습된 ML 아티팩트를 의미합니다.
모델을 배포하려면 Vertex AI에서 엔드포인트를 만들어야 합니다.
- Vertex AI 탐색 메뉴에서 엔드포인트로 이동합니다. 모델을 가져올 때 사용한 리전을 선택합니다. 만들기를 클릭합니다.
- 엔드포인트 이름을 입력하세요.
- Access의 경우 Vertex AI는 비공개 Vertex AI 엔드포인트 사용을 권장합니다. 보안 이점 외에도 비공개 엔드포인트를 선택하면 더 높은 페이로드 제한을 얻을 수 있지만 엔드포인트에 대한 액세스를 허용하도록 VPC 네트워크 및 방화벽 규칙을 구성해야 합니다. 비공개 엔드포인트에 대한 자세한 내용은 Vertex AI 설명서를 참조하십시오.
- 계속을 클릭합니다.
- 모델 설정 대화 상자에서 이전에 가져온 모델을 선택합니다. 이제 모델의 머신 유형, 메모리 및 GPU 설정을 구성할 수 있습니다. 적절한 YOLO11 성능을 위해 I/O 병목 현상이 발생하지 않도록 높은 추론 부하가 예상되는 경우 충분한 메모리를 확보하십시오.
-
Accelerator type에서 추론에 사용할 GPU 유형을 선택합니다. 어떤 GPU를 선택해야 할지 확실하지 않은 경우 CUDA를 지원하는 NVIDIA T4로 시작할 수 있습니다.
리전 및 머신 유형 할당량
특정 리전은 컴퓨팅 할당량이 매우 제한적이므로 해당 리전에서 특정 머신 유형 또는 GPU를 선택하지 못할 수 있습니다. 이것이 중요한 경우 배포 리전을 할당량이 더 큰 리전으로 변경하십시오. 자세한 내용은 Vertex AI 공식 문서(Vertex AI 할당량 및 제한)에서 확인하십시오.
-
머신 유형을 선택했으면 계속을 클릭할 수 있습니다. 이 시점에서 Vertex AI에서 모델 모니터링을 활성화하도록 선택할 수 있습니다. 이는 모델의 성능을 추적하고 동작에 대한 통찰력을 제공하는 추가 서비스입니다. 이는 선택 사항이며 추가 비용이 발생하므로 필요에 따라 선택하십시오. 만들기를 클릭합니다.
Vertex AI는 모델을 배포하는 데 몇 분(일부 지역에서는 최대 30분)이 소요됩니다. 배포가 완료되면 이메일 알림을 받게 됩니다.
6. 배포된 모델 테스트
배포가 완료되면 Vertex AI에서 모델을 테스트할 수 있는 샘플 API 인터페이스를 제공합니다.
원격 추론을 테스트하려면 제공된 cURL 명령을 사용하거나 배포된 모델에 요청을 보낼 다른 python 클라이언트 라이브러리를 만들 수 있습니다. 이미지를 base64로 인코딩하여 전송해야 합니다. /predict
엔드포인트.
첫 번째 요청 시 약간의 지연이 예상됩니다.
로컬 테스트와 유사하게, Ultralytics가 실행 중인 컨테이너에서 YOLO11 모델을 가져오고 로드해야 하므로 첫 번째 요청 시 약간의 지연이 예상됩니다.
축하합니다! Ultralytics를 사용하여 Google Cloud Vertex AI에 사전 학습된 YOLO11 모델을 성공적으로 배포했습니다.
FAQ
Docker 없이 Vertex AI에서 Ultralytics YOLO 모델을 사용할 수 있습니까?
예, 하지만 먼저 TensorFlow, Scikit-learn 또는 XGBoost와 같이 Vertex AI와 호환되는 형식으로 모델을 내보내야 합니다. Google Cloud는 실행에 대한 가이드를 제공합니다. .pt
전환 프로세스에 대한 전체 개요와 함께 Vertex의 모델: Vertex AI에서 PyTorch 모델 실행.
결과 설정은 Vertex AI 표준 서비스 계층에만 의존하며 고급 Ultralytics 프레임워크 기능은 지원하지 않습니다. Vertex AI는 컨테이너화된 모델을 완전히 지원하고 배포 구성에 따라 자동으로 확장할 수 있으므로 다른 형식으로 변환할 필요 없이 Ultralytics YOLO 모델의 모든 기능을 활용할 수 있습니다.
FastAPI가 YOLO11 추론 제공에 적합한 선택인 이유는 무엇인가요?
FastAPI는 추론 워크로드에 대해 높은 처리량을 제공합니다. 비동기 지원을 통해 메인 스레드를 차단하지 않고 여러 동시 요청을 처리할 수 있으며, 이는 컴퓨터 비전 모델을 제공할 때 중요합니다.
FastAPI를 사용한 자동 요청/응답 유효성 검사는 프로덕션 추론 서비스에서 런타임 오류를 줄여줍니다. 이는 입력 형식의 일관성이 중요한 객체 감지 API에 특히 유용합니다.
FastAPI는 추론 파이프라인에 대한 계산 오버헤드를 최소화하여 모델 실행 및 이미지 처리 작업에 더 많은 리소스를 사용할 수 있도록 합니다.
FastAPI는 스트리밍 추론 시나리오에 유용한 SSE(Server-Sent Events)도 지원합니다.
왜 이렇게 여러 번 지역을 선택해야 하나요?
이는 실제로 Google Cloud Platform의 다재다능한 기능으로, 사용하는 모든 서비스에 대해 리전을 선택해야 합니다. Vertex AI에 컨테이너화된 모델을 배포하는 작업의 경우 가장 중요한 리전 선택은 모델 레지스트리용입니다. 모델 배포에 사용할 수 있는 머신 유형 및 할당량을 결정합니다.
또한 설정 확장을 통해 예측 데이터 또는 결과를 클라우드 스토리지 또는 BigQuery에 저장하는 경우 데이터 액세스에 대한 대기 시간을 최소화하고 높은 처리량을 보장하기 위해 모델 레지스트리와 동일한 리전을 사용해야 합니다.