Vertex AI์ NVIDIA Triton
Vertex AI๋ NVIDIA GPU Cloud(NGC) - NVIDIA Triton ์ถ๋ก ์๋ฒ ์ด๋ฏธ์ง๋ก ๊ฒ์๋ ์ปค์คํ ์ปจํ ์ด๋์์ ์คํ๋๋ Triton ์ถ๋ก ์๋ฒ์ ๋ชจ๋ธ ๋ฐฐํฌ๋ฅผ ์ง์ํฉ๋๋ค. NVIDIA์ Triton ์ด๋ฏธ์ง์๋ ์ปค์คํ ์ ๊ณต ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๋ํ Vertex AI ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ชจ๋ ํ์ ํจํค์ง ๋ฐ ๊ตฌ์ฑ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฏธ์ง์๋ TensorFlow, PyTorch, TensorRT, ONNX, OpenVINO ๋ชจ๋ธ ์ง์๊ณผ ํจ๊ป Triton ์ถ๋ก ์๋ฒ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ์ด๋ฏธ์ง์๋ ๋ํ XGBoost, LightGBM, Scikit-Learn๊ณผ ๊ฐ์ ML ํ๋ ์์ํฌ ์คํ์ ์ง์ํ๋ FIL(ํฌ๋ ์คํธ ์ถ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ๋ฐฑ์๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Triton์ ๋ชจ๋ธ์ ๋ก๋ํ๊ณ ํ์ค ์ถ๋ก ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ ๊ด๋ฆฌ REST ์๋ํฌ์ธํธ, ์ถ๋ก , ์ํ๋ฅผ ๋ ธ์ถํฉ๋๋ค. ๋ชจ๋ธ์ Vertex AI์ ๋ฐฐํฌํ๋ ๋์ Triton์ Vertex AI ํ๊ฒฝ์ ์ธ์ํ์ฌ ์ํ ์ ๊ฒ ๋ฐ ์ถ๋ก ์์ฒญ์ Vertex AI ์ถ๋ก ํ๋กํ ์ฝ์ ์ ์ฉํฉ๋๋ค.
๋ค์์ NVIDIA Triton ์ถ๋ก ์๋ฒ์ ์ฃผ์ ๊ธฐ๋ฅ ๋ฐ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์ฝํ ๋ชฉ๋ก์ ๋๋ค.
- ์ฌ๋ฌ ๋ฅ ๋ฌ๋ ๋ฐ ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ ์ง์: Triton์ ์ฌ๋ฌ ๋ชจ๋ธ ๋ฐ ํผํฉ๋ ํ๋ ์์ํฌ์ ๋ชจ๋ธ ํ์์ ๋ฐฐํฌ๋ฅผ ์ง์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ XGBoost, LightGBM, Scikit-Learn, C++ ๋ชจ๋ธ ํ์์ ๋ชจ๋ ์ปค์คํ Python ๋ฑ์ ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ TensorFlow(SavedModel๊ณผ GraphDef), PyTorch(TorchScript), TensorRT, ONNX, OpenVINO, FIL ๋ฐฑ์๋๊ฐ ํฌํจ๋ฉ๋๋ค.
- ๋์ ๋ค์ค ๋ชจ๋ธ ์คํ: Triton์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋ชจ๋ธ, ๋์ผ ๋ชจ๋ธ์ ์ฌ๋ฌ ์ธ์คํด์ค, ๋๋ ๋ ๊ฐ์ง ๋ชจ๋๊ฐ GPU 0๊ฐ ์ด์์ ๋์ผํ ์ปดํจํ ๋ฆฌ์์ค์์ ๋์์ ์คํ๋ ์ ์์ต๋๋ค.
- ๋ชจ๋ธ ์์๋ธ(์ฐ๊ฒฐ ๋๋ ํ์ดํ๋ผ์ธ): Triton ์์๋ธ์ ์ฌ๋ฌ ๋ชจ๋ธ์ด ์๋ก๊ฐ์ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ํ ์๊ฐ ์ฐ๊ฒฐ๋ ํ์ดํ๋ผ์ธ(๋๋ DAG, ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ)์ผ๋ก ๊ตฌ์ฑ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํฉ๋๋ค. ๋ํ Triton Python ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋น์ฆ๋์ค ๋ก์ง ์คํฌ๋ฆฝํ (BLS)์ ์ ์๋ ๋ชจ๋ ์ฌ์ ์ฒ๋ฆฌ, ์ฌํ ์ฒ๋ฆฌ ๋๋ ์ ์ด ํ๋ฆ ๋ก์ง์ ํฌํจํ ์ ์์ต๋๋ค.
- CPU ๋ฐ GPU ๋ฐฑ์๋์์ ์คํ: Triton์ CPU ๋ฐ GPU ํฌํจ ๋ ธ๋์ ๋ฐฐํฌ๋ ๋ชจ๋ธ์ ๋ํ ์ถ๋ก ์ ์ง์ํฉ๋๋ค.
- ์ถ๋ก ์์ฒญ์ ๋์ ์ผ๊ด ์ฒ๋ฆฌ: ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ ๋ชจ๋ธ์ ์ํด Triton์๋ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ์์ฝ ๋ฐ ์ผ๊ด ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ถ๋ก ์ฒ๋ฆฌ๋ ํฅ์ ๋ฐ GPU ์ฌ์ฉ๋ฅ ์ฆ๊ฐ๋ฅผ ์ํด ์๋ฒ ์ธก์์ ๊ฐ๋ณ ์ถ๋ก ์์ฒญ์ ์ผ๊ด ์ฒ๋ฆฌ๋ก ๋์ ์ผ๋ก ์กฐํฉํฉ๋๋ค.
NVIDIA Triton ์ถ๋ก ์๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ Triton ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฌ์ฉ ๊ฐ๋ฅํ NVIDIA Triton ์ปจํ ์ด๋ ์ด๋ฏธ์ง
๋ค์ ํ์์๋ NVIDIA NGC ์นดํ๋ก๊ทธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ Triton Docker ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ชจ๋ธ ํ๋ ์์ํฌ, ๋ฐฑ์๋, ์ฌ์ฉ๋๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ํํฉ๋๋ค.
xx
๋ฐ yy
๋ ๊ฐ๊ฐ Triton์ ์ฃผ ๋ฒ์ ๊ณผ ๋ถ ๋ฒ์ ์ ๋ํ๋
๋๋ค.
NVIDIA Triton ์ด๋ฏธ์ง | ์ง์ |
---|---|
xx.yy-py3 |
TensorFlow, PyTorch, TensorRT, ONNX, OpenVINO ๋ชจ๋ธ ์ง์์ด ํฌํจ๋ ์ ์ฒด ์ปจํ ์ด๋ |
xx.yy-pyt-python-py3 |
PyTorch ๋ฐ Python ๋ฐฑ์๋๋ง |
xx.yy-tf2-python-py3 |
TensorFlow 2.x ๋ฐ Python ๋ฐฑ์๋๋ง |
xx.yy-py3-min |
ํ์์ ๋ฐ๋ผ Triton ์ปจํ ์ด๋ ๋ง์ถค์ค์ |
์์ํ๊ธฐ: NVIDIA Triton์ผ๋ก ์ถ๋ก ์ ๊ณต
๋ค์ ๊ทธ๋ฆผ์ Vertex AI ์ถ๋ก ์ ๋ํ Triton์ ๊ณ ์์ค ์ํคํ ์ฒ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- Triton์์ ์ ๊ณต๋๋ ML ๋ชจ๋ธ์ด Vertex AI Model Registry์ ๋ฑ๋ก๋ฉ๋๋ค. ์ด ๋ชจ๋ธ์ ๋ฉํ๋ฐ์ดํฐ๋ Cloud Storage์ ๋ชจ๋ธ ์ํฐํฉํธ์ ์์น, ์ปค์คํ ์ ๊ณต ์ปจํ ์ด๋, ํด๋น ๊ตฌ์ฑ์ ์ฐธ์กฐํฉ๋๋ค.
- Vertex AI Model Registry์ ๋ชจ๋ธ์ด CPU ๋ฐ GPU ํฌํจ ์ปดํจํ ๋ ธ๋์์ ์ปค์คํ ์ปจํ ์ด๋๋ก Triton ์ถ๋ก ์๋ฒ๋ฅผ ์คํ ์ค์ธ Vertex AI ์ถ๋ก ์๋ํฌ์ธํธ์ ๋ฐฐํฌ๋ฉ๋๋ค.
- ์ถ๋ก ์์ฒญ์ Vertex AI ์ถ๋ก ์๋ํฌ์ธํธ๋ฅผ ํตํด Triton ์ถ๋ก ์๋ฒ์ ๋๋ฌํ์ฌ ์ ์ ํ ์ค์ผ์ค๋ฌ๋ก ๋ผ์ฐํ ๋ฉ๋๋ค.
- ๋ฐฑ์๋๊ฐ ์ผ๊ด ์์ฒญ์ ์ ๊ณต๋ ์ ๋ ฅ์ ์ฌ์ฉํ์ฌ ์ถ๋ก ์ ์ํํ๊ณ ์๋ต์ ๋ฐํํฉ๋๋ค.
- Triton์ Vertex AI์ ๊ฐ์ ๋ฐฐํฌ ํ๊ฒฝ์ Triton์ ํตํฉํ ์ ์๋ ์ค๋น ์ํ ๋ฐ ํ์ฑ ์ํ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ Vertex AI์์ ๋จธ์ ๋ฌ๋ (ML) ๋ชจ๋ธ์ ๋ฐฐํฌํ๊ธฐ ์ํด NVIDIA Triton ์ถ๋ก ์๋ฒ๋ฅผ ์คํ ์ค์ด๊ณ , ์จ๋ผ์ธ ์ถ๋ก ์ ์ ๊ณตํ๋ ์ปค์คํ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. COCO 2017 ๋ฐ์ดํฐ ์ธํธ๋ก ์ฌ์ ํ์ต๋ TensorFlow Hub์ ๊ฐ์ฒด ๊ฐ์ง ๋ชจ๋ธ์์ ์ถ๋ก ์ ์ ๊ณตํ๊ธฐ ์ํด Triton์ ์คํํ๋ ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํฉ๋๋ค. ๊ทธ๋ฐ ํ Vertex AI๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
๋ ธํธ๋ถ ํ์์ผ๋ก ์ด ํํ ๋ฆฌ์ผ์ ์คํํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
Colab์์ ์ด๊ธฐ | Colab Enterprise์์ ์ด๊ธฐ | GitHub์์ ๋ณด๊ธฐ | Vertex AI Workbench์์ ์ด๊ธฐ |์์ํ๊ธฐ ์ ์
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Vertex AI API and Artifact Registry API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Vertex AI API and Artifact Registry API APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Artifact Registry ๋ฌธ์์ ๋ฐ๋ผ Docker๋ฅผ ์ค์นํฉ๋๋ค.
- LOCATION_ID: ์ด์ ์น์ ์ ์ง์ ๋ ๋๋ก Artifact Registry ์ ์ฅ์์ ๋ฆฌ์
- PROJECT_ID: Google Cloudํ๋ก์ ํธ ID
์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ์์ ์คํํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker run -t -d -p 8000:8000 --rm \ --name=local_object_detector \ -e AIP_MODE=True \ LOCATION_ID-docker.pkg.dev/PROJECT_ID/getting-started-nvidia-triton/vertex-triton-inference \ --model-repository MODEL_ARTIFACTS_REPOSITORY \ --strict-model-config=false
์ด์ ์น์ ์์ ํ ๊ฒ์ฒ๋ผ ๋ค์์ ๋ฐ๊ฟ๋๋ค.
- LOCATION_ID: ์ด์ ์น์ ์ ์ง์ ๋ ๋๋ก Artifact Registry ์ ์ฅ์์ ๋ฆฌ์
- PROJECT_ID: Google Cloud์ ID์ ๋๋ค. ํ๋ก์ ํธ
- MODEL_ARTIFACTS_REPOSITORY: ๋ชจ๋ธ ์ํฐํฉํธ๊ฐ ์๋ Cloud Storage ๊ฒฝ๋ก
์ด ๋ช ๋ น์ด๋ ์ปจํ ์ด๋์ ํฌํธ
8000
์ ๋ก์ปฌ ํ๊ฒฝ์ ํฌํธ8000
์ผ๋ก ๋งคํํ์ฌ ๋ถ๋ฆฌ ๋ชจ๋์์ ์ปจํ ์ด๋๋ฅผ ์คํํฉ๋๋ค. NGC์ Triton ์ด๋ฏธ์ง๋ ํฌํธ8000
์ ์ฌ์ฉํ๋๋ก Triton์ ๊ตฌ์ฑํฉ๋๋ค.์ปจํ ์ด๋ ์๋ฒ์ ์ํ ์ ๊ฒ์ ๋ณด๋ด๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/v2/health/ready
์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ ์ํ ์ฝ๋๋ฅผ
200
์ผ๋ก ๋ฐํํฉ๋๋ค.๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ด์ ์ ์์ฑ๋ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋ ์๋ฒ์ ์ถ๋ก ์์ฒญ์ ์ ์กํ๊ณ ์ถ๋ก ์๋ต์ ๊ฐ์ ธ์ต๋๋ค.
curl -X POST \ -H "Content-Type: application/json" \ -d @instances.json \ localhost:8000/v2/models/object_detector/infer | jq -c '.outputs[] | select(.name == "detection_classes")'
์ด ์์ฒญ์๋ TensorFlow ๊ฐ์ฒด ๊ฐ์ง ์์์ ํฌํจ๋ ํ ์คํธ ์ด๋ฏธ์ง ์ค ํ๋๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ ๋ค์ ์ถ๋ก ์ ๋ฐํํฉ๋๋ค.
{"name":"detection_classes","datatype":"FP32","shape":[1,300],"data":[38,1,...,44]}
์ปจํ ์ด๋๋ฅผ ์ค์งํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker stop local_object_detector
์ ํํ ๋ฆฌ์ ์ Artifact Registry๋ก ํธ์ํ ์ ์๋๋ก ๋ก์ปฌ Docker์ ์ค์น ๊ถํ์ ์ ๊ณตํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud auth configure-docker LOCATION_ID-docker.pkg.dev
- LOCATION_ID์ ์ด์ ์น์ ์์ ์ ์ฅ์๋ฅผ ๋ง๋ ๋ฆฌ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
Artifact Registry์ ๋ฐ๋ก ์ ์ ๋น๋ํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker push LOCATION_ID-docker.pkg.dev/PROJECT_ID/getting-started-nvidia-triton/vertex-triton-inference
์ด์ ์น์ ์์ ํ ๊ฒ์ฒ๋ผ ๋ค์์ ๋ฐ๊ฟ๋๋ค.
- LOCATION_ID: ์ด์ ์น์ ์ ์ง์ ๋ ๋๋ก Artifact Registry ์ ์ฅ์์ Rhe ๋ฆฌ์
- PROJECT_ID: Google Cloudํ๋ก์ ํธ์ ID์ ๋๋ค.
- LOCATION_ID: Vertex AI๋ฅผ ์ฌ์ฉํ๋ ๋ฆฌ์
- PROJECT_ID: Google Cloudํ๋ก์ ํธ ID
-
DEPLOYED_MODEL_NAME:
DeployedModel
์ ์ด๋ฆ.DeployedModel
์Model
ํ์ ์ด๋ฆ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. - LOCATION_ID: Vertex AI๋ฅผ ์ฌ์ฉํ๋ ๋ฆฌ์
- ENDPOINT_NAME: ์๋ํฌ์ธํธ์ ํ์ ์ด๋ฆ
- LOCATION_ID: Vertex AI๋ฅผ ์ฌ์ฉํ๋ ๋ฆฌ์
- ENDPOINT_NAME: ์๋ํฌ์ธํธ์ ํ์ ์ด๋ฆ
-
DEPLOYED_MODEL_NAME:
DeployedModel
์ ์ด๋ฆ.DeployedModel
์Model
ํ์ ์ด๋ฆ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. -
MACHINE_TYPE: (์ ํ์ฌํญ) ์ด ๋ฐฐํฌ์ ๊ฐ ๋
ธ๋์ ์ฌ์ฉ๋๋ ๋จธ์ ๋ฆฌ์์ค. ๊ธฐ๋ณธ ์ค์ ์
n1-standard-2
์ ๋๋ค. ๋จธ์ ์ ํ์ ๋ํด ์์ธํ ์์๋ณด์ธ์. - MIN_REPLICA_COUNT: ์ด ๋ฐฐํฌ์ ์ต์ ๋ ธ๋ ์. ์ถ๋ก ๋ก๋ ์ ํ์์ ๋ฐ๋ผ ๋ ธ๋ ์๋ฅผ ์ต๋ ๋ ธ๋ ์๊น์ง ๋๋ฆฌ๊ฑฐ๋ ์ด ๋ ธ๋ ์๊น์ง ์ค์ผ ์ ์์ต๋๋ค.
- MAX_REPLICA_COUNT: ์ด ๋ฐฐํฌ์ ์ต๋ ๋ ธ๋ ์. ์ถ๋ก ๋ก๋ ์ ํ์์ ๋ฐ๋ผ ์ด ๋ ธ๋ ์๋ฅผ ๋ ธ๋ ์๊น์ง ๋๋ฆฌ๊ฑฐ๋ ์ต์ ๋ ธ๋ ์๊น์ง ์ค์ผ ์ ์์ต๋๋ค.
ACCELERATOR_COUNT: ์์ ์ ์คํํ๋ ๊ฐ ๋จธ์ ์ ์ฐ๊ฒฐํ ๊ฐ์๊ธฐ ์. ์ผ๋ฐ์ ์ผ๋ก 1์ ๋๋ค. ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค.
ACCELERATOR_TYPE: GPU ์ ๊ณต์ ์ํ ๊ฐ์๊ธฐ ๊ตฌ์ฑ์ ๊ด๋ฆฌํฉ๋๋ค. ๋ํ Compute Engine ๋จธ์ ์ ํ์ผ๋ก ๋ชจ๋ธ์ ๋ฐฐํฌํ ๋๋ GPU ๊ฐ์๊ธฐ๋ฅผ ์ ํํ ์ ์๊ณ ์ ํ์ ์ง์ ํด์ผ ํฉ๋๋ค. ์ ํ์ง๋
nvidia-tesla-a100
,nvidia-tesla-p100
,nvidia-tesla-p4
,nvidia-tesla-t4
,nvidia-tesla-v100
์ ๋๋ค.- LOCATION_ID: Vertex AI๋ฅผ ์ฌ์ฉํ๋ ๋ฆฌ์
- ENDPOINT_NAME: ์๋ํฌ์ธํธ์ ํ์ ์ด๋ฆ
์๋ํฌ์ธํธ์์ ๋ชจ๋ธ์ ๋ฐฐํฌ ํด์ ํ๊ณ ์๋ํฌ์ธํธ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
ENDPOINT_ID=$(gcloud ai endpoints list \ --region=LOCATION_ID \ --filter=display_name=ENDPOINT_NAME \ --format="value(name)") DEPLOYED_MODEL_ID=$(gcloud ai endpoints describe $ENDPOINT_ID \ --region=LOCATION_ID \ --format="value(deployedModels.id)") gcloud ai endpoints undeploy-model $ENDPOINT_ID \ --region=LOCATION_ID \ --deployed-model-id=$DEPLOYED_MODEL_ID gcloud ai endpoints delete $ENDPOINT_ID \ --region=LOCATION_ID \ --quiet
LOCATION_ID์ ์ด์ ์น์ ์์ ๋ชจ๋ธ์ ๋ง๋ ๋ฆฌ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
๋ชจ๋ธ์ ์ญ์ ํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
MODEL_ID=$(gcloud ai models list \ --region=LOCATION_ID \ --filter=display_name=DEPLOYED_MODEL_NAME \ --format="value(name)") gcloud ai models delete $MODEL_ID \ --region=LOCATION_ID \ --quiet
LOCATION_ID์ ์ด์ ์น์ ์์ ๋ชจ๋ธ์ ๋ง๋ ๋ฆฌ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
Artifact Registry ์ ์ฅ์ ๋ฐ ๊ทธ ์์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud artifacts repositories delete getting-started-nvidia-triton \ --location=LOCATION_ID \ --quiet
LOCATION_ID์ ์ด์ ์น์ ์์ Artifact Registry ์ ์ฅ์๋ฅผ ๋ง๋ ๋ฆฌ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
- Triton ์ปค์คํ ์ปจํ ์ด๋๋ Vertex Explainable AI ๋๋ Vertex AI Model Monitoring๊ณผ ํธํ๋์ง ์์ต๋๋ค.
- Vertex AI์์ NVIDIA Triton ์ถ๋ก ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฐํฌ ํจํด์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด NVIDIA Triton ๋ ธํธ๋ถ ํํ ๋ฆฌ์ผ์ ์ฐธ๊ณ ํ์ธ์.
์ด ํํ ๋ฆฌ์ผ์์๋ Cloud Shell์ ์ฌ์ฉํ์ฌ Google Cloud์ ์ํธ์์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Cloud Shell ๋์ ๋ค๋ฅธ Bash ์ ธ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ์ถ๊ฐ ๊ตฌ์ฑ์ ์ํํ์ธ์.
์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
์ปค์คํ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ปค์คํ ์ปจํ ์ด๋ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ Docker ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด ์น์ ์์๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ Artifact Registry์ ํธ์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๋ชจ๋ธ ์ํฐํฉํธ ๋ค์ด๋ก๋
๋ชจ๋ธ ์ํฐํฉํธ๋ ์ถ๋ก ์ ๊ณต์ ์ํด ์ฌ์ฉํ ์ ์๋ ML ํ์ต์ผ๋ก ์์ฑ๋๋ ํ์ผ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ต์ํ ํ์ต๋ ML ๋ชจ๋ธ์ ๊ตฌ์กฐ ๋ฐ ๊ฐ์ค์น๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ชจ๋ธ ์ํฐํฉํธ์ ํ์์ ํ์ต์ ์ฌ์ฉํ๋ ML ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ๋ชจ๋ธ์ ์ฒ์๋ถํฐ ํ์ตํ๋ ๋์ COCO 2017 ๋ฐ์ดํฐ ์ธํธ์์ ํ์ต๋ TensorFlow Hub์์ ๊ฐ์ฒด ๊ฐ์ง ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
Triton์ TensorFlow SavedModel
ํ์์ ์ ๊ณตํ๊ธฐ ์ํด ๋ชจ๋ธ ์ ์ฅ์๊ฐ ๋ค์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
โโโ model-repository-path
โโโ model_name
โโโ config.pbtxt
โโโ 1
โโโ model.savedmodel
โโโ <saved-model-files>
config.pbtxt
ํ์ผ์ ๋ชจ๋ธ์ ๋ํ ๋ชจ๋ธ ๊ตฌ์ฑ์ ์ค๋ช
ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ํ ์ค์ ์ด ํฌํจ๋ ๋ชจ๋ธ ๊ตฌ์ฑ ํ์ผ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ํ์ง๋ง Triton์ด --strict-model-config=false
์ต์
์ผ๋ก ์์๋ ๊ฒฝ์ฐ์๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ Triton์์ ๋ชจ๋ธ ๊ตฌ์ฑ์ด ์๋์ผ๋ก ์์ฑ๋ ์ ์๊ณ ๋ช
์์ ์ผ๋ก ์ ๊ณตํ ํ์๊ฐ ์์ต๋๋ค.
ํนํ TensorRT, TensorFlow SavedModel, ONNX ๋ชจ๋ธ์ Triton์ด ๋ชจ๋ ํ์ ์ค์ ์ ์๋์ผ๋ก ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ ๊ตฌ์ฑ ํ์ผ์ ํ์๋ก ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋ชจ๋ธ ์ ํ์ ๋ชจ๋ธ ๊ตฌ์ฑ ํ์ผ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
# Download and organize model artifacts according to the Triton model repository spec
mkdir -p models/object_detector/1/model.savedmodel/
curl -L "https://tfhub.dev/tensorflow/faster_rcnn/resnet101_v1_640x640/1?tf-hub-format=compressed" | \
tar -zxvC ./models/object_detector/1/model.savedmodel/
ls -ltr ./models/object_detector/1/model.savedmodel/
๋ชจ๋ธ์ ๋ก์ปฌ๋ก ๋ค์ด๋ก๋ํ ํ ๋ชจ๋ธ ์ ์ฅ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค.
./models
โโโ object_detector
โโโ 1
โโโ model.savedmodel
โโโ saved_model.pb
โโโ variables
โโโ variables.data-00000-of-00001
โโโ variables.index
๋ชจ๋ธ ์ํฐํฉํธ๋ฅผ Cloud Storage ๋ฒํท์ ๋ณต์ฌ
๋ชจ๋ธ ๊ตฌ์ฑ ํ์ผ์ ํฌํจํ๋ ๋ค์ด๋ก๋ํ ๋ชจ๋ธ ์ํฐํํธ๊ฐ Vertex AI ๋ชจ๋ธ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ ์ ์๋ MODEL_ARTIFACTS_REPOSITORY
์ ์ง์ ๋ Cloud Storage ๋ฒํท์ ํธ์๋ฉ๋๋ค.
gcloud storage cp ./models/object_detector MODEL_ARTIFACTS_REPOSITORY/ --recursive
Artifact Registry ์ ์ฅ์ ๋ง๋ค๊ธฐ
๋ค์ ์น์ ์์ ๋ง๋ค ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ Artifact Registry ์ ์ฅ์๋ฅผ ๋ง๋ญ๋๋ค.
ํ๋ก์ ํธ์ Artifact Registry API ์๋น์ค๋ฅผ ์ฌ์ฉ ์ค์ ํ์ธ์.
gcloud services enable artifactregistry.googleapis.com
์ ธ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Artifact Registry ์ ์ฅ์๋ฅผ ๋ง๋ญ๋๋ค.
gcloud artifacts repositories create getting-started-nvidia-triton \
--repository-format=docker \
--location=LOCATION_ID \
--description="NVIDIA Triton Docker repository"
LOCATION_ID์ Artifact Registry์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ ์ฅ ๋ฆฌ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค. ๋์ค์ ์ด ๋ฆฌ์ ๊ณผ ์ผ์นํ๋ ์์น ์๋ํฌ์ธํธ์์ Vertex AI ๋ชจ๋ธ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก, us-central1
๊ณผ ๊ฐ์ด Vertex AI์ ์์น ์๋ํฌ์ธํธ๊ฐ ์๋ ๋ฆฌ์ ์ ์ ํํฉ๋๋ค.
์์ ์ด ์๋ฃ๋๋ฉด ๋ช ๋ น์ด๊ฐ ๋ค์์ ์ถ๋ ฅํฉ๋๋ค.
Created repository [getting-started-nvidia-triton].
์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋น๋
NVIDIA์์ Triton์ ์คํ ์ค์ธ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ์ ์๋๋ก Docker ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๊ณ ์ ๊ณต์ ๋ํ Vertex AI ์ปค์คํ
์ปจํ
์ด๋ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค. docker
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ด๋ฏธ์ง๊ฐ ๊ฒ์๋๋ Artifact Registry ๊ฒฝ๋ก์ ํ๊ทธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
NGC_TRITON_IMAGE_URI="nvcr.io/nvidia/tritonserver:22.01-py3"
docker pull $NGC_TRITON_IMAGE_URI
docker tag $NGC_TRITON_IMAGE_URI LOCATION_ID-docker.pkg.dev/PROJECT_ID/getting-started-nvidia-triton/vertex-triton-inference
๋ค์์ ๋ฐ๊ฟ๋๋ค.
์ด ๋ช ๋ น์ด๋ ๋ช ๋ถ ๋์ ์คํ๋ ์ ์์ต๋๋ค.
์ถ๋ก ์์ฒญ ํ ์คํธ๋ฅผ ์ํ ํ์ด๋ก๋ ํ์ผ ์ค๋น
์ปจํ ์ด๋ ์๋ฒ์ ์ถ๋ก ์์ฒญ์ ์ ์กํ๋ ค๋ฉด Python์ ์ฌ์ฉํ๋ ์ํ ์ด๋ฏธ์ง ํ์ผ๋ก ํ์ด๋ก๋๋ฅผ ์ค๋นํฉ๋๋ค. ๋ค์ python ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ํ์ด๋ก๋ ํ์ผ์ ์์ฑํฉ๋๋ค.
import json
import requests
# install required packages before running
# pip install pillow numpy --upgrade
from PIL import Image
import numpy as np
# method to generate payload from image url
def generate_payload(image_url):
# download image from url and resize
image_inputs = Image.open(requests.get(image_url, stream=True).raw)
image_inputs = image_inputs.resize((200, 200))
# convert image to numpy array
image_tensor = np.asarray(image_inputs)
# derive image shape
image_shape = [1] + list(image_tensor.shape)
# create payload request
payload = {
"id": "0",
"inputs": [
{
"name": "input_tensor",
"shape": image_shape,
"datatype": "UINT8",
"parameters": {},
"data": image_tensor.tolist(),
}
],
}
# save payload as json file
payload_file = "instances.json"
with open(payload_file, "w") as f:
json.dump(payload, f)
print(f"Payload generated at {payload_file}")
return payload_file
if __name__ == '__main__':
image_url = "https://github.com/tensorflow/models/raw/master/research/object_detection/test_images/image2.jpg"
payload_file = generate_payload(image_url)
Python ์คํฌ๋ฆฝํธ๊ฐ ํ์ด๋ก๋๋ฅผ ์์ฑํ๊ณ ๋ค์ ์๋ต์ ์ถ๋ ฅํฉ๋๋ค.
Payload generated at instances.json
๋ก์ปฌ๋ก ์ปจํ ์ด๋ ์คํ(์ ํ์ฌํญ)
์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ Vertex AI์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด Artifact Registry๋ก ํธ์ํ๊ธฐ ์ ์ ๋ก์ปฌ ํ๊ฒฝ์์ ์ปจํ ์ด๋๋ก ์คํํ์ฌ ์๋ฒ๊ฐ ์์ํ ๋๋ก ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ Artifact Registry์ ํธ์
Artifact Registry์ ์ก์ธ์คํ๋๋ก Docker๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ๋ฐ ํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ Artifact Registry ์ ์ฅ์์ ํธ์ํฉ๋๋ค.
๋ชจ๋ธ ๋ฐฐํฌ
์ด ์น์ ์์๋ ๋ชจ๋ธ๊ณผ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ ๋ค์ ๋ชจ๋ธ์ ์๋ํฌ์ธํธ์ ๋ฐฐํฌํฉ๋๋ค.
๋ชจ๋ธ ๋ง๋ค๊ธฐ
Triton์ ์คํํ๋ ์ปค์คํ
์ปจํ
์ด๋๊ฐ ์ฌ์ฉ๋๋ Model
๋ฆฌ์์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด gcloud ai models upload
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ ์ ์ปค์คํ
์ปจํ
์ด๋ ์ค์ ์ ์ฝ๊ณ ์ปจํ
์ด๋์ ์ ํ์ฌํญ์ธ sharedMemorySizeMb
, startupProbe
, healthProbe
ํ๋๋ฅผ ์ง์ ํด์ผ ํ๋์ง ํ์ธํ์ธ์.
gcloud ai models upload \
--region=LOCATION_ID \
--display-name=DEPLOYED_MODEL_NAME \
--container-image-uri=LOCATION_ID-docker.pkg.dev/PROJECT_ID/getting-started-nvidia-triton/vertex-triton-inference \
--artifact-uri=MODEL_ARTIFACTS_REPOSITORY \
--container-args='--strict-model-config=false'
--container-args='--strict-model-config=false'
์ธ์๋ Triton์ด ๋ชจ๋ธ ๊ตฌ์ฑ์ ์๋์ผ๋ก ์์ฑํ๋๋ก ํ์ฉํฉ๋๋ค.
์๋ํฌ์ธํธ ๋ง๋ค๊ธฐ
์จ๋ผ์ธ ์ถ๋ก ์ ๊ณต์ ์ํด ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ๋ชจ๋ธ์ ์๋ํฌ์ธํธ์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ์๋ํฌ์ธํธ์ ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋ค์ ์์์์๋ gcloud ai endpoints create
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
gcloud ai endpoints create \
--region=LOCATION_ID \
--display-name=ENDPOINT_NAME
๋ค์์ ๋ฐ๊ฟ๋๋ค.
Google Cloud CLI ๋๊ตฌ๊ฐ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋๋ ๋ฐ ๋ช ์ด ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์๋ํฌ์ธํธ์ ๋ชจ๋ธ ๋ฐฐํฌ
์๋ํฌ์ธํธ๊ฐ ์ค๋น๋๋ฉด ์๋ํฌ์ธํธ์ ๋ชจ๋ธ์ ๋ฐฐํฌํฉ๋๋ค. ์๋ํฌ์ธํธ์ ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ฉด ์๋น์ค๊ฐ ๋ฌผ๋ฆฌ์ ๋ฆฌ์์ค๋ฅผ Triton ์คํ ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐํ์ฌ ์จ๋ผ์ธ ์ถ๋ก ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ ์์์์๋ gcloud ai endpoints deploy-model
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ GPU์ Triton์ ์คํํ๋ endpoint
์ Model
์ ๋ฐฐํฌํ์ฌ ์ฌ๋ฌ DeployedModel
๋ฆฌ์์ค ๊ฐ ํธ๋ํฝ์ ๋ถํ ํ์ง ์๊ณ ์ถ๋ก ์ ๊ณต์ ๊ฐ์ํํฉ๋๋ค.
ENDPOINT_ID=$(gcloud ai endpoints list \ --region=LOCATION_ID
\ --filter=display_name=ENDPOINT_NAME
\ --format="value(name)") MODEL_ID=$(gcloud ai models list \ --region=LOCATION_ID
\ --filter=display_name=DEPLOYED_MODEL_NAME
\ --format="value(name)") gcloud ai endpoints deploy-model $ENDPOINT_ID \ --region=LOCATION_ID
\ --model=$MODEL_ID \ --display-name=DEPLOYED_MODEL_NAME
\ --machine-type=MACHINE_TYPE
\ --min-replica-count=MIN_REPLICA_COUNT
\ --max-replica-count=MAX_REPLICA_COUNT
\ --accelerator=count=ACCELERATOR_COUNT
,type=ACCELERATOR_TYPE
\ --traffic-split=0=100
๋ค์์ ๋ฐ๊ฟ๋๋ค.
Google Cloud CLI ๋๊ตฌ๋ก ๋ชจ๋ธ์ ์๋ํฌ์ธํธ์ ๋ฐฐํฌํ๋ ค๋ฉด ๋ช ์ด ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๋ชจ๋ธ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌ๋๋ฉด ์ด ๋ช ๋ น์ด๊ฐ ๋ค์ ์ถ๋ ฅ์ ํ์ํฉ๋๋ค.
Deployed a model to the endpoint xxxxx. Id of the deployed model: xxxxx.
๋ฐฐํฌ๋ ๋ชจ๋ธ์์ ์จ๋ผ์ธ ์ถ๋ก ๊ฐ์ ธ์ค๊ธฐ
Vertex AI ์ถ๋ก ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋ชจ๋ธ์ ํธ์ถํ๋ ค๋ฉด ํ์ค ์ถ๋ก ์์ฒญ JSON ๊ฐ์ฒด
๋๋ ๋ฐ์ด๋๋ฆฌ ํ์ฅ์๊ฐ ์๋ ์ถ๋ก ์์ฒญ JSON ๊ฐ์ฒด
๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ก ์์ฒญ์ ํ์์ ์ง์ ํ๊ณ Vertex AI REST rawPredict
์๋ํฌ์ธํธ์ ์์ฒญ์ ์ ์ถํฉ๋๋ค.
๋ค์ ์์์์๋ gcloud ai endpoints raw-predict
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ENDPOINT_ID=$(gcloud ai endpoints list \
--region=LOCATION_ID \
--filter=display_name=ENDPOINT_NAME \
--format="value(name)")
gcloud ai endpoints raw-predict $ENDPOINT_ID \
--region=LOCATION_ID \
--http-headers=Content-Type=application/json \
--request=@instances.json
๋ค์์ ๋ฐ๊ฟ๋๋ค.
์๋ํฌ์ธํธ๊ฐ ์ ํจํ ์์ฒญ์ ๋ํด ๋ค์ ์๋ต์ ๋ฐํํฉ๋๋ค.
{
"id": "0",
"model_name": "object_detector",
"model_version": "1",
"outputs": [{
"name": "detection_anchor_indices",
"datatype": "FP32",
"shape": [1, 300],
"data": [2.0, 1.0, 0.0, 3.0, 26.0, 11.0, 6.0, 92.0, 76.0, 17.0, 58.0, ...]
}]
}
์ญ์
Vertex AI ์๊ธ ๋ฐ Artifact Registry ์๊ธ์ด ๊ณ์ ์ฒญ๊ตฌ๋์ง ์๊ฒ ํ๋ ค๋ฉด ์ด ํํ ๋ฆฌ์ผ์์ ๋ง๋ Google Cloud ๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.