Buckets:

hf-doc-build/doc / transformers /main /ko /model_memory_anatomy.html
mishig's picture
download
raw
18 kB
<meta charset="utf-8" /><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;GPU 메모리 사용량&quot;,&quot;local&quot;:&quot;gpu-memory-usage&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;텐서&quot;,&quot;local&quot;:&quot;tensors&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;운영&quot;,&quot;local&quot;:&quot;ops&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;다음 단계&quot;,&quot;local&quot;:&quot;next-steps&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2}],&quot;depth&quot;:1}"/>
<link href="/docs/transformers/main/en/_app/immutable/entry/start.ByZEd4qm.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/DHdg-_0Z.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/CBySwR1V.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/entry/app.CQqZS61p.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/Cdb1BouH.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/dUGfULTE.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/DOLBYqcr.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/DsnmJJEf.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/nodes/0.CEy2b_T8.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/Conj1S5Z.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/nodes/666.DoYCJ7Ar.js" rel="modulepreload">
<link href="/docs/transformers/main/en/_app/immutable/chunks/DoQ7MZQh.js" rel="modulepreload">
<!--71qes8--><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;GPU memory usage&quot;,&quot;local&quot;:&quot;gpu-memory-usage&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Tensors&quot;,&quot;local&quot;:&quot;tensors&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Ops&quot;,&quot;local&quot;:&quot;ops&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Next steps&quot;,&quot;local&quot;:&quot;next-steps&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2}],&quot;depth&quot;:1}"/><!---->
<link href="/docs/transformers/main/en/_app/immutable/assets/0.tn0RQdqM.css" rel="modulepreload"> <!--[--><!--[0--><!--[--><!--[0--><!--[--><p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: inline-end; margin-inline-start: 10px; display: inline-flex; position: relative; z-index: 10;"><div dir="ltr" class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----></span> <span dir="auto">Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg><!----></button></div> <!--[-1--><!--]--></div><!----> <!--[0--><h1 class="relative group"><a id="gpu-memory-usage" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#gpu-memory-usage"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->GPU 메모리 사용량<!----></span></h1><!--]--><!----> <p>16의 배치 크기로 혼합 정밀도(mixed precision)에서 4B 파라미터 모델을 학습하려면 대략 85GB의 GPU 메모리가 필요합니다. GPU 메모리를 차지하는 요소와 학습 중에 발생하는 연산 작업을 이해하면 메모리 사용량을 줄일 수 있는 부분을 파악하는 데 도움이 됩니다.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> 복사됨</div><!----></button><!----></div> <pre class="language-text "><!---->┌─────────────────────────── TENSORS ──────────────────────────────────┐
│ │
│ MODEL WEIGHTS ████████████████████████ 6 bytes/param │
│ (mixed precision) ├── fp16 copy (2B) — forward/backward pass │
│ └── fp32 copy (4B) — stable weight updates │
│ │
│ OPTIMIZER STATES ████████████████████████████████ 8 bytes/param │
│ (Adam) ├── fp32 momentum (4B) │
│ └── fp32 variance (4B) │
│ ↳ quantized Adam (bitsandbytes) → 2 bytes/param │
│ │
│ GRADIENTS ████████████████ 4 bytes/param (fp32) │
│ └── computed in backward pass, per parameter │
│ │
│ ACTIVATIONS ████ varies — batch × seq_len × depth × hidden │
│ (forward cache) └── cached for backward; can OOM even if model │
│ fits (long seqs / large batches) │
│ bf16/fp16 if using mixed precision │
│ │
│ TEMPORARY TENSORS ▓ short-lived (softmax, matmul scratch) │
│ └── peak spikes can cause OOM │
│ │
│ OTHER OVERHEAD ▒ beam search caches, large embedding tables │
└──────────────────────────────────────────────────────────────────────┘<!----></pre></div><!----> <p>GPU 메모리는 저장된 텐서와 이를 처리하는 연산이라는 두 가지 범주의 요소를 포함합니다.</p> <!--[1--><h2 class="relative group"><a id="tensors" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#tensors"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->텐서<!----></span></h2><!--]--><!----> <p>트레이닝에는 저장해야 하는 다양한 텐서 타입이 필요하며, 이러한 텐서 타입이 생성됩니다.</p> <ul><li><p>모델 가중치는 GPU에 저장됩니다. 혼합 정밀도 학습에서는 가중치 두 부가 필요합니다. 하나는 forward/backward pass에 사용되는 fp16이고, 다른 하나는 안정적인 가중치 업데이트를 위한 "main copy"로 사용되는 fp32입니다. 이는 매개변수당 6바이트에 해당합니다.</p></li> <li><p>Adam과 같은 Optimizer 상태는 매개변수마다 momentum과 variance라는 두 개의 추가 텐서를 저장하며, 둘 다 fp32입니다. 이는 매개변수당 8바이트의 추가 용량을 의미합니다.</p> <p><a href="https://huggingface.co/docs/bitsandbytes/main/en/index" rel="nofollow">bitsandbytes</a>의 양자화 버전인 Adam과 같은 다른 옵티마이저를 사용하여 매개변수당 2바이트로 압축할 수 있습니다.</p></li> <li><p>Gradient 텐서는 backward pass에서 각 매개변수에 대해 계산됩니다. 이는 fp32로 유지되므로 매개변수당 4바이트가 필요합니다.</p></li> <li><p>Forward activations는 forward pass에서 계산되어 backward pass에서 기울기를 계산하기 위해 캐시됩니다. 이러한 activations는 배치 크기, 시퀀스 길이, 모델 깊이, hidden size에 따라 크기가 달라집니다. 따라서 모델 자체는 GPU 메모리에 들어맞더라도 배치 크기나 시퀀스 길이 때문에 GPU 메모리가 소진될 수 있습니다.</p></li> <li><p>softmax이나 행렬 곱셈과 같은 연산에 의해 임시 텐서가 생성되며, 각 연산이 완료된 후 해제됩니다. 단일 연산의 피크가 매우 높으면 메모리가 부족해질 수 있는 일시적인 스파이크를 유발할 수 있습니다.</p></li> <li><p>일부 기능은 자체 오버헤드를 추가합니다. 예를 들어, beam search는 여러 출력을 유지하며, 대규모 어휘를 위한 embedding 테이블은 매우 커질 수 있습니다.</p></li></ul> <!--[1--><h2 class="relative group"><a id="ops" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#ops"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->운영<!----></span></h2><!--]--><!----> <p>주요 학습 op 유형은 세 가지입니다.</p> <ul><li><p>Matrix multiplication(matmul)은 linear layer, QKV projection, attention output projection, FFN layer를 포함하는 주요 연산 유형입니다. 주요 메모리 점유 요소는 시퀀스 길이의 제곱에 비례하여 증가하는 attention score matrix입니다. 이것이 긴 시퀀스가 매우 비용이 높은 이유이며, 메모리에 전체 matrix를 materialize하는 것을 피하기 위해 다양한 <a href="./attention_interface">attention backend</a>가 존재합니다.</p></li> <li><p>softmax, layer norm과 같은 reduction 연산은 전체 텐서를 읽고, 차원 전체에 걸쳐 통계를 계산한 뒤, 해당 값을 적용하기 위해 텐서를 다시 읽습니다. 이로 인해 연산마다 메모리에 여러 번 접근해야 합니다.</p></li> <li><p>activation과 dropout과 같은 요소별 연산은 각 요소에 독립적으로 함수를 적용하며, 메모리 사용량은 텐서 크기에 비례합니다.</p></li></ul> <!--[1--><h2 class="relative group"><a id="next-steps" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#next-steps"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->다음 단계<!----></span></h2><!--]--><!----> <ul><li>GPU 메모리가 부족하지 않으면서 더 큰 유효 배치 크기로 훈련을 시뮬레이션하는 방법을 배우려면 <a href="./grad_accumulation">Gradient accumulation</a> 가이드를 참조하세요.</li> <li>일부 중간 활성화만 저장하여 메모리 사용량을 줄이는 방법을 배우려면 <a href="./grad_checkpointing">Gradient checkpointing</a> 가이드를 참조하세요.</li> <li>메모리를 줄이고 학습 속도를 높이기 위해 낮은 정밀도의 데이터 타입을 사용하는 방법을 배우려면 <a href="./mixed_precision_training">Mixed precision training</a> 가이드를 참조하세요.</li> <li>커스텀 퓨즈드 커널을 사용하여 학습을 가속화하는 방법을 배우려면 <a href="./kernels">Kernels</a> 가이드를 참조하세요.</li></ul> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/transformers/blob/main/docs/source/en/model_memory_anatomy.md" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg><!----> <span><span class="underline">Update</span> on GitHub</span></a><!----> <p></p><!--]--><!----><!--]--><!--]--><!--]--> <!--[-1--><!--]--><!--]-->
<script>
{
__sveltekit_1y3v6y9 = {
base: "/docs/transformers/main/en",
assets: "/docs/transformers/main/en"
};
const element = document.currentScript.parentElement;
Promise.all([
import("/docs/transformers/main/en/_app/immutable/entry/start.ByZEd4qm.js"),
import("/docs/transformers/main/en/_app/immutable/entry/app.CQqZS61p.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 666],
data: [null,null],
form: null,
error: null
});
});
}
</script>

Xet Storage Details

Size:
18 kB
·
Xet hash:
b65abdfff30766f504e2187bfc83e2ab94c0f305902b2f23baab1659f1a54743

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.