[AWS] Sagemaker AI: ๋ชจ๋ธ ์๋น
Sagemaker๋ AWS์์ ์ ๊ณตํ๋ AI ๋ชจ๋ธ ๊ฐ๋ฐ/์๋น์ฉ ํ๋ซํผ์ด๋ค.
๋จ์ผ ์๋น์ค์ฒ๋ผ ์๊ฐํ๊ธด ํ๋๋ฐ, ์จ๊ฐ ๋ค์ํ ๋ณ๋ ๊ธฐ๋ฅ๋ค์ด ํ๋๋ก ๋ญ์ณ์ง ํผ์ข
์ด๋ค. ์์ฐ๋ ๊ธฐ๋ฅ์ด ๋ ๋ง๋ค.
์ฌ๊ธฐ์๋ AI ๋ชจ๋ธ์ ๋ฐฐํฌํ๊ธฐ์ ์ ์ฉํ Realtime Endpoint(Realtime Inference)๋ฅผ ์์ฃผ๋ก ์๊ฐํด๋ณธ๋ค.
๊ตฌ์กฐ
๊ธฐ๋ณธ์ ์ผ๋ก ECS์ฒ๋ผ ์ปจํ
์ด๋ ๊ธฐ๋ฐ์ ๋ฐฉ๋ฒ๋ก ์ ๋ฐ๋ฅธ๋ค.
๋ชจ๋ธ ์๋ฒ๋ฅผ ์ปจํ
์ด๋๋ก ๋ง์์ ECR์ ์ฌ๋ ค๋๊ณ Sagemaker์ ๋ชจ๋ธ๋ก์ ๋ฑ๋ก์ ํ๋ฉด, ์ค์ ํ๊ธฐ์ ๋ฐ๋ผ์ Sagemaker๊ฐ ๋ชจ๋ธ์๋ฒ๋ฅผ ์๋์ผ๋ก ํ๋ก๋น์ ๋ํด์ ์ธ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ฐ ์์ด๋ค.
์๋ง ๋ด๋ถ ์ธํ๋ผ๋ EC2๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. ํฌ์ฅ๋ง ์ ํด์ ํ๋ ๊ฒ์ด๋ค.
์ด์
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ค์ด ์๋ค.
๋ก๊ทธ ์๋ ๊ด๋ฆฌ (cloudwatch)
๋ฉํธ๋ฆญ ์๋ ๊ด๋ฆฌ
๋ฌด์ค๋จ ๋ฐฐํฌ ๊ธฐ๋ณธ ์ง์
์๋ํฌ์ธํธ ์๋ ์ง์
๊ฐํธํ ์ค์ผ์ผ๋ง ๊ธฐ๋ฅ
์คํ์ดํฌ ๋์์ ์ํ ๋น๋๊ธฐ ์ถ๋ก ๊ธฐ๋ฅ
์ด๋ํ ์ถ๋ก ์ ์ํ Batch ๊ธฐ๋ฅ ์ง์
์ ํ์ฌํญ ๋ฐ ํ๊ณ
์ปจํ ์ด๋๋ก ๋ง๊ธฐ ๋๋ฌธ์ ๊ธฐ์ ์์ ๋๋ ์ ๋ฒ ์๋ ํธ์ด๊ธด ํ๋ฐ, ๊ทธ๋๋ ๋ช๊ฐ์ง ํ๋กํ ์ฝ/๋๋ผ์ด๋ฒ ์์ค ์ ํ์ฌํญ์ ์๋ค.
- ๋ชจ๋ธ ๊ตฌ์ฑ์ cuda 12.* ๋ฒ์ ์ ํธํ๋์ด์ผ ํ๋ค.
- ์๋ฒ๋ 8080 ํฌํธ๋ก ์ด๋ ค์ผ ํ๋ค.
- ์ ํด์ง ํํ๋ก API๋ฅผ ๊ฐ๋ฐฉํด์ผ ํ๋ค.
- (์๋ฒ๋ฆฌ์ค์ ๊ฒฝ์ฐ) ๋ชจ๋ธ์ด ๋จน๋ ๋ฉ๋ชจ๋ฆฌ์ HARD LIMIT์ 6GB๋ค.
- (๋๊ธฐํ ํ๋ก๋น์ ๋์ ๊ฒฝ์ฐ) ๋ชจ๋ธ ์ธ์คํด์ค๋ฅผ 0๊ฐ๋ก ์ค์ผ ์ ์๋ค.
๋น์ฉ
๋น์ฐํ์ง๋ง, ๋ง๋ฅ ์ธ์ง ์๋ค.
https://aws.amazon.com/ko/sagemaker/ai/pricing/
๊ฐ์ฅ ์ง๊ด์ ์ธ ํ๋ก๋น์ ๋์ ๊ฒฝ์ฐ์๋ EC2 ์ฒ๋ผ ํ์ ๋ณ ์๊ธ์ ๋ฏ๋๋ค.

CPU๋ง ์๋๊ฑด ์ธ๊ณ , GPU ๋ฌ๋ฆฐ๊ฑด ๋น์ฐํ ๋น์ธ๋ค.
๋์ผ์คํ์ EC2 ๋๋น ๋๋ต 1.5๋ฐฐ์ฏค ๋น์ผ ํธ์ด๋ค.
์๋ฒ๋ฆฌ์ค์ ๊ฒฝ์ฐ ์คํ๋ ์๊ฐ ๊ธฐ๋ฐ์ผ๋ก ๋ฏ๊ณ , ํธ๋ํฝ์ผ๋ก ๋ฏ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ฉ๋๋ก AI Saving Plan์ด ๋ฐ๋ก ์๋ค. ์ด๊ฑด ํ๋ก๋น์ ๋์ ๋ํด์๋ง ์ง์๋๋ฉฐ, 1๋
์ ๊ฒฐ์ ๊ธฐ์ค 30% ์ ๋๊ฐ ์ ๊ฐ๋๋ค.
https://aws.amazon.com/ko/savingsplans/ml-pricing/
Docker ์ด๋ฏธ์ง ๋ง๊ธฐ
๋จผ์ ์๋ฒ ๊ท๊ฒฉ์ ๋ง์ถฐ์ ์ฝ๋๋ฅผ ์ข ์ถ๊ฐํด์ผ ํ๋ค.
๋ค์ 2๊ฐ์ง API๊ฐ ํ์์ ์ด๋ค.
ping์ด ํฌ์ค์ฒดํฌ์ฉ์ด๊ณ , invacation์ด ์ถ๋ก API๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์๋๋ก ์ฝ๊ฐ ์ต์
์ ์ค์ผ ํ๋ค.
์๊ทธ๋ฌ๋ฉด ๋ชจ๋ธ ๋ฑ๋กํ ๋ ๋ป๋๋ค. provenance์ sbom๋ฅผ ๊บผ์ ์ฌ๋ฆฌ์.
docker buildx build --platform linux/amd64 \
--provenance=false \
--sbom=false \
-f Dockerfile.sagemaker-cpu \
-t "$AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPO:$TAG" \
--push .
๊ทธ๋ฆฌ๊ณ ECR์ ์ ์ฌ๋ฆฌ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋ชจ๋ธ ์์ฑ
์ด์ AWS๋ก ๊ฐ์ ๋ชจ๋ธ์ ๋ฑ๋กํด๋ณด์.
Deployable Models ํญ์ผ๋ก ์ด๋ํ๋ค.

๊ทธ๋ฆฌ๊ณ ๋ฐฉ๊ธ ์ฌ๋ฆฐ ECR ๊ฒฝ๋ก๋ฅผ ์ ๋นํ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋คํธ์ํฌ ์ต์
์ ์ ํ์ด๋ค.
๋ง์ฝ ํ๊น
ํ์ด์ค ๊ฐ์ ๋ฐ์ ๋ค์ด๋ฐ๊ฑฐ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๊ฑฐ๋ ํ๋ฉด ์ ๊ฒฉ๋ฆฌ๋ฅผ ๊บผ์ผํ๋ค.
๋ณด์์ด ์ค์ํ๋ค๋ฉด ์ผ๋๊ฒ ์ข๋ค.
๊ทธ๋์ ์ด๋ ๊ฒ ๋ฑ๋ก์ด ๋๋ฉด ๋ฒฝ๋ ํ๋๋ ์์ฑํ ๊ฒ์ด๋ค.
์๋ํฌ์ธํธ Config ์์ฑ
๊ทธ ๋ค์์๋ ๊ตฌ์ฑ์ ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ค ์ธ์คํด์ค ํ์ ์ผ๋ก ๋์ธ์ง ๋ฑ์ ์ ํํ๋ค.

์ด๊ฒ ์ข ํท๊ฐ๋ฆฌ๋๊ฒ ์๋๋ฐ, ๋ณํ์ ๋ชจ๋ธ์ ๊ณจ๋ผ์ ๋ฃ์ผ๋ฉด ์ง๋ง๋๋ก ์ธ์คํด์ค ํ์ ์ ๊ณ ์ ํด์ ๋ฃ์ด๋ฒ๋ฆฐ๋ค.

์ ๊ธฐ ์ค๋ฅธํธ์ ์จ์ด์๋ ํธ์ง ๋ฒํผ์ ๋๋ฌ์ผ ํ์ ์ ๊ณ ๋ฅผ ์ ์๋ค.

ํ๋ก๋น์ ๋ ์๋ํฌ์ธํธ ๋ง๋ค๊ธฐ
๊ทธ๋ผ ์ด์ ๋ฐฉ๊ธ ๋ง๋ ๊ตฌ์ฑ์ ํตํด์ ์ค์ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
์ด๊ฒ ์ฐ๋ง์ด๋ค.

๊ณจ๋ผ์ ์์ฑํ๋ฉด, ์์ฑ ์๊ฐ์ด ์ฝ๊ฐ ๊ฑธ๋ฆฐ๋ค.
๊ทธ๋ฌ๋ฉด ์ ๊ธฐ URL์ด ์๊ธฐ๋๋ฐ
๊ฐ๋ผ๋ก ๋ง๋ ๊ฑฐ๋ผ์ ์ ๊ฑธ ์ง์ ์ฐ์ง ๋ชปํ๋ค. URL ์์ฒด๊ฐ ๋ณ๋ก ์ ๋ํฌํด๋ณด์ด์ง ์์๋.
๊ฐ์ฅ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ sdk๋ api๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.
aws sagemaker-runtime invoke-endpoint \
--region ap-northeast-2 \
--endpoint-name ์๋ํฌ์ธํธ๋ช
\
--content-type application/json \
--cli-binary-format raw-in-base64-out \
--body '{"text":"The battery life is terrible","aspect":"battery"}' \
output.json
์ด๋ฐ ๋๋์ผ๋ก ๋ ๋ฆฌ๋ฉด ์๋ต์ด ๊ตฌ์ฑํ๋๋ก json์ผ๋ก ์ ๋ ๋ผ์ฌ ๊ฒ์ด๋ค.
๊ด์ธก์ฑ
๊ด๋ฆฌํ ์๋น์ค์ด๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ณธ์ ์ธ ๋ฉํธ๋ฆญ์ ์์์ ์๊ณ ์ ๊ณตํด์ค๋ค.
CPU/๋ฉ๋ชจ๋ฆฌ ์ ๋ณด ๋ฑ์ ๊ธฐ๋ณธ ํ์ด์ง์์ ์ ๊ณตํ๋ฉฐ

๋ก๊ทธ๋ Cloudwatch๋ฅผ ํตํด ์ ๊ณตํ๋ค.

์คํ ์ค์ผ์ผ๋ง
์๋ฒ๋ฅผ ์ค์ด๊ณ ๋๋ฆฌ๋ ๊ฒ๋ ๊ฝค ๊ฐํธํ๋ค.

์ฌ๊ธฐ์ ๊ทธ๋ฅ ๋ฐ๊ฟ๋ ๋๊ณ
์คํ ์ค์ผ์ผ๋ง์ ๊ตฌ์ฑํด์ ์ค์ผ์ผ๋ง์ ์๋ํํ ์๋ ์๋ค.
๋ค๋ง. ๊ธฐ๋ณธ ์๋ํฌ์ธํธ ๊ตฌ์ฑ์์๋ 0๊ฐ๋ก ์๋ ์ถ์๋ ์ง์๋์ง ์๋๋ค. ์ด๊ฑด Async ์๋ํฌ์ธํธ์์๋ง ๊ฐ๋ฅํ๋ค.
Async ์๋ํฌ์ธํธ
ASync ์๋ํฌ์ธํธ๋ ์คํ์ดํฌ ํจํด์ ์ต์ ํ๋ ํ ๋ณํ์ด๋ค.
์๋ํฌ์ธํธ ๊ตฌ์ฑ ์์ค์์ ์ค์ ํ ์ ์๋ค.
์ด๋ ๊ฒ ์ ๋นํ ์ค์ ํ๊ณ , ์๋ํฌ์ธํธ๋ฅผ ์๋ก ์์ฑํ๋ค.
์๋ํฌ์ธํธ๋ ๊ตฌ์ฑ์ ๋ค์ดํ์ ์์ด ๊ต์ฒดํ ์ ์์ง๋ง, Async <> Sync ๊ต์ฒด๋ ๋ถ๊ฐ๋ฅํ๋ค. ์๋ก ๋ง๋ค์ด์ผ ํ๋ค.
Async ์ถ๋ก ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์ข ๋ค๋ฅด๋ค.

์์ฒญ json์ ๋ฒํท์ ์ฌ๋ฆฐ ๋ค์์
๊ทธ ๊ฒฝ๋ก๋ฅผ ๋ฃ์ด์ ์ด์ผ ํ๋ค.
aws sagemaker-runtime invoke-endpoint-async \
--region ap-northeast-2 \
--endpoint-name ์๋ํฌ์ธํธ\
--content-type application/json \
--input-location ํ์ผ๊ฒฝ๋ก
๊ทธ๋ผ ์ด๋ ๊ฒ ์๋ต์ด ์ค๋๋ฐ, InferenceID๋ ์ธ๋ชจ๊ฐ ์๋ค. ์๋ฃ ์๋ฆผ์ด ํ์ํ๋ค๋ฉด SNS/SQS๋ฅผ ์ค์ ํด์ ๋๊ธฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์๋ฌดํผ ๊ทธ๊ฒ ์๋ค๋ฉด ์ค์ ์ฑ๊ณต ๊ฒฝ๋ก์ ํ์ผ์ด ๋จ์ด์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ํ์ผ์ด ๋จ์ด์ง ๊ฒ์ด๋ค.

๊น๋ณด๋ฉด ์๋ต๊ฐ์ด ๋์จ๋ค.
๊ทธ๋ฆฌ๊ณ Async Endpoint์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์ด ์์๋ ์ธ์คํด์ค๊ฐ 0์ผ๋ก ๋ค์ด๋๋, zero scale์ด ๊ฐ๋ฅํ๋ค. (๋จ, t ์๋ฆฌ์ฆ๋ ์๋จ)

์ด๋ ๊ฒ ๋ง์ถฐ๋์ผ๋ฉด
์์ธ๋ 0๊ฐ๋ก ๋ด๋ ค๊ฐ๋ค. ์ด๊ฒ ์ข ์ข๋ค.
์๋ฒ๋ฆฌ์ค ์๋ํฌ์ธํธ
๋ ๋งค์ฐ ๊ฐ๋ฒผ์ด ์ฌ์ฉ์ฌ๋ก๋ผ๋ฉด ๊ด์ฐฎ์ ์ต์
์ค ํ๋๊ฐ ์ด๊ฑฐ๋ค.
Lambda ์ฒ๋ผ ์์ ํ ์จ๋๋งจ๋๋ผ์ ํ๋ก๋น์ ๋ํ ํ์๊ฐ ์๊ณ , ์ปดํจํ
์๊ฐ๋น ๊ณผ๊ธ์ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์ ๋๋ง ๋ฏธ๋ฆฌ ๋ช
์ํด๋๋ฉด ์์์ ๋ด๋ถ์์ ํ์ฅํ๋ค.

์ด๋ ๊ฒ ๋์ถฉ ๋ง๋ค๋ฉด ๋๋ค.
์ด๊ฒ ์ฝ๋์คํํธ๊ฐ ์ข ๊ธธ๋ค. 600MB ์ง๋ฆฌ ๋ชจ๋ธ์ 1GB ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ธ๋๋ ์ฝ๋์คํํธ๊ฐ 40-50์ด ์ ๋ ๊ฑธ๋ฆฌ๋๋ผ.
๊ทธ๋ฆฌ๊ณ 1GB์ง๋ฆฌ ์ต์์คํ์ผ๋ก ํด์๋ ์ฑ๋ฅ์ด ์ข ๋ง์ด ๋ธ๋ฆฌ๋ ํธ์ด๋ค.
Lambda์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ์ ๋น๋กํด์ CPU๋ฅผ ํ ๋นํ๊ธฐ ๋๋ฌธ์ด๋ค.
1GB๋ก ํ์๋
2GB๋ก ํ์๋
๊ทผ๋ฐ ์ด๊ฒ ํ์ค์ ์ผ๋ก ์ข ๋ง์ด ๋น์ธ๊ธฐ ๋๋ฌธ์, ํ๋ฌ์ ํ๋ฒ ์ ๋ ์ง์ง ์กฐ๊ธ์ฉ ํธ์ถํ๋ ๊ฐํ์ ์ธ ์ผ์ด์ค๊ฐ ์๋๋ผ๋ฉด ์ถ์ฒํ์ง ์๋๋ค.
๋ฌด์จ ๋ชจ๋ธ์ด CPU์์๋ ํ์๋ฆฟ์ ๋ฐ๋ฆฌ์ด ์์ค์ผ๋ก ๋น ๋ฅธ๊ฒ ์๋๋ฉด ์คํ์ดํฌ ํธ๋ํฝ์๋ ์ ๋ง์ง ์๋๋ค. CPU์์๋ ์ด ๋จ์๋ก ๋๋ฆฐ๋ฐ ํธ์ถ์ด ๋น๋ฒํ๋ฉด ๋น์ฉ์ด ํญ๋ฐํ๋ค.
๋ด๊ฐ ๋ดค์๋๋ ์คํจํ ์๋น์ค์ ํ ํํ๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ค์ ์ธ ์ถ์ฒ์์ Async Endpoint๋ค.
์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html