์ด ํํ ๋ฆฌ์ผ์์๋ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ถ๋ก ์ ์ํด GKE์์ GPU ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ๋ฐฐํฌํ๊ณ ์๋นํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. L4 GPU ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ๋ GKE ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค๊ณ ๋ค์ ๋ชจ๋ธ์ ์๋นํ๋๋ก ์ธํ๋ผ๋ฅผ ์ค๋นํฉ๋๋ค.
๋ชจ๋ธ์ ๋ฐ์ดํฐ ํ์์ ๋ฐ๋ผ ํ์ํ GPU ์๊ฐ ๋ฌ๋ผ์ง๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์ ๊ฐ ๋ชจ๋ธ์ L4 GPU 2๊ฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ GPU ์ ๊ณ์ฐ์ ์ฐธ์กฐํ์ธ์.
์ด ํํ ๋ฆฌ์ผ์ LLM์ ์๋นํ๋ ๋ฐ Kubernetes ์ปจํ ์ด๋ ์กฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๋จธ์ ๋ฌ๋(ML) ์์ง๋์ด, ํ๋ซํผ ๊ด๋ฆฌ์ ๋ฐ ์ด์์, ๋ฐ์ดํฐ ๋ฐ AI ์ ๋ฌธ๊ฐ๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค. Google Cloud์ฝํ ์ธ ์์ ์ฐธ์กฐํ๋ ์ผ๋ฐ์ ์ธ ์ญํ ๊ณผ ์์ ํ์คํฌ๋ฅผ ์์ธํ ์์๋ณด๋ ค๋ฉด ์ผ๋ฐ GKE ์ฌ์ฉ์ ์ญํ ๋ฐ ํ์คํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด ํ์ด์ง๋ฅผ ์ฝ๊ธฐ ์ ๋ค์ ๋ด์ฉ์ ์์งํด์ผ ํฉ๋๋ค.
๋ชฉํ
์ด ๊ฐ์ด๋์ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด๋ฌ์คํฐ ๋ฐ ๋ ธ๋ ํ ๋ง๋ค๊ธฐ
- ์ํฌ๋ก๋ ์ค๋น
- ์ํฌ๋ก๋ ๋ฐฐํฌ
- LLM ์ธํฐํ์ด์ค์ ์ํธ์์ฉ
์์ํ๊ธฐ ์ ์
์์ํ๊ธฐ ์ ์ ๋ค์ ํ์คํฌ๋ฅผ ์ํํ๋์ง ํ์ธํฉ๋๋ค.
- Google Kubernetes Engine API๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค. Google Kubernetes Engine API ์ฌ์ฉ ์ค์
- ์ด ํ์คํฌ์ Google Cloud CLI๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด gcloud CLI๋ฅผ ์ค์นํ ํ ์ด๊ธฐํํ์ธ์. ์ด์ ์ gcloud CLI๋ฅผ ์ค์นํ ๊ฒฝ์ฐ
gcloud components update
๋ฅผ ์คํํ์ฌ ์ต์ ๋ฒ์ ์ ๊ฐ์ ธ์ต๋๋ค.
์ผ๋ถ ๋ชจ๋ธ์๋ ์ถ๊ฐ ์๊ตฌ์ฌํญ์ด ์์ต๋๋ค. ๋ค์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
- Hugging Face์ ๋ชจ๋ธ์ ์ก์ธ์คํ๋ ค๋ฉด HuggingFace ํ ํฐ์ ์ฌ์ฉํฉ๋๋ค.
- Mixtral 8x7b ๋ชจ๋ธ์ ๊ฒฝ์ฐ Mistral Mixtral ๋ชจ๋ธ ์กฐ๊ฑด์ ์๋ฝํฉ๋๋ค.
- Llama 3 70b ๋ชจ๋ธ์ ๊ฒฝ์ฐ Meta Llama ๋ชจ๋ธ์ ํ์ฑ ๋ผ์ด์ ์ค๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ ์ค๋น
Google Cloud ์ฝ์์์ Cloud Shell ์ธ์คํด์ค๋ฅผ ์์ํฉ๋๋ค.
Cloud Shell ์ด๊ธฐ๊ธฐ๋ณธ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
gcloud config set project PROJECT_ID gcloud config set billing/quota_project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CONTROL_PLANE_LOCATION=us-central1
PROJECT_ID๋ฅผ Google Cloudํ๋ก์ ํธ ID๋ก ๋ฐ๊ฟ๋๋ค.
GKE ํด๋ฌ์คํฐ ๋ฐ ๋ ธ๋ ํ ๋ง๋ค๊ธฐ
GPU๋ฅผ ํ์ฉํ์ฌ GKE Autopilot ๋๋ Standard ํด๋ฌ์คํฐ์์ LLM์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์์ ๊ด๋ฆฌํ Kubernetes ํ๊ฒฝ์ ์ํด์๋ Autopilot์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ํฌ๋ก๋์ ๊ฐ์ฅ ์ ํฉํ GKE ์์ ๋ชจ๋๋ฅผ ์ ํํ๋ ค๋ฉด GKE ์์ ๋ชจ๋ ์ ํ์ ์ฐธ์กฐํ์ธ์.
Autopilot
Cloud Shell์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud container clusters create-auto l4-demo \ --project=${PROJECT_ID} \ --location=${CONTROL_PLANE_LOCATION} \ --release-channel=rapid
GKE๋ ๋ฐฐํฌ๋ ์ํฌ๋ก๋์ ์์ฒญ์ ๋ฐ๋ผ CPU ๋ฐ GPU ๋ ธ๋๋ฅผ ์ฌ์ฉํ์ฌ Autopilot ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ญ๋๋ค.
ํด๋ฌ์คํฐ์ ํต์ ํ๋๋ก
kubectl
์ ๊ตฌ์ฑํฉ๋๋ค.gcloud container clusters get-credentials l4-demo --location=${CONTROL_PLANE_LOCATION}
Standard
Cloud Shell์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ GKE์ ๋ํด ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋ Standard ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ญ๋๋ค.
gcloud container clusters create l4-demo \ --location ${CONTROL_PLANE_LOCATION} \ --workload-pool ${PROJECT_ID}.svc.id.goog \ --enable-image-streaming \ --node-locations=${CONTROL_PLANE_LOCATION}-a \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type n2d-standard-4 \ --num-nodes 1 --min-nodes 1 --max-nodes 5 \ --release-channel=rapid
ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ๋ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํด๋ฌ์คํฐ์ ๋ํด ๋ ธ๋ ํ์ ๋ง๋ญ๋๋ค.
gcloud container node-pools create g2-standard-24 --cluster l4-demo \ --location ${CONTROL_PLANE_LOCATION} \ --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest \ --machine-type g2-standard-24 \ --enable-autoscaling --enable-image-streaming \ --num-nodes=0 --min-nodes=0 --max-nodes=3 \ --node-locations ${CONTROL_PLANE_LOCATION}-a,${CONTROL_PLANE_LOCATION}-c \ --spot
GKE๋ LLM์ ๋ค์ ๋ฆฌ์์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ๊ณต๊ฐ Google Kubernetes Engine(GKE) Standard ๋ฒ์ ํด๋ฌ์คํฐ
g2-standard-24
๋จธ์ ์ ํ์ด 0๊ฐ ๋ ธ๋๋ก ์ถ์๋ ๋ ธ๋ ํ. ํฌ๋๋ฅผ ์คํํ์ฌ GPU๋ฅผ ์์ฒญํ๊ธฐ ์ ๊น์ง๋ GPU ๋น์ฉ์ด ์ฒญ๊ตฌ๋์ง ์์ต๋๋ค. ์ด ๋ ธ๋ ํ์ ๊ธฐ๋ณธ ํ์ค Compute Engine VM๋ณด๋ค ์ ๋ ดํ Spot VM์ ํ๋ก๋น์ ๋ํ๊ณ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฃผ๋ฌธํ VM์ ์ฌ์ฉํ๋ ค๋ฉด ์ด ๋ช ๋ น์ด์text-generation-inference.yaml
๊ตฌ์ฑ์cloud.google.com/gke-spot
๋ ธ๋ ์ ํ๊ธฐ์์--spot
ํ๋๊ทธ๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ์ ํต์ ํ๋๋ก
kubectl
์ ๊ตฌ์ฑํฉ๋๋ค.gcloud container clusters get-credentials l4-demo --location=${CONTROL_PLANE_LOCATION}
์ํฌ๋ก๋ ์ค๋น
์ด ์น์ ์์๋ ์ฌ์ฉํ ๋ชจ๋ธ์ ๋ฐ๋ผ ์ํฌ๋ก๋๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ Kubernetes ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋ฐฐํฌํฉ๋๋ค. ๋ฐฐํฌ๋ ํด๋ฌ์คํฐ์์ ๋ ธ๋ ๊ฐ์ ๋ฐฐํฌ๋๋ ์ฌ๋ฌ ํฌ๋ ๋ณต์ ๋ณธ์ ์คํํ ์ ์๋ Kubernetes API ๊ฐ์ฒด์ ๋๋ค.
Llama 3 70b
๊ธฐ๋ณธ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
export HF_TOKEN=HUGGING_FACE_TOKEN
HUGGING_FACE_TOKEN
์ HuggingFace ํ ํฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.HuggingFace ํ ํฐ์ Kubernetes ๋ณด์ ๋น๋ฐ์ ๋ง๋ญ๋๋ค.
kubectl create secret generic l4-demo \ --from-literal=HUGGING_FACE_TOKEN=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -
๋ค์
text-generation-inference.yaml
๋ฐฐํฌ ๋งค๋ํ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.์ด ๋งค๋ํ์คํธ์์ ๊ฐ ํญ๋ชฉ์ ๋ค์์ ์ํํฉ๋๋ค.
- ๋ชจ๋ธ์ 2๊ฐ์ NVIDIA L4 GPU๊ฐ ํ์ํ๋ฏ๋ก
NUM_SHARD
๋2
์ฌ์ผ ํฉ๋๋ค. QUANTIZE
๋bitsandbytes-nf4
๋ก ์ค์ ๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ธ์ด 32๋นํธ ๋์ 4๋นํธ์ ๋ก๋๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด GKE๊ฐ ํ์ํ GPU ๋ฉ๋ชจ๋ฆฌ ์์ ์ค์ด๊ณ ์ถ๋ก ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ธ ์ ํ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ์์ฒญํ GPU๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ GPU ์ ๊ณ์ฐ์ ์ฐธ์กฐํ์ธ์.
- ๋ชจ๋ธ์ 2๊ฐ์ NVIDIA L4 GPU๊ฐ ํ์ํ๋ฏ๋ก
๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f text-generation-inference.yaml
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
deployment.apps/llm created
๋ชจ๋ธ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
kubectl get deploy
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 20m
์คํ ์ค์ธ ๋ฐฐํฌ์ ๋ก๊ทธ๋ฅผ ๋ด ๋๋ค.
kubectl logs -l app=llm
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Mixtral 8x7b
๊ธฐ๋ณธ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
export HF_TOKEN=HUGGING_FACE_TOKEN
HUGGING_FACE_TOKEN
์ HuggingFace ํ ํฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.HuggingFace ํ ํฐ์ Kubernetes ๋ณด์ ๋น๋ฐ์ ๋ง๋ญ๋๋ค.
kubectl create secret generic l4-demo \ --from-literal=HUGGING_FACE_TOKEN=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -
๋ค์
text-generation-inference.yaml
๋ฐฐํฌ ๋งค๋ํ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.์ด ๋งค๋ํ์คํธ์์ ๊ฐ ํญ๋ชฉ์ ๋ค์์ ์ํํฉ๋๋ค.
- ๋ชจ๋ธ์ 2๊ฐ์ NVIDIA L4 GPU๊ฐ ํ์ํ๋ฏ๋ก
NUM_SHARD
๋2
์ฌ์ผ ํฉ๋๋ค. QUANTIZE
๋bitsandbytes-nf4
๋ก ์ค์ ๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ธ์ด 32๋นํธ ๋์ 4๋นํธ์ ๋ก๋๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด GKE๊ฐ ํ์ํ GPU ๋ฉ๋ชจ๋ฆฌ ์์ ์ค์ด๊ณ ์ถ๋ก ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ธ ์ ํ๋๊ฐ ์ค์ด๋ค ์ ์์ต๋๋ค. ์์ฒญํ GPU๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ GPU ์ ๊ณ์ฐ์ ์ฐธ์กฐํ์ธ์.
- ๋ชจ๋ธ์ 2๊ฐ์ NVIDIA L4 GPU๊ฐ ํ์ํ๋ฏ๋ก
๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f text-generation-inference.yaml
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
deployment.apps/llm created
๋ชจ๋ธ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
watch kubectl get deploy
๋ฐฐํฌ๊ฐ ์ค๋น๋๋ฉด ์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 10m
ํ์ธ์ ์ข ๋ฃํ๋ ค๋ฉด
CTRL + C
๋ฅผ ์ ๋ ฅํฉ๋๋ค.์คํ ์ค์ธ ๋ฐฐํฌ์ ๋ก๊ทธ๋ฅผ ๋ด ๋๋ค.
kubectl logs -l app=llm
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Falcon 40b
๋ค์
text-generation-inference.yaml
๋ฐฐํฌ ๋งค๋ํ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.์ด ๋งค๋ํ์คํธ์์ ๊ฐ ํญ๋ชฉ์ ๋ค์์ ์ํํฉ๋๋ค.
- ๋ชจ๋ธ์ 2๊ฐ์ NVIDIA L4 GPU๊ฐ ํ์ํ๋ฏ๋ก
NUM_SHARD
๋2
์ฌ์ผ ํฉ๋๋ค. QUANTIZE
๋bitsandbytes-nf4
๋ก ์ค์ ๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ธ์ด 32๋นํธ ๋์ 4๋นํธ์ ๋ก๋๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด GKE๊ฐ ํ์ํ GPU ๋ฉ๋ชจ๋ฆฌ ์์ ์ค์ด๊ณ ์ถ๋ก ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ธ ์ ํ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ์์ฒญํ GPU๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ GPU ์ ๊ณ์ฐ์ ์ฐธ์กฐํ์ธ์.
- ๋ชจ๋ธ์ 2๊ฐ์ NVIDIA L4 GPU๊ฐ ํ์ํ๋ฏ๋ก
๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f text-generation-inference.yaml
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
deployment.apps/llm created
๋ชจ๋ธ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
watch kubectl get deploy
๋ฐฐํฌ๊ฐ ์ค๋น๋๋ฉด ์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 10m
ํ์ธ์ ์ข ๋ฃํ๋ ค๋ฉด
CTRL + C
๋ฅผ ์ ๋ ฅํฉ๋๋ค.์คํ ์ค์ธ ๋ฐฐํฌ์ ๋ก๊ทธ๋ฅผ ๋ด ๋๋ค.
kubectl logs -l app=llm
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
ClusterIP ์ ํ์ ์๋น์ค ๋ง๋ค๊ธฐ
๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํฌ๋๋ฅผ ๊ฒ์ํ๊ณ ์ก์ธ์คํ ์ ์๋๋ก ํด๋ฌ์คํฐ ๋ด์์ ํฌ๋๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๋ ธ์ถํฉ๋๋ค.
๋ค์
llm-service.yaml
๋งค๋ํ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.apiVersion: v1 kind: Service metadata: name: llm-service spec: selector: app: llm type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 8080
๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f llm-service.yaml
์ฑํ ์ธํฐํ์ด์ค ๋ฐฐํฌ
Gradio๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ๊ณผ ์ํธ์์ฉํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํฉ๋๋ค. Gradio๋ ์ฑ๋ด์ฉ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ChatInterface ๋ํผ๊ฐ ์๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
Llama 3 70b
gradio.yaml
์ด๋ผ๋ ํ์ผ์ ๋ง๋ญ๋๋ค.๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f gradio.yaml
์๋น์ค์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ์ฐพ์ต๋๋ค.
kubectl get svc
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125m
EXTERNAL-IP
์ด์์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ๋ณต์ฌํฉ๋๋ค.์ธ๋ถ IP ์ฃผ์์ ๋ ธ์ถ๋ ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ธ ์ธํฐํ์ด์ค๋ฅผ ํ์ธํฉ๋๋ค.
http://EXTERNAL_IP
Mixtral 8x7b
gradio.yaml
์ด๋ผ๋ ํ์ผ์ ๋ง๋ญ๋๋ค.๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f gradio.yaml
์๋น์ค์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ์ฐพ์ต๋๋ค.
kubectl get svc
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125m
EXTERNAL-IP
์ด์์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ๋ณต์ฌํฉ๋๋ค.์ธ๋ถ IP ์ฃผ์์ ๋ ธ์ถ๋ ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ธ ์ธํฐํ์ด์ค๋ฅผ ํ์ธํฉ๋๋ค.
http://EXTERNAL_IP
Falcon 40b
gradio.yaml
์ด๋ผ๋ ํ์ผ์ ๋ง๋ญ๋๋ค.๋งค๋ํ์คํธ๋ฅผ ์ ์ฉํฉ๋๋ค.
kubectl apply -f gradio.yaml
์๋น์ค์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ์ฐพ์ต๋๋ค.
kubectl get svc
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125m
EXTERNAL-IP
์ด์์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ๋ณต์ฌํฉ๋๋ค.์ธ๋ถ IP ์ฃผ์์ ๋ ธ์ถ๋ ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ธ ์ธํฐํ์ด์ค๋ฅผ ํ์ธํฉ๋๋ค.
http://EXTERNAL_IP
GPU ์ ๊ณ์ฐ
GPU ์์ QUANTIZE
ํ๋๊ทธ์ ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ QUANTIZE
๊ฐ bitsandbytes-nf4
๋ก ์ค์ ๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ธ์ด 4๋นํธ๋ก ๋ก๋๋ฉ๋๋ค.
700์ต ๊ฐ ๋งค๊ฐ๋ณ์ ๋ชจ๋ธ์๋ 700์ต x 4๋นํธ(700์ต x 4๋นํธ = 35GB)์ ํด๋นํ๋ ์ต์ 40GB์ GPU ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ฉฐ 5GB์ ์ค๋ฒํค๋๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋จ์ผ L4 GPU์ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ํํ ๋ฆฌ์ผ์ ์์์์๋ 2๊ฐ์ L4 GPU ๋ฉ๋ชจ๋ฆฌ(2 x 24 = 48GB)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ตฌ์ฑ์ L4 GPU์์ Falcon 40b ๋๋ Llama 3 70b๋ฅผ ์คํํ๋ ๋ฐ ์ถฉ๋ถํฉ๋๋ค.
์ญ์
์ด ํํ ๋ฆฌ์ผ์์ ์ฌ์ฉ๋ ๋ฆฌ์์ค ๋น์ฉ์ด Google Cloud ๊ณ์ ์ ์ฒญ๊ตฌ๋์ง ์๋๋ก ํ๋ ค๋ฉด ๋ฆฌ์์ค๊ฐ ํฌํจ๋ ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ํ๋ก์ ํธ๋ฅผ ์ ์งํ๊ณ ๊ฐ๋ณ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ์ธ์.
ํด๋ฌ์คํฐ ์ญ์
์ด ๊ฐ์ด๋์์ ๋ง๋ ๋ฆฌ์์ค์ ๋ํ ๋น์ฉ์ด Google Cloud ๊ณ์ ์ ์ฒญ๊ตฌ๋์ง ์๊ฒ ํ๋ ค๋ฉด GKE ํด๋ฌ์คํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
gcloud container clusters delete l4-demo --location ${CONTROL_PLANE_LOCATION}