Buckets:
| import{s as kd,o as Cd,n as Gd}from"../chunks/scheduler.9bc65507.js";import{S as Bd,i as $d,g as p,s as n,r as u,m as o,H as h,A as zd,h as m,f as t,c as l,j as v,u as y,x as r,n as c,B as g,k,y as i,a as e,v as M,d,t as w,w as f}from"../chunks/index.707bf1b6.js";import{T as Zd}from"../chunks/Tip.c2ecdbf4.js";import{C as b}from"../chunks/CodeBlock.54a9f38d.js";import{D as Qd}from"../chunks/DocNotebookDropdown.41f65cb5.js";import{H as ps,E as Vd}from"../chunks/EditOnGithub.922df6ba.js";function Id(ol){let C,Cs='참고로, 키-값 캐시를 사용할 것을 권장하지만, 이를 사용할 때 LLM 출력이 약간 다를 수 있습니다. 이것은 행렬 곱셈 커널 자체의 특성 때문입니다 — 더 자세한 내용은 <a href="https://github.com/huggingface/transformers/issues/25420#issuecomment-1775317535" rel="nofollow">여기</a>에서 읽어볼 수 있습니다.';return{c(){C=p("p"),C.innerHTML=Cs},l(S){C=m(S,"P",{"data-svelte-h":!0}),r(C)!=="svelte-mt58p3"&&(C.innerHTML=Cs)},m(S,wn){e(S,C,wn)},p:Gd,d(S){S&&t(C)}}}function Rd(ol){let C,Cs,S,wn,Gs,cl,Bs,hl,$s,Hg='GPT3/4, <a href="https://huggingface.co/tiiuae/falcon-40b" rel="nofollow">Falcon</a>, <a href="https://huggingface.co/meta-llama/Llama-2-70b-hf" rel="nofollow">Llama</a>와 같은 대규모 언어 모델의 인간 중심 과제를 해결하는 능력이 빠르게 발전하고 있으며, 현대 지식 기반 산업에서 필수 도구로 자리잡고 있습니다. 그러나 이러한 모델을 실제 과제에 배포하는 것은 여전히 어려운 과제입니다.',gl,zs,Ng='<li>인간과 비슷한 텍스트 이해 및 생성 능력을 보이기 위해, 현재 대규모 언어 모델은 수십억 개의 매개변수로 구성되어야 합니다 (참조: <a href="https://arxiv.org/abs/2001.08361" rel="nofollow">Kaplan et al</a>, <a href="https://arxiv.org/abs/2206.07682" rel="nofollow">Wei et. al</a>). 이는 추론을 위한 메모리 요구를 크게 증가시킵니다.</li> <li>많은 실제 과제에서 대규모 언어 모델은 방대한 맥락 정보를 제공받아야 합니다. 이는 모델이 추론 과정에서 매우 긴 입력 시퀀스를 처리할 수 있어야 한다는 것을 뜻합니다.</li>',ul,Zs,Lg="이러한 과제의 핵심은 대규모 언어 모델의 계산 및 메모리 활용 능력을 증대시키는 데 있습니다. 특히 방대한 입력 시퀀스를 처리할 때 이러한 능력이 중요합니다.",yl,Qs,Wg="이 가이드에서는 효율적인 대규모 언어 모델 배포를 위한 효과적인 기법들을 살펴보겠습니다.",Ml,Vs,Eg='<li><p><strong>낮은 정밀도:</strong> 연구에 따르면, <a href="./main_classes/quantization.md">8비트와 4비트</a>와 같이 낮은 수치 정밀도로 작동하면 모델 성능의 큰 저하 없이 계산상의 이점을 얻을 수 있습니다.</p></li> <li><p><strong>플래시 어텐션:</strong> 플래시 어텐션은 메모리 효율성을 높일 뿐만 아니라 최적화된 GPU 메모리 활용을 통해 효율성을 향상시키는 어텐션 알고리즘의 변형입니다.</p></li> <li><p><strong>아키텍처 혁신:</strong> 추론 시 대규모 언어 모델은 주로 동일한 방식(긴 입력 맥락을 가진 자기회귀 텍스트 생성 방식)으로 배포되는데, 더 효율적인 추론을 가능하게 하는 특화된 모델 아키텍처가 제안되었습니다. 이러한 모델 아키텍처의 가장 중요한 발전으로는 <a href="https://arxiv.org/abs/2108.12409" rel="nofollow">Alibi</a>, <a href="https://arxiv.org/abs/2104.09864" rel="nofollow">Rotary embeddings</a>, <a href="https://arxiv.org/abs/1911.02150" rel="nofollow">Multi-Query Attention (MQA)</a>, <a href="(https://arxiv.org/abs/2305.13245)">Grouped-Query-Attention (GQA)</a>이 있습니다.</p></li>',dl,Is,Yg="이 가이드에서는 텐서의 관점에서 자기회귀 생성에 대한 분석을 제공합니다. 낮은 정밀도를 채택하는 것의 장단점을 논의하고, 최신 어텐션 알고리즘을 포괄적으로 탐구하며, 향상된 대규모 언어 모델 아키텍처에 대해 논합니다. 이 과정에서 각 기능의 개선 사항을 보여주는 실용적인 예제를 확인합니다.",wl,Rs,fl,Xs,Ag="대규모 언어 모델을 가중치 행렬과 벡터의 집합으로 보고, 텍스트 입력을 벡터의 시퀀스로 본다면, 대규모 언어 모델의 메모리 요구사항을 가장 잘 이해할 수 있습니다. 이어지는 내용에서 <em>가중치</em>는 모델의 모든 가중치 행렬과 벡터를 의미합니다.",bl,Hs,Sg='이 가이드를 작성하는 시점의 대규모 언어 모델은 최소 몇십억 개의 매개변수로 구성되어 있습니다. 각 매개변수는 <code>4.5689</code>와 같은 십진수로 이루어져 있으며, 보통 <a href="https://en.wikipedia.org/wiki/Single-precision_floating-point_format" rel="nofollow">float32</a>, <a href="https://en.wikipedia.org/wiki/Bfloat16_floating-point_format" rel="nofollow">bfloat16</a> 또는 <a href="https://en.wikipedia.org/wiki/Half-precision_floating-point_format" rel="nofollow">float16</a> 형식으로 저장됩니다. 이를 통해 대규모 언어 모델을 메모리에 로드하는 데 필요한 메모리의 요구사항을 쉽게 계산할 수 있습니다:',vl,Ns,Pg="<p><em>X</em> 10억 개의 매개변수를 가진 모델의 가중치를 로드하려면 float32 정밀도에서 대략 4 <em>X GB의 VRAM이 필요합니다.</em></p>",xl,Ls,qg="요즘에는 모델이 float32 정밀도로 훈련되는 경우는 드물고, 일반적으로 bfloat16 정밀도나 가끔 float16 정밀도로 훈련됩니다. 따라서 경험적으로 알아낸 법칙은 다음과 같습니다:",Tl,Ws,Fg="<p><em>X</em> 10억 개의 매개변수를 가진 모델의 가중치를 로드하려면 bfloat16/float16 정밀도에서 대략 2 <em>X GB의 VRAM이 필요합니다.</em></p>",_l,Es,Kg="짧은 텍스트 입력(1024 토큰 미만)의 경우, 추론을 위한 메모리 요구 사항의 대부분은 가중치를 로드하는 데 필요한 메모리 요구 사항입니다. 따라서 지금은 추론을 위한 메모리 요구 사항이 모델의 가중치를 GPU VRAM에 로드하는 데 필요한 메모리 요구 사항과 같다고 가정합시다.",jl,Ys,Dg="모델을 bfloat16으로 로드하는 데 대략 얼마나 많은 VRAM이 필요한지 몇 가지 예를 들어보겠습니다:",Ul,As,Og='<li><strong>GPT3</strong>는 2 * 175 GB = <strong>350 GB</strong> VRAM이 필요합니다.</li> <li><a href="https://huggingface.co/bigscience/bloom" rel="nofollow"><strong>Bloom</strong></a>은 2 * 176 GB = <strong>352 GB</strong> VRAM이 필요합니다.</li> <li><a href="https://huggingface.co/meta-llama/Llama-2-70b-hf" rel="nofollow"><strong>Llama-2-70b</strong></a>는 2 * 70 GB = <strong>140 GB</strong> VRAM이 필요합니다.</li> <li><a href="https://huggingface.co/tiiuae/falcon-40b" rel="nofollow"><strong>Falcon-40b</strong></a>는 2 * 40 GB = <strong>80 GB</strong> VRAM이 필요합니다.</li> <li><a href="https://huggingface.co/mosaicml/mpt-30b" rel="nofollow"><strong>MPT-30b</strong></a>는 2 * 30 GB = <strong>60 GB</strong> VRAM이 필요합니다.</li> <li><a href="https://huggingface.co/bigcode/starcoder" rel="nofollow"><strong>bigcode/starcoder</strong></a>는 2 * 15.5 GB = <strong>31 GB</strong> VRAM이 필요합니다.</li>',Jl,Ss,su='이 문서를 작성하는 시점에서, 현재 시장에서 가장 큰 GPU 칩은 80GB의 VRAM을 제공하는 A100과 H100입니다. 앞서 언급된 대부분의 모델들은 로드하기 위해서는 최소 80GB 이상의 용량을 필요로 하며, 따라서 <a href="https://huggingface.co/docs/transformers/perf_train_gpu_many#tensor-parallelism" rel="nofollow">텐서 병렬 처리</a> 및/또는 <a href="https://huggingface.co/docs/transformers/perf_train_gpu_many#naive-model-parallelism-vertical-and-pipeline-parallelism" rel="nofollow">파이프라인 병렬 처리</a>를 반드시 필요로 합니다.',kl,Ps,au='🤗 Transformers는 텐서 병렬 처리를 바로 지원하지 않습니다. 이는 모델 아키텍처가 특정 방식으로 작성되어야 하기 때문입니다. 텐서 병렬 처리를 지원하는 방식으로 모델을 작성하는 데 관심이 있다면 <a href="https://github.com/huggingface/text-generation-inference/tree/main/server/text_generation_server/models/custom_modeling" rel="nofollow">the text-generation-inference library</a>를 참조해 보시기 바랍니다.',Cl,qs,tu='기본적인 파이프라인 병렬 처리는 바로 지원됩니다. 이를 위해 단순히 모델을 <code>device="auto"</code>로 로드하면 <a href="https://huggingface.co/docs/accelerate/v0.22.0/en/concept_guides/big_model_inference" rel="nofollow">여기</a>에 설명된 대로 사용 가능한 GPU에 모델의 서로 다른 레이어를 자동으로 배치합니다. 이것은 매우 효과적이긴 하지만 이러한 기본 파이프라인 병렬 처리는 GPU 유휴 문제를 해결하지 못한다는 점을 유의해야 합니다. 더 발전된 파이프라인 병렬 처리가 필요하며, 이에 대한 설명은 <a href="https://huggingface.co/docs/transformers/en/perf_train_gpu_many#naive-model-parallelism-vertical-and-pipeline-parallelism" rel="nofollow">여기</a>에서 확인할 수 있습니다.',Gl,Fs,eu="80GB A100 GPU 8개를 가진 노드에 접근할 수 있다면, BLOOM을 다음과 같이 로드할 수 있습니다.",Bl,Ks,$l,Ds,zl,Os,nu="<code>device_map="auto"</code>를 사용하면 모든 사용 가능한 GPU에 어텐션 레이어가 고르게 분산됩니다.",Zl,sa,lu='이 가이드에서는 <a href="https://huggingface.co/bigcode/octocoder" rel="nofollow">bigcode/octocoder</a>를 사용할 것입니다. 이 모델은 단일 40GB A100 GPU 장치에서 실행할 수 있습니다. 앞으로 적용할 모든 메모리 및 속도 최적화는 모델 또는 텐서 병렬 처리를 필요로 하는 다른 모델에도 동일하게 적용될 수 있습니다.',Ql,aa,pu="모델이 bfloat16 정밀도로 로드되기 때문에, 위의 경험적으로 알아낸 법칙을 사용하면 <code>bigcode/octocoder</code>를 사용하여 추론을 실행하기 위한 메모리 요구 사항이 약 31GB VRAM일 것으로 예상됩니다. 한 번 시도해 보겠습니다.",Vl,ta,mu='먼저 모델과 토크나이저를 로드한 다음, 둘 다 Transformers의 <a href="https://huggingface.co/docs/transformers/main_classes/pipelines" rel="nofollow">파이프라인</a> 객체에 전달합니다.',Il,ea,Rl,na,Xl,la,iu="<strong>출력</strong>:",Hl,pa,Nl,ma,ru="좋습니다. 이제 결과를 직접 사용하여 바이트를 기가바이트로 변환할 수 있습니다.",Ll,ia,Wl,ra,ou='<a href="https://pytorch.org/docs/stable/generated/torch.cuda.max_memory_allocated.html" rel="nofollow"><code>torch.cuda.max_memory_allocated</code></a>를 호출하여 최대 GPU 메모리 할당을 측정해 보겠습니다.',El,oa,Yl,ca,cu="<strong>출력</strong>:",Al,ha,Sl,ga,hu="대략적으로 계산한 결과와 거의 일치합니다! 바이트에서 킬로바이트로 변환할 때 1000이 아닌 1024로 곱해야 하므로 숫자가 정확하지 않은 것을 알 수 있습니다. 따라서 대략적으로 계산할 때 공식은 “최대 X GB”으로 이해할 수 있습니다. 만약 우리가 모델을 float32 정밀도로 실행하려고 했다면 더 큰 크기인 64GB의 VRAM이 필요했을 것입니다.",Pl,ua,gu='<p>거의 모든 모델이 요즘 bfloat16으로 학습되므로, <a href="https://discuss.pytorch.org/t/bfloat16-native-support/117155/5" rel="nofollow">GPU가 bfloat16을 지원</a>한다면 모델을 float32 정밀도로 실행할 이유가 없습니다. float32로 돌리는 모델은 학습할 때 사용했던 정밀도보다 더 나은 추론 결과를 제공하지 않습니다.</p>',ql,ya,uu='모델 가중치가 어떤 정밀도 형식으로 Hub에 저장되어 있는지 확실하지 않은 경우, HuggingFace Hub에서 해당 체크포인트 config의 <code>"torch_dtype"</code>을 확인하면 됩니다, <em>예</em>를 들어 <a href="https://huggingface.co/meta-llama/Llama-2-7b-hf/blob/6fdf2e60f86ff2481f2241aaee459f85b5b0bbb9/config.json#L21" rel="nofollow">여기</a>를 확인하세요. 모델을 <code>from_pretrained(..., torch_dtype=...)</code>로 로드할 때는 config에 명시된 정밀도 유형과 동일한 정밀도로 설정하는 것이 권장됩니다. 단, 원래 유형이 float32인 경우 추론을 위해 <code>float16</code> 또는 <code>bfloat16</code>을 둘 다 사용할 수 있습니다.',Fl,Ma,yu="이제 <code>flush(...)</code> 함수를 정의하여 모든 메모리를 해제하고, GPU 메모리의 최대 할당량을 정확하게 측정하도록 합시다.",Kl,da,Dl,wa,Mu="다음 실험을 위해 바로 호출해 봅시다.",Ol,fa,sp,ba,du="최근 버전의 accelerate 라이브러리에서는 <code>release_memory()</code>라는 유틸리티 메소드도 사용할 수 있습니다.",ap,va,tp,xa,wu='만약 GPU에 32GB의 VRAM이 없다면 어떻게 될까요? 모델 가중치를 성능에 큰 손실 없이 8비트 또는 4비트로 양자화할 수 있다는 것이 밝혀졌습니다(참고: <a href="https://arxiv.org/abs/2208.07339" rel="nofollow">Dettmers et al.</a>). 최근의 <a href="https://arxiv.org/abs/2210.17323" rel="nofollow">GPTQ 논문</a> 에서는 모델을 3비트 또는 2비트로 양자화해도 성능 손실이 허용 가능한 수준임을 보여주었습니다🤯.',ep,Ta,fu="너무 자세한 내용은 다루지 않고 설명하자면, 양자화는 가중치의 정밀도를 줄이면서 모델의 추론 결과를 가능한 한 정확하게(즉, bfloat16과 최대한 가깝게) 유지하려고 합니다. 양자화는 특히 텍스트 생성에 잘 작동하는데, 이는 우리가 <em>가장 가능성 있는 다음 토큰 집합</em>을 선택하는 것에 초점을 두고 있기 때문이며, 다음 토큰의 <em>logit</em> 분포값을 정확하게 예측할 필요는 없기 때문입니다. 핵심은 다음 토큰 <em>logit</em> 분포가 대략적으로 동일하게 유지되어 <code>argmax</code> 또는 <code>topk</code> 연산이 동일한 결과를 제공하는 것입니다.",np,_a,bu="다양한 양자화 기법이 존재하지만, 자세히 다루지는 않을 것입니다. 일반적으로 모든 양자화 기법은 다음과 같이 작동합니다:",lp,ja,vu='<li><ol><li>모든 가중치를 목표 정밀도로 양자화합니다.</li></ol></li> <li><ol start="2"><li>양자화된 가중치를 로드하고, bfloat16 정밀도의 입력 벡터 시퀀스를 모델에 전달합니다.</li></ol></li> <li><ol start="3"><li>가중치를 동적으로 bfloat16으로 반대로 양자화(dequantize)하여 입력 벡터와 함께 bfloat16 정밀도로 계산을 수행합니다.</li></ol></li>',pp,G,Uh,fn,xu="입력-가중치 행렬",Jh,mp,e0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex"> X </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span>',ip,bn,Tu="입력",kh,rp,n0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi></mrow><annotation encoding="application/x-tex"> W </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>',op,cp,l0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi></mrow><annotation encoding="application/x-tex"> Y </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span>',hp,gp,p0='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>Y</mi><mo>=</mo><mi>X</mi><mo>∗</mo><mi>W</mi></mrow><annotation encoding="application/x-tex"> Y = X * W </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span></span>',up,Ua,Ch,yp,m0='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>Y</mi><mo>=</mo><mi>X</mi><mo>∗</mo><mtext>dequantize</mtext><mo stretchy="false">(</mo><mi>W</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> Y = X * \\text{dequantize}(W) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">dequantize</span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mclose">)</span></span></span></span></span>',Mp,Ja,_u="모든 행렬 곱셈에 대해 위와 같이 수행됩니다. 입력이 네트워크 그래프를 통과하면서 모든 가중치 행렬에 대해 역양자화(dequantization)와 재양자화(re-quantization)가 순차적으로 수행됩니다.",dp,ka,ju='따라서, 양자화된 가중치를 사용할 때 추론 시간이 감소하지 <strong>않고</strong> 오히려 증가하는 경우가 많습니다. 이제 이론은 충분하니 실제로 시도해 봅시다! Transformers를 사용하여 가중치를 양자화하려면 <a href="https://github.com/TimDettmers/bitsandbytes" rel="nofollow"><code>bitsandbytes</code></a> 라이브러리가 설치되어 있는지 확인해야 합니다.',wp,Ca,fp,Ga,Uu="그런 다음 <code>from_pretrained</code>에 <code>load_in_8bit=True</code> 플래그를 추가하여 8비트 양자화로 모델을 로드할 수 있습니다.",bp,Ba,vp,$a,Ju="이제 예제를 다시 실행하고 메모리 사용량을 측정해 봅시다.",xp,za,Tp,Za,ku="<strong>출력</strong>:",_p,Qa,jp,Va,Cu="좋습니다. 정확도 손실 없이 이전과 동일한 결과를 얻고 있습니다! 이번에는 사용된 메모리 양을 확인해 봅시다.",Up,Ia,Jp,Ra,Gu="<strong>출력</strong>:",kp,Xa,Cp,Ha,Bu="훨씬 적네요! 메모리 사용량이 15GB를 조금 넘는 수준으로 줄어들어 4090과 같은 소비자용 GPU에서도 이 모델을 실행할 수 있습니다. 메모리 효율성에서 매우 큰 향상을 보이고 있으며 모델 출력의 품질 저하도 거의 없습니다. 그러나 추론 중에 약간의 속도 저하가 발생한 것을 확인할 수 있습니다.",Gp,Na,$u="모델을 삭제하고 메모리를 다시 초기화합니다.",Bp,La,$p,Wa,zp,Ea,zu="이제 4비트 양자화가 제공하는 최대 GPU 메모리 사용량을 확인해 봅시다. 4비트로 모델을 양자화하려면 이전과 동일한 API를 사용하되 이번에는 <code>load_in_8bit=True</code> 대신 <code>load_in_4bit=True</code>를 전달하면 됩니다.",Zp,Ya,Qp,Aa,Zu="<strong>출력</strong>:",Vp,Sa,Ip,Pa,Qu="바로 전 코드 스니펫에서 <code>python</code>만 누락되고, 이 전과 거의 동일한 출력 텍스트를 보고 있습니다. 이제 얼마나 많은 메모리가 필요했는지 확인해 봅시다.",Rp,qa,Xp,Fa,Vu="<strong>출력</strong>:",Hp,Ka,Np,Da,Iu="9.5GB밖에 되지 않습니다! 150억 개 이상의 파라미터를 가진 모델인 것을 감안하면 매우 적은 양입니다.",Lp,Oa,Ru="여기서는 모델의 정확도 저하가 거의 없음을 확인할 수 있지만, 실제로는 4비트 양자화를 8비트 양자화나 <code>bfloat16</code>를 사용한 추론 결과와 비교하면 결과가 다를 수 있습니다. 사용자가 직접 시도해 보는 것이 좋겠습니다.",Wp,F,Gh,Ep,i0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>quantize</mtext></mrow><annotation encoding="application/x-tex"> \\text{quantize} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8623em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">quantize</span></span></span></span></span>',Yp,Ap,r0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>dequantize</mtext></mrow><annotation encoding="application/x-tex"> \\text{dequantize} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord text"><span class="mord">dequantize</span></span></span></span></span>',Sp,Pp,st,qp,at,Fp,tt,Xu="전체적으로 OctoCoder를 8비트 정밀도로 실행하면 필요한 GPU VRAM이 32GB에서 15GB로 줄어들었고, 4비트 정밀도로 모델을 실행하면 필요한 GPU VRAM이 9GB로 더 줄어드는 것을 확인했습니다.",Kp,et,Hu="4비트 양자화는 RTX3090, V100, T4와 같은 GPU에서 모델을 실행할 수 있게 해주며, 이는 대부분의 사람들이 접근할 수 있는 GPU입니다.",Dp,nt,Nu='양자화에 대한 더 많은 정보를 확인하고 4비트보다 더 적은 GPU VRAM 메모리로 모델을 양자화하거나, 더 많은 양자화 관련 정보를 보려면 <a href="https://huggingface.co/docs/transformers/main/en/main_classes/quantization#autogptq-integration%60" rel="nofollow"><code>AutoGPTQ</code></a> 구현을 참조하는 것을 추천합니다.',Op,lt,Lu="<p>결론적으로, 모델 양자화는 향상된 메모리 효율성과 모델 정확성 간의 균형을 맞추는 것이며, 경우에 따라 추론 시간에도 영향을 미칠 수 있습니다.</p>",sm,pt,Wu="실제 사례에서 GPU 메모리가 충분하다면, 양자화를 고려할 필요가 없습니다. 그러나 많은 GPU는 양자화 없이 대규모 언어 모델을 실행할 수 없으며, 이 경우 4비트 및 8비트 양자화가 매우 유용한 도구입니다.",am,mt,Eu='사용과 관련한 더 자세한 정보는 <a href="https://huggingface.co/docs/transformers/main_classes/quantization#general-usage" rel="nofollow">트랜스포머 양자화 문서</a>를 참고하는 것을 강력히 추천합니다. 다음으로, 더 나은 알고리즘과 개선된 모델 아키텍처를 사용하여 계산 및 메모리 효율성을 향상시키는 방법을 살펴보겠습니다.',tm,it,em,rt,Yu="오늘날의 최고 성능을 자랑하는 대규모 언어 모델은 대체로 피드포워드 레이어(feed-forward layer), 활성화 레이어(activation layer), 레이어 정규화 레이어(layer normalization layer), 그리고 가장 중요한 셀프 어텐션 레이어(self-attention layer)로 구성된 아키텍처를 공유하고 있습니다.",nm,K,Bh,lm,o0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex"> N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>',pm,vn,Au="2차적",$h,mm,T,zh,im,c0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex"> N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>',rm,om,h0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">X</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{X} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">X</span></span></span></span>',cm,hm,g0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">O</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{O} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">O</span></span></span></span>',gm,um,u0='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext mathvariant="bold">O</mtext><mo>=</mo><mtext>Attn</mtext><mo stretchy="false">(</mo><mi mathvariant="bold">X</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="bold">V</mi><mo>×</mo><mtext>Softmax</mtext><mo stretchy="false">(</mo><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup><mo stretchy="false">)</mo><mtext> with </mtext><mi mathvariant="bold">Q</mi><mo>=</mo><msub><mi mathvariant="bold">W</mi><mi>q</mi></msub><mi mathvariant="bold">X</mi><mo separator="true">,</mo><mi mathvariant="bold">V</mi><mo>=</mo><msub><mi mathvariant="bold">W</mi><mi>v</mi></msub><mi mathvariant="bold">X</mi><mo separator="true">,</mo><mi mathvariant="bold">K</mi><mo>=</mo><msub><mi mathvariant="bold">W</mi><mi>k</mi></msub><mi mathvariant="bold">X</mi></mrow><annotation encoding="application/x-tex"> \\textbf{O} = \\text{Attn}(\\mathbf{X}) = \\mathbf{V} \\times \\text{Softmax}(\\mathbf{QK}^T) \\text{ with } \\mathbf{Q} = \\mathbf{W}_q \\mathbf{X}, \\mathbf{V} = \\mathbf{W}_v \\mathbf{X}, \\mathbf{K} = \\mathbf{W}_k \\mathbf{X} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord text"><span class="mord textbf">O</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Attn</span></span><span class="mopen">(</span><span class="mord mathbf">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7694em;vertical-align:-0.0833em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1673em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Softmax</span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord text"><span class="mord"> with </span></span><span class="mord mathbf">Q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9722em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.01597em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.016em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord mathbf">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8805em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.01597em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.016em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathbf">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathbf">K</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.01597em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.016em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathbf">X</span></span></span></span></span>',ym,Mm,y0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">X</mi><mo>=</mo><mo stretchy="false">(</mo><mi mathvariant="bold">x</mi><mn>1</mn><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="bold">x</mi><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> \\mathbf{X} = (\\mathbf{x}1, ... \\mathbf{x}{N}) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathbf">x</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mord mathbf">x</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span><span class="mclose">)</span></span></span></span>',dm,wm,M0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">Q</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{Q} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8805em;vertical-align:-0.1944em;"></span><span class="mord mathbf">Q</span></span></span></span>',fm,bm,d0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">K</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{K} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">K</span></span></span></span>',vm,xm,w0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex"> N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>',Tm,_m,f0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',jm,Um,b0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>N</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex"> N^2 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>',Jm,km,U,Zh,Cm,v0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">Q</mi><msup><mi mathvariant="bold">K</mi><mi mathvariant="bold">T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK^T} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0377em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">Q</span><span class="mord"><span class="mord mathbf">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8433em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathbf mtight">T</span></span></span></span></span></span></span></span></span></span></span></span>',Gm,Bm,x0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>40</mn><mo>∗</mo><mn>2</mn><mo>∗</mo><msup><mi>N</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex"> 40 * 2 * N^2 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">40</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>',$m,zm,T0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>=</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex"> N=1000 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1000</span></span></span></span>',Zm,Qm,_0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>=</mo><mn>16000</mn></mrow><annotation encoding="application/x-tex"> N=16000 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">16000</span></span></span></span>',Vm,Im,j0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>=</mo><mn>100</mn><mo separator="true">,</mo><mn>000</mn></mrow><annotation encoding="application/x-tex"> N=100,000 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">100</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">000</span></span></span></span>',Rm,Xm,U0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">Q</mi><msup><mi mathvariant="bold">K</mi><mi mathvariant="bold">T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK^T} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0377em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">Q</span><span class="mord"><span class="mord mathbf">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8433em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathbf mtight">T</span></span></span></span></span></span></span></span></span></span></span></span>',Hm,Nm,ot,Su="요약하자면, 기본 셀프 어텐션 알고리즘은 큰 입력 컨텍스트에 대해 매우 과도한 메모리 사용을 요구하게 됩니다.",Lm,ct,Pu="대규모 언어 모델의 텍스트 이해 및 생성 능력이 개선되면서 점점 더 복잡한 작업에 사용되고 있습니다. 한때 몇 문장의 번역이나 요약을 처리하던 모델이 이제는 전체 페이지를 처리해야 하게 되면서 광범위한 입력 길이를 처리할 수 있는 능력이 요구되고 있습니다.",Wm,W,Qh,Em,J0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> QK^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0358em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',Ym,cs,qu="Tri Dao et al.",Vh,xn,Fu="플래시 어텐션(Flash Attention)",Ih,Am,ms,Rh,Sm,k0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">V</mi><mo>×</mo><mtext>Softmax</mtext><mo stretchy="false">(</mo><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex">\\mathbf{V} \\times \\text{Softmax}(\\mathbf{QK}^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7694em;vertical-align:-0.0833em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1673em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Softmax</span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',Pm,qm,C0='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mtext mathvariant="bold">O</mtext><mi>i</mi></msub><mo>←</mo><msubsup><mi>s</mi><mrow><mi>i</mi><mi>j</mi></mrow><mi>a</mi></msubsup><mo>∗</mo><msub><mtext mathvariant="bold">O</mtext><mi>i</mi></msub><mo>+</mo><msubsup><mi>s</mi><mrow><mi>i</mi><mi>j</mi></mrow><mi>b</mi></msubsup><mo>∗</mo><msub><mi mathvariant="bold">V</mi><mi>j</mi></msub><mo>×</mo><mtext>Softmax</mtext><mo stretchy="false">(</mo><msubsup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow><mi>T</mi></msubsup><mo stretchy="false">)</mo><mtext> for multiple </mtext><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mtext> iterations</mtext></mrow><annotation encoding="application/x-tex"> \\textbf{O}_i \\leftarrow s^a_{ij} * \\textbf{O}_i + s^b_{ij} * \\mathbf{V}_{j} \\times \\text{Softmax}(\\mathbf{QK}^T_{i,j}) \\text{ for multiple } i, j \\text{ iterations} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord text"><span class="mord textbf">O</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">←</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0975em;vertical-align:-0.3831em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord text"><span class="mord textbf">O</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.2822em;vertical-align:-0.3831em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.9722em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.01597em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.016em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.3004em;vertical-align:-0.3831em;"></span><span class="mord text"><span class="mord">Softmax</span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-2.453em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord text"><span class="mord"> for multiple </span></span><span class="mord mathnormal">i</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mord text"><span class="mord"> iterations</span></span></span></span></span></span>',Fm,Q,Xh,Km,G0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>s</mi><mrow><mi>i</mi><mi>j</mi></mrow><mi>a</mi></msubsup></mrow><annotation encoding="application/x-tex"> s^a_{ij} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0592em;vertical-align:-0.3948em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.3948em;"><span></span></span></span></span></span></span></span></span></span>',Dm,Om,B0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>s</mi><mrow><mi>i</mi><mi>j</mi></mrow><mi>b</mi></msubsup></mrow><annotation encoding="application/x-tex"> s^b_{ij} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2439em;vertical-align:-0.3948em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">ij</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.3948em;"><span></span></span></span></span></span></span></span></span></span>',si,ai,$0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex"> i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>',ti,ei,z0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex"> j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>',ni,li,ht,Ku='플래시 어텐션의 전체 알고리즘은 더 복잡하며, 본 가이드의 범위를 벗어나기 때문에 크게 단순화하였습니다. 여러분은 잘 작성된 <a href="https://arxiv.org/abs/2205.14135" rel="nofollow">Flash Attention paper</a> 논문을 참조하여 더 자세한 내용을 확인해 보시기 바랍니다.',pi,gt,Du="주요 요점은 다음과 같습니다:",mi,Tn,is,Hh,_n,Ou="숫자적으로 동일한",Nh,ii,Z0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex"> N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>',ri,oi,ut,sy='공식을 보면, 플래시 어텐션이 더 많은 계산을 필요로 하기 때문에 기본 셀프 어텐션 공식보다 훨씬 느릴 것이라고 생각할 수 있습니다. 실제로 플래시 어텐션은 소프트맥스 정규화 통계량을 지속적으로 다시 계산해야 하기 때문에 일반 어텐션보다 더 많은 FLOP이 필요합니다. (더 자세한 내용은 <a href="https://arxiv.org/abs/2205.14135" rel="nofollow">논문</a>을 참조하세요)',ci,yt,ay="<p>그러나 플래시 어텐션은 기본 어텐션보다 추론 속도가 훨씬 빠릅니다. 이는 GPU의 느리고 고대역폭 메모리(VRAM)의 사용량을 크게 줄이고 대신 빠른 온칩 메모리(SRAM)에 집중할 수 있기 때문입니다.</p>",hi,D,Lh,jn,ty="온칩",Wh,gi,Q0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">O</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{O} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">O</span></span></span></span>',ui,yi,Mt,ey="현실적으로 플래시 어텐션이 사용 가능한 경우 이를 <strong>사용하지 않을</strong> 이유는 전혀 없습니다. 이 알고리즘은 수학적으로 동일한 출력을 제공하며, 더 빠르고 메모리 효율적입니다.",Mi,dt,ny="실제 예를 살펴보겠습니다.",di,wt,ly="우리의 OctoCoder 모델은 이제 <em>시스템 프롬프트</em>가 포함된 훨씬 더 긴 입력 프롬프트를 받게 됩니다. 시스템 프롬프트는 대규모 언어 모델을 사용자의 작업에 맞춘 더 나은 어시스턴트로 유도하는 데 사용됩니다. 다음 예제에서는 OctoCoder를 더 나은 코딩 어시스턴트로 만들기 위한 시스템 프롬프트를 사용합니다.",wi,ft,fi,bt,py="시연을 위해 시스템 프롬프트를 10번 중복하여 증가시켜 플래시 어텐션의 메모리 절약 효과를 관찰할 수 있을 만큼 입력 길이를 충분히 길게 만듭니다. 원래의 텍스트 프롬프트를 다음과 같이 추가합니다. <code>"Question: Please write a function in Python that transforms bytes to Giga bytes.\\n\\nAnswer: Here"</code>",bi,vt,vi,xt,my="모델을 다시 bfloat16 정밀도로 인스턴스화합니다.",xi,Tt,Ti,_t,iy="이제 플래시 어텐션을 <em>사용하지 않고</em> 이전과 동일하게 모델을 실행하여 최대 GPU 메모리 요구량과 추론 시간을 측정해 봅시다.",_i,jt,ji,Ut,ry="<strong>출력</strong>:",Ui,Jt,Ji,kt,oy="이전과 동일한 출력을 얻고 있지만, 이번에는 모델이 답변을 여러 번 반복하여 60개의 토큰이 잘릴 때까지 계속됩니다. 시연을 위해 시스템 프롬프트를 10번 반복했기 때문에 모델이 스스로 반복하도록 유도한 결과입니다. 이는 놀라운 일이 아닙니다.",ki,Ct,cy="<strong>참고</strong> 실제 응용에서는 시스템 프롬프트를 10번 반복할 필요가 없습니다. 한 번만 사용하면 충분합니다!",Ci,Gt,hy="최대 GPU 메모리 요구량을 측정해 봅시다.",Gi,Bt,Bi,$t,gy="<strong>출력</strong>:",$i,zt,zi,Zt,uy="보시다시피 최대 GPU 메모리 요구량이 처음보다 상당히 높아졌습니다. 이는 주로 입력 시퀀스가 길어졌기 때문입니다. 또한 생성 시간이 이제 1분을 넘어갑니다.",Zi,Qt,yy="다음 실험을 위해 <code>flush()</code>를 호출하여 GPU 메모리를 초기화합니다.",Qi,Vt,Vi,It,My=`비교를 위해, 동일한 기능을 실행하되 플래시 어텐션을 활성화해 보겠습니다. | |
| 이를 위해 모델을 <a href="https://huggingface.co/docs/optimum/bettertransformer/overview" rel="nofollow">BetterTransformer</a>로 변환하고, 이를 통해 PyTorch의 <a href="https://pytorch.org/docs/master/generated/torch.nn.functional.scaled_dot_product_attention" rel="nofollow">SDPA self-attention</a>을 활성화하면 플래시 어텐션을 사용할 수 있습니다.`,Ii,Rt,Ri,Xt,dy="이제 이전과 동일한 코드 스니펫을 실행하면, 내부적으로 Transformers가 플래시 어텐션을 사용할 것입니다.",Xi,Ht,Hi,Nt,wy="<strong>출력</strong>:",Ni,Lt,Li,Wt,fy="이전과 동일한 결과를 얻었지만, 플래시 어텐션 덕분에 매우 큰 속도 향상을 관찰할 수 있습니다.",Wi,Et,by="메모리 소비량을 마지막으로 한 번 더 측정해 봅시다.",Ei,Yt,Yi,At,vy="<strong>출력</strong>:",Ai,St,Si,Pt,xy="그리고 우리는 처음에 보았던 GPU 메모리 요구량인 29GB로 돌아왔습니다.",Pi,qt,Ty="플래시 어텐션을 사용하여 매우 긴 입력 시퀀스를 전달할 때 처음에 짧은 입력 시퀀스를 전달했을 때와 비교하여 약 100MB 정도의 GPU 메모리를 더 사용한다는 것을 관찰할 수 있습니다.",qi,Ft,Fi,Kt,_y='플래시 어텐션 사용에 대한 자세한 정보는 <a href="https://huggingface.co/docs/transformers/en/perf_infer_gpu_one#flashattention-2" rel="nofollow">이 문서 페이지</a>를 참조해 주세요.',Ki,Dt,Di,Ot,jy="지금까지 우리는 계산 및 메모리 효율성을 개선하기 위해 다음을 살펴보았습니다:",Oi,se,Uy="<li>가중치를 낮은 정밀도 형식으로 변환</li> <li>셀프 어텐션 알고리즘을 보다 더 메모리 및 계산 효율적인 버전으로 교체</li>",sr,ae,Jy="이제 긴 텍스트 입력이 필요한 작업에 가장 효과적이고 효율적인 대규모 언어 모델 아키텍처로 변경하는 방법을 살펴보겠습니다. 작업의 예시는 다음과 같습니다:",ar,te,ky="<li>검색 증강 질의 응답</li> <li>요약</li> <li>채팅</li>",tr,ee,Cy="<em>채팅</em>을 위해서는 대규모 언어 모델이 긴 텍스트 입력을 처리하는 것뿐만 아니라 사용자와 어시스턴트 간의 대화도 효율적으로 처리할 수 있어야 합니다(예: ChatGPT).",er,ne,Gy="한번 학습된 후에는 대규모 언어 모델의 기본 아키텍처를 변경하기 어렵기 때문에, 대규모 언어 모델의 작업에 대한 고려를 미리 하고 이에 따라 모델의 아키텍처를 최적화하는 것이 중요합니다. 긴 입력 시퀀스에 대해 메모리 또는 성능의 병목 현상을 빠르게 발생시키는 모델 아키텍처의 중요한 두 가지 구성 요소가 있습니다.",nr,le,By="<li>위치 임베딩</li> <li>키-값 캐시</li>",lr,pe,$y="각 구성 요소를 더 자세히 살펴보겠습니다.",pr,me,mr,O,Eh,Un,zy="“Hello”, “I”, “love”, “you”",Yh,ir,V0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>Softmax</mtext><mo stretchy="false">(</mo><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> \\text{Softmax}(\\mathbf{QK}^T) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1673em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Softmax</span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>',rr,or,ie,Zy='<img src="/blog/assets/163_optimize_llm/self_attn_tokens.png"/>',cr,re,Qy="각 단어 토큰은 다른 모든 단어 토큰에 주의를 기울이는 확률 질량을 부여받아 모든 다른 단어 토큰과 관계를 맺게 됩니다. 예를 들어, 단어 <em>“love”</em>는 단어 <em>“Hello”</em>에 5%, <em>“I”</em>에 30%, 그리고 자신에게 65%의 주의를 기울입니다.",hr,V,Ah,gr,I0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',ur,yr,R0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex"> O(1) </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span>',Mr,Jn,Vy="“Hello I love you”",Sh,kn,Iy="“You love I hello”",Ph,dr,oe,Ry=`대규모 언어 모델이 문장의 순서를 이해하려면 추가적인 <em>단서</em>가 필요하며, 이는 일반적으로 <em>위치 인코딩</em> (또는 <em>위치 임베딩</em>이라고도 함)의 형태로 적용됩니다. | |
| 위치 인코딩은 각 토큰의 위치를 숫자 표현으로 인코딩하여 대규모 언어 모델이 문장의 순서를 더 잘 이해할 수 있도록 도와줍니다.`,wr,B,hs,Xy="<em>Attention Is All You Need</em>",qh,fr,X0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">P</mi><mo>=</mo><msub><mi mathvariant="bold">p</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi mathvariant="bold">p</mi><mi>N</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{P} = \\mathbf{p}_1, \\ldots, \\mathbf{p}_N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">P</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbf">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',br,vr,H0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">p</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{p}_i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',xr,Tr,N0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex"> i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>',_r,jr,L0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi mathvariant="bold">X</mi><mo>^</mo></mover><mo>=</mo><msub><mover accent="true"><mi mathvariant="bold">x</mi><mo>^</mo></mover><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mover accent="true"><mi mathvariant="bold">x</mi><mo>^</mo></mover><mi>N</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{\\hat{X}} = \\mathbf{\\hat{x}}_1, \\ldots, \\mathbf{\\hat{x}}_N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9495em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9495em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathbf">X</span></span><span style="top:-3.2551em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.2875em;"><span class="mord mathbf">^</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9023em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathbf">x</span></span><span style="top:-3.0134em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.2875em;"><span class="mord mathbf">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathbf">x</span></span><span style="top:-3.0134em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.2875em;"><span class="mord mathbf">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',Ur,Jr,W0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">x</mi><mn>1</mn></msub><mo>+</mo><msub><mi mathvariant="bold">p</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi mathvariant="bold">x</mi><mi>N</mi></msub><mo>+</mo><msub><mi mathvariant="bold">p</mi><mi>N</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{x}_1 + \\mathbf{p}_1, \\ldots, \\mathbf{x}_N + \\mathbf{p}_N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbf">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',kr,Cr,ss,Fh,gs,Hy="Devlin et al.",Kh,Gr,E0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">P</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{P} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf">P</span></span></span></span>',Br,$r,ce,Ny="사인 함수 및 학습된 위치 임베딩은 문장 순서를 대규모 언어 모델에 인코딩하는 주요 방법이었지만, 이러한 위치 인코딩과 관련된 몇 가지 문제가 발견되었습니다:",zr,us,P,Dh,Zr,Y0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>N</mi></mrow><annotation encoding="application/x-tex"> 0, \\ldots, N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>',Qr,ys,Ly="Huang et al.",Oh,Ms,Wy="Su et al.",sg,ag,he,tg,Vr,A0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex"> N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>',Ir,Rr,ge,Ey="최근에는 위에서 언급한 문제를 해결할 수 있는 상대적 위치 임베딩이 더 인기를 끌고 있습니다. 특히 다음과 같은 방법들이 주목받고 있습니다:",Xr,ue,Yy='<li><a href="https://arxiv.org/abs/2104.09864" rel="nofollow">Rotary Position Embedding (RoPE)</a></li> <li><a href="https://arxiv.org/abs/2108.12409" rel="nofollow">ALiBi</a></li>',Hr,q,Cn,Ay="RoPE",eg,Gn,Sy="ALiBi",ng,Nr,S0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',Lr,Wr,$,lg,Bn,Py="RoPE",pg,Er,P0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',Yr,Ar,q0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">x</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{x}_j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7305em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>',Sr,Pr,F0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>∗</mo><mi>i</mi></mrow><annotation encoding="application/x-tex"> \\theta * i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>',qr,Fr,K0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>∗</mo><mi>j</mi></mrow><annotation encoding="application/x-tex"> \\theta * j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>',Kr,Dr,D0='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mover accent="true"><mi mathvariant="bold">q</mi><mo>^</mo></mover><mi>i</mi><mi>T</mi></msubsup><msub><mover accent="true"><mi mathvariant="bold">x</mi><mo>^</mo></mover><mi>j</mi></msub><mo>=</mo><msubsup><mi mathvariant="bold">q</mi><mi>i</mi><mi>T</mi></msubsup><msub><mi mathvariant="bold">R</mi><mrow><mi>θ</mi><mo separator="true">,</mo><mi>i</mi><mo>−</mo><mi>j</mi></mrow></msub><msub><mi mathvariant="bold">x</mi><mi>j</mi></msub><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{\\hat{q}}_i^T \\mathbf{\\hat{x}}_j = \\mathbf{{q}}_i^T \\mathbf{R}_{\\theta, i -j} \\mathbf{{x}}_j. </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2252em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7079em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathbf">q</span></span><span style="top:-3.0134em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.2875em;"><span class="mord mathbf">^</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9391em;"><span style="top:-2.453em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.1608em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7079em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathbf">x</span></span><span style="top:-3.0134em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.2875em;"><span class="mord mathbf">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1774em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">q</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-2.453em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathbf">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord"><span class="mord mathbf">x</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord">.</span></span></span></span></span>',Or,E,mg,so,O0='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">R</mi><mrow><mi>θ</mi><mo separator="true">,</mo><mi>i</mi><mo>−</mo><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{R}_{\\theta, i - j} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9722em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>',ao,to,sd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex"> \\theta </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>',eo,$n,qy="학습되지 않으며",ig,no,zn,z,rg,lo,ad='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',po,mo,td='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7305em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>',io,ro,ed='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo mathvariant="normal">≠</mo><mi>j</mi></mrow><annotation encoding="application/x-tex"> i \\ne j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>',oo,co,nd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex"> i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>',ho,go,ld='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex"> j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>',uo,yo,pd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>−</mo><mi>j</mi></mrow><annotation encoding="application/x-tex"> i - j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>',Mo,wo,ye,Fy="<em>RoPE</em>는 현재 여러 중요한 대규모 언어 모델이 사용되고 있습니다. 예를 들면:",fo,Me,Ky='<li><a href="https://huggingface.co/tiiuae/falcon-40b" rel="nofollow"><strong>Falcon</strong></a></li> <li><a href="https://arxiv.org/abs/2302.13971" rel="nofollow"><strong>Llama</strong></a></li> <li><a href="https://arxiv.org/abs/2204.02311" rel="nofollow"><strong>PaLM</strong></a></li>',bo,Y,og,Zn,Dy="ALiBi",cg,Qn,Oy="m",hg,vo,md='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',xo,To,de,sM='<img src="/blog/assets/163_optimize_llm/alibi.png"/>',_o,we,aM='<a href="https://arxiv.org/abs/2108.12409" rel="nofollow">ALiBi</a> 논문에서 보여주듯이, 이 간단한 상대적 위치 인코딩은 매우 긴 텍스트 입력 시퀀스에서도 모델이 높은 성능을 유지할 수 있게 합니다.',jo,fe,tM="<em>ALiBi</em>는 현재 여러 중요한 대규모 언어 모델 모델이 사용하고 있습니다. 예를 들면:",Uo,be,eM='<li><a href="https://huggingface.co/mosaicml/mpt-30b" rel="nofollow"><strong>MPT</strong></a></li> <li><a href="https://huggingface.co/bigscience/bloom" rel="nofollow"><strong>BLOOM</strong></a></li>',Jo,x,Vn,nM="RoPE",gg,In,lM="ALiBi",ug,Rn,pM="ALiBi",yg,Xn,mM="RoPE",Mg,Hn,iM="ALiBi",dg,Nn,rM="RoPE",wg,ko,id='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex"> \\theta </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>',Co,ds,oM="Press et al.",fg,Go,rd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex"> \\theta </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span></span></span></span>',Bo,Ln,cM="RoPE",bg,ws,hM="here",vg,$o,fs,Wn,gM="RoPE와 ALiBi는 모두 훈련 중에 <em>학습되지 않는</em> 상대적 위치 임베딩으로 다음과 같은 직관에 기반합니다:",xg,rs,ve,Tg,zo,od='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> QK^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0358em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',Zo,_g,En,uM="대규모 언어 모델은 일정한 <em>상대적</em> 거리 위치 인코딩을 서로 학습하도록 유도되어야 합니다.",jg,Yn,yM="텍스트 입력 토큰 간의 거리가 멀어질수록, 그들의 쿼리-값 확률은 낮아져야 합니다. RoPE와 ALiBi는 서로 멀리 떨어진 토큰의 쿼리-키 확률을 낮춥니다. RoPE는 쿼리-키 벡터 간의 각도를 증가시켜 벡터 곱을 감소시키는 방식으로, ALiBi는 벡터 곱에 큰 음수를 추가하는 방식으로 이 작업을 수행합니다.",Qo,A,Ug,Vo,cd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>N</mi><mn>1</mn></msub><mo>=</mo><mn>2048</mn></mrow><annotation encoding="application/x-tex"> N_1 = 2048 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2048</span></span></span></span>',Io,Ro,hd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>N</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex"> N_1 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',Xo,Ho,gd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>N</mi><mn>2</mn></msub><mo>=</mo><mn>8192</mn><mo>></mo><msub><mi>N</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex"> N_2 = 8192 > N_1 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6835em;vertical-align:-0.0391em;"></span><span class="mord">8192</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',No,Lo,xe,Wo,Te,MM="대규모 언어 모델을 이용한 자기회귀 텍스트 생성은 입력 시퀀스를 반복적으로 넣고, 다음 토큰을 샘플링하며, 그 다음 토큰을 입력 시퀀스에 추가하고, 대규모 언어 모델이 생성을 완료했다는 토큰을 생성할 때까지 이를 계속 수행하는 방식으로 작동합니다.",Eo,_e,dM='자기회귀 생성이 어떻게 작동하는지에 대한 시각적 설명을 보려면 <a href="https://huggingface.co/docs/transformers/llm_tutorial#generate-text" rel="nofollow">Transformer’s Generate Text Tutorial</a>을 참조하세요.',Yo,je,wM="자기회귀 생성이 실제로 어떻게 작동하는지 보여주는 간단한 코드 스니펫을 실행해 보겠습니다. 여기서는 <code>torch.argmax</code>를 통해 가장 가능성이 높은 다음 토큰을 가져올 것입니다.",Ao,Ue,So,Je,fM="<strong>출력</strong>:",Po,ke,qo,Ce,bM="보시다시피 샘플링된 토큰에 의해 텍스트 입력 토큰을 매번 증가시킵니다.",Fo,Ge,vM='매우 예외적인 경우를 제외하고, 대규모 언어 모델은 <a href="https://huggingface.co/docs/transformers/tasks/language_modeling#causal-language-modeling" rel="nofollow">인과적인 언어 모델링 목표</a>를 사용하여 학습되므로 어텐션 점수의 상삼각 행렬을 마스킹합니다. 이것이 위의 두 다이어그램에서 어텐션 점수가 비어 있는 이유입니다 (즉, 0 확률을 가짐). 인과 언어 모델링에 대한 빠른 요약은 <a href="https://jalammar.github.io/illustrated-gpt2/#part-2-illustrated-self-attention" rel="nofollow"><em>Illustrated Self Attention 블로그</em></a>를 참조할 수 있습니다.',Ko,J,Jg,An,xM="절대",kg,Do,ud='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',Oo,sc,yd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi><mo>></mo><mi>i</mi></mrow><annotation encoding="application/x-tex"> j > i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>',ac,tc,Md='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">k</mi><mi>j</mi></msub><mo separator="true">,</mo><mi mathvariant="bold">v</mi><mi>j</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{k}_j, \\mathbf{v}j </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">v</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>',ec,nc,dd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">q</mi><mi>i</mi></mrow><annotation encoding="application/x-tex"> \\mathbf{q}i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathbf">q</span><span class="mord mathnormal">i</span></span></span></span>',lc,pc,wd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="bold">k</mi><mrow><mi>m</mi><mo><</mo><mi>i</mi></mrow><mo separator="true">,</mo><mi mathvariant="bold">v</mi><mrow><mi>m</mi><mo><</mo><mi>i</mi></mrow><mtext> , for </mtext><mi>m</mi><mo>∈</mo><mrow><mn>0</mn><mo separator="true">,</mo><mo>…</mo><mi>i</mi><mo>−</mo><mn>1</mn></mrow></mrow><annotation encoding="application/x-tex"> \\mathbf{k}{m < i}, \\mathbf{v}{m < i} \\text{ , for } m \\in {0, \\ldots i - 1} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathbf">k</span><span class="mord"><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">i</span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">v</span><span class="mord"><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal">i</span></span><span class="mord text"><span class="mord"> , for </span></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span></span></span>',mc,ic,Be,TM=`다음으로, 대규모 언어 모델이 각 포워드 패스마다 키-값 캐시를 검색하고 전달하여 이를 활용하도록 합니다. | |
| Transformers에서는 <code>forward</code> 호출에 <code>use_cache</code> 플래그를 전달하여 키-값 캐시를 검색한 다음 현재 토큰과 함께 전달할 수 있습니다.`,rc,$e,oc,ze,_M="<strong>출력</strong>:",cc,Ze,hc,Qe,jM="키-값 캐시를 사용할 때, 텍스트 입력 토큰의 길이는 <em>증가하지 않고</em> 단일 입력 벡터로 유지되는 것을 볼 수 있습니다. 반면에 키-값 캐시의 길이는 각 디코딩 단계마다 하나씩 증가합니다.",gc,Sn,H,Cg,uc,fd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',yc,Mc,bd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>c</mi></msub><msup><mi mathvariant="bold">K</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_c\\mathbf{K}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0358em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathbf">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',dc,wc,vd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>c</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_c </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',fc,Pn,UM="항상",Gg,bc,Ve,JM="키-값 캐시를 사용하는 것에는 두 가지 장점이 있습니다:",vc,bs,Ie,Bg,xc,xd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',Tc,$g,qn,kM="생성된 토큰 수에 따라 필요한 최대 메모리가 이차적으로 증가하지 않고, 선형적으로만 증가합니다.",_c,Re,CM='<p>더 긴 입력 시퀀스에 대해 동일한 결과와 큰 속도 향상을 가져오기 때문에 키-값 캐시를 <em>항상</em> 사용해야 합니다. Transformers는 텍스트 파이프라인이나 <a href="https://huggingface.co/docs/transformers/main_classes/text_generation" rel="nofollow"><code>generate</code> 메서드</a>를 사용할 때 기본적으로 키-값 캐시를 활성화합니다.</p>',jc,vs,Uc,Xe,Jc,He,GM="키-값 캐시는 여러 번의 자기회귀 디코딩이 필요한 채팅과 같은 애플리케이션에 특히 유용합니다. 예제를 살펴보겠습니다.",kc,Ne,Cc,Le,BM="이 채팅에서 대규모 언어 모델은 두 번의 자기회귀 디코딩을 실행합니다:",Gc,We,$M="<li>첫 번째로, 키-값 캐시는 비어 있고 입력 프롬프트는 <code>"User: How many people live in France?"</code>입니다. 모델은 자기회귀적으로 <code>"Roughly 75 million people live in France"</code>라는 텍스트를 생성하며 디코딩 단계마다 키-값 캐시를 증가시킵니다.</li> <li>두 번째로, 입력 프롬프트는 <code>"User: How many people live in France? \\n Assistant: Roughly 75 million people live in France \\n User: And how many in Germany?"</code>입니다. 캐시 덕분에 첫 번째 두 문장에 대한 모든 키-값 벡터는 이미 계산되어 있습니다. 따라서 입력 프롬프트는 <code>"User: And how many in Germany?"</code>로만 구성됩니다. 줄어든 입력 프롬프트를 처리하는 동안 계산된 키-값 벡터가 첫 번째 디코딩의 키-값 캐시에 연결됩니다. 두 번째 어시스턴트의 답변인 <code>"Germany has ca. 81 million inhabitants"</code>는 <code>"User: How many people live in France? \\n Assistant: Roughly 75 million people live in France \\n User: And how many are in Germany?"</code>의 인코딩된 키-값 벡터로 구성된 키-값 캐시를 사용하여 자기회귀적으로 생성됩니다.</li>",Bc,Ee,zM="여기서 두 가지를 주목해야 합니다:",$c,Ye,ZM="<li>대규모 언어 모델이 대화의 모든 이전 문맥을 이해할 수 있도록 모든 문맥을 유지하는 것이 채팅에 배포된 대규모 언어 모델에서는 매우 중요합니다. 예를 들어, 위의 예에서 대규모 언어 모델은 사용자가 <code>"And how many are in Germany"</code>라고 물을 때 인구를 언급하고 있음을 이해해야 합니다.</li> <li>키-값 캐시는 채팅에서 매우 유용합니다. 이는 인코딩된 채팅 기록을 처음부터 다시 인코딩할 필요 없이 계속해서 확장할 수 있게 해주기 때문입니다(예: 인코더-디코더 아키텍처를 사용할 때와 같은 경우).</li>",zc,Ae,QM="<code>transformers</code>에서 <code>generate</code> 호출은 기본적으로 <code>use_cache=True</code>와 함께 <code>return_dict_in_generate=True</code>를 전달하면 <code>past_key_values</code>를 반환합니다. 이는 아직 <code>pipeline</code> 인터페이스를 통해서는 사용할 수 없습니다.",Zc,Se,Qc,Pe,VM="<strong>출력</strong>:",Vc,qe,Ic,as,zg,Rc,Td='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',Xc,Hc,_d='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">x</mi><mi>i</mi></msub><mtext>, for </mtext><mi>i</mi><mo>∈</mo><mrow><mn>1</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>c</mi><mo>−</mo><mn>1</mn></mrow></mrow><annotation encoding="application/x-tex"> \\mathbf{x}_i \\text{, for } i \\in {1, \\ldots, c - 1} </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord">, for </span></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span></span></span>',Nc,Lc,Fe,IM=`이전에 사용한 대규모 언어 모델 <code>bigcode/octocoder</code>에 대해 키-값 캐시에 저장해야 하는 부동 소수점 값의 수를 계산해 봅시다. | |
| 부동 소수점 값의 수는 시퀀스 길이의 두 배의 어텐션 헤드 수, 어텐션 헤드 차원, 레이어 수를 곱한 값입니다. | |
| 가상의 입력 시퀀스 길이 16000에서 대규모 언어 모델에 대해 이를 계산하면 다음과 같습니다.`,Wc,Ke,Ec,De,RM="<strong>출력</strong>:",Yc,Oe,Ac,sn,XM=`대략 80억 개의 부동 소수점 값입니다! <code>float16</code> 정밀도로 80억 개의 부동 소수점 값을 저장하는 데는 약 15GB의 RAM이 필요하며, 이는 모델 가중치 자체의 절반 정도입니다. | |
| 연구자들은 키-값 캐시를 저장하는 데 필요한 메모리 비용을 크게 줄일 수 있는 두 가지 방법을 제안했으며, 이는 다음 절에서 살펴보겠습니다.`,Sc,an,Pc,tn,HM='<a href="https://arxiv.org/abs/1911.02150" rel="nofollow">멀티 쿼리 어텐션 (MQA)</a>은 Noam Shazeer의 <em>Fast Transformer Decoding: One Write-Head is All You Need</em> 논문에서 제안되었습니다. 제목에서 알 수 있듯이, Noam은 <code>n_head</code> 키-값 프로젝션 가중치 대신, 모든 어텐션 헤드에서 공유되는 단일 헤드-값 프로젝션 가중치를 사용할 수 있으며, 이를 통해 모델 성능이 크게 저하되지 않는다는 것을 발견했습니다.',qc,Fn,os,Zg,Fc,jd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">k</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi mathvariant="bold">v</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex"> \\mathbf{k}_i, \\mathbf{v}_i </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.01597em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.016em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>',Kc,Kn,NM="n_head",Qg,Dc,en,LM="대부분의 대규모 언어 모델이 20에서 100 사이의 어텐션 헤드를 사용하기 때문에, MQA는 키-값 캐시의 메모리 소비를 크게 줄입니다. 이 노트북에서 사용된 대규모 언어 모델의 경우, 입력 시퀀스 길이 16000에서 필요한 메모리 소비를 15GB에서 400MB 미만으로 줄일 수 있습니다.",Oc,ts,Vg,sh,Ud='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi mathvariant="bold">q</mi><mi>c</mi></msub><msup><mi mathvariant="bold">K</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{q}_c\\mathbf{K}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0358em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathbf">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',ah,xs,WM="Noam의 논문",Ig,th,Ts,Rg,eh,Jd='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow><mi mathvariant="bold">Q</mi><mi mathvariant="bold">K</mi></mrow><mi>T</mi></msup></mrow><annotation encoding="application/x-tex"> \\mathbf{QK}^T </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1118em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathbf">QK</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9173em;"><span style="top:-3.139em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span>',nh,lh,nn,EM="MQA는 커뮤니티에서 널리 채택되어 현재 가장 인기 있는 많은 대규모 언어 모델에서 사용되고 있습니다.",ph,ln,YM='<li><a href="https://huggingface.co/tiiuae/falcon-40b" rel="nofollow"><strong>Falcon</strong></a></li> <li><a href="https://arxiv.org/abs/2204.02311" rel="nofollow"><strong>PaLM</strong></a></li> <li><a href="https://huggingface.co/mosaicml/mpt-30b" rel="nofollow"><strong>MPT</strong></a></li> <li><a href="https://huggingface.co/bigscience/bloom" rel="nofollow"><strong>BLOOM</strong></a></li>',mh,pn,AM="또한, 이 노트북에서 사용된 체크포인트 <code>bigcode/octocoder</code>는 MQA를 사용합니다.",ih,mn,rh,rn,SM='<a href="https://arxiv.org/abs/2305.13245" rel="nofollow">그룹 쿼리 어텐션 (GQA)</a>은 Google의 Ainslie 등의 연구진들에 의해 제안되었습니다. 그들은 MQA를 사용하는 것이 종종 일반적인 멀티 키-값 헤드 프로젝션을 사용하는 것보다 품질 저하를 가져올 수 있다는 것을 발견했습니다. 이 논문은 쿼리 헤드 프로젝션 가중치의 수를 너무 극단적으로 줄이는 대신, 더 많은 모델 성능을 유지할 수 있다고 주장합니다. 단일 키-값 프로젝션 가중치 대신, <code>n < n_head</code> 키-값 프로젝션 가중치를 사용해야 합니다. <code>n_head</code>보다 훨씬 작은 <code>n</code>값, 예를 들어 2, 4 또는 8을 선택하면, MQA의 거의 모든 메모리 및 속도 이점을 유지하면서 모델 용량을 덜 희생하고 따라서 성능 저하를 줄일 수 있습니다.',oh,on,PM="또한, GQA의 저자들은 기존 모델 체크포인트를 원래 사전 학습 계산의 5% 정도의 적은 양으로 GQA 아키텍처로 <em>업트레이닝</em>할 수 있음을 발견했습니다. 원래 사전 학습 계산의 5%가 여전히 엄청난 양일 수 있지만, GQA <em>업트레이닝</em>은 기존 체크포인트가 더 긴 입력 시퀀스에서도 유용하도록 합니다.",ch,cn,qM=`GQA는 최근에 제안되었기 때문에 이 노트북을 작성할 당시에는 채택이 덜 되었습니다. | |
| GQA의 가장 주목할 만한 적용 사례는 <a href="https://huggingface.co/meta-llama/Llama-2-70b-hf" rel="nofollow">Llama-v2</a>입니다.`,hh,hn,FM="<p>결론적으로, 대규모 언어 모델이 자기회귀 디코딩으로 배포되면서 채팅과 같이 큰 입력 시퀀스를 가진 작업을 처리해야 하는 경우 GQA 또는 MQA를 사용하는 것이 강력히 권장됩니다.</p>",gh,gn,uh,un,KM='연구 커뮤니티는 점점 더 큰 대규모 언어 모델의 추론 시간을 가속화하기 위한 새로운 기발한 방법들을 끊임없이 찾아내고 있습니다. 예를 들어, <a href="https://arxiv.org/abs/2211.17192" rel="nofollow">추측 디코딩</a>이라는 유망한 연구 방향이 있습니다. 여기서 “쉬운 토큰”은 더 작고 빠른 언어 모델에 의해 생성되고, “어려운 토큰”만 대규모 언어 모델 자체에 의해 생성됩니다. 자세한 내용은 이 노트북의 범위를 벗어나지만, <a href="https://huggingface.co/blog/assisted-generation" rel="nofollow">멋진 블로그 포스트</a>에서 읽어볼 수 있습니다.',yh,yn,DM='GPT3/4, Llama-2-70b, Claude, PaLM과 같은 거대한 대규모 언어 모델이 <a href="https://huggingface.co/chat/" rel="nofollow">Hugging Face Chat</a> 또는 ChatGPT와 같은 채팅 인터페이스에서 빠르게 실행될 수 있는 이유는 위에서 언급한 정밀도, 알고리즘, 아키텍처의 개선 덕분입니다. 앞으로 GPU, TPU 등과 같은 가속기는 점점 더 빨라지고 더 많은 메모리를 사용할 것입니다. 따라서 가장 좋은 알고리즘과 아키텍처를 사용하여 최고의 효율을 얻는 것이 중요합니다 🤗',Mh,Mn,dh,il,wh;return Gs=new ps({props:{title:"대규모 언어 모델의 속도 및 메모리 최적화",local:"optimizing-llms-for-speed-and-memory",headingTag:"h1"}}),Bs=new Qd({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Mixed",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/transformers_doc/ko/llm_tutorial_optimization.ipynb"},{label:"PyTorch",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/transformers_doc/ko/pytorch/llm_tutorial_optimization.ipynb"},{label:"TensorFlow",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/transformers_doc/ko/tensorflow/llm_tutorial_optimization.ipynb"},{label:"Mixed",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/transformers_doc/ko/llm_tutorial_optimization.ipynb"},{label:"PyTorch",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/transformers_doc/ko/pytorch/llm_tutorial_optimization.ipynb"},{label:"TensorFlow",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/transformers_doc/ko/tensorflow/llm_tutorial_optimization.ipynb"}]}}),Rs=new ps({props:{title:"1. 낮은 정밀도",local:"1-lower-precision",headingTag:"h2"}}),Ks=new b({props:{code:"IXBpcCUyMGluc3RhbGwlMjB0cmFuc2Zvcm1lcnMlMjBhY2NlbGVyYXRlJTIwYml0c2FuZGJ5dGVzJTIwb3B0aW11bQ==",highlighted:"!pip install transformers accelerate bitsandbytes optimum",wrap:!1}}),Ds=new b({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvckNhdXNhbExNJTBBJTBBbW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JDYXVzYWxMTS5mcm9tX3ByZXRyYWluZWQoJTIyYmlnc2NpZW5jZSUyRmJsb29tJTIyJTJDJTIwZGV2aWNlX21hcCUzRCUyMmF1dG8lMjIlMkMlMjBwYWRfdG9rZW5faWQlM0QwKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForCausalLM | |
| model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">"bigscience/bloom"</span>, device_map=<span class="hljs-string">"auto"</span>, pad_token_id=<span class="hljs-number">0</span>)`,wrap:!1}}),ea=new b({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Nb2RlbEZvckNhdXNhbExNJTJDJTIwQXV0b1Rva2VuaXplciUyQyUyMHBpcGVsaW5lJTBBaW1wb3J0JTIwdG9yY2glMEElMEFtb2RlbCUyMCUzRCUyMEF1dG9Nb2RlbEZvckNhdXNhbExNLmZyb21fcHJldHJhaW5lZCglMjJiaWdjb2RlJTJGb2N0b2NvZGVyJTIyJTJDJTIwdG9yY2hfZHR5cGUlM0R0b3JjaC5iZmxvYXQxNiUyQyUyMGRldmljZV9tYXAlM0QlMjJhdXRvJTIyJTJDJTIwcGFkX3Rva2VuX2lkJTNEMCklMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZCglMjJiaWdjb2RlJTJGb2N0b2NvZGVyJTIyKSUwQSUwQXBpcGUlMjAlM0QlMjBwaXBlbGluZSglMjJ0ZXh0LWdlbmVyYXRpb24lMjIlMkMlMjBtb2RlbCUzRG1vZGVsJTJDJTIwdG9rZW5pemVyJTNEdG9rZW5pemVyKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoModelForCausalLM, AutoTokenizer, pipeline | |
| <span class="hljs-keyword">import</span> torch | |
| model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">"bigcode/octocoder"</span>, torch_dtype=torch.bfloat16, device_map=<span class="hljs-string">"auto"</span>, pad_token_id=<span class="hljs-number">0</span>) | |
| tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">"bigcode/octocoder"</span>) | |
| pipe = pipeline(<span class="hljs-string">"text-generation"</span>, model=model, tokenizer=tokenizer)`,wrap:!1}}),na=new b({props:{code:"cHJvbXB0JTIwJTNEJTIwJTIyUXVlc3Rpb24lM0ElMjBQbGVhc2UlMjB3cml0ZSUyMGElMjBmdW5jdGlvbiUyMGluJTIwUHl0aG9uJTIwdGhhdCUyMHRyYW5zZm9ybXMlMjBieXRlcyUyMHRvJTIwR2lnYSUyMGJ5dGVzLiU1Q24lNUNuQW5zd2VyJTNBJTIyJTBBJTBBcmVzdWx0JTIwJTNEJTIwcGlwZShwcm9tcHQlMkMlMjBtYXhfbmV3X3Rva2VucyUzRDYwKSU1QjAlNUQlNUIlMjJnZW5lcmF0ZWRfdGV4dCUyMiU1RCU1Qmxlbihwcm9tcHQpJTNBJTVEJTBBcmVzdWx0",highlighted:`prompt = <span class="hljs-string">"Question: Please write a function in Python that transforms bytes to Giga bytes.\\n\\nAnswer:"</span> | |
| result = pipe(prompt, max_new_tokens=<span class="hljs-number">60</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">"generated_text"</span>][<span class="hljs-built_in">len</span>(prompt):] | |
| result`,wrap:!1}}),pa=new b({props:{code:"SGVyZSUyMGlzJTIwYSUyMFB5dGhvbiUyMGZ1bmN0aW9uJTIwdGhhdCUyMHRyYW5zZm9ybXMlMjBieXRlcyUyMHRvJTIwR2lnYSUyMGJ5dGVzJTNBJTVDbiU1Q24lNjAlNjAlNjBweXRob24lNUNuZGVmJTIwYnl0ZXNfdG9fZ2lnYV9ieXRlcyhieXRlcyklM0ElNUNuJTIwJTIwJTIwJTIwcmV0dXJuJTIwYnl0ZXMlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNCUyMCUyRiUyMDEwMjQlNUNuJTYwJTYwJTYwJTVDbiU1Q25UaGlzJTIwZnVuY3Rpb24lMjB0YWtlcyUyMGElMjBzaW5nbGU=",highlighted:'Here <span class="hljs-keyword">is</span> a Python <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> transforms bytes <span class="hljs-keyword">to</span> Giga bytes:<span class="hljs-string">\\n\\n```python\\ndef</span> bytes_to_giga_bytes(bytes):<span class="hljs-string">\\n</span> <span class="hljs-keyword">return</span> bytes / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span><span class="hljs-string">\\n```\\n\\nThis</span> <span class="hljs-keyword">function</span> takes a single',wrap:!1}}),ia=new b({props:{code:"ZGVmJTIwYnl0ZXNfdG9fZ2lnYV9ieXRlcyhieXRlcyklM0ElMEElMjAlMjByZXR1cm4lMjBieXRlcyUyMCUyRiUyMDEwMjQlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNA==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">bytes_to_giga_bytes</span>(<span class="hljs-params"><span class="hljs-built_in">bytes</span></span>): | |
| <span class="hljs-keyword">return</span> <span class="hljs-built_in">bytes</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span>`,wrap:!1}}),oa=new b({props:{code:"Ynl0ZXNfdG9fZ2lnYV9ieXRlcyh0b3JjaC5jdWRhLm1heF9tZW1vcnlfYWxsb2NhdGVkKCkp",highlighted:"bytes_to_giga_bytes(torch.cuda.max_memory_allocated())",wrap:!1}}),ha=new b({props:{code:"MjkuMDI2MDY0ODcyNzQxNw==",highlighted:"29.0260648727417",wrap:!1}}),da=new b({props:{code:"ZGVsJTIwcGlwZSUwQWRlbCUyMG1vZGVsJTBBJTBBaW1wb3J0JTIwZ2MlMEFpbXBvcnQlMjB0b3JjaCUwQSUwQWRlZiUyMGZsdXNoKCklM0ElMEElMjAlMjBnYy5jb2xsZWN0KCklMEElMjAlMjB0b3JjaC5jdWRhLmVtcHR5X2NhY2hlKCklMEElMjAlMjB0b3JjaC5jdWRhLnJlc2V0X3BlYWtfbWVtb3J5X3N0YXRzKCk=",highlighted:`<span class="hljs-keyword">del</span> pipe | |
| <span class="hljs-keyword">del</span> model | |
| <span class="hljs-keyword">import</span> gc | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">flush</span>(): | |
| gc.collect() | |
| torch.cuda.empty_cache() | |
| torch.cuda.reset_peak_memory_stats()`,wrap:!1}}),fa=new b({props:{code:"Zmx1c2goKQ==",highlighted:"flush()",wrap:!1}}),va=new b({props:{code:"ZnJvbSUyMGFjY2VsZXJhdGUudXRpbHMlMjBpbXBvcnQlMjByZWxlYXNlX21lbW9yeSUwQSUyMyUyMC4uLiUwQSUwQXJlbGVhc2VfbWVtb3J5KG1vZGVsKQ==",highlighted:`<span class="hljs-keyword">from</span> accelerate.utils <span class="hljs-keyword">import</span> release_memory | |
| <span class="hljs-comment"># ...</span> | |
| release_memory(model)`,wrap:!1}}),Ca=new b({props:{code:"IXBpcCUyMGluc3RhbGwlMjBiaXRzYW5kYnl0ZXM=",highlighted:"!pip install bitsandbytes",wrap:!1}}),Ba=new b({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JDYXVzYWxMTS5mcm9tX3ByZXRyYWluZWQoJTIyYmlnY29kZSUyRm9jdG9jb2RlciUyMiUyQyUyMGxvYWRfaW5fOGJpdCUzRFRydWUlMkMlMjBwYWRfdG9rZW5faWQlM0QwKQ==",highlighted:'model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">"bigcode/octocoder"</span>, load_in_8bit=<span class="hljs-literal">True</span>, pad_token_id=<span class="hljs-number">0</span>)',wrap:!1}}),za=new b({props:{code:"cGlwZSUyMCUzRCUyMHBpcGVsaW5lKCUyMnRleHQtZ2VuZXJhdGlvbiUyMiUyQyUyMG1vZGVsJTNEbW9kZWwlMkMlMjB0b2tlbml6ZXIlM0R0b2tlbml6ZXIpJTBBJTBBcmVzdWx0JTIwJTNEJTIwcGlwZShwcm9tcHQlMkMlMjBtYXhfbmV3X3Rva2VucyUzRDYwKSU1QjAlNUQlNUIlMjJnZW5lcmF0ZWRfdGV4dCUyMiU1RCU1Qmxlbihwcm9tcHQpJTNBJTVEJTBBcmVzdWx0",highlighted:`pipe = pipeline(<span class="hljs-string">"text-generation"</span>, model=model, tokenizer=tokenizer) | |
| result = pipe(prompt, max_new_tokens=<span class="hljs-number">60</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">"generated_text"</span>][<span class="hljs-built_in">len</span>(prompt):] | |
| result`,wrap:!1}}),Qa=new b({props:{code:"SGVyZSUyMGlzJTIwYSUyMFB5dGhvbiUyMGZ1bmN0aW9uJTIwdGhhdCUyMHRyYW5zZm9ybXMlMjBieXRlcyUyMHRvJTIwR2lnYSUyMGJ5dGVzJTNBJTVDbiU1Q24lNjAlNjAlNjBweXRob24lNUNuZGVmJTIwYnl0ZXNfdG9fZ2lnYV9ieXRlcyhieXRlcyklM0ElNUNuJTIwJTIwJTIwJTIwcmV0dXJuJTIwYnl0ZXMlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNCUyMCUyRiUyMDEwMjQlNUNuJTYwJTYwJTYwJTVDbiU1Q25UaGlzJTIwZnVuY3Rpb24lMjB0YWtlcyUyMGElMjBzaW5nbGU=",highlighted:'Here <span class="hljs-keyword">is</span> a Python <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> transforms bytes <span class="hljs-keyword">to</span> Giga bytes:<span class="hljs-string">\\n\\n```python\\ndef</span> bytes_to_giga_bytes(bytes):<span class="hljs-string">\\n</span> <span class="hljs-keyword">return</span> bytes / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span><span class="hljs-string">\\n```\\n\\nThis</span> <span class="hljs-keyword">function</span> takes a single',wrap:!1}}),Ia=new b({props:{code:"Ynl0ZXNfdG9fZ2lnYV9ieXRlcyh0b3JjaC5jdWRhLm1heF9tZW1vcnlfYWxsb2NhdGVkKCkp",highlighted:"bytes_to_giga_bytes(torch.cuda.max_memory_allocated())",wrap:!1}}),Xa=new b({props:{code:"MTUuMjE5MjM0NDY2NTUyNzM0",highlighted:'<span class="hljs-attribute">15</span>.<span class="hljs-number">219234466552734</span>',wrap:!1}}),La=new b({props:{code:"ZGVsJTIwbW9kZWwlMEFkZWwlMjBwaXBl",highlighted:`<span class="hljs-keyword">del</span> model | |
| <span class="hljs-keyword">del</span> pipe`,wrap:!1}}),Wa=new b({props:{code:"Zmx1c2goKQ==",highlighted:"flush()",wrap:!1}}),Ya=new b({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JDYXVzYWxMTS5mcm9tX3ByZXRyYWluZWQoJTIyYmlnY29kZSUyRm9jdG9jb2RlciUyMiUyQyUyMGxvYWRfaW5fNGJpdCUzRFRydWUlMkMlMjBsb3dfY3B1X21lbV91c2FnZSUzRFRydWUlMkMlMjBwYWRfdG9rZW5faWQlM0QwKSUwQSUwQXBpcGUlMjAlM0QlMjBwaXBlbGluZSglMjJ0ZXh0LWdlbmVyYXRpb24lMjIlMkMlMjBtb2RlbCUzRG1vZGVsJTJDJTIwdG9rZW5pemVyJTNEdG9rZW5pemVyKSUwQSUwQXJlc3VsdCUyMCUzRCUyMHBpcGUocHJvbXB0JTJDJTIwbWF4X25ld190b2tlbnMlM0Q2MCklNUIwJTVEJTVCJTIyZ2VuZXJhdGVkX3RleHQlMjIlNUQlNUJsZW4ocHJvbXB0KSUzQSU1RCUwQXJlc3VsdA==",highlighted:`model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">"bigcode/octocoder"</span>, load_in_4bit=<span class="hljs-literal">True</span>, low_cpu_mem_usage=<span class="hljs-literal">True</span>, pad_token_id=<span class="hljs-number">0</span>) | |
| pipe = pipeline(<span class="hljs-string">"text-generation"</span>, model=model, tokenizer=tokenizer) | |
| result = pipe(prompt, max_new_tokens=<span class="hljs-number">60</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">"generated_text"</span>][<span class="hljs-built_in">len</span>(prompt):] | |
| result`,wrap:!1}}),Sa=new b({props:{code:"SGVyZSUyMGlzJTIwYSUyMFB5dGhvbiUyMGZ1bmN0aW9uJTIwdGhhdCUyMHRyYW5zZm9ybXMlMjBieXRlcyUyMHRvJTIwR2lnYSUyMGJ5dGVzJTNBJTVDbiU1Q24lNjAlNjAlNjAlNUNuZGVmJTIwYnl0ZXNfdG9fZ2lnYWJ5dGVzKGJ5dGVzKSUzQSU1Q24lMjAlMjAlMjAlMjByZXR1cm4lMjBieXRlcyUyMCUyRiUyMDEwMjQlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNCU1Q24lNjAlNjAlNjAlNUNuJTVDblRoaXMlMjBmdW5jdGlvbiUyMHRha2VzJTIwYSUyMHNpbmdsZSUyMGFyZ3VtZW50",highlighted:'Here <span class="hljs-keyword">is</span> a Python <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> transforms bytes <span class="hljs-keyword">to</span> Giga bytes:<span class="hljs-string">\\n\\n```\\ndef</span> bytes_to_gigabytes(bytes):<span class="hljs-string">\\n</span> <span class="hljs-keyword">return</span> bytes / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span><span class="hljs-string">\\n```\\n\\nThis</span> <span class="hljs-keyword">function</span> takes a single argument',wrap:!1}}),qa=new b({props:{code:"Ynl0ZXNfdG9fZ2lnYV9ieXRlcyh0b3JjaC5jdWRhLm1heF9tZW1vcnlfYWxsb2NhdGVkKCkp",highlighted:"bytes_to_giga_bytes(torch.cuda.max_memory_allocated())",wrap:!1}}),Ka=new b({props:{code:"OS41NDM1NzQzMzMxOTA5MTg=",highlighted:'<span class="hljs-attribute">9</span>.<span class="hljs-number">543574333190918</span>',wrap:!1}}),st=new b({props:{code:"ZGVsJTIwbW9kZWwlMEFkZWwlMjBwaXBl",highlighted:`<span class="hljs-keyword">del</span> model | |
| <span class="hljs-keyword">del</span> pipe`,wrap:!1}}),at=new b({props:{code:"Zmx1c2goKQ==",highlighted:"flush()",wrap:!1}}),it=new ps({props:{title:"2. 플래시 어텐션",local:"2-flash-attention",headingTag:"h2"}}),ft=new b({props:{code:"c3lzdGVtX3Byb21wdCUyMCUzRCUyMCUyMiUyMiUyMkJlbG93JTIwYXJlJTIwYSUyMHNlcmllcyUyMG9mJTIwZGlhbG9ndWVzJTIwYmV0d2VlbiUyMHZhcmlvdXMlMjBwZW9wbGUlMjBhbmQlMjBhbiUyMEFJJTIwdGVjaG5pY2FsJTIwYXNzaXN0YW50LiUwQVRoZSUyMGFzc2lzdGFudCUyMHRyaWVzJTIwdG8lMjBiZSUyMGhlbHBmdWwlMkMlMjBwb2xpdGUlMkMlMjBob25lc3QlMkMlMjBzb3BoaXN0aWNhdGVkJTJDJTIwZW1vdGlvbmFsbHklMjBhd2FyZSUyQyUyMGFuZCUyMGh1bWJsZSUyMGJ1dCUyMGtub3dsZWRnZWFibGUuJTBBVGhlJTIwYXNzaXN0YW50JTIwaXMlMjBoYXBweSUyMHRvJTIwaGVscCUyMHdpdGglMjBjb2RlJTIwcXVlc3Rpb25zJTIwYW5kJTIwd2lsbCUyMGRvJTIwdGhlaXIlMjBiZXN0JTIwdG8lMjB1bmRlcnN0YW5kJTIwZXhhY3RseSUyMHdoYXQlMjBpcyUyMG5lZWRlZC4lMEFJdCUyMGFsc28lMjB0cmllcyUyMHRvJTIwYXZvaWQlMjBnaXZpbmclMjBmYWxzZSUyMG9yJTIwbWlzbGVhZGluZyUyMGluZm9ybWF0aW9uJTJDJTIwYW5kJTIwaXQlMjBjYXZlYXRzJTIwd2hlbiUyMGl0JTIwaXNuJ3QlMjBlbnRpcmVseSUyMHN1cmUlMjBhYm91dCUyMHRoZSUyMHJpZ2h0JTIwYW5zd2VyLiUwQVRoYXQlMjBzYWlkJTJDJTIwdGhlJTIwYXNzaXN0YW50JTIwaXMlMjBwcmFjdGljYWwlMjByZWFsbHklMjBkb2VzJTIwaXRzJTIwYmVzdCUyQyUyMGFuZCUyMGRvZXNuJ3QlMjBsZXQlMjBjYXV0aW9uJTIwZ2V0JTIwdG9vJTIwbXVjaCUyMGluJTIwdGhlJTIwd2F5JTIwb2YlMjBiZWluZyUyMHVzZWZ1bC4lMEElMEFUaGUlMjBTdGFyY29kZXIlMjBtb2RlbHMlMjBhcmUlMjBhJTIwc2VyaWVzJTIwb2YlMjAxNS41QiUyMHBhcmFtZXRlciUyMG1vZGVscyUyMHRyYWluZWQlMjBvbiUyMDgwJTJCJTIwcHJvZ3JhbW1pbmclMjBsYW5ndWFnZXMlMjBmcm9tJTIwVGhlJTIwU3RhY2slMjAodjEuMiklMjAoZXhjbHVkaW5nJTIwb3B0LW91dCUyMHJlcXVlc3RzKS4lMEFUaGUlMjBtb2RlbCUyMHVzZXMlMjBNdWx0aSUyMFF1ZXJ5JTIwQXR0ZW50aW9uJTJDJTIwd2FzJTIwdHJhaW5lZCUyMHVzaW5nJTIwdGhlJTIwRmlsbC1pbi10aGUtTWlkZGxlJTIwb2JqZWN0aXZlJTJDJTIwYW5kJTIwd2l0aCUyMDglMkMxOTIlMjB0b2tlbnMlMjBjb250ZXh0JTIwd2luZG93JTIwZm9yJTIwYSUyMHRyaWxsaW9uJTIwdG9rZW5zJTIwb2YlMjBoZWF2aWx5JTIwZGVkdXBsaWNhdGVkJTIwZGF0YS4lMEElMEEtLS0tLSUwQSUwQVF1ZXN0aW9uJTNBJTIwV3JpdGUlMjBhJTIwZnVuY3Rpb24lMjB0aGF0JTIwdGFrZXMlMjB0d28lMjBsaXN0cyUyMGFuZCUyMHJldHVybnMlMjBhJTIwbGlzdCUyMHRoYXQlMjBoYXMlMjBhbHRlcm5hdGluZyUyMGVsZW1lbnRzJTIwZnJvbSUyMGVhY2glMjBpbnB1dCUyMGxpc3QuJTBBJTBBQW5zd2VyJTNBJTIwU3VyZS4lMjBIZXJlJTIwaXMlMjBhJTIwZnVuY3Rpb24lMjB0aGF0JTIwZG9lcyUyMHRoYXQuJTBBJTBBZGVmJTIwYWx0ZXJuYXRpbmcobGlzdDElMkMlMjBsaXN0MiklM0ElMEElMjAlMjAlMjByZXN1bHRzJTIwJTNEJTIwJTVCJTVEJTBBJTIwJTIwJTIwZm9yJTIwaSUyMGluJTIwcmFuZ2UobGVuKGxpc3QxKSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjByZXN1bHRzLmFwcGVuZChsaXN0MSU1QmklNUQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0cy5hcHBlbmQobGlzdDIlNUJpJTVEKSUwQSUyMCUyMCUyMHJldHVybiUyMHJlc3VsdHMlMEElMEFRdWVzdGlvbiUzQSUyMENhbiUyMHlvdSUyMHdyaXRlJTIwc29tZSUyMHRlc3QlMjBjYXNlcyUyMGZvciUyMHRoaXMlMjBmdW5jdGlvbiUzRiUwQSUwQUFuc3dlciUzQSUyMFN1cmUlMkMlMjBoZXJlJTIwYXJlJTIwc29tZSUyMHRlc3RzLiUwQSUwQWFzc2VydCUyMGFsdGVybmF0aW5nKCU1QjEwJTJDJTIwMjAlMkMlMjAzMCU1RCUyQyUyMCU1QjElMkMlMjAyJTJDJTIwMyU1RCklMjAlM0QlM0QlMjAlNUIxMCUyQyUyMDElMkMlMjAyMCUyQyUyMDIlMkMlMjAzMCUyQyUyMDMlNUQlMEFhc3NlcnQlMjBhbHRlcm5hdGluZyglNUJUcnVlJTJDJTIwRmFsc2UlNUQlMkMlMjAlNUI0JTJDJTIwNSU1RCklMjAlM0QlM0QlMjAlNUJUcnVlJTJDJTIwNCUyQyUyMEZhbHNlJTJDJTIwNSU1RCUwQWFzc2VydCUyMGFsdGVybmF0aW5nKCU1QiU1RCUyQyUyMCU1QiU1RCklMjAlM0QlM0QlMjAlNUIlNUQlMEElMEFRdWVzdGlvbiUzQSUyME1vZGlmeSUyMHRoZSUyMGZ1bmN0aW9uJTIwc28lMjB0aGF0JTIwaXQlMjByZXR1cm5zJTIwYWxsJTIwaW5wdXQlMjBlbGVtZW50cyUyMHdoZW4lMjB0aGUlMjBsaXN0cyUyMGhhdmUlMjB1bmV2ZW4lMjBsZW5ndGguJTIwVGhlJTIwZWxlbWVudHMlMjBmcm9tJTIwdGhlJTIwbG9uZ2VyJTIwbGlzdCUyMHNob3VsZCUyMGJlJTIwYXQlMjB0aGUlMjBlbmQuJTBBJTBBQW5zd2VyJTNBJTIwSGVyZSUyMGlzJTIwdGhlJTIwbW9kaWZpZWQlMjBmdW5jdGlvbi4lMEElMEFkZWYlMjBhbHRlcm5hdGluZyhsaXN0MSUyQyUyMGxpc3QyKSUzQSUwQSUyMCUyMCUyMHJlc3VsdHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjBmb3IlMjBpJTIwaW4lMjByYW5nZShtaW4obGVuKGxpc3QxKSUyQyUyMGxlbihsaXN0MikpKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlc3VsdHMuYXBwZW5kKGxpc3QxJTVCaSU1RCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjByZXN1bHRzLmFwcGVuZChsaXN0MiU1QmklNUQpJTBBJTIwJTIwJTIwaWYlMjBsZW4obGlzdDEpJTIwJTNFJTIwbGVuKGxpc3QyKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlc3VsdHMuZXh0ZW5kKGxpc3QxJTVCaSUyQjElM0ElNUQpJTBBJTIwJTIwJTIwZWxzZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMHJlc3VsdHMuZXh0ZW5kKGxpc3QyJTVCaSUyQjElM0ElNUQpJTBBJTIwJTIwJTIwcmV0dXJuJTIwcmVzdWx0cyUwQSUwQS0tLS0tJTBBJTIyJTIyJTIy",highlighted:`system_prompt = <span class="hljs-string">"""Below are a series of dialogues between various people and an AI technical assistant. | |
| The assistant tries to be helpful, polite, honest, sophisticated, emotionally aware, and humble but knowledgeable. | |
| The assistant is happy to help with code questions and will do their best to understand exactly what is needed. | |
| It also tries to avoid giving false or misleading information, and it caveats when it isn't entirely sure about the right answer. | |
| That said, the assistant is practical really does its best, and doesn't let caution get too much in the way of being useful. | |
| The Starcoder models are a series of 15.5B parameter models trained on 80+ programming languages from The Stack (v1.2) (excluding opt-out requests). | |
| The model uses Multi Query Attention, was trained using the Fill-in-the-Middle objective, and with 8,192 tokens context window for a trillion tokens of heavily deduplicated data. | |
| ----- | |
| Question: Write a function that takes two lists and returns a list that has alternating elements from each input list. | |
| Answer: Sure. Here is a function that does that. | |
| def alternating(list1, list2): | |
| results = [] | |
| for i in range(len(list1)): | |
| results.append(list1[i]) | |
| results.append(list2[i]) | |
| return results | |
| Question: Can you write some test cases for this function? | |
| Answer: Sure, here are some tests. | |
| assert alternating([10, 20, 30], [1, 2, 3]) == [10, 1, 20, 2, 30, 3] | |
| assert alternating([True, False], [4, 5]) == [True, 4, False, 5] | |
| assert alternating([], []) == [] | |
| Question: Modify the function so that it returns all input elements when the lists have uneven length. The elements from the longer list should be at the end. | |
| Answer: Here is the modified function. | |
| def alternating(list1, list2): | |
| results = [] | |
| for i in range(min(len(list1), len(list2))): | |
| results.append(list1[i]) | |
| results.append(list2[i]) | |
| if len(list1) > len(list2): | |
| results.extend(list1[i+1:]) | |
| else: | |
| results.extend(list2[i+1:]) | |
| return results | |
| ----- | |
| """</span>`,wrap:!1}}),vt=new b({props:{code:"bG9uZ19wcm9tcHQlMjAlM0QlMjAxMCUyMColMjBzeXN0ZW1fcHJvbXB0JTIwJTJCJTIwcHJvbXB0",highlighted:'long_prompt = <span class="hljs-number">10</span> * system_prompt + prompt',wrap:!1}}),Tt=new b({props:{code:"bW9kZWwlMjAlM0QlMjBBdXRvTW9kZWxGb3JDYXVzYWxMTS5mcm9tX3ByZXRyYWluZWQoJTIyYmlnY29kZSUyRm9jdG9jb2RlciUyMiUyQyUyMHRvcmNoX2R0eXBlJTNEdG9yY2guYmZsb2F0MTYlMkMlMjBkZXZpY2VfbWFwJTNEJTIyYXV0byUyMiklMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZCglMjJiaWdjb2RlJTJGb2N0b2NvZGVyJTIyKSUwQSUwQXBpcGUlMjAlM0QlMjBwaXBlbGluZSglMjJ0ZXh0LWdlbmVyYXRpb24lMjIlMkMlMjBtb2RlbCUzRG1vZGVsJTJDJTIwdG9rZW5pemVyJTNEdG9rZW5pemVyKQ==",highlighted:`model = AutoModelForCausalLM.from_pretrained(<span class="hljs-string">"bigcode/octocoder"</span>, torch_dtype=torch.bfloat16, device_map=<span class="hljs-string">"auto"</span>) | |
| tokenizer = AutoTokenizer.from_pretrained(<span class="hljs-string">"bigcode/octocoder"</span>) | |
| pipe = pipeline(<span class="hljs-string">"text-generation"</span>, model=model, tokenizer=tokenizer)`,wrap:!1}}),jt=new b({props:{code:"aW1wb3J0JTIwdGltZSUwQSUwQXN0YXJ0X3RpbWUlMjAlM0QlMjB0aW1lLnRpbWUoKSUwQXJlc3VsdCUyMCUzRCUyMHBpcGUobG9uZ19wcm9tcHQlMkMlMjBtYXhfbmV3X3Rva2VucyUzRDYwKSU1QjAlNUQlNUIlMjJnZW5lcmF0ZWRfdGV4dCUyMiU1RCU1Qmxlbihsb25nX3Byb21wdCklM0ElNUQlMEElMEFwcmludChmJTIyR2VuZXJhdGVkJTIwaW4lMjAlN0J0aW1lLnRpbWUoKSUyMC0lMjBzdGFydF90aW1lJTdEJTIwc2Vjb25kcy4lMjIpJTBBcmVzdWx0",highlighted:`<span class="hljs-keyword">import</span> time | |
| start_time = time.time() | |
| result = pipe(long_prompt, max_new_tokens=<span class="hljs-number">60</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">"generated_text"</span>][<span class="hljs-built_in">len</span>(long_prompt):] | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Generated in <span class="hljs-subst">{time.time() - start_time}</span> seconds."</span>) | |
| result`,wrap:!1}}),Jt=new b({props:{code:"R2VuZXJhdGVkJTIwaW4lMjAxMC45Njg1NDAxOTE2NTAzOSUyMHNlY29uZHMuJTBBU3VyZS4lMjBIZXJlJTIwaXMlMjBhJTIwZnVuY3Rpb24lMjB0aGF0JTIwZG9lcyUyMHRoYXQuJTVDbiU1Q25kZWYlMjBieXRlc190b19naWdhKGJ5dGVzKSUzQSU1Q24lMjAlMjAlMjByZXR1cm4lMjBieXRlcyUyMCUyRiUyMDEwMjQlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNCU1Q24lNUNuQW5zd2VyJTNBJTIwU3VyZS4lMjBIZXJlJTIwaXMlMjBhJTIwZnVuY3Rpb24lMjB0aGF0JTIwZG9lcyUyMHRoYXQuJTVDbiU1Q25kZWY=",highlighted:`Generated <span class="hljs-keyword">in</span> <span class="hljs-number">10.96854019165039</span> seconds. | |
| Sure. Here <span class="hljs-keyword">is</span> a <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> does <span class="hljs-literal">that</span>.<span class="hljs-string">\\n\\ndef</span> bytes_to_giga(bytes):<span class="hljs-string">\\n</span> <span class="hljs-keyword">return</span> bytes / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span><span class="hljs-string">\\n\\nAnswer:</span> Sure. Here <span class="hljs-keyword">is</span> a <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> does <span class="hljs-literal">that</span>.<span class="hljs-string">\\n\\ndef</span>`,wrap:!1}}),Bt=new b({props:{code:"Ynl0ZXNfdG9fZ2lnYV9ieXRlcyh0b3JjaC5jdWRhLm1heF9tZW1vcnlfYWxsb2NhdGVkKCkp",highlighted:"bytes_to_giga_bytes(torch.cuda.max_memory_allocated())",wrap:!1}}),zt=new b({props:{code:"MzcuNjY4MTkzMzQwMzAxNTE0",highlighted:"37.668193340301514",wrap:!1}}),Vt=new b({props:{code:"Zmx1c2goKQ==",highlighted:"flush()",wrap:!1}}),Rt=new b({props:{code:"bW9kZWwudG9fYmV0dGVydHJhbnNmb3JtZXIoKQ==",highlighted:"model.to_bettertransformer()",wrap:!1}}),Ht=new b({props:{code:"c3RhcnRfdGltZSUyMCUzRCUyMHRpbWUudGltZSgpJTBBd2l0aCUyMHRvcmNoLmJhY2tlbmRzLmN1ZGEuc2RwX2tlcm5lbChlbmFibGVfZmxhc2glM0RUcnVlJTJDJTIwZW5hYmxlX21hdGglM0RGYWxzZSUyQyUyMGVuYWJsZV9tZW1fZWZmaWNpZW50JTNERmFsc2UpJTNBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwcGlwZShsb25nX3Byb21wdCUyQyUyMG1heF9uZXdfdG9rZW5zJTNENjApJTVCMCU1RCU1QiUyMmdlbmVyYXRlZF90ZXh0JTIyJTVEJTVCbGVuKGxvbmdfcHJvbXB0KSUzQSU1RCUwQSUwQXByaW50KGYlMjJHZW5lcmF0ZWQlMjBpbiUyMCU3QnRpbWUudGltZSgpJTIwLSUyMHN0YXJ0X3RpbWUlN0QlMjBzZWNvbmRzLiUyMiklMEFyZXN1bHQ=",highlighted:`start_time = time.time() | |
| <span class="hljs-keyword">with</span> torch.backends.cuda.sdp_kernel(enable_flash=<span class="hljs-literal">True</span>, enable_math=<span class="hljs-literal">False</span>, enable_mem_efficient=<span class="hljs-literal">False</span>): | |
| result = pipe(long_prompt, max_new_tokens=<span class="hljs-number">60</span>)[<span class="hljs-number">0</span>][<span class="hljs-string">"generated_text"</span>][<span class="hljs-built_in">len</span>(long_prompt):] | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Generated in <span class="hljs-subst">{time.time() - start_time}</span> seconds."</span>) | |
| result`,wrap:!1}}),Lt=new b({props:{code:"R2VuZXJhdGVkJTIwaW4lMjAzLjAyMTE2MTc5NDY2MjQ3NTYlMjBzZWNvbmRzLiUwQSUyMFN1cmUuJTIwSGVyZSUyMGlzJTIwYSUyMGZ1bmN0aW9uJTIwdGhhdCUyMGRvZXMlMjB0aGF0LiU1Q24lNUNuZGVmJTIwYnl0ZXNfdG9fZ2lnYShieXRlcyklM0ElNUNuJTIwJTIwJTIwcmV0dXJuJTIwYnl0ZXMlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNCUyMCUyRiUyMDEwMjQlNUNuJTVDbkFuc3dlciUzQSUyMFN1cmUuJTIwSGVyZSUyMGlzJTIwYSUyMGZ1bmN0aW9uJTIwdGhhdCUyMGRvZXMlMjB0aGF0LiU1Q24lNUNuZGVm",highlighted:`Generated <span class="hljs-keyword">in</span> <span class="hljs-number">3.0211617946624756</span> seconds. | |
| Sure. Here <span class="hljs-keyword">is</span> a <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> does <span class="hljs-literal">that</span>.<span class="hljs-string">\\n\\ndef</span> bytes_to_giga(bytes):<span class="hljs-string">\\n</span> <span class="hljs-keyword">return</span> bytes / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span><span class="hljs-string">\\n\\nAnswer:</span> Sure. Here <span class="hljs-keyword">is</span> a <span class="hljs-keyword">function</span> <span class="hljs-literal">that</span> does <span class="hljs-literal">that</span>.<span class="hljs-string">\\n\\ndef</span>`,wrap:!1}}),Yt=new b({props:{code:"Ynl0ZXNfdG9fZ2lnYV9ieXRlcyh0b3JjaC5jdWRhLm1heF9tZW1vcnlfYWxsb2NhdGVkKCkp",highlighted:"bytes_to_giga_bytes(torch.cuda.max_memory_allocated())",wrap:!1}}),St=new b({props:{code:"MzIuNjE3MzMxOTgxNjU4OTM2",highlighted:'<span class="hljs-attribute">32</span>.<span class="hljs-number">617331981658936</span>',wrap:!1}}),Ft=new b({props:{code:"Zmx1c2goKQ==",highlighted:"flush()",wrap:!1}}),Dt=new ps({props:{title:"3. 아키텍처 혁신",local:"3-architectural-innovations",headingTag:"h2"}}),me=new ps({props:{title:"3.1 대규모 언어 모델의 위치 임베딩 개선",local:"31-improving-positional-embeddings-of-llms",headingTag:"h3"}}),xe=new ps({props:{title:"3.2 키-값 캐시",local:"32-the-key-value-cache",headingTag:"h3"}}),Ue=new b({props:{code:"aW5wdXRfaWRzJTIwJTNEJTIwdG9rZW5pemVyKHByb21wdCUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIycHQlMjIpJTVCJTIyaW5wdXRfaWRzJTIyJTVELnRvKCUyMmN1ZGElMjIpJTBBJTBBZm9yJTIwXyUyMGluJTIwcmFuZ2UoNSklM0ElMEElMjAlMjBuZXh0X2xvZ2l0cyUyMCUzRCUyMG1vZGVsKGlucHV0X2lkcyklNUIlMjJsb2dpdHMlMjIlNUQlNUIlM0ElMkMlMjAtMSUzQSU1RCUwQSUyMCUyMG5leHRfdG9rZW5faWQlMjAlM0QlMjB0b3JjaC5hcmdtYXgobmV4dF9sb2dpdHMlMkNkaW0lM0QtMSklMEElMEElMjAlMjBpbnB1dF9pZHMlMjAlM0QlMjB0b3JjaC5jYXQoJTVCaW5wdXRfaWRzJTJDJTIwbmV4dF90b2tlbl9pZCU1RCUyQyUyMGRpbSUzRC0xKSUwQSUyMCUyMHByaW50KCUyMnNoYXBlJTIwb2YlMjBpbnB1dF9pZHMlMjIlMkMlMjBpbnB1dF9pZHMuc2hhcGUpJTBBJTBBZ2VuZXJhdGVkX3RleHQlMjAlM0QlMjB0b2tlbml6ZXIuYmF0Y2hfZGVjb2RlKGlucHV0X2lkcyU1QiUzQSUyQyUyMC01JTNBJTVEKSUwQWdlbmVyYXRlZF90ZXh0",highlighted:`input_ids = tokenizer(prompt, return_tensors=<span class="hljs-string">"pt"</span>)[<span class="hljs-string">"input_ids"</span>].to(<span class="hljs-string">"cuda"</span>) | |
| <span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>): | |
| next_logits = model(input_ids)[<span class="hljs-string">"logits"</span>][:, -<span class="hljs-number">1</span>:] | |
| next_token_id = torch.argmax(next_logits,dim=-<span class="hljs-number">1</span>) | |
| input_ids = torch.cat([input_ids, next_token_id], dim=-<span class="hljs-number">1</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">"shape of input_ids"</span>, input_ids.shape) | |
| generated_text = tokenizer.batch_decode(input_ids[:, -<span class="hljs-number">5</span>:]) | |
| generated_text`,wrap:!1}}),ke=new b({props:{code:"c2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDIxJTVEKSUwQXNoYXBlJTIwb2YlMjBpbnB1dF9pZHMlMjB0b3JjaC5TaXplKCU1QjElMkMlMjAyMiU1RCklMEFzaGFwZSUyMG9mJTIwaW5wdXRfaWRzJTIwdG9yY2guU2l6ZSglNUIxJTJDJTIwMjMlNUQpJTBBc2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDI0JTVEKSUwQXNoYXBlJTIwb2YlMjBpbnB1dF9pZHMlMjB0b3JjaC5TaXplKCU1QjElMkMlMjAyNSU1RCklMEElNUInJTIwSGVyZSUyMGlzJTIwYSUyMFB5dGhvbiUyMGZ1bmN0aW9uJyU1RA==",highlighted:`shape of input_ids torch<span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[1, 21]</span>) | |
| shape of input_ids torch<span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[1, 22]</span>) | |
| shape of input_ids torch<span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[1, 23]</span>) | |
| shape of input_ids torch<span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[1, 24]</span>) | |
| shape of input_ids torch<span class="hljs-selector-class">.Size</span>(<span class="hljs-selector-attr">[1, 25]</span>) | |
| <span class="hljs-selector-attr">[<span class="hljs-string">' Here is a Python function'</span>]</span>`,wrap:!1}}),$e=new b({props:{code:"cGFzdF9rZXlfdmFsdWVzJTIwJTNEJTIwTm9uZSUyMCUyMyUyMHBhc3Rfa2V5X3ZhbHVlcyUyMCVFQiU4QSU5NCUyMCVFRCU4MiVBNC0lRUElQjAlOTIlMjAlRUMlQkElOTAlRUMlOEIlOUMlRUIlQTUlQkMlMjAlRUMlOUQlOTglRUIlQUYlQjglMEFnZW5lcmF0ZWRfdG9rZW5zJTIwJTNEJTIwJTVCJTVEJTBBbmV4dF90b2tlbl9pZCUyMCUzRCUyMHRva2VuaXplcihwcm9tcHQlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnB0JTIyKSU1QiUyMmlucHV0X2lkcyUyMiU1RC50byglMjJjdWRhJTIyKSUwQSUwQWZvciUyMF8lMjBpbiUyMHJhbmdlKDUpJTNBJTBBJTIwJTIwbmV4dF9sb2dpdHMlMkMlMjBwYXN0X2tleV92YWx1ZXMlMjAlM0QlMjBtb2RlbChuZXh0X3Rva2VuX2lkJTJDJTIwcGFzdF9rZXlfdmFsdWVzJTNEcGFzdF9rZXlfdmFsdWVzJTJDJTIwdXNlX2NhY2hlJTNEVHJ1ZSkudG9fdHVwbGUoKSUwQSUyMCUyMG5leHRfbG9naXRzJTIwJTNEJTIwbmV4dF9sb2dpdHMlNUIlM0ElMkMlMjAtMSUzQSU1RCUwQSUyMCUyMG5leHRfdG9rZW5faWQlMjAlM0QlMjB0b3JjaC5hcmdtYXgobmV4dF9sb2dpdHMlMkMlMjBkaW0lM0QtMSklMEElMEElMjAlMjBwcmludCglMjJzaGFwZSUyMG9mJTIwaW5wdXRfaWRzJTIyJTJDJTIwbmV4dF90b2tlbl9pZC5zaGFwZSklMEElMjAlMjBwcmludCglMjJsZW5ndGglMjBvZiUyMGtleS12YWx1ZSUyMGNhY2hlJTIyJTJDJTIwbGVuKHBhc3Rfa2V5X3ZhbHVlcyU1QjAlNUQlNUIwJTVEKSklMjAlMjAlMjMlMjBwYXN0X2tleV92YWx1ZXMlMjAlRUQlOTglOTUlRUQlODMlOUMlM0ElMjAlNUJudW1fbGF5ZXJzJTJDJTIwMCUyMGZvciUyMGslMkMlMjAxJTIwZm9yJTIwdiUyQyUyMGJhdGNoX3NpemUlMkMlMjBsZW5ndGglMkMlMjBoaWRkZW5fZGltJTVEJTBBJTIwJTIwZ2VuZXJhdGVkX3Rva2Vucy5hcHBlbmQobmV4dF90b2tlbl9pZC5pdGVtKCkpJTBBJTBBZ2VuZXJhdGVkX3RleHQlMjAlM0QlMjB0b2tlbml6ZXIuYmF0Y2hfZGVjb2RlKGdlbmVyYXRlZF90b2tlbnMpJTBBZ2VuZXJhdGVkX3RleHQ=",highlighted:`past_key_values = <span class="hljs-literal">None</span> <span class="hljs-comment"># past_key_values 는 키-값 캐시를 의미</span> | |
| generated_tokens = [] | |
| next_token_id = tokenizer(prompt, return_tensors=<span class="hljs-string">"pt"</span>)[<span class="hljs-string">"input_ids"</span>].to(<span class="hljs-string">"cuda"</span>) | |
| <span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">5</span>): | |
| next_logits, past_key_values = model(next_token_id, past_key_values=past_key_values, use_cache=<span class="hljs-literal">True</span>).to_tuple() | |
| next_logits = next_logits[:, -<span class="hljs-number">1</span>:] | |
| next_token_id = torch.argmax(next_logits, dim=-<span class="hljs-number">1</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">"shape of input_ids"</span>, next_token_id.shape) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">"length of key-value cache"</span>, <span class="hljs-built_in">len</span>(past_key_values[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>])) <span class="hljs-comment"># past_key_values 형태: [num_layers, 0 for k, 1 for v, batch_size, length, hidden_dim]</span> | |
| generated_tokens.append(next_token_id.item()) | |
| generated_text = tokenizer.batch_decode(generated_tokens) | |
| generated_text`,wrap:!1}}),Ze=new b({props:{code:"c2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDElNUQpJTBBbGVuZ3RoJTIwb2YlMjBrZXktdmFsdWUlMjBjYWNoZSUyMDIwJTBBc2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDElNUQpJTBBbGVuZ3RoJTIwb2YlMjBrZXktdmFsdWUlMjBjYWNoZSUyMDIxJTBBc2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDElNUQpJTBBbGVuZ3RoJTIwb2YlMjBrZXktdmFsdWUlMjBjYWNoZSUyMDIyJTBBc2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDElNUQpJTBBbGVuZ3RoJTIwb2YlMjBrZXktdmFsdWUlMjBjYWNoZSUyMDIzJTBBc2hhcGUlMjBvZiUyMGlucHV0X2lkcyUyMHRvcmNoLlNpemUoJTVCMSUyQyUyMDElNUQpJTBBbGVuZ3RoJTIwb2YlMjBrZXktdmFsdWUlMjBjYWNoZSUyMDI0JTBBJTVCJyUyMEhlcmUnJTJDJTIwJyUyMGlzJyUyQyUyMCclMjBhJyUyQyUyMCclMjBQeXRob24nJTJDJTIwJyUyMGZ1bmN0aW9uJyU1RA==",highlighted:`<span class="hljs-attribute">shape</span> of input_ids torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>]) | |
| <span class="hljs-attribute">length</span> of key-value cache <span class="hljs-number">20</span> | |
| <span class="hljs-attribute">shape</span> of input_ids torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>]) | |
| <span class="hljs-attribute">length</span> of key-value cache <span class="hljs-number">21</span> | |
| <span class="hljs-attribute">shape</span> of input_ids torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>]) | |
| <span class="hljs-attribute">length</span> of key-value cache <span class="hljs-number">22</span> | |
| <span class="hljs-attribute">shape</span> of input_ids torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>]) | |
| <span class="hljs-attribute">length</span> of key-value cache <span class="hljs-number">23</span> | |
| <span class="hljs-attribute">shape</span> of input_ids torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">1</span>]) | |
| <span class="hljs-attribute">length</span> of key-value cache <span class="hljs-number">24</span><span class="hljs-meta"> | |
| [' Here', ' is', ' a', ' Python', ' function']</span>`,wrap:!1}}),vs=new Zd({props:{warning:!0,$$slots:{default:[Id]},$$scope:{ctx:ol}}}),Xe=new ps({props:{title:"3.2.1 멀티 라운드 대화",local:"321-multi-round-conversation",headingTag:"h4"}}),Ne=new b({props:{code:"VXNlciUzQSUyMEhvdyUyMG1hbnklMjBwZW9wbGUlMjBsaXZlJTIwaW4lMjBGcmFuY2UlM0YlMEFBc3Npc3RhbnQlM0ElMjBSb3VnaGx5JTIwNzUlMjBtaWxsaW9uJTIwcGVvcGxlJTIwbGl2ZSUyMGluJTIwRnJhbmNlJTBBVXNlciUzQSUyMEFuZCUyMGhvdyUyMG1hbnklMjBhcmUlMjBpbiUyMEdlcm1hbnklM0YlMEFBc3Npc3RhbnQlM0ElMjBHZXJtYW55JTIwaGFzJTIwY2EuJTIwODElMjBtaWxsaW9uJTIwaW5oYWJpdGFudHM=",highlighted:`<span class="hljs-symbol">User:</span> How many people live <span class="hljs-keyword">in</span> France? | |
| <span class="hljs-symbol">Assistant:</span> Roughly <span class="hljs-number">75</span> million people live <span class="hljs-keyword">in</span> France | |
| <span class="hljs-symbol">User:</span> <span class="hljs-keyword">And</span> how many are <span class="hljs-keyword">in</span> Germany? | |
| <span class="hljs-symbol">Assistant:</span> Germany has ca. <span class="hljs-number">81</span> million inhabitants`,wrap:!1}}),Se=new b({props:{code:"JTIzJTIwJUVDJTlEJUJDJUVCJUIwJTk4JUVDJUEwJTgxJUVDJTlEJUI4JTIwJUVDJTgzJTlEJUVDJTg0JUIxJTBBcHJvbXB0JTIwJTNEJTIwc3lzdGVtX3Byb21wdCUyMCUyQiUyMCUyMlF1ZXN0aW9uJTNBJTIwUGxlYXNlJTIwd3JpdGUlMjBhJTIwZnVuY3Rpb24lMjBpbiUyMFB5dGhvbiUyMHRoYXQlMjB0cmFuc2Zvcm1zJTIwYnl0ZXMlMjB0byUyMEdpZ2ElMjBieXRlcy4lNUNuJTVDbkFuc3dlciUzQSUyMEhlcmUlMjIlMEFtb2RlbF9pbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIocHJvbXB0JTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QncHQnKSUwQWdlbmVyYXRpb25fb3V0cHV0JTIwJTNEJTIwbW9kZWwuZ2VuZXJhdGUoKiptb2RlbF9pbnB1dHMlMkMlMjBtYXhfbmV3X3Rva2VucyUzRDYwJTJDJTIwcmV0dXJuX2RpY3RfaW5fZ2VuZXJhdGUlM0RUcnVlKSUwQWRlY29kZWRfb3V0cHV0JTIwJTNEJTIwdG9rZW5pemVyLmJhdGNoX2RlY29kZShnZW5lcmF0aW9uX291dHB1dC5zZXF1ZW5jZXMpJTVCMCU1RCUwQSUwQSUyMyUyMCVFQiVBNiVBQyVFRCU4NCVCNCVFQiU5MCU5QyUyMCU2MHBhc3Rfa2V5X3ZhbHVlcyU2MCVFQiVBNSVCQyUyMCVFRCU4QyU4QyVFQyU5RCVCNCVFRCU5NCU4NCVFQiU5RCVCQyVFQyU5RCVCOCVFRCU5OSU5NCVFRCU5NSU5OCVFQyU5NyVBQyUyMCVFQiU4QiVBNCVFQyU5RCU4QyUyMCVFQiU4QyU4MCVFRCU5OSU5NCUyMCVFQiU5RCVCQyVFQyU5QSVCNCVFQiU5MyU5QyVFQiVBNSVCQyUyMCVFQSVCMCU4MCVFQyU4NiU4RCVFRCU5OSU5NCUwQXByb21wdCUyMCUzRCUyMGRlY29kZWRfb3V0cHV0JTIwJTJCJTIwJTIyJTVDblF1ZXN0aW9uJTNBJTIwSG93JTIwY2FuJTIwSSUyMG1vZGlmeSUyMHRoZSUyMGZ1bmN0aW9uJTIwYWJvdmUlMjB0byUyMHJldHVybiUyME1lZ2ElMjBieXRlcyUyMGluc3RlYWQlM0YlNUNuJTVDbkFuc3dlciUzQSUyMEhlcmUlMjIlMEFtb2RlbF9pbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIocHJvbXB0JTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QncHQnKSUwQWdlbmVyYXRpb25fb3V0cHV0JTIwJTNEJTIwbW9kZWwuZ2VuZXJhdGUoJTBBJTIwJTIwKiptb2RlbF9pbnB1dHMlMkMlMEElMjAlMjBwYXN0X2tleV92YWx1ZXMlM0RnZW5lcmF0aW9uX291dHB1dC5wYXN0X2tleV92YWx1ZXMlMkMlMEElMjAlMjBtYXhfbmV3X3Rva2VucyUzRDYwJTJDJTBBJTIwJTIwcmV0dXJuX2RpY3RfaW5fZ2VuZXJhdGUlM0RUcnVlJTBBKSUwQXRva2VuaXplci5iYXRjaF9kZWNvZGUoZ2VuZXJhdGlvbl9vdXRwdXQuc2VxdWVuY2VzKSU1QjAlNUQlNUJsZW4ocHJvbXB0KSUzQSU1RA==",highlighted:`<span class="hljs-comment"># 일반적인 생성</span> | |
| prompt = system_prompt + <span class="hljs-string">"Question: Please write a function in Python that transforms bytes to Giga bytes.\\n\\nAnswer: Here"</span> | |
| model_inputs = tokenizer(prompt, return_tensors=<span class="hljs-string">'pt'</span>) | |
| generation_output = model.generate(**model_inputs, max_new_tokens=<span class="hljs-number">60</span>, return_dict_in_generate=<span class="hljs-literal">True</span>) | |
| decoded_output = tokenizer.batch_decode(generation_output.sequences)[<span class="hljs-number">0</span>] | |
| <span class="hljs-comment"># 리턴된 \`past_key_values\`를 파이프라인화하여 다음 대화 라운드를 가속화</span> | |
| prompt = decoded_output + <span class="hljs-string">"\\nQuestion: How can I modify the function above to return Mega bytes instead?\\n\\nAnswer: Here"</span> | |
| model_inputs = tokenizer(prompt, return_tensors=<span class="hljs-string">'pt'</span>) | |
| generation_output = model.generate( | |
| **model_inputs, | |
| past_key_values=generation_output.past_key_values, | |
| max_new_tokens=<span class="hljs-number">60</span>, | |
| return_dict_in_generate=<span class="hljs-literal">True</span> | |
| ) | |
| tokenizer.batch_decode(generation_output.sequences)[<span class="hljs-number">0</span>][<span class="hljs-built_in">len</span>(prompt):]`,wrap:!1}}),qe=new b({props:{code:"JTIwaXMlMjBhJTIwbW9kaWZpZWQlMjB2ZXJzaW9uJTIwb2YlMjB0aGUlMjBmdW5jdGlvbiUyMHRoYXQlMjByZXR1cm5zJTIwTWVnYSUyMGJ5dGVzJTIwaW5zdGVhZC4lMEElMEFkZWYlMjBieXRlc190b19tZWdhYnl0ZXMoYnl0ZXMpJTNBJTBBJTIwJTIwJTIwcmV0dXJuJTIwYnl0ZXMlMjAlMkYlMjAxMDI0JTIwJTJGJTIwMTAyNCUwQSUwQUFuc3dlciUzQSUyMFRoZSUyMGZ1bmN0aW9uJTIwdGFrZXMlMjBhJTIwbnVtYmVyJTIwb2YlMjBieXRlcyUyMGFzJTIwaW5wdXQlMjBhbmQlMjByZXR1cm5zJTIwdGhlJTIwbnVtYmVyJTIwb2Y=",highlighted:` <span class="hljs-keyword">is</span> a modified <span class="hljs-keyword">version</span> <span class="hljs-keyword">of</span> the <span class="hljs-keyword">function</span> that <span class="hljs-keyword">returns</span> Mega bytes <span class="hljs-keyword">instead</span>. | |
| def bytes_to_megabytes(bytes): | |
| <span class="hljs-keyword">return</span> bytes / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> | |
| Answer: The <span class="hljs-keyword">function</span> takes a number <span class="hljs-keyword">of</span> bytes <span class="hljs-keyword">as</span> <span class="hljs-keyword">input</span> <span class="hljs-keyword">and</span> <span class="hljs-keyword">returns</span> the number <span class="hljs-keyword">of</span>`,wrap:!1}}),Ke=new b({props:{code:"Y29uZmlnJTIwJTNEJTIwbW9kZWwuY29uZmlnJTBBMiUyMColMjAxNl8wMDAlMjAqJTIwY29uZmlnLm5fbGF5ZXIlMjAqJTIwY29uZmlnLm5faGVhZCUyMColMjBjb25maWcubl9lbWJkJTIwJTJGJTJGJTIwY29uZmlnLm5faGVhZA==",highlighted:`config = model.config | |
| <span class="hljs-number">2</span> * <span class="hljs-number">16_000</span> * config.n_layer * config.n_head * config.n_embd // config.n_head`,wrap:!1}}),Oe=new b({props:{code:"Nzg2NDMyMDAwMA==",highlighted:'<span class="hljs-number">7864320000</span>',wrap:!1}}),an=new ps({props:{title:"3.2.2 멀티 쿼리 어텐션 (MQA)",local:"322-multi-query-attention-mqa",headingTag:"h4"}}),mn=new ps({props:{title:"3.2.3 그룹 쿼리 어텐션 (GQA)",local:"323-grouped-query-attention-gqa",headingTag:"h4"}}),gn=new ps({props:{title:"결론",local:"conclusion",headingTag:"h2"}}),Mn=new Vd({props:{source:"https://github.com/huggingface/transformers/blob/main/docs/source/ko/llm_tutorial_optimization.md"}}),{c(){C=p("meta"),Cs=n(),S=p("p"),wn=n(),u(Gs.$$.fragment),cl=n(),u(Bs.$$.fragment),hl=n(),$s=p("p"),$s.innerHTML=Hg,gl=n(),zs=p("ul"),zs.innerHTML=Ng,ul=n(),Zs=p("p"),Zs.textContent=Lg,yl=n(),Qs=p("p"),Qs.textContent=Wg,Ml=n(),Vs=p("ol"),Vs.innerHTML=Eg,dl=n(),Is=p("p"),Is.textContent=Yg,wl=n(),u(Rs.$$.fragment),fl=n(),Xs=p("p"),Xs.innerHTML=Ag,bl=n(),Hs=p("p"),Hs.innerHTML=Sg,vl=n(),Ns=p("blockquote"),Ns.innerHTML=Pg,xl=n(),Ls=p("p"),Ls.textContent=qg,Tl=n(),Ws=p("blockquote"),Ws.innerHTML=Fg,_l=n(),Es=p("p"),Es.textContent=Kg,jl=n(),Ys=p("p"),Ys.textContent=Dg,Ul=n(),As=p("ul"),As.innerHTML=Og,Jl=n(),Ss=p("p"),Ss.innerHTML=su,kl=n(),Ps=p("p"),Ps.innerHTML=au,Cl=n(),qs=p("p"),qs.innerHTML=tu,Gl=n(),Fs=p("p"),Fs.textContent=eu,Bl=n(),u(Ks.$$.fragment),$l=n(),u(Ds.$$.fragment),zl=n(),Os=p("p"),Os.innerHTML=nu,Zl=n(),sa=p("p"),sa.innerHTML=lu,Ql=n(),aa=p("p"),aa.innerHTML=pu,Vl=n(),ta=p("p"),ta.innerHTML=mu,Il=n(),u(ea.$$.fragment),Rl=n(),u(na.$$.fragment),Xl=n(),la=p("p"),la.innerHTML=iu,Hl=n(),u(pa.$$.fragment),Nl=n(),ma=p("p"),ma.textContent=ru,Ll=n(),u(ia.$$.fragment),Wl=n(),ra=p("p"),ra.innerHTML=ou,El=n(),u(oa.$$.fragment),Yl=n(),ca=p("p"),ca.innerHTML=cu,Al=n(),u(ha.$$.fragment),Sl=n(),ga=p("p"),ga.textContent=hu,Pl=n(),ua=p("blockquote"),ua.innerHTML=gu,ql=n(),ya=p("p"),ya.innerHTML=uu,Fl=n(),Ma=p("p"),Ma.innerHTML=yu,Kl=n(),u(da.$$.fragment),Dl=n(),wa=p("p"),wa.textContent=Mu,Ol=n(),u(fa.$$.fragment),sp=n(),ba=p("p"),ba.innerHTML=du,ap=n(),u(va.$$.fragment),tp=n(),xa=p("p"),xa.innerHTML=wu,ep=n(),Ta=p("p"),Ta.innerHTML=fu,np=n(),_a=p("p"),_a.textContent=bu,lp=n(),ja=p("ul"),ja.innerHTML=vu,pp=n(),G=p("p"),Uh=o("간단히 말해서, "),fn=p("em"),fn.textContent=xu,Jh=o(" 곱셈은,"),mp=new h(!1),ip=o("가 "),bn=p("em"),bn.textContent=Tu,kh=o(","),rp=new h(!1),op=o("가 가중치 행렬,"),cp=new h(!1),hp=o(`가 출력인 경우 다음과 같습니다: | |
| `),gp=new h(!1),up=n(),Ua=p("p"),Ch=o(`위 공식이 다음과 같이 변경됩니다 | |
| `),yp=new h(!1),Mp=n(),Ja=p("p"),Ja.textContent=_u,dp=n(),ka=p("p"),ka.innerHTML=ju,wp=n(),u(Ca.$$.fragment),fp=n(),Ga=p("p"),Ga.innerHTML=Uu,bp=n(),u(Ba.$$.fragment),vp=n(),$a=p("p"),$a.textContent=Ju,xp=n(),u(za.$$.fragment),Tp=n(),Za=p("p"),Za.innerHTML=ku,_p=n(),u(Qa.$$.fragment),jp=n(),Va=p("p"),Va.textContent=Cu,Up=n(),u(Ia.$$.fragment),Jp=n(),Ra=p("p"),Ra.innerHTML=Gu,kp=n(),u(Xa.$$.fragment),Cp=n(),Ha=p("p"),Ha.textContent=Bu,Gp=n(),Na=p("p"),Na.textContent=$u,Bp=n(),u(La.$$.fragment),$p=n(),u(Wa.$$.fragment),zp=n(),Ea=p("p"),Ea.innerHTML=zu,Zp=n(),u(Ya.$$.fragment),Qp=n(),Aa=p("p"),Aa.innerHTML=Zu,Vp=n(),u(Sa.$$.fragment),Ip=n(),Pa=p("p"),Pa.innerHTML=Qu,Rp=n(),u(qa.$$.fragment),Xp=n(),Fa=p("p"),Fa.innerHTML=Vu,Hp=n(),u(Ka.$$.fragment),Np=n(),Da=p("p"),Da.textContent=Iu,Lp=n(),Oa=p("p"),Oa.innerHTML=Ru,Wp=n(),F=p("p"),Gh=o("또한 4비트 양자화에 사용된 더 공격적인 양자화 방법으로 인해 추론 시"),Ep=new h(!1),Yp=o("와"),Ap=new h(!1),Sp=o(" 과정이 더 오래 걸리므로 여기서도 8비트 양자화와 비교하여 추론 속도가 약간 느려졌음을 유의하세요."),Pp=n(),u(st.$$.fragment),qp=n(),u(at.$$.fragment),Fp=n(),tt=p("p"),tt.textContent=Xu,Kp=n(),et=p("p"),et.textContent=Hu,Dp=n(),nt=p("p"),nt.innerHTML=Nu,Op=n(),lt=p("blockquote"),lt.innerHTML=Lu,sm=n(),pt=p("p"),pt.textContent=Wu,am=n(),mt=p("p"),mt.innerHTML=Eu,tm=n(),u(it.$$.fragment),em=n(),rt=p("p"),rt.textContent=Yu,nm=n(),K=p("p"),Bh=o(`셀프 어텐션 레이어는 입력 토큰 간의 문맥적 관계를 이해할 수 있게 해 주기 때문에 대규모 언어 모델의 핵심 요소입니다. | |
| 하지만 셀프 어텐션 레이어의 최대 GPU 메모리 소비는 입력 토큰의 수(이하`),lm=new h(!1),pm=o("으로 표기)와 함께 계산 및 메모리 복잡성이 "),vn=p("em"),vn.textContent=Au,$h=o("으로 증가합니다. 입력 시퀀스가 짧은 경우(최대 1000개)에는 크게 눈에 띄지 않지만, 더 긴 입력 시퀀스(약 16000개)에서는 심각한 문제가 됩니다."),mm=n(),T=p("p"),zh=o("자세히 한 번 들여다 봅시다. 길이"),im=new h(!1),rm=o("의 입력"),om=new h(!1),cm=o("에 대한 셀프 어텐션 레이어의 출력"),hm=new h(!1),gm=o(`을 계산하는 공식은 다음과 같습니다: | |
| `),um=new h(!1),ym=n(),Mm=new h(!1),dm=o("는 어텐션 레이어의 입력 시퀀스입니다. 프로젝션"),wm=new h(!1),fm=o("와"),bm=new h(!1),vm=o("는 각각"),xm=new h(!1),Tm=o("개의 벡터로 구성되며, 그 결과"),_m=new h(!1),jm=o("의 크기는"),Um=new h(!1),Jm=o("가 됩니다."),km=n(),U=p("p"),Zh=o("대규모 언어 모델은 일반적으로 여러 개의 어텐션 헤드를 가지고 있어 여러 개의 셀프 어텐션 계산을 병렬로 수행합니다. 대규모 언어 모델이 40개의 어텐션 헤드를 가지고 bfloat16 정밀도로 실행된다고 가정하면,"),Cm=new h(!1),Gm=o(" 행렬을 저장하는 데 필요한 메모리를"),Bm=new h(!1),$m=o(" 바이트로 계산할 수 있습니다."),zm=new h(!1),Zm=o("일 때는 약 50MB의 VRAM만 필요하지만,"),Qm=new h(!1),Vm=o("일 때는 19GB의 VRAM이 필요하며,"),Im=new h(!1),Rm=o("일 때는"),Xm=new h(!1),Hm=o(" 행렬을 저장하기 위해 거의 1TB의 VRAM이 필요합니다."),Nm=n(),ot=p("p"),ot.textContent=Su,Lm=n(),ct=p("p"),ct.textContent=Pu,Wm=n(),W=p("p"),Qh=o("어떻게 하면 큰 입력 길이에 대한 과도한 메모리 요구를 없앨 수 있을까요?"),Em=new h(!1),Ym=o(" 행렬을 제거하는 새로운 셀프 어텐션 메커니즘을 계산하는 방법이 필요합니다. "),cs=p("a"),cs.textContent=qu,Vh=o("은 바로 이러한 새로운 알고리즘을 개발하였고, 그것이 "),xn=p("strong"),xn.textContent=Fu,Ih=o("입니다."),Am=n(),ms=p("p"),Rh=o("간단히 말해, 플래시 어텐션은"),Sm=new h(!1),Pm=o(`) 계산을 분할하는데, 여러 번의 소프트맥스 계산을 반복하면서 작은 청크 단위로 출력을 계산합니다: | |
| `),qm=new h(!1),Fm=n(),Q=p("p"),Xh=o("여기서"),Km=new h(!1),Dm=o("와"),Om=new h(!1),si=o("는 각"),ai=new h(!1),ti=o("와"),ei=new h(!1),ni=o("에 대해 계산되는 소프트맥스 정규화 통계량입니다."),li=n(),ht=p("p"),ht.innerHTML=Ku,pi=n(),gt=p("p"),gt.textContent=Du,mi=n(),Tn=p("blockquote"),is=p("p"),Hh=o("소프트맥스 정규화 통계량과 몇 가지 스마트한 수학적 방법을 사용함으로써, 플래시 어텐션은 기본 셀프 어텐션 레이어와 "),_n=p("strong"),_n.textContent=Ou,Nh=o(" 출력을 제공하고 메모리 비용은"),ii=new h(!1),ri=o("에 따라 선형적으로만 증가합니다."),oi=n(),ut=p("p"),ut.innerHTML=sy,ci=n(),yt=p("blockquote"),yt.innerHTML=ay,hi=n(),D=p("p"),Lh=o("본질적으로, 플래시 어텐션의 모든 중간 단계의 쓰기 및 읽기 작업은 느린 VRAM 메모리에 접근하지 않고 빠른 "),jn=p("em"),jn.textContent=ty,Wh=o(" SRAM 메모리를 사용하여 출력 벡터"),gi=new h(!1),ui=o("를 계산할 수 있도록 합니다."),yi=n(),Mt=p("p"),Mt.innerHTML=ey,Mi=n(),dt=p("p"),dt.textContent=ny,di=n(),wt=p("p"),wt.innerHTML=ly,wi=n(),u(ft.$$.fragment),fi=n(),bt=p("p"),bt.innerHTML=py,bi=n(),u(vt.$$.fragment),vi=n(),xt=p("p"),xt.textContent=my,xi=n(),u(Tt.$$.fragment),Ti=n(),_t=p("p"),_t.innerHTML=iy,_i=n(),u(jt.$$.fragment),ji=n(),Ut=p("p"),Ut.innerHTML=ry,Ui=n(),u(Jt.$$.fragment),Ji=n(),kt=p("p"),kt.textContent=oy,ki=n(),Ct=p("p"),Ct.innerHTML=cy,Ci=n(),Gt=p("p"),Gt.textContent=hy,Gi=n(),u(Bt.$$.fragment),Bi=n(),$t=p("p"),$t.innerHTML=gy,$i=n(),u(zt.$$.fragment),zi=n(),Zt=p("p"),Zt.textContent=uy,Zi=n(),Qt=p("p"),Qt.innerHTML=yy,Qi=n(),u(Vt.$$.fragment),Vi=n(),It=p("p"),It.innerHTML=My,Ii=n(),u(Rt.$$.fragment),Ri=n(),Xt=p("p"),Xt.textContent=dy,Xi=n(),u(Ht.$$.fragment),Hi=n(),Nt=p("p"),Nt.innerHTML=wy,Ni=n(),u(Lt.$$.fragment),Li=n(),Wt=p("p"),Wt.textContent=fy,Wi=n(),Et=p("p"),Et.textContent=by,Ei=n(),u(Yt.$$.fragment),Yi=n(),At=p("p"),At.innerHTML=vy,Ai=n(),u(St.$$.fragment),Si=n(),Pt=p("p"),Pt.textContent=xy,Pi=n(),qt=p("p"),qt.textContent=Ty,qi=n(),u(Ft.$$.fragment),Fi=n(),Kt=p("p"),Kt.innerHTML=_y,Ki=n(),u(Dt.$$.fragment),Di=n(),Ot=p("p"),Ot.textContent=jy,Oi=n(),se=p("ul"),se.innerHTML=Uy,sr=n(),ae=p("p"),ae.textContent=Jy,ar=n(),te=p("ul"),te.innerHTML=ky,tr=n(),ee=p("p"),ee.innerHTML=Cy,er=n(),ne=p("p"),ne.textContent=Gy,nr=n(),le=p("ul"),le.innerHTML=By,lr=n(),pe=p("p"),pe.textContent=$y,pr=n(),u(me.$$.fragment),mr=n(),O=p("p"),Eh=o(`셀프 어텐션은 각 토큰을 서로의 토큰과 연관시킵니다. | |
| 예를 들어, 텍스트 입력 시퀀스 `),Un=p("em"),Un.textContent=zy,Yh=o("의"),ir=new h(!1),rr=o(" 행렬은 다음과 같을 수 있습니다:"),or=n(),ie=p("p"),ie.innerHTML=Zy,cr=n(),re=p("p"),re.innerHTML=Qy,hr=n(),V=p("p"),Ah=o("셀프 어텐션 기반 대규모 언어 모델이 위치 임베딩이 없는 경우 텍스트 입력의 위치를 이해하는 데 큰 어려움을 겪을 것입니다. 이는"),gr=new h(!1),ur=o("에 의해 계산된 확률 점수가 상대적 위치 거리에 상관없이 각 단어 토큰을 다른 모든 단어 토큰과"),yr=new h(!1),Mr=o(" 계산으로 연관시키기 때문입니다. 따라서 위치 임베딩이 없는 대규모 언어 모델은 각 토큰이 다른 모든 토큰과 동일한 거리에 있는 것으로 나타나기 때문에, "),Jn=p("em"),Jn.textContent=Vy,Sh=o("와 "),kn=p("em"),kn.textContent=Iy,Ph=o("를 구분하는 것이 매우 어렵습니다."),dr=n(),oe=p("p"),oe.innerHTML=Ry,wr=n(),B=p("p"),hs=p("a"),hs.innerHTML=Xy,qh=o(" 논문의 저자들은 사인 함수 기반의 위치 임베딩"),fr=new h(!1),br=o("을 도입했습니다. 각 벡터"),vr=new h(!1),xr=o("는 위치"),Tr=new h(!1),_r=o("의 사인 함수로 계산됩니다. 위치 인코딩은 입력 시퀀스 벡터에 단순히 더해져"),jr=new h(!1),Ur=o(" ="),Jr=new h(!1),kr=o(" 모델이 문장 순서를 더 잘 학습할 수 있도록 합니다."),Cr=n(),ss=p("p"),Fh=o("고정된 위치 임베딩 대신 "),gs=p("a"),gs.textContent=Hy,Kh=o("과 같은 다른 연구자들은 학습된 위치 인코딩을 사용했습니다. 이 경우 위치 임베딩"),Gr=new h(!1),Br=o("은 학습 중에 사용됩니다."),$r=n(),ce=p("p"),ce.textContent=Ny,zr=n(),us=p("ol"),P=p("li"),Dh=o("사인 함수와 학습된 위치 임베딩은 모두 절대 위치 임베딩으로, 각 위치 ID"),Zr=new h(!1),Qr=o("에 대해 고유한 임베딩을 인코딩합니다. "),ys=p("a"),ys.textContent=Ly,Oh=o(" 및 "),Ms=p("a"),Ms.textContent=Wy,sg=o("의 연구에 따르면, 절대 위치 임베딩은 긴 텍스트 입력에 대해 대규모 언어 모델 성능이 저하됩니다. 긴 텍스트 입력의 경우, 모델이 절대 위치 대신 입력 토큰 간의 상대적 위치 거리를 학습하는 것이 유리합니다."),ag=n(),he=p("li"),tg=o("학습된 위치 임베딩을 사용할 때, 대규모 언어 모델은 고정된 입력 길이"),Vr=new h(!1),Ir=o("으로 학습되어야 하므로, 학습된 입력 길이보다 더 긴 입력 길이에 대해 추론하는 것이 어렵습니다."),Rr=n(),ge=p("p"),ge.textContent=Ey,Xr=n(),ue=p("ul"),ue.innerHTML=Yy,Hr=n(),q=p("p"),Cn=p("em"),Cn.textContent=Ay,eg=o("와 "),Gn=p("em"),Gn.textContent=Sy,ng=o("는 모두 셀프 어텐션 알고리즘 내에서 직접적으로 문장 순서를 모델에게 알려주는 것이 최선이라고 주장합니다. 이는 단어 토큰이 서로 관계를 맺는 곳이기 때문입니다. 구체적으로, 문장 순서를"),Nr=new h(!1),Lr=o(" 계산을 수정하는 방식으로 알려주어야 한다는 것입니다."),Wr=n(),$=p("p"),lg=o("너무 많은 세부 사항을 다루지 않고, "),Bn=p("em"),Bn.textContent=Py,pg=o("는 위치 정보를 쿼리-키 쌍에 인코딩할 수 있다고 지적합니다. 예를 들어, 각 벡터"),Er=new h(!1),Yr=o("와"),Ar=new h(!1),Sr=o("를 각각"),Pr=new h(!1),qr=o("와"),Fr=new h(!1),Kr=o(`의 각도로 회전시킴으로써 다음과 같이 표현할 수 있습니다: | |
| `),Dr=new h(!1),Or=n(),E=p("p"),mg=o("여기서"),so=new h(!1),ao=o("는 회전 행렬을 나타냅니다."),to=new h(!1),eo=o("는 훈련 중에 "),$n=p("em"),$n.textContent=qy,ig=o(", 대신 학습 중 최대 입력 시퀀스 길이에 따라 사전 정의된 값으로 설정됩니다."),no=n(),zn=p("blockquote"),z=p("p"),rg=o("이렇게 함으로써"),lo=new h(!1),po=o("와"),mo=new h(!1),io=o(" 간의 확률 점수는"),ro=new h(!1),oo=o("인 경우에만 영향을 받으며, 각 벡터의 특정 위치"),co=new h(!1),ho=o("와"),go=new h(!1),uo=o("와는 상관없이 오직 상대적 거리"),yo=new h(!1),Mo=o("에만 의존하게 됩니다."),wo=n(),ye=p("p"),ye.innerHTML=Fy,fo=n(),Me=p("ul"),Me.innerHTML=Ky,bo=n(),Y=p("p"),og=o("대안으로, "),Zn=p("em"),Zn.textContent=Dy,cg=o("는 훨씬 더 간단한 상대적 위치 인코딩 방식을 제안합니다. 입력 토큰 간의 상대적 거리를 음수인 정수로서 사전 정의된 값 "),Qn=p("code"),Qn.textContent=Oy,hg=o("으로 스케일링하여"),vo=new h(!1),xo=o(" 행렬의 각 쿼리-키 항목에 소프트맥스 계산 직전에 추가합니다."),To=n(),de=p("p"),de.innerHTML=sM,_o=n(),we=p("p"),we.innerHTML=aM,jo=n(),fe=p("p"),fe.innerHTML=tM,Uo=n(),be=p("ul"),be.innerHTML=eM,Jo=n(),x=p("p"),Vn=p("em"),Vn.textContent=nM,gg=o("와 "),In=p("em"),In.textContent=lM,ug=o(" 위치 인코딩은 모두 학습 중에 보지 못한 입력 길이에 대해 확장할 수 있으며, "),Rn=p("em"),Rn.textContent=pM,yg=o("가 "),Xn=p("em"),Xn.textContent=mM,Mg=o("보다 더 잘 확장되는 것으로 나타났습니다. "),Hn=p("em"),Hn.textContent=iM,dg=o("의 경우, 하삼각 위치 행렬의 값을 입력 시퀀스 길이에 맞추어 증가시키기만 하면 됩니다. "),Nn=p("em"),Nn.textContent=rM,wg=o("의 경우, 학습 중에 사용된 동일한"),ko=new h(!1),Co=o("를 유지하면 학습 중에 보지 못한 매우 긴 텍스트 입력을 전달할 때 성능이 저하됩니다(참고: "),ds=p("a"),ds.textContent=oM,fg=o("). 그러나 커뮤니티는"),Go=new h(!1),Bo=o("를 조정하는 몇 가지 효과적인 트릭을 찾아냈으며, 이를 통해 "),Ln=p("em"),Ln.textContent=cM,bg=o(" 위치 임베딩이 확장된 텍스트 입력 시퀀스에서도 잘 작동할 수 있게 되었습니다(참고: "),ws=p("a"),ws.textContent=hM,vg=o(")."),$o=n(),fs=p("blockquote"),Wn=p("p"),Wn.innerHTML=gM,xg=n(),rs=p("ul"),ve=p("li"),Tg=o("텍스트 입력에 대한 위치 단서는 셀프 어텐션 레이어의"),zo=new h(!1),Zo=o(" 행렬에 직접 제공되어야 합니다."),_g=n(),En=p("li"),En.innerHTML=uM,jg=n(),Yn=p("li"),Yn.textContent=yM,Qo=n(),A=p("p"),Ug=o("결론적으로, 큰 텍스트 입력을 처리해야 하는 작업에 배포될 예정인 대규모 언어 모델은 RoPE와 ALiBi와 같은 상대적 위치 임베딩으로 훈련하는 것이 더 좋습니다. 또한 RoPE와 ALiBi를 사용하여 훈련된 대규모 언어 모델이 고정 길이"),Vo=new h(!1),Io=o("에서만 훈련되었더라도 위치 임베딩을 외삽하여"),Ro=new h(!1),Xo=o("보다 훨씬 큰 텍스트 입력"),Ho=new h(!1),No=o("로 실습에서 사용할 수 있음을 유의하세요."),Lo=n(),u(xe.$$.fragment),Wo=n(),Te=p("p"),Te.textContent=MM,Eo=n(),_e=p("p"),_e.innerHTML=dM,Yo=n(),je=p("p"),je.innerHTML=wM,Ao=n(),u(Ue.$$.fragment),So=n(),Je=p("p"),Je.innerHTML=fM,Po=n(),u(ke.$$.fragment),qo=n(),Ce=p("p"),Ce.textContent=bM,Fo=n(),Ge=p("p"),Ge.innerHTML=vM,Ko=n(),J=p("p"),Jg=o("결과적으로, 토큰은 "),An=p("em"),An.textContent=xM,kg=o(" 이전 토큰에 의존하지 않습니다. 더 구체적으로는"),Do=new h(!1),Oo=o(" 벡터가"),sc=new h(!1),ac=o("인 경우 어떤 키, 값 벡터"),tc=new h(!1),ec=o("와도 연관되지 않습니다. 대신"),nc=new h(!1),lc=o("는 이전의 키-값 벡터"),pc=new h(!1),mc=o("에만 주의를 기울입니다. 불필요한 계산을 줄이기 위해 각 층의 키-값 벡터를 모든 이전 시간 단계에 대해 캐시할 수 있습니다."),ic=n(),Be=p("p"),Be.innerHTML=TM,rc=n(),u($e.$$.fragment),oc=n(),ze=p("p"),ze.innerHTML=_M,cc=n(),u(Ze.$$.fragment),hc=n(),Qe=p("p"),Qe.innerHTML=jM,gc=n(),Sn=p("blockquote"),H=p("p"),Cg=o("키-값 캐시를 사용하면"),uc=new h(!1),yc=o("가 본질적으로"),Mc=new h(!1),dc=o("로 줄어드는데, 여기서"),wc=new h(!1),fc=o("는 현재 전달된 입력 토큰의 쿼리 프로젝션으로, "),Pn=p("em"),Pn.textContent=UM,Gg=o(" 단일 벡터입니다."),bc=n(),Ve=p("p"),Ve.textContent=JM,vc=n(),bs=p("ul"),Ie=p("li"),Bg=o("전체"),xc=new h(!1),Tc=o(" 행렬을 계산하는 것과 비교하여 계산 효율성이 크게 향상됩니다. 이는 추론 속도의 증가로 이어집니다."),$g=n(),qn=p("li"),qn.textContent=kM,_c=n(),Re=p("blockquote"),Re.innerHTML=CM,jc=n(),u(vs.$$.fragment),Uc=n(),u(Xe.$$.fragment),Jc=n(),He=p("p"),He.textContent=GM,kc=n(),u(Ne.$$.fragment),Cc=n(),Le=p("p"),Le.textContent=BM,Gc=n(),We=p("ol"),We.innerHTML=$M,Bc=n(),Ee=p("p"),Ee.textContent=zM,$c=n(),Ye=p("ol"),Ye.innerHTML=ZM,zc=n(),Ae=p("p"),Ae.innerHTML=QM,Zc=n(),u(Se.$$.fragment),Qc=n(),Pe=p("p"),Pe.innerHTML=VM,Vc=n(),u(qe.$$.fragment),Ic=n(),as=p("p"),zg=o("훌륭합니다. 어텐션 층의 동일한 키와 값을 다시 계산하는 데 추가 시간이 소요되지 않습니다! 그러나 한 가지 문제가 있습니다."),Rc=new h(!1),Xc=o(" 행렬에 필요한 최대 메모리는 크게 줄어들지만, 긴 입력 시퀀스나 다회차 채팅의 경우 키-값 캐시를 메모리에 보관하는 것이 매우 메모리 집약적이 될 수 있습니다. 키-값 캐시는 모든 자기 어텐션 층과 모든 어텐션 헤드에 대해 이전 입력 벡터"),Hc=new h(!1),Nc=o("의 키-값 벡터를 저장해야 한다는 점을 기억하세요."),Lc=n(),Fe=p("p"),Fe.innerHTML=IM,Wc=n(),u(Ke.$$.fragment),Ec=n(),De=p("p"),De.innerHTML=RM,Yc=n(),u(Oe.$$.fragment),Ac=n(),sn=p("p"),sn.innerHTML=XM,Sc=n(),u(an.$$.fragment),Pc=n(),tn=p("p"),tn.innerHTML=HM,qc=n(),Fn=p("blockquote"),os=p("p"),Zg=o("단일 헤드-값 프로젝션 가중치를 사용함으로써, 키-값 벡터"),Fc=new h(!1),Kc=o("는 모든 어텐션 헤드에서 동일해야 하며, 이는 캐시에 "),Kn=p("code"),Kn.textContent=NM,Qg=o(" 개 대신 하나의 키-값 프로젝션 쌍만 저장하면 된다는 것을 의미합니다."),Dc=n(),en=p("p"),en.textContent=LM,Oc=n(),ts=p("p"),Vg=o(`메모리 절감 외에도, MQA는 계산 효율성도 향상시킵니다. 다음과 같이 설명합니다. | |
| 자기회귀 디코딩에서는 큰 키-값 벡터를 다시 로드하고, 현재 키-값 벡터 쌍과 연결한 후`),sh=new h(!1),ah=o(" 계산에 매 단계마다 입력해야 합니다. 자기회귀 디코딩의 경우, 지속적인 재로드에 필요한 메모리 대역폭이 심각한 시간 병목 현상을 가져올 수 있습니다. 키-값 벡터의 크기를 줄이면 접근해야 하는 메모리 양이 줄어들어 메모리 대역폭 병목 현상이 감소합니다. 자세한 내용은 "),xs=p("a"),xs.textContent=WM,Ig=o("을 참조하세요."),th=n(),Ts=p("p"),Rg=o("여기서 이해해야 할 중요한 부분은 키-값 어텐션 헤드 수를 1로 줄이는 것이 키-값 캐시를 사용할 때만 의미가 있다는 것입니다. 키-값 캐시 없이 단일 포워드 패스에 대한 모델의 최대 메모리 소비는 변경되지 않으며, 각 어텐션 헤드는 여전히 고유한 쿼리 벡터를 가지므로 각 어텐션 헤드는 여전히 다른"),eh=new h(!1),nh=o(" 행렬을 가집니다."),lh=n(),nn=p("p"),nn.textContent=EM,ph=n(),ln=p("ul"),ln.innerHTML=YM,mh=n(),pn=p("p"),pn.innerHTML=AM,ih=n(),u(mn.$$.fragment),rh=n(),rn=p("p"),rn.innerHTML=SM,oh=n(),on=p("p"),on.innerHTML=PM,ch=n(),cn=p("p"),cn.innerHTML=qM,hh=n(),hn=p("blockquote"),hn.innerHTML=FM,gh=n(),u(gn.$$.fragment),uh=n(),un=p("p"),un.innerHTML=KM,yh=n(),yn=p("p"),yn.innerHTML=DM,Mh=n(),u(Mn.$$.fragment),dh=n(),il=p("p"),this.h()},l(s){const a=zd("svelte-u9bgzb",document.head);C=m(a,"META",{name:!0,content:!0}),a.forEach(t),Cs=l(s),S=m(s,"P",{}),v(S).forEach(t),wn=l(s),y(Gs.$$.fragment,s),cl=l(s),y(Bs.$$.fragment,s),hl=l(s),$s=m(s,"P",{"data-svelte-h":!0}),r($s)!=="svelte-1uhgprk"&&($s.innerHTML=Hg),gl=l(s),zs=m(s,"UL",{"data-svelte-h":!0}),r(zs)!=="svelte-17awaqx"&&(zs.innerHTML=Ng),ul=l(s),Zs=m(s,"P",{"data-svelte-h":!0}),r(Zs)!=="svelte-4mrd1p"&&(Zs.textContent=Lg),yl=l(s),Qs=m(s,"P",{"data-svelte-h":!0}),r(Qs)!=="svelte-1i0b80e"&&(Qs.textContent=Wg),Ml=l(s),Vs=m(s,"OL",{"data-svelte-h":!0}),r(Vs)!=="svelte-vb2oy2"&&(Vs.innerHTML=Eg),dl=l(s),Is=m(s,"P",{"data-svelte-h":!0}),r(Is)!=="svelte-1dzipn2"&&(Is.textContent=Yg),wl=l(s),y(Rs.$$.fragment,s),fl=l(s),Xs=m(s,"P",{"data-svelte-h":!0}),r(Xs)!=="svelte-1w33txn"&&(Xs.innerHTML=Ag),bl=l(s),Hs=m(s,"P",{"data-svelte-h":!0}),r(Hs)!=="svelte-61u3mj"&&(Hs.innerHTML=Sg),vl=l(s),Ns=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(Ns)!=="svelte-jk4don"&&(Ns.innerHTML=Pg),xl=l(s),Ls=m(s,"P",{"data-svelte-h":!0}),r(Ls)!=="svelte-19yrhgr"&&(Ls.textContent=qg),Tl=l(s),Ws=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(Ws)!=="svelte-l6tgdf"&&(Ws.innerHTML=Fg),_l=l(s),Es=m(s,"P",{"data-svelte-h":!0}),r(Es)!=="svelte-xhf9gh"&&(Es.textContent=Kg),jl=l(s),Ys=m(s,"P",{"data-svelte-h":!0}),r(Ys)!=="svelte-1qf84v8"&&(Ys.textContent=Dg),Ul=l(s),As=m(s,"UL",{"data-svelte-h":!0}),r(As)!=="svelte-1d7edas"&&(As.innerHTML=Og),Jl=l(s),Ss=m(s,"P",{"data-svelte-h":!0}),r(Ss)!=="svelte-9bm5dc"&&(Ss.innerHTML=su),kl=l(s),Ps=m(s,"P",{"data-svelte-h":!0}),r(Ps)!=="svelte-zeekl2"&&(Ps.innerHTML=au),Cl=l(s),qs=m(s,"P",{"data-svelte-h":!0}),r(qs)!=="svelte-1k0fvym"&&(qs.innerHTML=tu),Gl=l(s),Fs=m(s,"P",{"data-svelte-h":!0}),r(Fs)!=="svelte-1i4wtwv"&&(Fs.textContent=eu),Bl=l(s),y(Ks.$$.fragment,s),$l=l(s),y(Ds.$$.fragment,s),zl=l(s),Os=m(s,"P",{"data-svelte-h":!0}),r(Os)!=="svelte-1javnyg"&&(Os.innerHTML=nu),Zl=l(s),sa=m(s,"P",{"data-svelte-h":!0}),r(sa)!=="svelte-bv6yfk"&&(sa.innerHTML=lu),Ql=l(s),aa=m(s,"P",{"data-svelte-h":!0}),r(aa)!=="svelte-1dcd6mf"&&(aa.innerHTML=pu),Vl=l(s),ta=m(s,"P",{"data-svelte-h":!0}),r(ta)!=="svelte-8agj96"&&(ta.innerHTML=mu),Il=l(s),y(ea.$$.fragment,s),Rl=l(s),y(na.$$.fragment,s),Xl=l(s),la=m(s,"P",{"data-svelte-h":!0}),r(la)!=="svelte-1g7xu3q"&&(la.innerHTML=iu),Hl=l(s),y(pa.$$.fragment,s),Nl=l(s),ma=m(s,"P",{"data-svelte-h":!0}),r(ma)!=="svelte-148fwck"&&(ma.textContent=ru),Ll=l(s),y(ia.$$.fragment,s),Wl=l(s),ra=m(s,"P",{"data-svelte-h":!0}),r(ra)!=="svelte-lozvjq"&&(ra.innerHTML=ou),El=l(s),y(oa.$$.fragment,s),Yl=l(s),ca=m(s,"P",{"data-svelte-h":!0}),r(ca)!=="svelte-1g7xu3q"&&(ca.innerHTML=cu),Al=l(s),y(ha.$$.fragment,s),Sl=l(s),ga=m(s,"P",{"data-svelte-h":!0}),r(ga)!=="svelte-cdg05o"&&(ga.textContent=hu),Pl=l(s),ua=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(ua)!=="svelte-xj4cvv"&&(ua.innerHTML=gu),ql=l(s),ya=m(s,"P",{"data-svelte-h":!0}),r(ya)!=="svelte-xtpi85"&&(ya.innerHTML=uu),Fl=l(s),Ma=m(s,"P",{"data-svelte-h":!0}),r(Ma)!=="svelte-1i4ktbf"&&(Ma.innerHTML=yu),Kl=l(s),y(da.$$.fragment,s),Dl=l(s),wa=m(s,"P",{"data-svelte-h":!0}),r(wa)!=="svelte-1ivx7d3"&&(wa.textContent=Mu),Ol=l(s),y(fa.$$.fragment,s),sp=l(s),ba=m(s,"P",{"data-svelte-h":!0}),r(ba)!=="svelte-1c3f8vu"&&(ba.innerHTML=du),ap=l(s),y(va.$$.fragment,s),tp=l(s),xa=m(s,"P",{"data-svelte-h":!0}),r(xa)!=="svelte-1ik2e5m"&&(xa.innerHTML=wu),ep=l(s),Ta=m(s,"P",{"data-svelte-h":!0}),r(Ta)!=="svelte-ys7ibg"&&(Ta.innerHTML=fu),np=l(s),_a=m(s,"P",{"data-svelte-h":!0}),r(_a)!=="svelte-7cnkdi"&&(_a.textContent=bu),lp=l(s),ja=m(s,"UL",{"data-svelte-h":!0}),r(ja)!=="svelte-7p6k6g"&&(ja.innerHTML=vu),pp=l(s),G=m(s,"P",{});var Z=v(G);Uh=c(Z,"간단히 말해서, "),fn=m(Z,"EM",{"data-svelte-h":!0}),r(fn)!=="svelte-56r1x3"&&(fn.textContent=xu),Jh=c(Z," 곱셈은,"),mp=g(Z,!1),ip=c(Z,"가 "),bn=m(Z,"EM",{"data-svelte-h":!0}),r(bn)!=="svelte-otpv2k"&&(bn.textContent=Tu),kh=c(Z,","),rp=g(Z,!1),op=c(Z,"가 가중치 행렬,"),cp=g(Z,!1),hp=c(Z,`가 출력인 경우 다음과 같습니다: | |
| `),gp=g(Z,!1),Z.forEach(t),up=l(s),Ua=m(s,"P",{});var Xg=v(Ua);Ch=c(Xg,`위 공식이 다음과 같이 변경됩니다 | |
| `),yp=g(Xg,!1),Xg.forEach(t),Mp=l(s),Ja=m(s,"P",{"data-svelte-h":!0}),r(Ja)!=="svelte-wne6y3"&&(Ja.textContent=_u),dp=l(s),ka=m(s,"P",{"data-svelte-h":!0}),r(ka)!=="svelte-1xrerus"&&(ka.innerHTML=ju),wp=l(s),y(Ca.$$.fragment,s),fp=l(s),Ga=m(s,"P",{"data-svelte-h":!0}),r(Ga)!=="svelte-vj3gc0"&&(Ga.innerHTML=Uu),bp=l(s),y(Ba.$$.fragment,s),vp=l(s),$a=m(s,"P",{"data-svelte-h":!0}),r($a)!=="svelte-2i3x1s"&&($a.textContent=Ju),xp=l(s),y(za.$$.fragment,s),Tp=l(s),Za=m(s,"P",{"data-svelte-h":!0}),r(Za)!=="svelte-1g7xu3q"&&(Za.innerHTML=ku),_p=l(s),y(Qa.$$.fragment,s),jp=l(s),Va=m(s,"P",{"data-svelte-h":!0}),r(Va)!=="svelte-x3u81q"&&(Va.textContent=Cu),Up=l(s),y(Ia.$$.fragment,s),Jp=l(s),Ra=m(s,"P",{"data-svelte-h":!0}),r(Ra)!=="svelte-1g7xu3q"&&(Ra.innerHTML=Gu),kp=l(s),y(Xa.$$.fragment,s),Cp=l(s),Ha=m(s,"P",{"data-svelte-h":!0}),r(Ha)!=="svelte-l1l382"&&(Ha.textContent=Bu),Gp=l(s),Na=m(s,"P",{"data-svelte-h":!0}),r(Na)!=="svelte-19xwq8a"&&(Na.textContent=$u),Bp=l(s),y(La.$$.fragment,s),$p=l(s),y(Wa.$$.fragment,s),zp=l(s),Ea=m(s,"P",{"data-svelte-h":!0}),r(Ea)!=="svelte-eopsme"&&(Ea.innerHTML=zu),Zp=l(s),y(Ya.$$.fragment,s),Qp=l(s),Aa=m(s,"P",{"data-svelte-h":!0}),r(Aa)!=="svelte-1g7xu3q"&&(Aa.innerHTML=Zu),Vp=l(s),y(Sa.$$.fragment,s),Ip=l(s),Pa=m(s,"P",{"data-svelte-h":!0}),r(Pa)!=="svelte-5yuidv"&&(Pa.innerHTML=Qu),Rp=l(s),y(qa.$$.fragment,s),Xp=l(s),Fa=m(s,"P",{"data-svelte-h":!0}),r(Fa)!=="svelte-1g7xu3q"&&(Fa.innerHTML=Vu),Hp=l(s),y(Ka.$$.fragment,s),Np=l(s),Da=m(s,"P",{"data-svelte-h":!0}),r(Da)!=="svelte-1fc4d0d"&&(Da.textContent=Iu),Lp=l(s),Oa=m(s,"P",{"data-svelte-h":!0}),r(Oa)!=="svelte-1rvqywl"&&(Oa.innerHTML=Ru),Wp=l(s),F=m(s,"P",{});var Dn=v(F);Gh=c(Dn,"또한 4비트 양자화에 사용된 더 공격적인 양자화 방법으로 인해 추론 시"),Ep=g(Dn,!1),Yp=c(Dn,"와"),Ap=g(Dn,!1),Sp=c(Dn," 과정이 더 오래 걸리므로 여기서도 8비트 양자화와 비교하여 추론 속도가 약간 느려졌음을 유의하세요."),Dn.forEach(t),Pp=l(s),y(st.$$.fragment,s),qp=l(s),y(at.$$.fragment,s),Fp=l(s),tt=m(s,"P",{"data-svelte-h":!0}),r(tt)!=="svelte-hitbs3"&&(tt.textContent=Xu),Kp=l(s),et=m(s,"P",{"data-svelte-h":!0}),r(et)!=="svelte-1s3z2u"&&(et.textContent=Hu),Dp=l(s),nt=m(s,"P",{"data-svelte-h":!0}),r(nt)!=="svelte-xcxpvh"&&(nt.innerHTML=Nu),Op=l(s),lt=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(lt)!=="svelte-j8v2v7"&&(lt.innerHTML=Lu),sm=l(s),pt=m(s,"P",{"data-svelte-h":!0}),r(pt)!=="svelte-ihvg88"&&(pt.textContent=Wu),am=l(s),mt=m(s,"P",{"data-svelte-h":!0}),r(mt)!=="svelte-ebsu1l"&&(mt.innerHTML=Eu),tm=l(s),y(it.$$.fragment,s),em=l(s),rt=m(s,"P",{"data-svelte-h":!0}),r(rt)!=="svelte-tdy7kc"&&(rt.textContent=Yu),nm=l(s),K=m(s,"P",{});var On=v(K);Bh=c(On,`셀프 어텐션 레이어는 입력 토큰 간의 문맥적 관계를 이해할 수 있게 해 주기 때문에 대규모 언어 모델의 핵심 요소입니다. | |
| 하지만 셀프 어텐션 레이어의 최대 GPU 메모리 소비는 입력 토큰의 수(이하`),lm=g(On,!1),pm=c(On,"으로 표기)와 함께 계산 및 메모리 복잡성이 "),vn=m(On,"EM",{"data-svelte-h":!0}),r(vn)!=="svelte-njfktt"&&(vn.textContent=Au),$h=c(On,"으로 증가합니다. 입력 시퀀스가 짧은 경우(최대 1000개)에는 크게 눈에 띄지 않지만, 더 긴 입력 시퀀스(약 16000개)에서는 심각한 문제가 됩니다."),On.forEach(t),mm=l(s),T=m(s,"P",{});var j=v(T);zh=c(j,"자세히 한 번 들여다 봅시다. 길이"),im=g(j,!1),rm=c(j,"의 입력"),om=g(j,!1),cm=c(j,"에 대한 셀프 어텐션 레이어의 출력"),hm=g(j,!1),gm=c(j,`을 계산하는 공식은 다음과 같습니다: | |
| `),um=g(j,!1),ym=l(j),Mm=g(j,!1),dm=c(j,"는 어텐션 레이어의 입력 시퀀스입니다. 프로젝션"),wm=g(j,!1),fm=c(j,"와"),bm=g(j,!1),vm=c(j,"는 각각"),xm=g(j,!1),Tm=c(j,"개의 벡터로 구성되며, 그 결과"),_m=g(j,!1),jm=c(j,"의 크기는"),Um=g(j,!1),Jm=c(j,"가 됩니다."),j.forEach(t),km=l(s),U=m(s,"P",{});var I=v(U);Zh=c(I,"대규모 언어 모델은 일반적으로 여러 개의 어텐션 헤드를 가지고 있어 여러 개의 셀프 어텐션 계산을 병렬로 수행합니다. 대규모 언어 모델이 40개의 어텐션 헤드를 가지고 bfloat16 정밀도로 실행된다고 가정하면,"),Cm=g(I,!1),Gm=c(I," 행렬을 저장하는 데 필요한 메모리를"),Bm=g(I,!1),$m=c(I," 바이트로 계산할 수 있습니다."),zm=g(I,!1),Zm=c(I,"일 때는 약 50MB의 VRAM만 필요하지만,"),Qm=g(I,!1),Vm=c(I,"일 때는 19GB의 VRAM이 필요하며,"),Im=g(I,!1),Rm=c(I,"일 때는"),Xm=g(I,!1),Hm=c(I," 행렬을 저장하기 위해 거의 1TB의 VRAM이 필요합니다."),I.forEach(t),Nm=l(s),ot=m(s,"P",{"data-svelte-h":!0}),r(ot)!=="svelte-15bbf0c"&&(ot.textContent=Su),Lm=l(s),ct=m(s,"P",{"data-svelte-h":!0}),r(ct)!=="svelte-1qihjcy"&&(ct.textContent=Pu),Wm=l(s),W=m(s,"P",{});var _s=v(W);Qh=c(_s,"어떻게 하면 큰 입력 길이에 대한 과도한 메모리 요구를 없앨 수 있을까요?"),Em=g(_s,!1),Ym=c(_s," 행렬을 제거하는 새로운 셀프 어텐션 메커니즘을 계산하는 방법이 필요합니다. "),cs=m(_s,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(cs)!=="svelte-1h13bsr"&&(cs.textContent=qu),Vh=c(_s,"은 바로 이러한 새로운 알고리즘을 개발하였고, 그것이 "),xn=m(_s,"STRONG",{"data-svelte-h":!0}),r(xn)!=="svelte-12grn2z"&&(xn.textContent=Fu),Ih=c(_s,"입니다."),_s.forEach(t),Am=l(s),ms=m(s,"P",{});var rl=v(ms);Rh=c(rl,"간단히 말해, 플래시 어텐션은"),Sm=g(rl,!1),Pm=c(rl,`) 계산을 분할하는데, 여러 번의 소프트맥스 계산을 반복하면서 작은 청크 단위로 출력을 계산합니다: | |
| `),qm=g(rl,!1),rl.forEach(t),Fm=l(s),Q=m(s,"P",{});var es=v(Q);Xh=c(es,"여기서"),Km=g(es,!1),Dm=c(es,"와"),Om=g(es,!1),si=c(es,"는 각"),ai=g(es,!1),ti=c(es,"와"),ei=g(es,!1),ni=c(es,"에 대해 계산되는 소프트맥스 정규화 통계량입니다."),es.forEach(t),li=l(s),ht=m(s,"P",{"data-svelte-h":!0}),r(ht)!=="svelte-1qa7t4q"&&(ht.innerHTML=Ku),pi=l(s),gt=m(s,"P",{"data-svelte-h":!0}),r(gt)!=="svelte-18j1cqo"&&(gt.textContent=Du),mi=l(s),Tn=m(s,"BLOCKQUOTE",{});var OM=v(Tn);is=m(OM,"P",{});var sl=v(is);Hh=c(sl,"소프트맥스 정규화 통계량과 몇 가지 스마트한 수학적 방법을 사용함으로써, 플래시 어텐션은 기본 셀프 어텐션 레이어와 "),_n=m(sl,"STRONG",{"data-svelte-h":!0}),r(_n)!=="svelte-foaoix"&&(_n.textContent=Ou),Nh=c(sl," 출력을 제공하고 메모리 비용은"),ii=g(sl,!1),ri=c(sl,"에 따라 선형적으로만 증가합니다."),sl.forEach(t),OM.forEach(t),oi=l(s),ut=m(s,"P",{"data-svelte-h":!0}),r(ut)!=="svelte-k2g6xh"&&(ut.innerHTML=sy),ci=l(s),yt=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(yt)!=="svelte-1bdblm4"&&(yt.innerHTML=ay),hi=l(s),D=m(s,"P",{});var al=v(D);Lh=c(al,"본질적으로, 플래시 어텐션의 모든 중간 단계의 쓰기 및 읽기 작업은 느린 VRAM 메모리에 접근하지 않고 빠른 "),jn=m(al,"EM",{"data-svelte-h":!0}),r(jn)!=="svelte-mrq12t"&&(jn.textContent=ty),Wh=c(al," SRAM 메모리를 사용하여 출력 벡터"),gi=g(al,!1),ui=c(al,"를 계산할 수 있도록 합니다."),al.forEach(t),yi=l(s),Mt=m(s,"P",{"data-svelte-h":!0}),r(Mt)!=="svelte-1aamg3g"&&(Mt.innerHTML=ey),Mi=l(s),dt=m(s,"P",{"data-svelte-h":!0}),r(dt)!=="svelte-1ad227p"&&(dt.textContent=ny),di=l(s),wt=m(s,"P",{"data-svelte-h":!0}),r(wt)!=="svelte-nflzdn"&&(wt.innerHTML=ly),wi=l(s),y(ft.$$.fragment,s),fi=l(s),bt=m(s,"P",{"data-svelte-h":!0}),r(bt)!=="svelte-1l448ht"&&(bt.innerHTML=py),bi=l(s),y(vt.$$.fragment,s),vi=l(s),xt=m(s,"P",{"data-svelte-h":!0}),r(xt)!=="svelte-12s9319"&&(xt.textContent=my),xi=l(s),y(Tt.$$.fragment,s),Ti=l(s),_t=m(s,"P",{"data-svelte-h":!0}),r(_t)!=="svelte-1f1qwtg"&&(_t.innerHTML=iy),_i=l(s),y(jt.$$.fragment,s),ji=l(s),Ut=m(s,"P",{"data-svelte-h":!0}),r(Ut)!=="svelte-1g7xu3q"&&(Ut.innerHTML=ry),Ui=l(s),y(Jt.$$.fragment,s),Ji=l(s),kt=m(s,"P",{"data-svelte-h":!0}),r(kt)!=="svelte-2jpbwp"&&(kt.textContent=oy),ki=l(s),Ct=m(s,"P",{"data-svelte-h":!0}),r(Ct)!=="svelte-d8lgwc"&&(Ct.innerHTML=cy),Ci=l(s),Gt=m(s,"P",{"data-svelte-h":!0}),r(Gt)!=="svelte-1039wow"&&(Gt.textContent=hy),Gi=l(s),y(Bt.$$.fragment,s),Bi=l(s),$t=m(s,"P",{"data-svelte-h":!0}),r($t)!=="svelte-1g7xu3q"&&($t.innerHTML=gy),$i=l(s),y(zt.$$.fragment,s),zi=l(s),Zt=m(s,"P",{"data-svelte-h":!0}),r(Zt)!=="svelte-emkfnp"&&(Zt.textContent=uy),Zi=l(s),Qt=m(s,"P",{"data-svelte-h":!0}),r(Qt)!=="svelte-1z0sf71"&&(Qt.innerHTML=yy),Qi=l(s),y(Vt.$$.fragment,s),Vi=l(s),It=m(s,"P",{"data-svelte-h":!0}),r(It)!=="svelte-1lt19yj"&&(It.innerHTML=My),Ii=l(s),y(Rt.$$.fragment,s),Ri=l(s),Xt=m(s,"P",{"data-svelte-h":!0}),r(Xt)!=="svelte-el5b6l"&&(Xt.textContent=dy),Xi=l(s),y(Ht.$$.fragment,s),Hi=l(s),Nt=m(s,"P",{"data-svelte-h":!0}),r(Nt)!=="svelte-1g7xu3q"&&(Nt.innerHTML=wy),Ni=l(s),y(Lt.$$.fragment,s),Li=l(s),Wt=m(s,"P",{"data-svelte-h":!0}),r(Wt)!=="svelte-155cwfd"&&(Wt.textContent=fy),Wi=l(s),Et=m(s,"P",{"data-svelte-h":!0}),r(Et)!=="svelte-gti8zv"&&(Et.textContent=by),Ei=l(s),y(Yt.$$.fragment,s),Yi=l(s),At=m(s,"P",{"data-svelte-h":!0}),r(At)!=="svelte-1g7xu3q"&&(At.innerHTML=vy),Ai=l(s),y(St.$$.fragment,s),Si=l(s),Pt=m(s,"P",{"data-svelte-h":!0}),r(Pt)!=="svelte-1btrdyk"&&(Pt.textContent=xy),Pi=l(s),qt=m(s,"P",{"data-svelte-h":!0}),r(qt)!=="svelte-1mtjqhr"&&(qt.textContent=Ty),qi=l(s),y(Ft.$$.fragment,s),Fi=l(s),Kt=m(s,"P",{"data-svelte-h":!0}),r(Kt)!=="svelte-14m9z3o"&&(Kt.innerHTML=_y),Ki=l(s),y(Dt.$$.fragment,s),Di=l(s),Ot=m(s,"P",{"data-svelte-h":!0}),r(Ot)!=="svelte-1p8911l"&&(Ot.textContent=jy),Oi=l(s),se=m(s,"UL",{"data-svelte-h":!0}),r(se)!=="svelte-1vugqp4"&&(se.innerHTML=Uy),sr=l(s),ae=m(s,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-1sxdvch"&&(ae.textContent=Jy),ar=l(s),te=m(s,"UL",{"data-svelte-h":!0}),r(te)!=="svelte-og1sh4"&&(te.innerHTML=ky),tr=l(s),ee=m(s,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-ul92jf"&&(ee.innerHTML=Cy),er=l(s),ne=m(s,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-z2soo2"&&(ne.textContent=Gy),nr=l(s),le=m(s,"UL",{"data-svelte-h":!0}),r(le)!=="svelte-ne9i5q"&&(le.innerHTML=By),lr=l(s),pe=m(s,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-g7p3cd"&&(pe.textContent=$y),pr=l(s),y(me.$$.fragment,s),mr=l(s),O=m(s,"P",{});var tl=v(O);Eh=c(tl,`셀프 어텐션은 각 토큰을 서로의 토큰과 연관시킵니다. | |
| 예를 들어, 텍스트 입력 시퀀스 `),Un=m(tl,"EM",{"data-svelte-h":!0}),r(Un)!=="svelte-13ogmf8"&&(Un.textContent=zy),Yh=c(tl,"의"),ir=g(tl,!1),rr=c(tl," 행렬은 다음과 같을 수 있습니다:"),tl.forEach(t),or=l(s),ie=m(s,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-7ssrcl"&&(ie.innerHTML=Zy),cr=l(s),re=m(s,"P",{"data-svelte-h":!0}),r(re)!=="svelte-12zykcb"&&(re.innerHTML=Qy),hr=l(s),V=m(s,"P",{});var ns=v(V);Ah=c(ns,"셀프 어텐션 기반 대규모 언어 모델이 위치 임베딩이 없는 경우 텍스트 입력의 위치를 이해하는 데 큰 어려움을 겪을 것입니다. 이는"),gr=g(ns,!1),ur=c(ns,"에 의해 계산된 확률 점수가 상대적 위치 거리에 상관없이 각 단어 토큰을 다른 모든 단어 토큰과"),yr=g(ns,!1),Mr=c(ns," 계산으로 연관시키기 때문입니다. 따라서 위치 임베딩이 없는 대규모 언어 모델은 각 토큰이 다른 모든 토큰과 동일한 거리에 있는 것으로 나타나기 때문에, "),Jn=m(ns,"EM",{"data-svelte-h":!0}),r(Jn)!=="svelte-1u1601v"&&(Jn.textContent=Vy),Sh=c(ns,"와 "),kn=m(ns,"EM",{"data-svelte-h":!0}),r(kn)!=="svelte-16pe0y3"&&(kn.textContent=Iy),Ph=c(ns,"를 구분하는 것이 매우 어렵습니다."),ns.forEach(t),dr=l(s),oe=m(s,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1ikynqa"&&(oe.innerHTML=Ry),wr=l(s),B=m(s,"P",{});var N=v(B);hs=m(N,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(hs)!=="svelte-507xi2"&&(hs.innerHTML=Xy),qh=c(N," 논문의 저자들은 사인 함수 기반의 위치 임베딩"),fr=g(N,!1),br=c(N,"을 도입했습니다. 각 벡터"),vr=g(N,!1),xr=c(N,"는 위치"),Tr=g(N,!1),_r=c(N,"의 사인 함수로 계산됩니다. 위치 인코딩은 입력 시퀀스 벡터에 단순히 더해져"),jr=g(N,!1),Ur=c(N," ="),Jr=g(N,!1),kr=c(N," 모델이 문장 순서를 더 잘 학습할 수 있도록 합니다."),N.forEach(t),Cr=l(s),ss=m(s,"P",{});var el=v(ss);Fh=c(el,"고정된 위치 임베딩 대신 "),gs=m(el,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(gs)!=="svelte-1j8obl2"&&(gs.textContent=Hy),Kh=c(el,"과 같은 다른 연구자들은 학습된 위치 인코딩을 사용했습니다. 이 경우 위치 임베딩"),Gr=g(el,!1),Br=c(el,"은 학습 중에 사용됩니다."),el.forEach(t),$r=l(s),ce=m(s,"P",{"data-svelte-h":!0}),r(ce)!=="svelte-18wihn3"&&(ce.textContent=Ny),zr=l(s),us=m(s,"OL",{});var fh=v(us);P=m(fh,"LI",{});var js=v(P);Dh=c(js,"사인 함수와 학습된 위치 임베딩은 모두 절대 위치 임베딩으로, 각 위치 ID"),Zr=g(js,!1),Qr=c(js,"에 대해 고유한 임베딩을 인코딩합니다. "),ys=m(js,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(ys)!=="svelte-1elqrnk"&&(ys.textContent=Ly),Oh=c(js," 및 "),Ms=m(js,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(Ms)!=="svelte-sksjon"&&(Ms.textContent=Wy),sg=c(js,"의 연구에 따르면, 절대 위치 임베딩은 긴 텍스트 입력에 대해 대규모 언어 모델 성능이 저하됩니다. 긴 텍스트 입력의 경우, 모델이 절대 위치 대신 입력 토큰 간의 상대적 위치 거리를 학습하는 것이 유리합니다."),js.forEach(t),ag=l(fh),he=m(fh,"LI",{});var bh=v(he);tg=c(bh,"학습된 위치 임베딩을 사용할 때, 대규모 언어 모델은 고정된 입력 길이"),Vr=g(bh,!1),Ir=c(bh,"으로 학습되어야 하므로, 학습된 입력 길이보다 더 긴 입력 길이에 대해 추론하는 것이 어렵습니다."),bh.forEach(t),fh.forEach(t),Rr=l(s),ge=m(s,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-1ayjhxe"&&(ge.textContent=Ey),Xr=l(s),ue=m(s,"UL",{"data-svelte-h":!0}),r(ue)!=="svelte-1q2i0ic"&&(ue.innerHTML=Yy),Hr=l(s),q=m(s,"P",{});var dn=v(q);Cn=m(dn,"EM",{"data-svelte-h":!0}),r(Cn)!=="svelte-1koqbni"&&(Cn.textContent=Ay),eg=c(dn,"와 "),Gn=m(dn,"EM",{"data-svelte-h":!0}),r(Gn)!=="svelte-4g6i8t"&&(Gn.textContent=Sy),ng=c(dn,"는 모두 셀프 어텐션 알고리즘 내에서 직접적으로 문장 순서를 모델에게 알려주는 것이 최선이라고 주장합니다. 이는 단어 토큰이 서로 관계를 맺는 곳이기 때문입니다. 구체적으로, 문장 순서를"),Nr=g(dn,!1),Lr=c(dn," 계산을 수정하는 방식으로 알려주어야 한다는 것입니다."),dn.forEach(t),Wr=l(s),$=m(s,"P",{});var L=v($);lg=c(L,"너무 많은 세부 사항을 다루지 않고, "),Bn=m(L,"EM",{"data-svelte-h":!0}),r(Bn)!=="svelte-1koqbni"&&(Bn.textContent=Py),pg=c(L,"는 위치 정보를 쿼리-키 쌍에 인코딩할 수 있다고 지적합니다. 예를 들어, 각 벡터"),Er=g(L,!1),Yr=c(L,"와"),Ar=g(L,!1),Sr=c(L,"를 각각"),Pr=g(L,!1),qr=c(L,"와"),Fr=g(L,!1),Kr=c(L,`의 각도로 회전시킴으로써 다음과 같이 표현할 수 있습니다: | |
| `),Dr=g(L,!1),L.forEach(t),Or=l(s),E=m(s,"P",{});var Us=v(E);mg=c(Us,"여기서"),so=g(Us,!1),ao=c(Us,"는 회전 행렬을 나타냅니다."),to=g(Us,!1),eo=c(Us,"는 훈련 중에 "),$n=m(Us,"EM",{"data-svelte-h":!0}),r($n)!=="svelte-sdd36q"&&($n.textContent=qy),ig=c(Us,", 대신 학습 중 최대 입력 시퀀스 길이에 따라 사전 정의된 값으로 설정됩니다."),Us.forEach(t),no=l(s),zn=m(s,"BLOCKQUOTE",{});var s0=v(zn);z=m(s0,"P",{});var R=v(z);rg=c(R,"이렇게 함으로써"),lo=g(R,!1),po=c(R,"와"),mo=g(R,!1),io=c(R," 간의 확률 점수는"),ro=g(R,!1),oo=c(R,"인 경우에만 영향을 받으며, 각 벡터의 특정 위치"),co=g(R,!1),ho=c(R,"와"),go=g(R,!1),uo=c(R,"와는 상관없이 오직 상대적 거리"),yo=g(R,!1),Mo=c(R,"에만 의존하게 됩니다."),R.forEach(t),s0.forEach(t),wo=l(s),ye=m(s,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-1jt8fgk"&&(ye.innerHTML=Fy),fo=l(s),Me=m(s,"UL",{"data-svelte-h":!0}),r(Me)!=="svelte-1ggqrue"&&(Me.innerHTML=Ky),bo=l(s),Y=m(s,"P",{});var Js=v(Y);og=c(Js,"대안으로, "),Zn=m(Js,"EM",{"data-svelte-h":!0}),r(Zn)!=="svelte-4g6i8t"&&(Zn.textContent=Dy),cg=c(Js,"는 훨씬 더 간단한 상대적 위치 인코딩 방식을 제안합니다. 입력 토큰 간의 상대적 거리를 음수인 정수로서 사전 정의된 값 "),Qn=m(Js,"CODE",{"data-svelte-h":!0}),r(Qn)!=="svelte-1gskrin"&&(Qn.textContent=Oy),hg=c(Js,"으로 스케일링하여"),vo=g(Js,!1),xo=c(Js," 행렬의 각 쿼리-키 항목에 소프트맥스 계산 직전에 추가합니다."),Js.forEach(t),To=l(s),de=m(s,"P",{"data-svelte-h":!0}),r(de)!=="svelte-1sb0gvf"&&(de.innerHTML=sM),_o=l(s),we=m(s,"P",{"data-svelte-h":!0}),r(we)!=="svelte-1rfd0z4"&&(we.innerHTML=aM),jo=l(s),fe=m(s,"P",{"data-svelte-h":!0}),r(fe)!=="svelte-sqjh59"&&(fe.innerHTML=tM),Uo=l(s),be=m(s,"UL",{"data-svelte-h":!0}),r(be)!=="svelte-l3k8fx"&&(be.innerHTML=eM),Jo=l(s),x=m(s,"P",{});var _=v(x);Vn=m(_,"EM",{"data-svelte-h":!0}),r(Vn)!=="svelte-1koqbni"&&(Vn.textContent=nM),gg=c(_,"와 "),In=m(_,"EM",{"data-svelte-h":!0}),r(In)!=="svelte-4g6i8t"&&(In.textContent=lM),ug=c(_," 위치 인코딩은 모두 학습 중에 보지 못한 입력 길이에 대해 확장할 수 있으며, "),Rn=m(_,"EM",{"data-svelte-h":!0}),r(Rn)!=="svelte-4g6i8t"&&(Rn.textContent=pM),yg=c(_,"가 "),Xn=m(_,"EM",{"data-svelte-h":!0}),r(Xn)!=="svelte-1koqbni"&&(Xn.textContent=mM),Mg=c(_,"보다 더 잘 확장되는 것으로 나타났습니다. "),Hn=m(_,"EM",{"data-svelte-h":!0}),r(Hn)!=="svelte-4g6i8t"&&(Hn.textContent=iM),dg=c(_,"의 경우, 하삼각 위치 행렬의 값을 입력 시퀀스 길이에 맞추어 증가시키기만 하면 됩니다. "),Nn=m(_,"EM",{"data-svelte-h":!0}),r(Nn)!=="svelte-1koqbni"&&(Nn.textContent=rM),wg=c(_,"의 경우, 학습 중에 사용된 동일한"),ko=g(_,!1),Co=c(_,"를 유지하면 학습 중에 보지 못한 매우 긴 텍스트 입력을 전달할 때 성능이 저하됩니다(참고: "),ds=m(_,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(ds)!=="svelte-1g4vyjx"&&(ds.textContent=oM),fg=c(_,"). 그러나 커뮤니티는"),Go=g(_,!1),Bo=c(_,"를 조정하는 몇 가지 효과적인 트릭을 찾아냈으며, 이를 통해 "),Ln=m(_,"EM",{"data-svelte-h":!0}),r(Ln)!=="svelte-1koqbni"&&(Ln.textContent=cM),bg=c(_," 위치 임베딩이 확장된 텍스트 입력 시퀀스에서도 잘 작동할 수 있게 되었습니다(참고: "),ws=m(_,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(ws)!=="svelte-ax8fr8"&&(ws.textContent=hM),vg=c(_,")."),_.forEach(t),$o=l(s),fs=m(s,"BLOCKQUOTE",{});var vh=v(fs);Wn=m(vh,"P",{"data-svelte-h":!0}),r(Wn)!=="svelte-1c5m37j"&&(Wn.innerHTML=gM),xg=l(vh),rs=m(vh,"UL",{});var nl=v(rs);ve=m(nl,"LI",{});var xh=v(ve);Tg=c(xh,"텍스트 입력에 대한 위치 단서는 셀프 어텐션 레이어의"),zo=g(xh,!1),Zo=c(xh," 행렬에 직접 제공되어야 합니다."),xh.forEach(t),_g=l(nl),En=m(nl,"LI",{"data-svelte-h":!0}),r(En)!=="svelte-a047ad"&&(En.innerHTML=uM),jg=l(nl),Yn=m(nl,"LI",{"data-svelte-h":!0}),r(Yn)!=="svelte-zcm9pe"&&(Yn.textContent=yM),nl.forEach(t),vh.forEach(t),Qo=l(s),A=m(s,"P",{});var ks=v(A);Ug=c(ks,"결론적으로, 큰 텍스트 입력을 처리해야 하는 작업에 배포될 예정인 대규모 언어 모델은 RoPE와 ALiBi와 같은 상대적 위치 임베딩으로 훈련하는 것이 더 좋습니다. 또한 RoPE와 ALiBi를 사용하여 훈련된 대규모 언어 모델이 고정 길이"),Vo=g(ks,!1),Io=c(ks,"에서만 훈련되었더라도 위치 임베딩을 외삽하여"),Ro=g(ks,!1),Xo=c(ks,"보다 훨씬 큰 텍스트 입력"),Ho=g(ks,!1),No=c(ks,"로 실습에서 사용할 수 있음을 유의하세요."),ks.forEach(t),Lo=l(s),y(xe.$$.fragment,s),Wo=l(s),Te=m(s,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-5ujeer"&&(Te.textContent=MM),Eo=l(s),_e=m(s,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-ix4ma1"&&(_e.innerHTML=dM),Yo=l(s),je=m(s,"P",{"data-svelte-h":!0}),r(je)!=="svelte-1m4m1r7"&&(je.innerHTML=wM),Ao=l(s),y(Ue.$$.fragment,s),So=l(s),Je=m(s,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-1g7xu3q"&&(Je.innerHTML=fM),Po=l(s),y(ke.$$.fragment,s),qo=l(s),Ce=m(s,"P",{"data-svelte-h":!0}),r(Ce)!=="svelte-1w6wb9i"&&(Ce.textContent=bM),Fo=l(s),Ge=m(s,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-1af54cr"&&(Ge.innerHTML=vM),Ko=l(s),J=m(s,"P",{});var X=v(J);Jg=c(X,"결과적으로, 토큰은 "),An=m(X,"EM",{"data-svelte-h":!0}),r(An)!=="svelte-8fmw0q"&&(An.textContent=xM),kg=c(X," 이전 토큰에 의존하지 않습니다. 더 구체적으로는"),Do=g(X,!1),Oo=c(X," 벡터가"),sc=g(X,!1),ac=c(X,"인 경우 어떤 키, 값 벡터"),tc=g(X,!1),ec=c(X,"와도 연관되지 않습니다. 대신"),nc=g(X,!1),lc=c(X,"는 이전의 키-값 벡터"),pc=g(X,!1),mc=c(X,"에만 주의를 기울입니다. 불필요한 계산을 줄이기 위해 각 층의 키-값 벡터를 모든 이전 시간 단계에 대해 캐시할 수 있습니다."),X.forEach(t),ic=l(s),Be=m(s,"P",{"data-svelte-h":!0}),r(Be)!=="svelte-w9g1vq"&&(Be.innerHTML=TM),rc=l(s),y($e.$$.fragment,s),oc=l(s),ze=m(s,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-1g7xu3q"&&(ze.innerHTML=_M),cc=l(s),y(Ze.$$.fragment,s),hc=l(s),Qe=m(s,"P",{"data-svelte-h":!0}),r(Qe)!=="svelte-x0ag6y"&&(Qe.innerHTML=jM),gc=l(s),Sn=m(s,"BLOCKQUOTE",{});var a0=v(Sn);H=m(a0,"P",{});var ls=v(H);Cg=c(ls,"키-값 캐시를 사용하면"),uc=g(ls,!1),yc=c(ls,"가 본질적으로"),Mc=g(ls,!1),dc=c(ls,"로 줄어드는데, 여기서"),wc=g(ls,!1),fc=c(ls,"는 현재 전달된 입력 토큰의 쿼리 프로젝션으로, "),Pn=m(ls,"EM",{"data-svelte-h":!0}),r(Pn)!=="svelte-dxdfls"&&(Pn.textContent=UM),Gg=c(ls," 단일 벡터입니다."),ls.forEach(t),a0.forEach(t),bc=l(s),Ve=m(s,"P",{"data-svelte-h":!0}),r(Ve)!=="svelte-1i0rf59"&&(Ve.textContent=JM),vc=l(s),bs=m(s,"UL",{});var Th=v(bs);Ie=m(Th,"LI",{});var _h=v(Ie);Bg=c(_h,"전체"),xc=g(_h,!1),Tc=c(_h," 행렬을 계산하는 것과 비교하여 계산 효율성이 크게 향상됩니다. 이는 추론 속도의 증가로 이어집니다."),_h.forEach(t),$g=l(Th),qn=m(Th,"LI",{"data-svelte-h":!0}),r(qn)!=="svelte-1jrk0qi"&&(qn.textContent=kM),Th.forEach(t),_c=l(s),Re=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(Re)!=="svelte-tovu0m"&&(Re.innerHTML=CM),jc=l(s),y(vs.$$.fragment,s),Uc=l(s),y(Xe.$$.fragment,s),Jc=l(s),He=m(s,"P",{"data-svelte-h":!0}),r(He)!=="svelte-e9kyky"&&(He.textContent=GM),kc=l(s),y(Ne.$$.fragment,s),Cc=l(s),Le=m(s,"P",{"data-svelte-h":!0}),r(Le)!=="svelte-1agw5ni"&&(Le.textContent=BM),Gc=l(s),We=m(s,"OL",{"data-svelte-h":!0}),r(We)!=="svelte-xc5z68"&&(We.innerHTML=$M),Bc=l(s),Ee=m(s,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-1cyje6q"&&(Ee.textContent=zM),$c=l(s),Ye=m(s,"OL",{"data-svelte-h":!0}),r(Ye)!=="svelte-1a68fo7"&&(Ye.innerHTML=ZM),zc=l(s),Ae=m(s,"P",{"data-svelte-h":!0}),r(Ae)!=="svelte-10avshz"&&(Ae.innerHTML=QM),Zc=l(s),y(Se.$$.fragment,s),Qc=l(s),Pe=m(s,"P",{"data-svelte-h":!0}),r(Pe)!=="svelte-1g7xu3q"&&(Pe.innerHTML=VM),Vc=l(s),y(qe.$$.fragment,s),Ic=l(s),as=m(s,"P",{});var ll=v(as);zg=c(ll,"훌륭합니다. 어텐션 층의 동일한 키와 값을 다시 계산하는 데 추가 시간이 소요되지 않습니다! 그러나 한 가지 문제가 있습니다."),Rc=g(ll,!1),Xc=c(ll," 행렬에 필요한 최대 메모리는 크게 줄어들지만, 긴 입력 시퀀스나 다회차 채팅의 경우 키-값 캐시를 메모리에 보관하는 것이 매우 메모리 집약적이 될 수 있습니다. 키-값 캐시는 모든 자기 어텐션 층과 모든 어텐션 헤드에 대해 이전 입력 벡터"),Hc=g(ll,!1),Nc=c(ll,"의 키-값 벡터를 저장해야 한다는 점을 기억하세요."),ll.forEach(t),Lc=l(s),Fe=m(s,"P",{"data-svelte-h":!0}),r(Fe)!=="svelte-pfu381"&&(Fe.innerHTML=IM),Wc=l(s),y(Ke.$$.fragment,s),Ec=l(s),De=m(s,"P",{"data-svelte-h":!0}),r(De)!=="svelte-1g7xu3q"&&(De.innerHTML=RM),Yc=l(s),y(Oe.$$.fragment,s),Ac=l(s),sn=m(s,"P",{"data-svelte-h":!0}),r(sn)!=="svelte-4r3m52"&&(sn.innerHTML=XM),Sc=l(s),y(an.$$.fragment,s),Pc=l(s),tn=m(s,"P",{"data-svelte-h":!0}),r(tn)!=="svelte-1dhndr9"&&(tn.innerHTML=HM),qc=l(s),Fn=m(s,"BLOCKQUOTE",{});var t0=v(Fn);os=m(t0,"P",{});var pl=v(os);Zg=c(pl,"단일 헤드-값 프로젝션 가중치를 사용함으로써, 키-값 벡터"),Fc=g(pl,!1),Kc=c(pl,"는 모든 어텐션 헤드에서 동일해야 하며, 이는 캐시에 "),Kn=m(pl,"CODE",{"data-svelte-h":!0}),r(Kn)!=="svelte-6j0g1x"&&(Kn.textContent=NM),Qg=c(pl," 개 대신 하나의 키-값 프로젝션 쌍만 저장하면 된다는 것을 의미합니다."),pl.forEach(t),t0.forEach(t),Dc=l(s),en=m(s,"P",{"data-svelte-h":!0}),r(en)!=="svelte-jyz326"&&(en.textContent=LM),Oc=l(s),ts=m(s,"P",{});var ml=v(ts);Vg=c(ml,`메모리 절감 외에도, MQA는 계산 효율성도 향상시킵니다. 다음과 같이 설명합니다. | |
| 자기회귀 디코딩에서는 큰 키-값 벡터를 다시 로드하고, 현재 키-값 벡터 쌍과 연결한 후`),sh=g(ml,!1),ah=c(ml," 계산에 매 단계마다 입력해야 합니다. 자기회귀 디코딩의 경우, 지속적인 재로드에 필요한 메모리 대역폭이 심각한 시간 병목 현상을 가져올 수 있습니다. 키-값 벡터의 크기를 줄이면 접근해야 하는 메모리 양이 줄어들어 메모리 대역폭 병목 현상이 감소합니다. 자세한 내용은 "),xs=m(ml,"A",{href:!0,rel:!0,"data-svelte-h":!0}),r(xs)!=="svelte-sd6uo8"&&(xs.textContent=WM),Ig=c(ml,"을 참조하세요."),ml.forEach(t),th=l(s),Ts=m(s,"P",{});var jh=v(Ts);Rg=c(jh,"여기서 이해해야 할 중요한 부분은 키-값 어텐션 헤드 수를 1로 줄이는 것이 키-값 캐시를 사용할 때만 의미가 있다는 것입니다. 키-값 캐시 없이 단일 포워드 패스에 대한 모델의 최대 메모리 소비는 변경되지 않으며, 각 어텐션 헤드는 여전히 고유한 쿼리 벡터를 가지므로 각 어텐션 헤드는 여전히 다른"),eh=g(jh,!1),nh=c(jh," 행렬을 가집니다."),jh.forEach(t),lh=l(s),nn=m(s,"P",{"data-svelte-h":!0}),r(nn)!=="svelte-8f0m9f"&&(nn.textContent=EM),ph=l(s),ln=m(s,"UL",{"data-svelte-h":!0}),r(ln)!=="svelte-c4p3y"&&(ln.innerHTML=YM),mh=l(s),pn=m(s,"P",{"data-svelte-h":!0}),r(pn)!=="svelte-1b78rx6"&&(pn.innerHTML=AM),ih=l(s),y(mn.$$.fragment,s),rh=l(s),rn=m(s,"P",{"data-svelte-h":!0}),r(rn)!=="svelte-hqor9t"&&(rn.innerHTML=SM),oh=l(s),on=m(s,"P",{"data-svelte-h":!0}),r(on)!=="svelte-4lic8p"&&(on.innerHTML=PM),ch=l(s),cn=m(s,"P",{"data-svelte-h":!0}),r(cn)!=="svelte-14prt5z"&&(cn.innerHTML=qM),hh=l(s),hn=m(s,"BLOCKQUOTE",{"data-svelte-h":!0}),r(hn)!=="svelte-xsy2p8"&&(hn.innerHTML=FM),gh=l(s),y(gn.$$.fragment,s),uh=l(s),un=m(s,"P",{"data-svelte-h":!0}),r(un)!=="svelte-15k6tov"&&(un.innerHTML=KM),yh=l(s),yn=m(s,"P",{"data-svelte-h":!0}),r(yn)!=="svelte-7zsclb"&&(yn.innerHTML=DM),Mh=l(s),y(Mn.$$.fragment,s),dh=l(s),il=m(s,"P",{}),v(il).forEach(t),this.h()},h(){k(C,"name","hf:doc:metadata"),k(C,"content",Xd),mp.a=ip,rp.a=op,cp.a=hp,gp.a=null,yp.a=null,Ep.a=Yp,Ap.a=Sp,lm.a=pm,im.a=rm,om.a=cm,hm.a=gm,um.a=ym,Mm.a=dm,wm.a=fm,bm.a=vm,xm.a=Tm,_m.a=jm,Um.a=Jm,Cm.a=Gm,Bm.a=$m,zm.a=Zm,Qm.a=Vm,Im.a=Rm,Xm.a=Hm,Em.a=Ym,k(cs,"href","https://arxiv.org/abs/2205.14135"),k(cs,"rel","nofollow"),Sm.a=Pm,qm.a=null,Km.a=Dm,Om.a=si,ai.a=ti,ei.a=ni,ii.a=ri,gi.a=ui,ir.a=rr,gr.a=ur,yr.a=Mr,k(hs,"href","https://arxiv.org/abs/1706.03762"),k(hs,"rel","nofollow"),fr.a=br,vr.a=xr,Tr.a=_r,jr.a=Ur,Jr.a=kr,k(gs,"href","https://arxiv.org/abs/1810.04805"),k(gs,"rel","nofollow"),Gr.a=Br,Zr.a=Qr,k(ys,"href","https://arxiv.org/abs/2009.13658"),k(ys,"rel","nofollow"),k(Ms,"href","https://arxiv.org/abs/2104.09864"),k(Ms,"rel","nofollow"),Vr.a=Ir,Nr.a=Lr,Er.a=Yr,Ar.a=Sr,Pr.a=qr,Fr.a=Kr,Dr.a=null,so.a=ao,to.a=eo,lo.a=po,mo.a=io,ro.a=oo,co.a=ho,go.a=uo,yo.a=Mo,vo.a=xo,ko.a=Co,k(ds,"href","https://arxiv.org/abs/2108.12409"),k(ds,"rel","nofollow"),Go.a=Bo,k(ws,"href","https://github.com/huggingface/transformers/pull/24653"),k(ws,"rel","nofollow"),zo.a=Zo,Vo.a=Io,Ro.a=Xo,Ho.a=No,Do.a=Oo,sc.a=ac,tc.a=ec,nc.a=lc,pc.a=mc,uc.a=yc,Mc.a=dc,wc.a=fc,xc.a=Tc,Rc.a=Xc,Hc.a=Nc,Fc.a=Kc,sh.a=ah,k(xs,"href","https://arxiv.org/abs/1911.02150"),k(xs,"rel","nofollow"),eh.a=nh},m(s,a){i(document.head,C),e(s,Cs,a),e(s,S,a),e(s,wn,a),M(Gs,s,a),e(s,cl,a),M(Bs,s,a),e(s,hl,a),e(s,$s,a),e(s,gl,a),e(s,zs,a),e(s,ul,a),e(s,Zs,a),e(s,yl,a),e(s,Qs,a),e(s,Ml,a),e(s,Vs,a),e(s,dl,a),e(s,Is,a),e(s,wl,a),M(Rs,s,a),e(s,fl,a),e(s,Xs,a),e(s,bl,a),e(s,Hs,a),e(s,vl,a),e(s,Ns,a),e(s,xl,a),e(s,Ls,a),e(s,Tl,a),e(s,Ws,a),e(s,_l,a),e(s,Es,a),e(s,jl,a),e(s,Ys,a),e(s,Ul,a),e(s,As,a),e(s,Jl,a),e(s,Ss,a),e(s,kl,a),e(s,Ps,a),e(s,Cl,a),e(s,qs,a),e(s,Gl,a),e(s,Fs,a),e(s,Bl,a),M(Ks,s,a),e(s,$l,a),M(Ds,s,a),e(s,zl,a),e(s,Os,a),e(s,Zl,a),e(s,sa,a),e(s,Ql,a),e(s,aa,a),e(s,Vl,a),e(s,ta,a),e(s,Il,a),M(ea,s,a),e(s,Rl,a),M(na,s,a),e(s,Xl,a),e(s,la,a),e(s,Hl,a),M(pa,s,a),e(s,Nl,a),e(s,ma,a),e(s,Ll,a),M(ia,s,a),e(s,Wl,a),e(s,ra,a),e(s,El,a),M(oa,s,a),e(s,Yl,a),e(s,ca,a),e(s,Al,a),M(ha,s,a),e(s,Sl,a),e(s,ga,a),e(s,Pl,a),e(s,ua,a),e(s,ql,a),e(s,ya,a),e(s,Fl,a),e(s,Ma,a),e(s,Kl,a),M(da,s,a),e(s,Dl,a),e(s,wa,a),e(s,Ol,a),M(fa,s,a),e(s,sp,a),e(s,ba,a),e(s,ap,a),M(va,s,a),e(s,tp,a),e(s,xa,a),e(s,ep,a),e(s,Ta,a),e(s,np,a),e(s,_a,a),e(s,lp,a),e(s,ja,a),e(s,pp,a),e(s,G,a),i(G,Uh),i(G,fn),i(G,Jh),mp.m(e0,G),i(G,ip),i(G,bn),i(G,kh),rp.m(n0,G),i(G,op),cp.m(l0,G),i(G,hp),gp.m(p0,G),e(s,up,a),e(s,Ua,a),i(Ua,Ch),yp.m(m0,Ua),e(s,Mp,a),e(s,Ja,a),e(s,dp,a),e(s,ka,a),e(s,wp,a),M(Ca,s,a),e(s,fp,a),e(s,Ga,a),e(s,bp,a),M(Ba,s,a),e(s,vp,a),e(s,$a,a),e(s,xp,a),M(za,s,a),e(s,Tp,a),e(s,Za,a),e(s,_p,a),M(Qa,s,a),e(s,jp,a),e(s,Va,a),e(s,Up,a),M(Ia,s,a),e(s,Jp,a),e(s,Ra,a),e(s,kp,a),M(Xa,s,a),e(s,Cp,a),e(s,Ha,a),e(s,Gp,a),e(s,Na,a),e(s,Bp,a),M(La,s,a),e(s,$p,a),M(Wa,s,a),e(s,zp,a),e(s,Ea,a),e(s,Zp,a),M(Ya,s,a),e(s,Qp,a),e(s,Aa,a),e(s,Vp,a),M(Sa,s,a),e(s,Ip,a),e(s,Pa,a),e(s,Rp,a),M(qa,s,a),e(s,Xp,a),e(s,Fa,a),e(s,Hp,a),M(Ka,s,a),e(s,Np,a),e(s,Da,a),e(s,Lp,a),e(s,Oa,a),e(s,Wp,a),e(s,F,a),i(F,Gh),Ep.m(i0,F),i(F,Yp),Ap.m(r0,F),i(F,Sp),e(s,Pp,a),M(st,s,a),e(s,qp,a),M(at,s,a),e(s,Fp,a),e(s,tt,a),e(s,Kp,a),e(s,et,a),e(s,Dp,a),e(s,nt,a),e(s,Op,a),e(s,lt,a),e(s,sm,a),e(s,pt,a),e(s,am,a),e(s,mt,a),e(s,tm,a),M(it,s,a),e(s,em,a),e(s,rt,a),e(s,nm,a),e(s,K,a),i(K,Bh),lm.m(o0,K),i(K,pm),i(K,vn),i(K,$h),e(s,mm,a),e(s,T,a),i(T,zh),im.m(c0,T),i(T,rm),om.m(h0,T),i(T,cm),hm.m(g0,T),i(T,gm),um.m(u0,T),i(T,ym),Mm.m(y0,T),i(T,dm),wm.m(M0,T),i(T,fm),bm.m(d0,T),i(T,vm),xm.m(w0,T),i(T,Tm),_m.m(f0,T),i(T,jm),Um.m(b0,T),i(T,Jm),e(s,km,a),e(s,U,a),i(U,Zh),Cm.m(v0,U),i(U,Gm),Bm.m(x0,U),i(U,$m),zm.m(T0,U),i(U,Zm),Qm.m(_0,U),i(U,Vm),Im.m(j0,U),i(U,Rm),Xm.m(U0,U),i(U,Hm),e(s,Nm,a),e(s,ot,a),e(s,Lm,a),e(s,ct,a),e(s,Wm,a),e(s,W,a),i(W,Qh),Em.m(J0,W),i(W,Ym),i(W,cs),i(W,Vh),i(W,xn),i(W,Ih),e(s,Am,a),e(s,ms,a),i(ms,Rh),Sm.m(k0,ms),i(ms,Pm),qm.m(C0,ms),e(s,Fm,a),e(s,Q,a),i(Q,Xh),Km.m(G0,Q),i(Q,Dm),Om.m(B0,Q),i(Q,si),ai.m($0,Q),i(Q,ti),ei.m(z0,Q),i(Q,ni),e(s,li,a),e(s,ht,a),e(s,pi,a),e(s,gt,a),e(s,mi,a),e(s,Tn,a),i(Tn,is),i(is,Hh),i(is,_n),i(is,Nh),ii.m(Z0,is),i(is,ri),e(s,oi,a),e(s,ut,a),e(s,ci,a),e(s,yt,a),e(s,hi,a),e(s,D,a),i(D,Lh),i(D,jn),i(D,Wh),gi.m(Q0,D),i(D,ui),e(s,yi,a),e(s,Mt,a),e(s,Mi,a),e(s,dt,a),e(s,di,a),e(s,wt,a),e(s,wi,a),M(ft,s,a),e(s,fi,a),e(s,bt,a),e(s,bi,a),M(vt,s,a),e(s,vi,a),e(s,xt,a),e(s,xi,a),M(Tt,s,a),e(s,Ti,a),e(s,_t,a),e(s,_i,a),M(jt,s,a),e(s,ji,a),e(s,Ut,a),e(s,Ui,a),M(Jt,s,a),e(s,Ji,a),e(s,kt,a),e(s,ki,a),e(s,Ct,a),e(s,Ci,a),e(s,Gt,a),e(s,Gi,a),M(Bt,s,a),e(s,Bi,a),e(s,$t,a),e(s,$i,a),M(zt,s,a),e(s,zi,a),e(s,Zt,a),e(s,Zi,a),e(s,Qt,a),e(s,Qi,a),M(Vt,s,a),e(s,Vi,a),e(s,It,a),e(s,Ii,a),M(Rt,s,a),e(s,Ri,a),e(s,Xt,a),e(s,Xi,a),M(Ht,s,a),e(s,Hi,a),e(s,Nt,a),e(s,Ni,a),M(Lt,s,a),e(s,Li,a),e(s,Wt,a),e(s,Wi,a),e(s,Et,a),e(s,Ei,a),M(Yt,s,a),e(s,Yi,a),e(s,At,a),e(s,Ai,a),M(St,s,a),e(s,Si,a),e(s,Pt,a),e(s,Pi,a),e(s,qt,a),e(s,qi,a),M(Ft,s,a),e(s,Fi,a),e(s,Kt,a),e(s,Ki,a),M(Dt,s,a),e(s,Di,a),e(s,Ot,a),e(s,Oi,a),e(s,se,a),e(s,sr,a),e(s,ae,a),e(s,ar,a),e(s,te,a),e(s,tr,a),e(s,ee,a),e(s,er,a),e(s,ne,a),e(s,nr,a),e(s,le,a),e(s,lr,a),e(s,pe,a),e(s,pr,a),M(me,s,a),e(s,mr,a),e(s,O,a),i(O,Eh),i(O,Un),i(O,Yh),ir.m(V0,O),i(O,rr),e(s,or,a),e(s,ie,a),e(s,cr,a),e(s,re,a),e(s,hr,a),e(s,V,a),i(V,Ah),gr.m(I0,V),i(V,ur),yr.m(R0,V),i(V,Mr),i(V,Jn),i(V,Sh),i(V,kn),i(V,Ph),e(s,dr,a),e(s,oe,a),e(s,wr,a),e(s,B,a),i(B,hs),i(B,qh),fr.m(X0,B),i(B,br),vr.m(H0,B),i(B,xr),Tr.m(N0,B),i(B,_r),jr.m(L0,B),i(B,Ur),Jr.m(W0,B),i(B,kr),e(s,Cr,a),e(s,ss,a),i(ss,Fh),i(ss,gs),i(ss,Kh),Gr.m(E0,ss),i(ss,Br),e(s,$r,a),e(s,ce,a),e(s,zr,a),e(s,us,a),i(us,P),i(P,Dh),Zr.m(Y0,P),i(P,Qr),i(P,ys),i(P,Oh),i(P,Ms),i(P,sg),i(us,ag),i(us,he),i(he,tg),Vr.m(A0,he),i(he,Ir),e(s,Rr,a),e(s,ge,a),e(s,Xr,a),e(s,ue,a),e(s,Hr,a),e(s,q,a),i(q,Cn),i(q,eg),i(q,Gn),i(q,ng),Nr.m(S0,q),i(q,Lr),e(s,Wr,a),e(s,$,a),i($,lg),i($,Bn),i($,pg),Er.m(P0,$),i($,Yr),Ar.m(q0,$),i($,Sr),Pr.m(F0,$),i($,qr),Fr.m(K0,$),i($,Kr),Dr.m(D0,$),e(s,Or,a),e(s,E,a),i(E,mg),so.m(O0,E),i(E,ao),to.m(sd,E),i(E,eo),i(E,$n),i(E,ig),e(s,no,a),e(s,zn,a),i(zn,z),i(z,rg),lo.m(ad,z),i(z,po),mo.m(td,z),i(z,io),ro.m(ed,z),i(z,oo),co.m(nd,z),i(z,ho),go.m(ld,z),i(z,uo),yo.m(pd,z),i(z,Mo),e(s,wo,a),e(s,ye,a),e(s,fo,a),e(s,Me,a),e(s,bo,a),e(s,Y,a),i(Y,og),i(Y,Zn),i(Y,cg),i(Y,Qn),i(Y,hg),vo.m(md,Y),i(Y,xo),e(s,To,a),e(s,de,a),e(s,_o,a),e(s,we,a),e(s,jo,a),e(s,fe,a),e(s,Uo,a),e(s,be,a),e(s,Jo,a),e(s,x,a),i(x,Vn),i(x,gg),i(x,In),i(x,ug),i(x,Rn),i(x,yg),i(x,Xn),i(x,Mg),i(x,Hn),i(x,dg),i(x,Nn),i(x,wg),ko.m(id,x),i(x,Co),i(x,ds),i(x,fg),Go.m(rd,x),i(x,Bo),i(x,Ln),i(x,bg),i(x,ws),i(x,vg),e(s,$o,a),e(s,fs,a),i(fs,Wn),i(fs,xg),i(fs,rs),i(rs,ve),i(ve,Tg),zo.m(od,ve),i(ve,Zo),i(rs,_g),i(rs,En),i(rs,jg),i(rs,Yn),e(s,Qo,a),e(s,A,a),i(A,Ug),Vo.m(cd,A),i(A,Io),Ro.m(hd,A),i(A,Xo),Ho.m(gd,A),i(A,No),e(s,Lo,a),M(xe,s,a),e(s,Wo,a),e(s,Te,a),e(s,Eo,a),e(s,_e,a),e(s,Yo,a),e(s,je,a),e(s,Ao,a),M(Ue,s,a),e(s,So,a),e(s,Je,a),e(s,Po,a),M(ke,s,a),e(s,qo,a),e(s,Ce,a),e(s,Fo,a),e(s,Ge,a),e(s,Ko,a),e(s,J,a),i(J,Jg),i(J,An),i(J,kg),Do.m(ud,J),i(J,Oo),sc.m(yd,J),i(J,ac),tc.m(Md,J),i(J,ec),nc.m(dd,J),i(J,lc),pc.m(wd,J),i(J,mc),e(s,ic,a),e(s,Be,a),e(s,rc,a),M($e,s,a),e(s,oc,a),e(s,ze,a),e(s,cc,a),M(Ze,s,a),e(s,hc,a),e(s,Qe,a),e(s,gc,a),e(s,Sn,a),i(Sn,H),i(H,Cg),uc.m(fd,H),i(H,yc),Mc.m(bd,H),i(H,dc),wc.m(vd,H),i(H,fc),i(H,Pn),i(H,Gg),e(s,bc,a),e(s,Ve,a),e(s,vc,a),e(s,bs,a),i(bs,Ie),i(Ie,Bg),xc.m(xd,Ie),i(Ie,Tc),i(bs,$g),i(bs,qn),e(s,_c,a),e(s,Re,a),e(s,jc,a),M(vs,s,a),e(s,Uc,a),M(Xe,s,a),e(s,Jc,a),e(s,He,a),e(s,kc,a),M(Ne,s,a),e(s,Cc,a),e(s,Le,a),e(s,Gc,a),e(s,We,a),e(s,Bc,a),e(s,Ee,a),e(s,$c,a),e(s,Ye,a),e(s,zc,a),e(s,Ae,a),e(s,Zc,a),M(Se,s,a),e(s,Qc,a),e(s,Pe,a),e(s,Vc,a),M(qe,s,a),e(s,Ic,a),e(s,as,a),i(as,zg),Rc.m(Td,as),i(as,Xc),Hc.m(_d,as),i(as,Nc),e(s,Lc,a),e(s,Fe,a),e(s,Wc,a),M(Ke,s,a),e(s,Ec,a),e(s,De,a),e(s,Yc,a),M(Oe,s,a),e(s,Ac,a),e(s,sn,a),e(s,Sc,a),M(an,s,a),e(s,Pc,a),e(s,tn,a),e(s,qc,a),e(s,Fn,a),i(Fn,os),i(os,Zg),Fc.m(jd,os),i(os,Kc),i(os,Kn),i(os,Qg),e(s,Dc,a),e(s,en,a),e(s,Oc,a),e(s,ts,a),i(ts,Vg),sh.m(Ud,ts),i(ts,ah),i(ts,xs),i(ts,Ig),e(s,th,a),e(s,Ts,a),i(Ts,Rg),eh.m(Jd,Ts),i(Ts,nh),e(s,lh,a),e(s,nn,a),e(s,ph,a),e(s,ln,a),e(s,mh,a),e(s,pn,a),e(s,ih,a),M(mn,s,a),e(s,rh,a),e(s,rn,a),e(s,oh,a),e(s,on,a),e(s,ch,a),e(s,cn,a),e(s,hh,a),e(s,hn,a),e(s,gh,a),M(gn,s,a),e(s,uh,a),e(s,un,a),e(s,yh,a),e(s,yn,a),e(s,Mh,a),M(Mn,s,a),e(s,dh,a),e(s,il,a),wh=!0},p(s,[a]){const Z={};a&2&&(Z.$$scope={dirty:a,ctx:s}),vs.$set(Z)},i(s){wh||(d(Gs.$$.fragment,s),d(Bs.$$.fragment,s),d(Rs.$$.fragment,s),d(Ks.$$.fragment,s),d(Ds.$$.fragment,s),d(ea.$$.fragment,s),d(na.$$.fragment,s),d(pa.$$.fragment,s),d(ia.$$.fragment,s),d(oa.$$.fragment,s),d(ha.$$.fragment,s),d(da.$$.fragment,s),d(fa.$$.fragment,s),d(va.$$.fragment,s),d(Ca.$$.fragment,s),d(Ba.$$.fragment,s),d(za.$$.fragment,s),d(Qa.$$.fragment,s),d(Ia.$$.fragment,s),d(Xa.$$.fragment,s),d(La.$$.fragment,s),d(Wa.$$.fragment,s),d(Ya.$$.fragment,s),d(Sa.$$.fragment,s),d(qa.$$.fragment,s),d(Ka.$$.fragment,s),d(st.$$.fragment,s),d(at.$$.fragment,s),d(it.$$.fragment,s),d(ft.$$.fragment,s),d(vt.$$.fragment,s),d(Tt.$$.fragment,s),d(jt.$$.fragment,s),d(Jt.$$.fragment,s),d(Bt.$$.fragment,s),d(zt.$$.fragment,s),d(Vt.$$.fragment,s),d(Rt.$$.fragment,s),d(Ht.$$.fragment,s),d(Lt.$$.fragment,s),d(Yt.$$.fragment,s),d(St.$$.fragment,s),d(Ft.$$.fragment,s),d(Dt.$$.fragment,s),d(me.$$.fragment,s),d(xe.$$.fragment,s),d(Ue.$$.fragment,s),d(ke.$$.fragment,s),d($e.$$.fragment,s),d(Ze.$$.fragment,s),d(vs.$$.fragment,s),d(Xe.$$.fragment,s),d(Ne.$$.fragment,s),d(Se.$$.fragment,s),d(qe.$$.fragment,s),d(Ke.$$.fragment,s),d(Oe.$$.fragment,s),d(an.$$.fragment,s),d(mn.$$.fragment,s),d(gn.$$.fragment,s),d(Mn.$$.fragment,s),wh=!0)},o(s){w(Gs.$$.fragment,s),w(Bs.$$.fragment,s),w(Rs.$$.fragment,s),w(Ks.$$.fragment,s),w(Ds.$$.fragment,s),w(ea.$$.fragment,s),w(na.$$.fragment,s),w(pa.$$.fragment,s),w(ia.$$.fragment,s),w(oa.$$.fragment,s),w(ha.$$.fragment,s),w(da.$$.fragment,s),w(fa.$$.fragment,s),w(va.$$.fragment,s),w(Ca.$$.fragment,s),w(Ba.$$.fragment,s),w(za.$$.fragment,s),w(Qa.$$.fragment,s),w(Ia.$$.fragment,s),w(Xa.$$.fragment,s),w(La.$$.fragment,s),w(Wa.$$.fragment,s),w(Ya.$$.fragment,s),w(Sa.$$.fragment,s),w(qa.$$.fragment,s),w(Ka.$$.fragment,s),w(st.$$.fragment,s),w(at.$$.fragment,s),w(it.$$.fragment,s),w(ft.$$.fragment,s),w(vt.$$.fragment,s),w(Tt.$$.fragment,s),w(jt.$$.fragment,s),w(Jt.$$.fragment,s),w(Bt.$$.fragment,s),w(zt.$$.fragment,s),w(Vt.$$.fragment,s),w(Rt.$$.fragment,s),w(Ht.$$.fragment,s),w(Lt.$$.fragment,s),w(Yt.$$.fragment,s),w(St.$$.fragment,s),w(Ft.$$.fragment,s),w(Dt.$$.fragment,s),w(me.$$.fragment,s),w(xe.$$.fragment,s),w(Ue.$$.fragment,s),w(ke.$$.fragment,s),w($e.$$.fragment,s),w(Ze.$$.fragment,s),w(vs.$$.fragment,s),w(Xe.$$.fragment,s),w(Ne.$$.fragment,s),w(Se.$$.fragment,s),w(qe.$$.fragment,s),w(Ke.$$.fragment,s),w(Oe.$$.fragment,s),w(an.$$.fragment,s),w(mn.$$.fragment,s),w(gn.$$.fragment,s),w(Mn.$$.fragment,s),wh=!1},d(s){s&&(t(Cs),t(S),t(wn),t(cl),t(hl),t($s),t(gl),t(zs),t(ul),t(Zs),t(yl),t(Qs),t(Ml),t(Vs),t(dl),t(Is),t(wl),t(fl),t(Xs),t(bl),t(Hs),t(vl),t(Ns),t(xl),t(Ls),t(Tl),t(Ws),t(_l),t(Es),t(jl),t(Ys),t(Ul),t(As),t(Jl),t(Ss),t(kl),t(Ps),t(Cl),t(qs),t(Gl),t(Fs),t(Bl),t($l),t(zl),t(Os),t(Zl),t(sa),t(Ql),t(aa),t(Vl),t(ta),t(Il),t(Rl),t(Xl),t(la),t(Hl),t(Nl),t(ma),t(Ll),t(Wl),t(ra),t(El),t(Yl),t(ca),t(Al),t(Sl),t(ga),t(Pl),t(ua),t(ql),t(ya),t(Fl),t(Ma),t(Kl),t(Dl),t(wa),t(Ol),t(sp),t(ba),t(ap),t(tp),t(xa),t(ep),t(Ta),t(np),t(_a),t(lp),t(ja),t(pp),t(G),t(up),t(Ua),t(Mp),t(Ja),t(dp),t(ka),t(wp),t(fp),t(Ga),t(bp),t(vp),t($a),t(xp),t(Tp),t(Za),t(_p),t(jp),t(Va),t(Up),t(Jp),t(Ra),t(kp),t(Cp),t(Ha),t(Gp),t(Na),t(Bp),t($p),t(zp),t(Ea),t(Zp),t(Qp),t(Aa),t(Vp),t(Ip),t(Pa),t(Rp),t(Xp),t(Fa),t(Hp),t(Np),t(Da),t(Lp),t(Oa),t(Wp),t(F),t(Pp),t(qp),t(Fp),t(tt),t(Kp),t(et),t(Dp),t(nt),t(Op),t(lt),t(sm),t(pt),t(am),t(mt),t(tm),t(em),t(rt),t(nm),t(K),t(mm),t(T),t(km),t(U),t(Nm),t(ot),t(Lm),t(ct),t(Wm),t(W),t(Am),t(ms),t(Fm),t(Q),t(li),t(ht),t(pi),t(gt),t(mi),t(Tn),t(oi),t(ut),t(ci),t(yt),t(hi),t(D),t(yi),t(Mt),t(Mi),t(dt),t(di),t(wt),t(wi),t(fi),t(bt),t(bi),t(vi),t(xt),t(xi),t(Ti),t(_t),t(_i),t(ji),t(Ut),t(Ui),t(Ji),t(kt),t(ki),t(Ct),t(Ci),t(Gt),t(Gi),t(Bi),t($t),t($i),t(zi),t(Zt),t(Zi),t(Qt),t(Qi),t(Vi),t(It),t(Ii),t(Ri),t(Xt),t(Xi),t(Hi),t(Nt),t(Ni),t(Li),t(Wt),t(Wi),t(Et),t(Ei),t(Yi),t(At),t(Ai),t(Si),t(Pt),t(Pi),t(qt),t(qi),t(Fi),t(Kt),t(Ki),t(Di),t(Ot),t(Oi),t(se),t(sr),t(ae),t(ar),t(te),t(tr),t(ee),t(er),t(ne),t(nr),t(le),t(lr),t(pe),t(pr),t(mr),t(O),t(or),t(ie),t(cr),t(re),t(hr),t(V),t(dr),t(oe),t(wr),t(B),t(Cr),t(ss),t($r),t(ce),t(zr),t(us),t(Rr),t(ge),t(Xr),t(ue),t(Hr),t(q),t(Wr),t($),t(Or),t(E),t(no),t(zn),t(wo),t(ye),t(fo),t(Me),t(bo),t(Y),t(To),t(de),t(_o),t(we),t(jo),t(fe),t(Uo),t(be),t(Jo),t(x),t($o),t(fs),t(Qo),t(A),t(Lo),t(Wo),t(Te),t(Eo),t(_e),t(Yo),t(je),t(Ao),t(So),t(Je),t(Po),t(qo),t(Ce),t(Fo),t(Ge),t(Ko),t(J),t(ic),t(Be),t(rc),t(oc),t(ze),t(cc),t(hc),t(Qe),t(gc),t(Sn),t(bc),t(Ve),t(vc),t(bs),t(_c),t(Re),t(jc),t(Uc),t(Jc),t(He),t(kc),t(Cc),t(Le),t(Gc),t(We),t(Bc),t(Ee),t($c),t(Ye),t(zc),t(Ae),t(Zc),t(Qc),t(Pe),t(Vc),t(Ic),t(as),t(Lc),t(Fe),t(Wc),t(Ec),t(De),t(Yc),t(Ac),t(sn),t(Sc),t(Pc),t(tn),t(qc),t(Fn),t(Dc),t(en),t(Oc),t(ts),t(th),t(Ts),t(lh),t(nn),t(ph),t(ln),t(mh),t(pn),t(ih),t(rh),t(rn),t(oh),t(on),t(ch),t(cn),t(hh),t(hn),t(gh),t(uh),t(un),t(yh),t(yn),t(Mh),t(dh),t(il)),t(C),f(Gs,s),f(Bs,s),f(Rs,s),f(Ks,s),f(Ds,s),f(ea,s),f(na,s),f(pa,s),f(ia,s),f(oa,s),f(ha,s),f(da,s),f(fa,s),f(va,s),f(Ca,s),f(Ba,s),f(za,s),f(Qa,s),f(Ia,s),f(Xa,s),f(La,s),f(Wa,s),f(Ya,s),f(Sa,s),f(qa,s),f(Ka,s),f(st,s),f(at,s),f(it,s),f(ft,s),f(vt,s),f(Tt,s),f(jt,s),f(Jt,s),f(Bt,s),f(zt,s),f(Vt,s),f(Rt,s),f(Ht,s),f(Lt,s),f(Yt,s),f(St,s),f(Ft,s),f(Dt,s),f(me,s),f(xe,s),f(Ue,s),f(ke,s),f($e,s),f(Ze,s),f(vs,s),f(Xe,s),f(Ne,s),f(Se,s),f(qe,s),f(Ke,s),f(Oe,s),f(an,s),f(mn,s),f(gn,s),f(Mn,s)}}}const Xd='{"title":"대규모 언어 모델의 속도 및 메모리 최적화","local":"optimizing-llms-for-speed-and-memory","sections":[{"title":"1. 낮은 정밀도","local":"1-lower-precision","sections":[],"depth":2},{"title":"2. 플래시 어텐션","local":"2-flash-attention","sections":[],"depth":2},{"title":"3. 아키텍처 혁신","local":"3-architectural-innovations","sections":[{"title":"3.1 대규모 언어 모델의 위치 임베딩 개선","local":"31-improving-positional-embeddings-of-llms","sections":[],"depth":3},{"title":"3.2 키-값 캐시","local":"32-the-key-value-cache","sections":[{"title":"3.2.1 멀티 라운드 대화","local":"321-multi-round-conversation","sections":[],"depth":4},{"title":"3.2.2 멀티 쿼리 어텐션 (MQA)","local":"322-multi-query-attention-mqa","sections":[],"depth":4},{"title":"3.2.3 그룹 쿼리 어텐션 (GQA)","local":"323-grouped-query-attention-gqa","sections":[],"depth":4}],"depth":3}],"depth":2},{"title":"결론","local":"conclusion","sections":[],"depth":2}],"depth":1}';function Hd(ol){return Cd(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Sd extends Bd{constructor(C){super(),$d(this,C,Hd,Rd,kd,{})}}export{Sd as component}; | |
Xet Storage Details
- Size:
- 242 kB
- Xet hash:
- 75bf7d0c0abe01e01e840eb400bcf275c67718210650a2df6fcafaf50539bda6
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.