рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдВ

Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде Ultralytics YOLOv8

рд╡рд╣реА Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░ (рдкреВрд░реНрд╡ рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ TensorRT рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░) NVIDIA рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрд╣ NVIDIA GPU рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХреНрд▓рд╛рдЙрдб рдЕрдиреБрдорд╛рди рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред Triton рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдПрдЖрдИ рдореЙрдбрд▓ рдХреА рддреИрдирд╛рддреА рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдПрдХреАрдХрд░рдг Ultralytics YOLOv8 рдХреЗ рд╕рд╛рде Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░ рдЖрдкрдХреЛ рд╕реНрдХреЗрд▓реЗрдмрд▓, рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдЧрд╣рди рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдорд╛рди рд╡рд░реНрдХрд▓реЛрдб рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдПрдХреАрдХрд░рдг рдХреЛ рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ.



рд╕рддрд░реНрдХрддрд╛: NVIDIA рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░ред

рдХреНрдпрд╛ рд╣реИ Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░?

Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░ рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ AI рдореЙрдбрд▓ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЧрд╣рд░реА рд╢рд┐рдХреНрд╖рд╛ рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ TensorFlow, PyTorch, ONNX рд░рдирдЯрд╛рдЗрдо, рдФрд░ рдХрдИ рдЕрдиреНрдпред рдЗрд╕рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ:

  • рдПрдХрд▓ рд╕рд░реНрд╡рд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗ рдХрдИ рдореЙрдбрд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ред
  • рд╕рд░реНрд╡рд░ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рдЧрддрд┐рд╢реАрд▓ рдореЙрдбрд▓ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдЕрдирд▓реЛрдбрд┐рдВрдЧред
  • рдЕрдиреБрдорд╛рди, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдореЙрдбрд▓реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • A/B рдкрд░реАрдХреНрд╖рдг рдФрд░ рд░реЛрд▓рд┐рдВрдЧ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рд╕рдВрд╕реНрдХрд░рдгред

рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ рд╣реИрдВ:

  • рдЖрдкрдХреА рдорд╢реАрди рдкрд░ рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред
  • рдкрджрд╛рд╕реАрди рдХрд░рдирд╛ tritonclient:
    pip install tritonclient[all]
    

рдирд┐рд░реНрдпрд╛рдд YOLOv8 рддрдХ ONNX рдкреНрд░рд╛рд░реВрдк

рдореЙрдбрд▓ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Triton, рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ONNX рдкреНрд░рд╛рд░реВрдкред ONNX (рдУрдкрди рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдПрдХреНрд╕рдЪреЗрдВрдЬ) рдПрдХ рдкреНрд░рд╛рд░реВрдк рд╣реИ рдЬреЛ рдореЙрдбрд▓ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЧрд╣рди рд╢рд┐рдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ export рдлрд╝рдВрдХреНрд╢рди рд╕реЗ YOLO рдХрдХреНрд╖рд╛:

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # load an official model

# Export the model
onnx_file = model.export(format='onnx', dynamic=True)

рд╕реНрдерд╛рдкрдирд╛ Triton рдореЙрдбрд▓ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА

рд╡рд╣реА Triton рдореЙрдбрд▓ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдПрдХ рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ Triton рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдФрд░ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  1. рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдБ:

    from pathlib import Path
    
    # Define paths
    triton_repo_path = Path('tmp') / 'triton_repo'
    triton_model_path = triton_repo_path / 'yolo'
    
    # Create directories
    (triton_model_path / '1').mkdir(parents=True, exist_ok=True)
    
  2. рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ ONNX рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ Triton рдХреЛрд╖:

    from pathlib import Path
    
    # Move ONNX model to Triton Model path
    Path(onnx_file).rename(triton_model_path / '1' / 'model.onnx')
    
    # Create config file
    (triton_model_path / 'config.pbtxt').touch()
    

рднрд╛рдЧрдирд╛ Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░

рдЪрд▓рд╛рдПрдБ Triton рдбреЙрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░:

import subprocess
import time

from tritonclient.http import InferenceServerClient

# Define image https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver
tag = 'nvcr.io/nvidia/tritonserver:23.09-py3'  # 6.4 GB

# Pull the image
subprocess.call(f'docker pull {tag}', shell=True)

# Run the Triton server and capture the container ID
container_id = subprocess.check_output(
    f'docker run -d --rm -v {triton_repo_path}:/models -p 8000:8000 {tag} tritonserver --model-repository=/models',
    shell=True).decode('utf-8').strip()

# Wait for the Triton server to start
triton_client = InferenceServerClient(url='localhost:8000', verbose=False, ssl=False)

# Wait until model is ready
for _ in range(10):
    with contextlib.suppress(Exception):
        assert triton_client.is_model_ready(model_name)
        break
    time.sleep(1)

рдлрд┐рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдорд╛рди рдЪрд▓рд╛рдПрдВ Triton рд╕рд░реНрд╡рд░ рдореЙрдбрд▓:

from ultralytics import YOLO

# Load the Triton Server model
model = YOLO(f'http://localhost:8000/yolo', task='detect')

# Run inference on the server
results = model('path/to/image.jpg')

рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕рд╛рдл рдХрд░реЗрдВ:

# Kill and remove the container at the end of the test
subprocess.call(f'docker kill {container_id}', shell=True)

рдЙрдкрд░реЛрдХреНрдд рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рдЖрдк рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ Ultralytics YOLOv8 рдореЙрдбрд▓ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЪрд╛рд▓реВ Triton рдЕрдиреБрдорд╛рди рд╕рд░реНрд╡рд░, рдЧрд╣рди рд╢рд┐рдХреНрд╖рдг рдЕрдиреБрдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдФрд░ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЖрдкрдХреЗ рдФрд░ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рджреЗрдЦреЗрдВ рдЕрдлрд╝рд╕рд░ Triton рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдпрд╛ рддрдХ рдкрд╣реБрдВрдЪреЗрдВ Ultralytics рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рд╕рдореБрджрд╛рдпред



2023-11-12 рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ 2024-02-03
рд▓реЗрдЦрдХ: рдЧреНрд▓реЗрди-рдЬреЛрдЪрд░ (5)

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ