CUDA Lazy Unloading
1. AI๊ฐ ์ฌ์ฉํ์ง ์์ ๋ ์๋์ผ๋ก ๋ด๋ ค๊ฐ๋ ์ด์
(1) CUDA Lazy Unloading (์ง์ฐ ์ธ๋ก๋)
โข
CUDA ์ปค๋์ด๋ AI ๋ชจ๋ธ์ด ์คํ๋์ง ์์ผ๋ฉด ์ผ์ ์๊ฐ์ด ์ง๋ ์๋์ผ๋ก GPU ๋ฉ๋ชจ๋ฆฌ์์ ์ธ๋ก๋๋จ.
โข
NVIDIA ๋๋ผ์ด๋ฒ ๋ฐ PyTorch/TensorFlow ๋ฑ ํ๋ ์์ํฌ๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌ.
โข
torch.cuda.empty_cache() ๊ฐ์ ๋ช
๋ น์ด๊ฐ ์คํ๋๋ฉด ๊ฐ์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ ์๋ ์์.
(2) OS ๋ฐ ๋๋ผ์ด๋ฒ์ ์ ๋ ฅ ๊ด๋ฆฌ ๊ธฐ๋ฅ
โข
Windows/Linux์ ์ ์ ๊ด๋ฆฌ ์ค์ ์ ๋ฐ๋ผ ์ผ์ ์๊ฐ ๋์ GPU ์ฌ์ฉ์ด ์์ผ๋ฉด ํด๋ญ ์๋๋ฅผ ๋ฎ์ถ๊ฑฐ๋ ๋ฆฌ์์ค๋ฅผ ํด์ ํจ.
โข
nvidia-smi --query-gpu=power.limit --format=csv ๋ช
๋ น์ด๋ก ํ์ธ ๊ฐ๋ฅ.
(3) AI ๋ชจ๋ธ์ด ์ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋์
โข
Flask, FastAPI, Django ๊ฐ์ ์๋ฒ ํ๋ ์์ํฌ์์ AI ๋ชจ๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค๊ฐ ์ผ์ ์๊ฐ ํ ์๋์ผ๋ก ํด์ .
โข
K8s(์ฟ ๋ฒ๋คํฐ์ค)๋ Docker ์ปจํ
์ด๋ ๊ธฐ๋ฐ ํ๊ฒฝ์์๋ ์ผ์ ์๊ฐ ๋์ ์์ฒญ์ด ์์ผ๋ฉด ์๋์ผ๋ก pod์ด ์ข
๋ฃ๋๊ฑฐ๋ scale down๋จ.
(4) Deep Learning ํ๋ ์์ํฌ์ Garbage Collection (GC)
โข
PyTorch, TensorFlow๋ ์ผ์ ์๊ฐ๋ง๋ค ๋ฏธ์ฌ์ฉ ํ
์๋ฅผ ํด์ ํ์ฌ GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณด.
โข
gc.collect() ๋๋ torch.cuda.empty_cache() ์คํ ์ ๊ฐ์ ์คํ๋จ.
2. ์ด ๊ธฐ๋ฅ์ ์ผ๊ฑฐ๋ ๋ ์ ์๋?
(1) CUDA Lazy Unloading ๋นํ์ฑํ
โข
๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ผ๋ก ๊ด๋ฆฌ๋์ง๋ง, CUDA ์ปจํ
์คํธ ์ ์ง๋ฅผ ์ํด ํน์ ์ค์ ์ ์กฐ์ ํ ์ ์์.
โข
Python์์๋ ๋ค์๊ณผ ๊ฐ์ด cudaMalloc์ ์ ์งํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์์:
torch.zeros((1,), device="cuda") # GPU ์ปจํ
์คํธ ์ ์ง
Python
๋ณต์ฌ
โข
๋๋ CUDA_LAUNCH_BLOCKING=1 ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋ฉด ์ผ๋ถ ์๋ ์ต์ ํ๊ฐ ๋นํ์ฑํ๋จ:
export CUDA_LAUNCH_BLOCKING=1
Shell
๋ณต์ฌ
(2) ์ ๋ ฅ ๊ด๋ฆฌ ๊ธฐ๋ฅ ๋นํ์ฑํ
โข
NVIDIA ์ ๋ ฅ ๊ด๋ฆฌ ์ค์ ์ Persistent Mode๋ก ๋ณ๊ฒฝํ๋ฉด ์ผ์ ์๊ฐ ํ ๋ฆฌ์์ค ํด์ ๊ฐ ๋ฐฉ์ง๋จ:
sudo nvidia-smi -pm 1
Shell
๋ณต์ฌ
โข
๋ถํ
ํ ๋ ์๋ ์ ์ฉํ๋ ค๋ฉด /etc/rc.local์ ์ถ๊ฐ.
(3) ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ชจ๋ธ ์ ์ง
โข
FastAPI, Flask ๋ฑ์ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ชจ๋ธ์ ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ๋ ค๋ฉด Lazy Loading์ ๋นํ์ฑํํ๊ณ , ๊ธ๋ก๋ฒ ๋ณ์๋ก ๋ชจ๋ธ์ ๋ก๋.
โข
์์ (FastAPI์์ AI ๋ชจ๋ธ ์ ์ง):
from fastapi import FastAPI
import torch
app = FastAPI()
model = torch.jit.load("model.pth").to("cuda") # ๋ชจ๋ธ์ GPU์ ํญ์ ๋ก๋
@app.get("/predict")
def predict():
return {"status": "model is always in GPU"}
Python
๋ณต์ฌ
โข
K8s๋ Docker ํ๊ฒฝ์์๋ pod autoscaler ๊ธฐ๋ฅ์ ๋๊ฑฐ๋, ์ต์ pod ์๋ฅผ ์ค์ .
(4) Garbage Collection ๊ฐ์ ์ ์ง
โข
gc.collect() ํธ์ถ์ ์ต์ํํ๊ฑฐ๋, torch.cuda.empty_cache()๋ฅผ ์คํํ์ง ์์ผ๋ฉด GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ ์ ์์.
โข
TensorFlow์ ๊ฒฝ์ฐ:
import tensorflow as tf
tf.config.experimental.set_memory_growth(tf.config.list_physical_devices('GPU')[0], True)
Python
๋ณต์ฌ
3. ๊ฒฐ๋ก
โข
AI ๋ชจ๋ธ์ด ์ฌ์ฉ๋์ง ์์ผ๋ฉด GPU ๋ฉ๋ชจ๋ฆฌ์์ ์๋ ํด์ ๋๋ ๊ฒ์ CUDA ๋ฐ OS์ ์์ ๊ด๋ฆฌ ๊ธฐ๋ฅ ๋๋ฌธ.
โข
์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด:
โฆ
nvidia-smi -pm 1๋ก GPU Persistent Mode ํ์ฑํ
โฆ
AI ์๋ฒ์์ ๋ชจ๋ธ์ ๊ธ๋ก๋ฒ ๋ณ์๋ก ์ ์ง
โฆ
CUDA ์ปจํ
์คํธ๋ฅผ ์ ์งํ๋ ์์ ์ฐ์ฐ(torch.zeros((1,), device="cuda")) ์ํ
โฆ
K8s/Docker ํ๊ฒฝ์์ ์๋ scale down ๋นํ์ฑํ
์ด ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ฉด AI ๋ชจ๋ธ์ด ํญ์ GPU์ ์ ์ง๋จ.
nvidia cuda fallback
1. CUDA Fallback์ด๋?
CUDA fallback์ ์ฝ๋ ์คํ ์ CUDA(์ฆ, GPU ๊ฐ์)๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ผ๋, ์ด๋ค ์ด์ ๋ก GPU ๊ฐ์์ด ๋ถ๊ฐ๋ฅํ์ฌ ๋์ CPU๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ ์๋ฏธํจ.
2. ๋ฐ์ํ๋ ์ฃผ์ ์์ธ
(1) CUDA ์ง์์ด ๋นํ์ฑํ๋จ
โข
GPU๊ฐ ์๊ฑฐ๋, CUDA ๋๋ผ์ด๋ฒ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์น๋์ง ์์.
โข
torch.cuda.is_available() ๋๋ nvidia-smi ๋ช
๋ น์ด๋ก ํ์ธ ๊ฐ๋ฅ.
(2) CUDA ๋ฒ์ ๋ถ์ผ์น
โข
์ค์น๋ PyTorch ๋๋ TensorFlow๊ฐ ์ง์ํ๋ CUDA ๋ฒ์ ๊ณผ ์์คํ
์ CUDA ๋๋ผ์ด๋ฒ ๋ฒ์ ์ด ๋ง์ง ์์.
โข
์: PyTorch๊ฐ CUDA 11.8์ ํ์๋ก ํ์ง๋ง, ์์คํ
์๋ CUDA 10.2๋ง ์ค์น๋จ.
โข
nvcc --version ๋ฐ torch.version.cuda๋ก ํ์ธ.
(3) CUDA ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
โข
GPU VRAM ๋ถ์กฑ์ผ๋ก CUDA ์ปค๋์ด ์คํ๋์ง ๋ชปํ๊ณ CPU๋ก ์ ํ๋จ.
โข
torch.cuda.memory_summary() ๋๋ nvidia-smi๋ก ์ฌ์ฉ๋ ํ์ธ.
โข
ํด๊ฒฐ์ฑ
: torch.cuda.empty_cache() ์คํ ํ ๋ค์ ์๋ํ๊ฑฐ๋ ๋ฐฐ์น ํฌ๊ธฐ ์ค์ด๊ธฐ.
(4) CUDA ์ฐ์ฐ ์ง์๋์ง ์์
โข
ํน์ ์ฐ์ฐ์ด GPU์์ ์ง์๋์ง ์์ CPU์์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ.
โข
์: ์ผ๋ถ CPU ์ ์ฉ ์ฐ์ฐ(torch.symeig() ๊ฐ์ ํจ์)์ GPU์์ ์คํ ๋ถ๊ฐ.
โข
ํด๊ฒฐ์ฑ
: CPU ์ ์ฉ ์ฐ์ฐ์ธ์ง ํ์ธ ํ ๋์ฒด ๋ฐฉ๋ฒ ๊ณ ๋ ค.
(5) PyTorch ๋๋ TensorFlow๊ฐ CPU ๋ชจ๋์์ ์คํ๋จ
โข
PyTorch ๋๋ TensorFlow๊ฐ CPU ๋ชจ๋๋ก ๋น๋๋จ.
โข
torch.backends.cudnn.enabled ๋๋ torch.cuda.is_available()๋ก ํ์ธ.
โข
ํด๊ฒฐ์ฑ
: GPU ์ง์ ๋ฒ์ ์ฌ์ค์น.
3. ํด๊ฒฐ ๋ฐฉ๋ฒ ์์ฝ
โข
torch.cuda.is_available() ๋๋ nvidia-smi๋ก CUDA ์ธ์ ์ฌ๋ถ ํ์ธ
โข
nvcc --version๊ณผ torch.version.cuda๋ก ๋ฒ์ ๋ถ์ผ์น ์ฒดํฌ
โข
GPU ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ torch.cuda.empty_cache() ์คํ ํ ์ฌ์๋
โข
GPU์์ ์คํ๋์ง ์๋ ์ฐ์ฐ์ธ์ง ํ์ธ ํ CPU ์คํ์ธ์ง ์ฒดํฌ
โข
PyTorch ๋๋ TensorFlow๊ฐ CPU ์ ์ฉ ๋น๋์ธ์ง ํ์ธ ํ ์ฌ์ค์น
์ถ๊ฐ์ ์ผ๋ก ๋ก๊ทธ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด ๋ ์ ํํ ์์ธ ๋ถ์ ๊ฐ๋ฅ.
์๋
ํ์ธ์
โข
๊ด๋ จ ๊ธฐ์ ๋ฌธ์์ R&D ๊ณต๋ ์ฐ๊ตฌ ์ฌ์
๊ด๋ จ ๋ฌธ์๋ โglory@keti.re.krโ๋ก ์ฐ๋ฝ ๋ถํ๋๋ฆฝ๋๋ค.
Hello 
โข
For technical and business inquiries, please contact me at โglory@keti.re.krโ



