{"componentChunkName":"component---src-templates-blog-post-js","path":"/ai/LLM-추론-최적화-KV-Cache-Quantization-Speculative-Decoding/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"e476f014-c56b-5eb6-950c-3506eea5b10e","excerpt":"LLM 추론 최적화 - KV Cache, Quantization, Speculative Decoding LLM 추론은 계산 집약적이고 메모리를 많이 사용한다. 프로덕션 환경에서 LLM을 효율적으로 서빙하려면 다양한 최적화 기법이 필요하다. 이 글은 KV Cache…","html":"<h1 id=\"llm-추론-최적화---kv-cache-quantization-speculative-decoding\" style=\"position:relative;\"><a href=\"#llm-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94---kv-cache-quantization-speculative-decoding\" aria-label=\"llm 추론 최적화   kv cache quantization speculative decoding permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>LLM 추론 최적화 - KV Cache, Quantization, Speculative Decoding</h1>\n<p>LLM 추론은 계산 집약적이고 메모리를 많이 사용한다. 프로덕션 환경에서 LLM을 효율적으로 서빙하려면 다양한 최적화 기법이 필요하다. 이 글은 KV Cache, Quantization, Speculative Decoding 등 핵심 최적화 기술을 실전 예제와 함께 정리한다.</p>\n<h2 id=\"1-llm-추론의-기본-구조\" style=\"position:relative;\"><a href=\"#1-llm-%EC%B6%94%EB%A1%A0%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0\" aria-label=\"1 llm 추론의 기본 구조 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. LLM 추론의 기본 구조</h2>\n<h3 id=\"1-1-transformer-추론-과정\" style=\"position:relative;\"><a href=\"#1-1-transformer-%EC%B6%94%EB%A1%A0-%EA%B3%BC%EC%A0%95\" aria-label=\"1 1 transformer 추론 과정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. Transformer 추론 과정</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> torch\n<span class=\"token keyword\">from</span> transformers <span class=\"token keyword\">import</span> AutoModelForCausalLM<span class=\"token punctuation\">,</span> AutoTokenizer\n\n<span class=\"token comment\"># 모델 로드</span>\nmodel <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span><span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">)</span>\ntokenizer <span class=\"token operator\">=</span> AutoTokenizer<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span><span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 기본 추론</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">basic_inference</span><span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> max_length<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    inputs <span class=\"token operator\">=</span> tokenizer<span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 각 토큰 생성마다 전체 모델을 통과</span>\n    outputs <span class=\"token operator\">=</span> model<span class=\"token punctuation\">.</span>generate<span class=\"token punctuation\">(</span>\n        inputs<span class=\"token punctuation\">.</span>input_ids<span class=\"token punctuation\">,</span>\n        max_length<span class=\"token operator\">=</span>max_length<span class=\"token punctuation\">,</span>\n        do_sample<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n        temperature<span class=\"token operator\">=</span><span class=\"token number\">0.7</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">return</span> tokenizer<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span>outputs<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> skip_special_tokens<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"1-2-추론의-병목-지점\" style=\"position:relative;\"><a href=\"#1-2-%EC%B6%94%EB%A1%A0%EC%9D%98-%EB%B3%91%EB%AA%A9-%EC%A7%80%EC%A0%90\" aria-label=\"1 2 추론의 병목 지점 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. 추론의 병목 지점</h3>\n<p>LLM 추론의 주요 병목 지점:</p>\n<ol>\n<li><strong>메모리 사용량</strong>: 모델 파라미터와 중간 활성화 값 저장</li>\n<li><strong>계산량</strong>: Attention 메커니즘의 O(n²) 복잡도</li>\n<li><strong>메모리 대역폭</strong>: GPU 메모리 접근 속도</li>\n<li><strong>순차적 생성</strong>: 토큰을 하나씩 생성하는 특성</li>\n</ol>\n<h2 id=\"2-kv-cache-최적화\" style=\"position:relative;\"><a href=\"#2-kv-cache-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"2 kv cache 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. KV Cache 최적화</h2>\n<h3 id=\"2-1-kv-cache-개념\" style=\"position:relative;\"><a href=\"#2-1-kv-cache-%EA%B0%9C%EB%85%90\" aria-label=\"2 1 kv cache 개념 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. KV Cache 개념</h3>\n<p>KV Cache는 이전 토큰들의 Key와 Value를 캐싱하여 반복 계산을 피하는 기법이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> torch\n<span class=\"token keyword\">import</span> torch<span class=\"token punctuation\">.</span>nn <span class=\"token keyword\">as</span> nn\n<span class=\"token keyword\">from</span> transformers <span class=\"token keyword\">import</span> GPT2LMHeadModel\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">OptimizedGPT2Inference</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> model_name<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>model <span class=\"token operator\">=</span> GPT2LMHeadModel<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>tokenizer <span class=\"token operator\">=</span> AutoTokenizer<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>kv_cache <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">generate_with_kv_cache</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> max_new_tokens<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        inputs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span>\n        input_ids <span class=\"token operator\">=</span> inputs<span class=\"token punctuation\">.</span>input_ids\n        \n        <span class=\"token comment\"># 초기 KV Cache 생성</span>\n        past_key_values <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>\n        generated_ids <span class=\"token operator\">=</span> input_ids<span class=\"token punctuation\">.</span>clone<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>max_new_tokens<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># KV Cache를 활용한 추론</span>\n            outputs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">(</span>\n                input_ids<span class=\"token operator\">=</span>generated_ids<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\"># 마지막 토큰만 입력</span>\n                past_key_values<span class=\"token operator\">=</span>past_key_values<span class=\"token punctuation\">,</span>    <span class=\"token comment\"># 이전 KV Cache 사용</span>\n                use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n            <span class=\"token punctuation\">)</span>\n            \n            <span class=\"token comment\"># 새로운 KV Cache 업데이트</span>\n            past_key_values <span class=\"token operator\">=</span> outputs<span class=\"token punctuation\">.</span>past_key_values\n            \n            <span class=\"token comment\"># 다음 토큰 선택</span>\n            next_token_logits <span class=\"token operator\">=</span> outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n            next_token_id <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>argmax<span class=\"token punctuation\">(</span>next_token_logits<span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            \n            <span class=\"token comment\"># 생성된 토큰 추가</span>\n            generated_ids <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>generated_ids<span class=\"token punctuation\">,</span> next_token_id<span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span>generated_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> skip_special_tokens<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"2-2-kv-cache-구현-상세\" style=\"position:relative;\"><a href=\"#2-2-kv-cache-%EA%B5%AC%ED%98%84-%EC%83%81%EC%84%B8\" aria-label=\"2 2 kv cache 구현 상세 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. KV Cache 구현 상세</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">KVCache</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_layers<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> batch_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> num_heads<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>num_layers <span class=\"token operator\">=</span> num_layers\n        self<span class=\"token punctuation\">.</span>cache <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n        \n        <span class=\"token comment\"># 각 레이어별 Key, Value 캐시 초기화</span>\n        <span class=\"token keyword\">for</span> layer_idx <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_layers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_key\"</span></span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>\n                batch_size<span class=\"token punctuation\">,</span> num_heads<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> hidden_size <span class=\"token operator\">//</span> num_heads\n            <span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_value\"</span></span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>\n                batch_size<span class=\"token punctuation\">,</span> num_heads<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> hidden_size <span class=\"token operator\">//</span> num_heads\n            <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">update</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> layer_idx<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> new_key<span class=\"token punctuation\">:</span> torch<span class=\"token punctuation\">.</span>Tensor<span class=\"token punctuation\">,</span> new_value<span class=\"token punctuation\">:</span> torch<span class=\"token punctuation\">.</span>Tensor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"새로운 Key, Value로 캐시 업데이트\"\"\"</span>\n        old_key <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_key\"</span></span><span class=\"token punctuation\">]</span>\n        old_value <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_value\"</span></span><span class=\"token punctuation\">]</span>\n        \n        <span class=\"token comment\"># 기존 캐시와 새로운 값 연결</span>\n        self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_key\"</span></span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>old_key<span class=\"token punctuation\">,</span> new_key<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_value\"</span></span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>old_value<span class=\"token punctuation\">,</span> new_value<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">get</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> layer_idx<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"특정 레이어의 Key, Value 반환\"\"\"</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n            self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_key\"</span></span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            self<span class=\"token punctuation\">.</span>cache<span class=\"token punctuation\">[</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"layer_</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>layer_idx<span class=\"token punctuation\">}</span></span><span class=\"token string\">_value\"</span></span><span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"2-3-kv-cache-성능-비교\" style=\"position:relative;\"><a href=\"#2-3-kv-cache-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90\" aria-label=\"2 3 kv cache 성능 비교 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-3. KV Cache 성능 비교</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> time\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">benchmark_inference</span><span class=\"token punctuation\">(</span>model<span class=\"token punctuation\">,</span> tokenizer<span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> use_cache<span class=\"token punctuation\">:</span> <span class=\"token builtin\">bool</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    inputs <span class=\"token operator\">=</span> tokenizer<span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span>\n    \n    start_time <span class=\"token operator\">=</span> time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">if</span> use_cache<span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># KV Cache 사용</span>\n        past_key_values <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>\n        generated_ids <span class=\"token operator\">=</span> inputs<span class=\"token punctuation\">.</span>input_ids\n        \n        <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            outputs <span class=\"token operator\">=</span> model<span class=\"token punctuation\">(</span>\n                input_ids<span class=\"token operator\">=</span>generated_ids<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                past_key_values<span class=\"token operator\">=</span>past_key_values<span class=\"token punctuation\">,</span>\n                use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n            <span class=\"token punctuation\">)</span>\n            past_key_values <span class=\"token operator\">=</span> outputs<span class=\"token punctuation\">.</span>past_key_values\n            next_token <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>argmax<span class=\"token punctuation\">(</span>outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            generated_ids <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>generated_ids<span class=\"token punctuation\">,</span> next_token<span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># KV Cache 미사용 (전체 시퀀스 재계산)</span>\n        generated_ids <span class=\"token operator\">=</span> inputs<span class=\"token punctuation\">.</span>input_ids\n        <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            outputs <span class=\"token operator\">=</span> model<span class=\"token punctuation\">(</span>input_ids<span class=\"token operator\">=</span>generated_ids<span class=\"token punctuation\">)</span>\n            next_token <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>argmax<span class=\"token punctuation\">(</span>outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            generated_ids <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>generated_ids<span class=\"token punctuation\">,</span> next_token<span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    \n    elapsed_time <span class=\"token operator\">=</span> time<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> start_time\n    <span class=\"token keyword\">return</span> elapsed_time<span class=\"token punctuation\">,</span> generated_ids\n\n<span class=\"token comment\"># 성능 비교</span>\nprompt <span class=\"token operator\">=</span> <span class=\"token string\">\"The future of AI is\"</span>\ntime_with_cache<span class=\"token punctuation\">,</span> _ <span class=\"token operator\">=</span> benchmark_inference<span class=\"token punctuation\">(</span>model<span class=\"token punctuation\">,</span> tokenizer<span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">,</span> use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\ntime_without_cache<span class=\"token punctuation\">,</span> _ <span class=\"token operator\">=</span> benchmark_inference<span class=\"token punctuation\">(</span>model<span class=\"token punctuation\">,</span> tokenizer<span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">,</span> use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"KV Cache 사용: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>time_with_cache<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">초\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"KV Cache 미사용: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>time_without_cache<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">초\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"속도 향상: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>time_without_cache <span class=\"token operator\">/</span> time_with_cache<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">x\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"3-quantization-양자화\" style=\"position:relative;\"><a href=\"#3-quantization-%EC%96%91%EC%9E%90%ED%99%94\" aria-label=\"3 quantization 양자화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Quantization (양자화)</h2>\n<h3 id=\"3-1-양자화-개념\" style=\"position:relative;\"><a href=\"#3-1-%EC%96%91%EC%9E%90%ED%99%94-%EA%B0%9C%EB%85%90\" aria-label=\"3 1 양자화 개념 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. 양자화 개념</h3>\n<p>양자화는 모델의 가중치와 활성화 값을 낮은 비트로 변환하여 메모리 사용량과 계산 속도를 개선하는 기법이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> transformers <span class=\"token keyword\">import</span> AutoModelForCausalLM<span class=\"token punctuation\">,</span> BitsAndBytesConfig\n<span class=\"token keyword\">import</span> torch\n\n<span class=\"token comment\"># 8-bit 양자화 설정</span>\nquantization_config <span class=\"token operator\">=</span> BitsAndBytesConfig<span class=\"token punctuation\">(</span>\n    load_in_8bit<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n    llm_int8_threshold<span class=\"token operator\">=</span><span class=\"token number\">6.0</span><span class=\"token punctuation\">,</span>\n    llm_int8_has_fp16_weight<span class=\"token operator\">=</span><span class=\"token boolean\">False</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 양자화된 모델 로드</span>\nmodel_8bit <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">,</span>\n    quantization_config<span class=\"token operator\">=</span>quantization_config<span class=\"token punctuation\">,</span>\n    device_map<span class=\"token operator\">=</span><span class=\"token string\">\"auto\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 4-bit 양자화 설정</span>\nquantization_config_4bit <span class=\"token operator\">=</span> BitsAndBytesConfig<span class=\"token punctuation\">(</span>\n    load_in_4bit<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n    bnb_4bit_compute_dtype<span class=\"token operator\">=</span>torch<span class=\"token punctuation\">.</span>float16<span class=\"token punctuation\">,</span>\n    bnb_4bit_use_double_quant<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n    bnb_4bit_quant_type<span class=\"token operator\">=</span><span class=\"token string\">\"nf4\"</span>\n<span class=\"token punctuation\">)</span>\n\nmodel_4bit <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">,</span>\n    quantization_config<span class=\"token operator\">=</span>quantization_config_4bit<span class=\"token punctuation\">,</span>\n    device_map<span class=\"token operator\">=</span><span class=\"token string\">\"auto\"</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"3-2-동적-양자화\" style=\"position:relative;\"><a href=\"#3-2-%EB%8F%99%EC%A0%81-%EC%96%91%EC%9E%90%ED%99%94\" aria-label=\"3 2 동적 양자화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. 동적 양자화</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> torch<span class=\"token punctuation\">.</span>quantization <span class=\"token keyword\">as</span> quant\n\n<span class=\"token comment\"># 모델 준비</span>\nmodel<span class=\"token punctuation\">.</span><span class=\"token builtin\">eval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 양자화 설정</span>\nmodel<span class=\"token punctuation\">.</span>qconfig <span class=\"token operator\">=</span> quant<span class=\"token punctuation\">.</span>get_default_qconfig<span class=\"token punctuation\">(</span><span class=\"token string\">'fbgemm'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 양자화 준비</span>\nquant<span class=\"token punctuation\">.</span>prepare<span class=\"token punctuation\">(</span>model<span class=\"token punctuation\">,</span> inplace<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 캘리브레이션 데이터로 양자화</span>\ncalibration_data <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>randn<span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">with</span> torch<span class=\"token punctuation\">.</span>no_grad<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        model<span class=\"token punctuation\">(</span>calibration_data<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 양자화 변환</span>\nquant<span class=\"token punctuation\">.</span>convert<span class=\"token punctuation\">(</span>model<span class=\"token punctuation\">,</span> inplace<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"3-3-gptq-양자화\" style=\"position:relative;\"><a href=\"#3-3-gptq-%EC%96%91%EC%9E%90%ED%99%94\" aria-label=\"3 3 gptq 양자화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-3. GPTQ 양자화</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> auto_gptq <span class=\"token keyword\">import</span> AutoGPTQForCausalLM<span class=\"token punctuation\">,</span> BaseQuantizeConfig\n\n<span class=\"token comment\"># GPTQ 양자화 설정</span>\nquantize_config <span class=\"token operator\">=</span> BaseQuantizeConfig<span class=\"token punctuation\">(</span>\n    bits<span class=\"token operator\">=</span><span class=\"token number\">4</span><span class=\"token punctuation\">,</span>\n    group_size<span class=\"token operator\">=</span><span class=\"token number\">128</span><span class=\"token punctuation\">,</span>\n    desc_act<span class=\"token operator\">=</span><span class=\"token boolean\">False</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 모델 양자화</span>\nmodel <span class=\"token operator\">=</span> AutoGPTQForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">,</span>\n    quantize_config<span class=\"token operator\">=</span>quantize_config\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 양자화 실행</span>\nexamples <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n    tokenizer<span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello, how are you?\"</span><span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">]</span>\n\nmodel<span class=\"token punctuation\">.</span>quantize<span class=\"token punctuation\">(</span>examples<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 양자화된 모델 저장</span>\nmodel<span class=\"token punctuation\">.</span>save_quantized<span class=\"token punctuation\">(</span><span class=\"token string\">\"./gpt2-4bit\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"3-4-양자화-성능-비교\" style=\"position:relative;\"><a href=\"#3-4-%EC%96%91%EC%9E%90%ED%99%94-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90\" aria-label=\"3 4 양자화 성능 비교 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-4. 양자화 성능 비교</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> torch\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">measure_memory_usage</span><span class=\"token punctuation\">(</span>model<span class=\"token punctuation\">,</span> input_ids<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    torch<span class=\"token punctuation\">.</span>cuda<span class=\"token punctuation\">.</span>reset_peak_memory_stats<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    _ <span class=\"token operator\">=</span> model<span class=\"token punctuation\">(</span>input_ids<span class=\"token punctuation\">)</span>\n    memory_used <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cuda<span class=\"token punctuation\">.</span>max_memory_allocated<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">1024</span><span class=\"token operator\">**</span><span class=\"token number\">3</span>  <span class=\"token comment\"># GB</span>\n    <span class=\"token keyword\">return</span> memory_used\n\n<span class=\"token comment\"># 원본 모델</span>\noriginal_model <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span><span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>cuda<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\noriginal_memory <span class=\"token operator\">=</span> measure_memory_usage<span class=\"token punctuation\">(</span>original_model<span class=\"token punctuation\">,</span> input_ids<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 8-bit 양자화 모델</span>\nmodel_8bit <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">,</span>\n    quantization_config<span class=\"token operator\">=</span>quantization_config<span class=\"token punctuation\">,</span>\n    device_map<span class=\"token operator\">=</span><span class=\"token string\">\"auto\"</span>\n<span class=\"token punctuation\">)</span>\nmemory_8bit <span class=\"token operator\">=</span> measure_memory_usage<span class=\"token punctuation\">(</span>model_8bit<span class=\"token punctuation\">,</span> input_ids<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 4-bit 양자화 모델</span>\nmodel_4bit <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">,</span>\n    quantization_config<span class=\"token operator\">=</span>quantization_config_4bit<span class=\"token punctuation\">,</span>\n    device_map<span class=\"token operator\">=</span><span class=\"token string\">\"auto\"</span>\n<span class=\"token punctuation\">)</span>\nmemory_4bit <span class=\"token operator\">=</span> measure_memory_usage<span class=\"token punctuation\">(</span>model_4bit<span class=\"token punctuation\">,</span> input_ids<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"원본 모델: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>original_memory<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\"> GB\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"8-bit 양자화: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>memory_8bit<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\"> GB (</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>original_memory<span class=\"token operator\">/</span>memory_8bit<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">x 감소)\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"4-bit 양자화: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>memory_4bit<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\"> GB (</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>original_memory<span class=\"token operator\">/</span>memory_4bit<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">x 감소)\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"4-speculative-decoding\" style=\"position:relative;\"><a href=\"#4-speculative-decoding\" aria-label=\"4 speculative decoding permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Speculative Decoding</h2>\n<h3 id=\"4-1-speculative-decoding-개념\" style=\"position:relative;\"><a href=\"#4-1-speculative-decoding-%EA%B0%9C%EB%85%90\" aria-label=\"4 1 speculative decoding 개념 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. Speculative Decoding 개념</h3>\n<p>Speculative Decoding은 작은 모델로 여러 토큰을 예측하고, 큰 모델로 검증하여 병렬 처리를 가능하게 하는 기법이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">SpeculativeDecoder</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> draft_model<span class=\"token punctuation\">,</span> target_model<span class=\"token punctuation\">,</span> tokenizer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>draft_model <span class=\"token operator\">=</span> draft_model  <span class=\"token comment\"># 작은 모델</span>\n        self<span class=\"token punctuation\">.</span>target_model <span class=\"token operator\">=</span> target_model  <span class=\"token comment\"># 큰 모델</span>\n        self<span class=\"token punctuation\">.</span>tokenizer <span class=\"token operator\">=</span> tokenizer\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">generate</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> max_tokens<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">,</span> gamma<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"\n        gamma: 추측할 토큰 수\n        \"\"\"</span>\n        input_ids <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>input_ids\n        generated_ids <span class=\"token operator\">=</span> input_ids<span class=\"token punctuation\">.</span>clone<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">while</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>generated_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> max_tokens<span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 1. Draft 모델로 gamma개의 토큰 추측</span>\n            draft_outputs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>draft_model<span class=\"token punctuation\">.</span>generate<span class=\"token punctuation\">(</span>\n                input_ids<span class=\"token operator\">=</span>generated_ids<span class=\"token punctuation\">,</span>\n                max_new_tokens<span class=\"token operator\">=</span>gamma<span class=\"token punctuation\">,</span>\n                do_sample<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span>\n                use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n            <span class=\"token punctuation\">)</span>\n            draft_tokens <span class=\"token operator\">=</span> draft_outputs<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>generated_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n            \n            <span class=\"token comment\"># 2. Target 모델로 검증</span>\n            accepted_tokens <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> token <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>draft_tokens<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># Target 모델로 확률 계산</span>\n                target_outputs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>target_model<span class=\"token punctuation\">(</span>\n                    input_ids<span class=\"token operator\">=</span>torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>generated_ids<span class=\"token punctuation\">,</span> torch<span class=\"token punctuation\">.</span>tensor<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>accepted_tokens <span class=\"token operator\">+</span> <span class=\"token punctuation\">[</span>token<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n                <span class=\"token punctuation\">)</span>\n                \n                <span class=\"token comment\"># Accept/Reject 결정</span>\n                draft_prob <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_get_draft_probability<span class=\"token punctuation\">(</span>draft_tokens<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> generated_ids<span class=\"token punctuation\">)</span>\n                target_prob <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>softmax<span class=\"token punctuation\">(</span>target_outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>token<span class=\"token punctuation\">]</span>\n                \n                <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>_should_accept<span class=\"token punctuation\">(</span>draft_prob<span class=\"token punctuation\">,</span> target_prob<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                    accepted_tokens<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token comment\"># Reject 시 Target 모델에서 직접 샘플링</span>\n                    new_token <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>multinomial<span class=\"token punctuation\">(</span>target_prob<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n                    accepted_tokens<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>new_token<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                    <span class=\"token keyword\">break</span>\n            \n            <span class=\"token comment\"># 3. 수락된 토큰 추가</span>\n            generated_ids <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n                generated_ids<span class=\"token punctuation\">,</span>\n                torch<span class=\"token punctuation\">.</span>tensor<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>accepted_tokens<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span>generated_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> skip_special_tokens<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">_get_draft_probability</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> tokens<span class=\"token punctuation\">,</span> prefix<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># Draft 모델의 확률 계산</span>\n        <span class=\"token keyword\">pass</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">_should_accept</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> draft_prob<span class=\"token punctuation\">,</span> target_prob<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># Accept/Reject 결정 로직</span>\n        <span class=\"token keyword\">return</span> target_prob <span class=\"token operator\">>=</span> draft_prob</code></pre></div>\n<h3 id=\"4-2-병렬-speculative-decoding\" style=\"position:relative;\"><a href=\"#4-2-%EB%B3%91%EB%A0%AC-speculative-decoding\" aria-label=\"4 2 병렬 speculative decoding permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. 병렬 Speculative Decoding</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> torch<span class=\"token punctuation\">.</span>nn<span class=\"token punctuation\">.</span>functional <span class=\"token keyword\">as</span> F\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">parallel_speculative_decode</span><span class=\"token punctuation\">(</span>\n    draft_model<span class=\"token punctuation\">,</span>\n    target_model<span class=\"token punctuation\">,</span>\n    input_ids<span class=\"token punctuation\">,</span>\n    gamma<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>\n    temperature<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span> <span class=\"token operator\">=</span> <span class=\"token number\">1.0</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    병렬로 여러 토큰을 추측하고 검증\n    \"\"\"</span>\n    <span class=\"token comment\"># Draft 모델로 gamma개 토큰 생성</span>\n    <span class=\"token keyword\">with</span> torch<span class=\"token punctuation\">.</span>no_grad<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        draft_outputs <span class=\"token operator\">=</span> draft_model<span class=\"token punctuation\">.</span>generate<span class=\"token punctuation\">(</span>\n            input_ids<span class=\"token punctuation\">,</span>\n            max_new_tokens<span class=\"token operator\">=</span>gamma<span class=\"token punctuation\">,</span>\n            do_sample<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n            temperature<span class=\"token operator\">=</span>temperature<span class=\"token punctuation\">,</span>\n            use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n        <span class=\"token punctuation\">)</span>\n    \n    draft_sequence <span class=\"token operator\">=</span> draft_outputs<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>input_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n    \n    <span class=\"token comment\"># Target 모델로 전체 시퀀스 검증</span>\n    full_sequence <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>input_ids<span class=\"token punctuation\">,</span> draft_sequence<span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    target_outputs <span class=\"token operator\">=</span> target_model<span class=\"token punctuation\">(</span>full_sequence<span class=\"token punctuation\">,</span> use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 각 위치에서 Accept/Reject 결정</span>\n    accepted_tokens <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>draft_sequence<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        draft_token <span class=\"token operator\">=</span> draft_sequence<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n        \n        <span class=\"token comment\"># Target 모델의 확률</span>\n        target_logits <span class=\"token operator\">=</span> target_outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>input_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n        target_probs <span class=\"token operator\">=</span> F<span class=\"token punctuation\">.</span>softmax<span class=\"token punctuation\">(</span>target_logits <span class=\"token operator\">/</span> temperature<span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Draft 모델의 확률</span>\n        draft_logits <span class=\"token operator\">=</span> draft_outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>input_ids<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n        draft_probs <span class=\"token operator\">=</span> F<span class=\"token punctuation\">.</span>softmax<span class=\"token punctuation\">(</span>draft_logits <span class=\"token operator\">/</span> temperature<span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Accept 확률 계산</span>\n        accept_prob <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span><span class=\"token number\">1.0</span><span class=\"token punctuation\">,</span> target_probs<span class=\"token punctuation\">[</span>draft_token<span class=\"token punctuation\">]</span> <span class=\"token operator\">/</span> draft_probs<span class=\"token punctuation\">[</span>draft_token<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">if</span> torch<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> accept_prob<span class=\"token punctuation\">:</span>\n            accepted_tokens<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>draft_token<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># Reject: Target 모델에서 재샘플링</span>\n            new_token <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>multinomial<span class=\"token punctuation\">(</span>target_probs<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            accepted_tokens<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>new_token<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">break</span>\n    \n    <span class=\"token keyword\">return</span> torch<span class=\"token punctuation\">.</span>tensor<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>accepted_tokens<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"5-배치-처리-최적화\" style=\"position:relative;\"><a href=\"#5-%EB%B0%B0%EC%B9%98-%EC%B2%98%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"5 배치 처리 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. 배치 처리 최적화</h2>\n<h3 id=\"5-1-동적-배치-처리\" style=\"position:relative;\"><a href=\"#5-1-%EB%8F%99%EC%A0%81-%EB%B0%B0%EC%B9%98-%EC%B2%98%EB%A6%AC\" aria-label=\"5 1 동적 배치 처리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. 동적 배치 처리</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DynamicBatching</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> model<span class=\"token punctuation\">,</span> tokenizer<span class=\"token punctuation\">,</span> max_batch_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>model <span class=\"token operator\">=</span> model\n        self<span class=\"token punctuation\">.</span>tokenizer <span class=\"token operator\">=</span> tokenizer\n        self<span class=\"token punctuation\">.</span>max_batch_size <span class=\"token operator\">=</span> max_batch_size\n        self<span class=\"token punctuation\">.</span>request_queue <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">add_request</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> max_tokens<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"요청을 큐에 추가\"\"\"</span>\n        self<span class=\"token punctuation\">.</span>request_queue<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"prompt\"</span><span class=\"token punctuation\">:</span> prompt<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"max_tokens\"</span><span class=\"token punctuation\">:</span> max_tokens<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">:</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>input_ids\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">process_batch</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"배치 처리\"\"\"</span>\n        <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> self<span class=\"token punctuation\">.</span>request_queue<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        \n        <span class=\"token comment\"># 배치 크기 결정</span>\n        batch_size <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>request_queue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>max_batch_size<span class=\"token punctuation\">)</span>\n        batch <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>request_queue<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span>batch_size<span class=\"token punctuation\">]</span>\n        self<span class=\"token punctuation\">.</span>request_queue <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>request_queue<span class=\"token punctuation\">[</span>batch_size<span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n        \n        <span class=\"token comment\"># 패딩으로 배치 구성</span>\n        max_length <span class=\"token operator\">=</span> <span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>req<span class=\"token punctuation\">[</span><span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> req <span class=\"token keyword\">in</span> batch<span class=\"token punctuation\">)</span>\n        batch_input_ids <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        attention_masks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        \n        <span class=\"token keyword\">for</span> req <span class=\"token keyword\">in</span> batch<span class=\"token punctuation\">:</span>\n            input_ids <span class=\"token operator\">=</span> req<span class=\"token punctuation\">[</span><span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n            padding_length <span class=\"token operator\">=</span> max_length <span class=\"token operator\">-</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>input_ids<span class=\"token punctuation\">)</span>\n            \n            padded_input <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n                input_ids<span class=\"token punctuation\">,</span>\n                torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>padding_length<span class=\"token punctuation\">,</span> dtype<span class=\"token operator\">=</span>torch<span class=\"token punctuation\">.</span><span class=\"token builtin\">long</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            batch_input_ids<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>padded_input<span class=\"token punctuation\">)</span>\n            \n            attention_mask <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n                torch<span class=\"token punctuation\">.</span>ones<span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>input_ids<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                torch<span class=\"token punctuation\">.</span>zeros<span class=\"token punctuation\">(</span>padding_length<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            attention_masks<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>attention_mask<span class=\"token punctuation\">)</span>\n        \n        batch_input_ids <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>stack<span class=\"token punctuation\">(</span>batch_input_ids<span class=\"token punctuation\">)</span>\n        attention_masks <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>stack<span class=\"token punctuation\">(</span>attention_masks<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># 배치 추론</span>\n        <span class=\"token keyword\">with</span> torch<span class=\"token punctuation\">.</span>no_grad<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            outputs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">.</span>generate<span class=\"token punctuation\">(</span>\n                batch_input_ids<span class=\"token punctuation\">,</span>\n                attention_mask<span class=\"token operator\">=</span>attention_masks<span class=\"token punctuation\">,</span>\n                max_new_tokens<span class=\"token operator\">=</span><span class=\"token number\">50</span><span class=\"token punctuation\">,</span>\n                use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n                pad_token_id<span class=\"token operator\">=</span>self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">.</span>pad_token_id\n            <span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># 결과 디코딩</span>\n        results <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> output <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>outputs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            decoded <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">,</span> skip_special_tokens<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n            results<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>decoded<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> results</code></pre></div>\n<h3 id=\"5-2-continuous-batching\" style=\"position:relative;\"><a href=\"#5-2-continuous-batching\" aria-label=\"5 2 continuous batching permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-2. Continuous Batching</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">ContinuousBatching</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> model<span class=\"token punctuation\">,</span> tokenizer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>model <span class=\"token operator\">=</span> model\n        self<span class=\"token punctuation\">.</span>tokenizer <span class=\"token operator\">=</span> tokenizer\n        self<span class=\"token punctuation\">.</span>active_requests <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        self<span class=\"token punctuation\">.</span>kv_caches <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">add_request</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> request_id<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> max_tokens<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"새 요청 추가\"\"\"</span>\n        input_ids <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">(</span>prompt<span class=\"token punctuation\">,</span> return_tensors<span class=\"token operator\">=</span><span class=\"token string\">\"pt\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>input_ids\n        self<span class=\"token punctuation\">.</span>active_requests<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"id\"</span><span class=\"token punctuation\">:</span> request_id<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">:</span> input_ids<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"max_tokens\"</span><span class=\"token punctuation\">:</span> max_tokens<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"generated_tokens\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"kv_cache\"</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">None</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">process_step</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"한 스텝 처리\"\"\"</span>\n        <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> self<span class=\"token punctuation\">.</span>active_requests<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">return</span>\n        \n        <span class=\"token comment\"># 모든 요청의 다음 토큰 생성</span>\n        <span class=\"token keyword\">for</span> req <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>active_requests<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> req<span class=\"token punctuation\">[</span><span class=\"token string\">\"generated_tokens\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>=</span> req<span class=\"token punctuation\">[</span><span class=\"token string\">\"max_tokens\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">continue</span>\n            \n            <span class=\"token comment\"># 마지막 토큰만 사용</span>\n            last_token <span class=\"token operator\">=</span> req<span class=\"token punctuation\">[</span><span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n            \n            outputs <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">(</span>\n                input_ids<span class=\"token operator\">=</span>last_token<span class=\"token punctuation\">,</span>\n                past_key_values<span class=\"token operator\">=</span>req<span class=\"token punctuation\">[</span><span class=\"token string\">\"kv_cache\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                use_cache<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n            <span class=\"token punctuation\">)</span>\n            \n            <span class=\"token comment\"># KV Cache 업데이트</span>\n            req<span class=\"token punctuation\">[</span><span class=\"token string\">\"kv_cache\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> outputs<span class=\"token punctuation\">.</span>past_key_values\n            \n            <span class=\"token comment\"># 다음 토큰 선택</span>\n            next_token <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>argmax<span class=\"token punctuation\">(</span>outputs<span class=\"token punctuation\">.</span>logits<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            req<span class=\"token punctuation\">[</span><span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>req<span class=\"token punctuation\">[</span><span class=\"token string\">\"input_ids\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> next_token<span class=\"token punctuation\">.</span>unsqueeze<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            req<span class=\"token punctuation\">[</span><span class=\"token string\">\"generated_tokens\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        \n        <span class=\"token comment\"># 완료된 요청 제거</span>\n        self<span class=\"token punctuation\">.</span>active_requests <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n            req <span class=\"token keyword\">for</span> req <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>active_requests\n            <span class=\"token keyword\">if</span> req<span class=\"token punctuation\">[</span><span class=\"token string\">\"generated_tokens\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> req<span class=\"token punctuation\">[</span><span class=\"token string\">\"max_tokens\"</span><span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">]</span></code></pre></div>\n<h2 id=\"6-모델-병렬화\" style=\"position:relative;\"><a href=\"#6-%EB%AA%A8%EB%8D%B8-%EB%B3%91%EB%A0%AC%ED%99%94\" aria-label=\"6 모델 병렬화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. 모델 병렬화</h2>\n<h3 id=\"6-1-pipeline-parallelism\" style=\"position:relative;\"><a href=\"#6-1-pipeline-parallelism\" aria-label=\"6 1 pipeline parallelism permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. Pipeline Parallelism</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> torch<span class=\"token punctuation\">.</span>nn <span class=\"token keyword\">as</span> nn\n<span class=\"token keyword\">from</span> torch<span class=\"token punctuation\">.</span>distributed <span class=\"token keyword\">import</span> Pipeline\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">PipelineParallelModel</span><span class=\"token punctuation\">(</span>nn<span class=\"token punctuation\">.</span>Module<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> num_layers<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> num_gpus<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token builtin\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__init__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>num_gpus <span class=\"token operator\">=</span> num_gpus\n        self<span class=\"token punctuation\">.</span>layers_per_gpu <span class=\"token operator\">=</span> num_layers <span class=\"token operator\">//</span> num_gpus\n        \n        <span class=\"token comment\"># 각 GPU에 할당될 레이어</span>\n        self<span class=\"token punctuation\">.</span>gpu_layers <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>ModuleList<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n            nn<span class=\"token punctuation\">.</span>ModuleList<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n                nn<span class=\"token punctuation\">.</span>TransformerEncoderLayer<span class=\"token punctuation\">(</span>hidden_size<span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>layers_per_gpu<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_gpus<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">forward</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># Pipeline으로 순차 처리</span>\n        <span class=\"token keyword\">for</span> gpu_idx <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>num_gpus<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            layers <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>gpu_layers<span class=\"token punctuation\">[</span>gpu_idx<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">for</span> layer <span class=\"token keyword\">in</span> layers<span class=\"token punctuation\">:</span>\n                x <span class=\"token operator\">=</span> layer<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> x</code></pre></div>\n<h3 id=\"6-2-tensor-parallelism\" style=\"position:relative;\"><a href=\"#6-2-tensor-parallelism\" aria-label=\"6 2 tensor parallelism permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. Tensor Parallelism</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">TensorParallelAttention</span><span class=\"token punctuation\">(</span>nn<span class=\"token punctuation\">.</span>Module<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> num_heads<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> num_gpus<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token builtin\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__init__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>num_gpus <span class=\"token operator\">=</span> num_gpus\n        self<span class=\"token punctuation\">.</span>num_heads_per_gpu <span class=\"token operator\">=</span> num_heads <span class=\"token operator\">//</span> num_gpus\n        \n        <span class=\"token comment\"># 각 GPU에 할당될 Attention 헤드</span>\n        self<span class=\"token punctuation\">.</span>qkv_layers <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>ModuleList<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n            nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>hidden_size<span class=\"token punctuation\">,</span> hidden_size <span class=\"token operator\">//</span> num_gpus<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>num_gpus<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">forward</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># 각 GPU에서 부분 계산</span>\n        qkv_outputs <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> layer <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>qkv_layers<span class=\"token punctuation\">:</span>\n            qkv_outputs<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>layer<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># 결과 병합</span>\n        <span class=\"token keyword\">return</span> torch<span class=\"token punctuation\">.</span>cat<span class=\"token punctuation\">(</span>qkv_outputs<span class=\"token punctuation\">,</span> dim<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"7-flash-attention\" style=\"position:relative;\"><a href=\"#7-flash-attention\" aria-label=\"7 flash attention permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. Flash Attention</h2>\n<h3 id=\"7-1-flash-attention-구현\" style=\"position:relative;\"><a href=\"#7-1-flash-attention-%EA%B5%AC%ED%98%84\" aria-label=\"7 1 flash attention 구현 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. Flash Attention 구현</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">from</span> flash_attn <span class=\"token keyword\">import</span> flash_attn_func\n<span class=\"token keyword\">except</span> ImportError<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Flash Attention이 설치되지 않았습니다.\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">flash_attention_forward</span><span class=\"token punctuation\">(</span>q<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span> dropout_p<span class=\"token operator\">=</span><span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> softmax_scale<span class=\"token operator\">=</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"\n    Flash Attention을 사용한 효율적인 Attention 계산\n    \"\"\"</span>\n    <span class=\"token keyword\">return</span> flash_attn_func<span class=\"token punctuation\">(</span>\n        q<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span>\n        dropout_p<span class=\"token operator\">=</span>dropout_p<span class=\"token punctuation\">,</span>\n        softmax_scale<span class=\"token operator\">=</span>softmax_scale<span class=\"token punctuation\">,</span>\n        causal<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n    <span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 사용 예시</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">FlashAttentionLayer</span><span class=\"token punctuation\">(</span>nn<span class=\"token punctuation\">.</span>Module<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> num_heads<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token builtin\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__init__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>hidden_size <span class=\"token operator\">=</span> hidden_size\n        self<span class=\"token punctuation\">.</span>num_heads <span class=\"token operator\">=</span> num_heads\n        self<span class=\"token punctuation\">.</span>head_dim <span class=\"token operator\">=</span> hidden_size <span class=\"token operator\">//</span> num_heads\n        \n        self<span class=\"token punctuation\">.</span>q_proj <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>hidden_size<span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>k_proj <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>hidden_size<span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>v_proj <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>hidden_size<span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>o_proj <span class=\"token operator\">=</span> nn<span class=\"token punctuation\">.</span>Linear<span class=\"token punctuation\">(</span>hidden_size<span class=\"token punctuation\">,</span> hidden_size<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">forward</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        batch_size<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> _ <span class=\"token operator\">=</span> x<span class=\"token punctuation\">.</span>shape\n        \n        q <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>q_proj<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span>\n        k <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>k_proj<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span>\n        v <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>v_proj<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># Flash Attention 사용</span>\n        q <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>view<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>num_heads<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>head_dim<span class=\"token punctuation\">)</span>\n        k <span class=\"token operator\">=</span> k<span class=\"token punctuation\">.</span>view<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>num_heads<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>head_dim<span class=\"token punctuation\">)</span>\n        v <span class=\"token operator\">=</span> v<span class=\"token punctuation\">.</span>view<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>num_heads<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>head_dim<span class=\"token punctuation\">)</span>\n        \n        output <span class=\"token operator\">=</span> flash_attention_forward<span class=\"token punctuation\">(</span>q<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">)</span>\n        output <span class=\"token operator\">=</span> output<span class=\"token punctuation\">.</span>contiguous<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>view<span class=\"token punctuation\">(</span>batch_size<span class=\"token punctuation\">,</span> seq_len<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>hidden_size<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>o_proj<span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"8-실전-통합-예제\" style=\"position:relative;\"><a href=\"#8-%EC%8B%A4%EC%A0%84-%ED%86%B5%ED%95%A9-%EC%98%88%EC%A0%9C\" aria-label=\"8 실전 통합 예제 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 실전 통합 예제</h2>\n<h3 id=\"8-1-최적화된-추론-서버\" style=\"position:relative;\"><a href=\"#8-1-%EC%B5%9C%EC%A0%81%ED%99%94%EB%90%9C-%EC%B6%94%EB%A1%A0-%EC%84%9C%EB%B2%84\" aria-label=\"8 1 최적화된 추론 서버 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-1. 최적화된 추론 서버</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> fastapi <span class=\"token keyword\">import</span> FastAPI<span class=\"token punctuation\">,</span> Request\n<span class=\"token keyword\">from</span> pydantic <span class=\"token keyword\">import</span> BaseModel\n<span class=\"token keyword\">import</span> torch\n\napp <span class=\"token operator\">=</span> FastAPI<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">InferenceRequest</span><span class=\"token punctuation\">(</span>BaseModel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    prompt<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span>\n    max_tokens<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">50</span>\n    temperature<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span> <span class=\"token operator\">=</span> <span class=\"token number\">0.7</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">OptimizedLLMService</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># 양자화된 모델 로드</span>\n        self<span class=\"token punctuation\">.</span>model <span class=\"token operator\">=</span> AutoModelForCausalLM<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span>\n            <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">,</span>\n            quantization_config<span class=\"token operator\">=</span>quantization_config_4bit<span class=\"token punctuation\">,</span>\n            device_map<span class=\"token operator\">=</span><span class=\"token string\">\"auto\"</span>\n        <span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>tokenizer <span class=\"token operator\">=</span> AutoTokenizer<span class=\"token punctuation\">.</span>from_pretrained<span class=\"token punctuation\">(</span><span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>batcher <span class=\"token operator\">=</span> ContinuousBatching<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>model<span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>tokenizer<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">generate</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> request<span class=\"token punctuation\">:</span> InferenceRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># 배치 처리로 효율적 생성</span>\n        request_id <span class=\"token operator\">=</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>uuid<span class=\"token punctuation\">.</span>uuid4<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>batcher<span class=\"token punctuation\">.</span>add_request<span class=\"token punctuation\">(</span>\n            request_id<span class=\"token punctuation\">,</span>\n            request<span class=\"token punctuation\">.</span>prompt<span class=\"token punctuation\">,</span>\n            request<span class=\"token punctuation\">.</span>max_tokens\n        <span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># 배치 처리</span>\n        result <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>batcher<span class=\"token punctuation\">.</span>process_step<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> result\n\nservice <span class=\"token operator\">=</span> OptimizedLLMService<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token decorator annotation punctuation\">@app<span class=\"token punctuation\">.</span>post</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/generate\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">def</span> <span class=\"token function\">generate</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">:</span> InferenceRequest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> service<span class=\"token punctuation\">.</span>generate<span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"generated_text\"</span><span class=\"token punctuation\">:</span> result<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"9-성능-벤치마크\" style=\"position:relative;\"><a href=\"#9-%EC%84%B1%EB%8A%A5-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%81%AC\" aria-label=\"9 성능 벤치마크 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. 성능 벤치마크</h2>\n<h3 id=\"9-1-종합-성능-비교\" style=\"position:relative;\"><a href=\"#9-1-%EC%A2%85%ED%95%A9-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90\" aria-label=\"9 1 종합 성능 비교 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-1. 종합 성능 비교</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">benchmark_all_techniques</span><span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"gpt2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    results <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n    \n    <span class=\"token comment\"># 1. 기본 추론</span>\n    baseline_time <span class=\"token operator\">=</span> benchmark_baseline<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">)</span>\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"baseline\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> baseline_time\n    \n    <span class=\"token comment\"># 2. KV Cache</span>\n    kv_cache_time <span class=\"token operator\">=</span> benchmark_kv_cache<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">)</span>\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"kv_cache\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> kv_cache_time\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"kv_cache_speedup\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> baseline_time <span class=\"token operator\">/</span> kv_cache_time\n    \n    <span class=\"token comment\"># 3. 8-bit 양자화</span>\n    quant8_time<span class=\"token punctuation\">,</span> quant8_memory <span class=\"token operator\">=</span> benchmark_quantization<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">,</span> bits<span class=\"token operator\">=</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"quant8\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"time\"</span><span class=\"token punctuation\">:</span> quant8_time<span class=\"token punctuation\">,</span> <span class=\"token string\">\"memory\"</span><span class=\"token punctuation\">:</span> quant8_memory<span class=\"token punctuation\">}</span>\n    \n    <span class=\"token comment\"># 4. 4-bit 양자화</span>\n    quant4_time<span class=\"token punctuation\">,</span> quant4_memory <span class=\"token operator\">=</span> benchmark_quantization<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">,</span> bits<span class=\"token operator\">=</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"quant4\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"time\"</span><span class=\"token punctuation\">:</span> quant4_time<span class=\"token punctuation\">,</span> <span class=\"token string\">\"memory\"</span><span class=\"token punctuation\">:</span> quant4_memory<span class=\"token punctuation\">}</span>\n    \n    <span class=\"token comment\"># 5. Speculative Decoding</span>\n    spec_time <span class=\"token operator\">=</span> benchmark_speculative<span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">)</span>\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"speculative\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> spec_time\n    results<span class=\"token punctuation\">[</span><span class=\"token string\">\"speculative_speedup\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> baseline_time <span class=\"token operator\">/</span> spec_time\n    \n    <span class=\"token keyword\">return</span> results</code></pre></div>\n<h2 id=\"10-결론\" style=\"position:relative;\"><a href=\"#10-%EA%B2%B0%EB%A1%A0\" aria-label=\"10 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10. 결론</h2>\n<p>LLM 추론 최적화는 다양한 기법을 조합하여 수행한다. 이 글에서 다룬 내용:</p>\n<ol>\n<li><strong>KV Cache</strong>: 반복 계산 제거로 속도 향상</li>\n<li><strong>Quantization</strong>: 메모리 사용량 감소 (4-bit, 8-bit)</li>\n<li><strong>Speculative Decoding</strong>: 병렬 처리로 생성 속도 향상</li>\n<li><strong>배치 처리</strong>: 동적 배치, Continuous Batching</li>\n<li><strong>모델 병렬화</strong>: Pipeline, Tensor Parallelism</li>\n<li><strong>Flash Attention</strong>: 메모리 효율적인 Attention 계산</li>\n</ol>\n<p>이러한 기법들을 적절히 조합하면 프로덕션 환경에서 LLM을 효율적으로 서빙할 수 있다.</p>\n<h2 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" aria-label=\"참고 자료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료</h2>\n<ul>\n<li><a href=\"https://github.com/vllm-project/vllm\">vLLM: High-Throughput LLM Serving</a></li>\n<li><a href=\"https://github.com/Dao-AILab/flash-attention\">Flash Attention</a></li>\n<li><a href=\"https://github.com/IST-DASLab/gptq\">GPTQ: Accurate Post-Training Quantization</a></li>\n<li><a href=\"https://arxiv.org/abs/2211.17192\">Speculative Decoding</a></li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#llm-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94---kv-cache-quantization-speculative-decoding\">LLM 추론 최적화 - KV Cache, Quantization, Speculative Decoding</a></p>\n<ul>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#1-llm-%EC%B6%94%EB%A1%A0%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%A1%B0\">1. LLM 추론의 기본 구조</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#1-1-transformer-%EC%B6%94%EB%A1%A0-%EA%B3%BC%EC%A0%95\">1-1. Transformer 추론 과정</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#1-2-%EC%B6%94%EB%A1%A0%EC%9D%98-%EB%B3%91%EB%AA%A9-%EC%A7%80%EC%A0%90\">1-2. 추론의 병목 지점</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#2-kv-cache-%EC%B5%9C%EC%A0%81%ED%99%94\">2. KV Cache 최적화</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#2-1-kv-cache-%EA%B0%9C%EB%85%90\">2-1. KV Cache 개념</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#2-2-kv-cache-%EA%B5%AC%ED%98%84-%EC%83%81%EC%84%B8\">2-2. KV Cache 구현 상세</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#2-3-kv-cache-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90\">2-3. KV Cache 성능 비교</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#3-quantization-%EC%96%91%EC%9E%90%ED%99%94\">3. Quantization (양자화)</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#3-1-%EC%96%91%EC%9E%90%ED%99%94-%EA%B0%9C%EB%85%90\">3-1. 양자화 개념</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#3-2-%EB%8F%99%EC%A0%81-%EC%96%91%EC%9E%90%ED%99%94\">3-2. 동적 양자화</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#3-3-gptq-%EC%96%91%EC%9E%90%ED%99%94\">3-3. GPTQ 양자화</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#3-4-%EC%96%91%EC%9E%90%ED%99%94-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90\">3-4. 양자화 성능 비교</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#4-speculative-decoding\">4. Speculative Decoding</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#4-1-speculative-decoding-%EA%B0%9C%EB%85%90\">4-1. Speculative Decoding 개념</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#4-2-%EB%B3%91%EB%A0%AC-speculative-decoding\">4-2. 병렬 Speculative Decoding</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#5-%EB%B0%B0%EC%B9%98-%EC%B2%98%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94\">5. 배치 처리 최적화</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#5-1-%EB%8F%99%EC%A0%81-%EB%B0%B0%EC%B9%98-%EC%B2%98%EB%A6%AC\">5-1. 동적 배치 처리</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#5-2-continuous-batching\">5-2. Continuous Batching</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#6-%EB%AA%A8%EB%8D%B8-%EB%B3%91%EB%A0%AC%ED%99%94\">6. 모델 병렬화</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#6-1-pipeline-parallelism\">6-1. Pipeline Parallelism</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#6-2-tensor-parallelism\">6-2. Tensor Parallelism</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#7-flash-attention\">7. Flash Attention</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#7-1-flash-attention-%EA%B5%AC%ED%98%84\">7-1. Flash Attention 구현</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#8-%EC%8B%A4%EC%A0%84-%ED%86%B5%ED%95%A9-%EC%98%88%EC%A0%9C\">8. 실전 통합 예제</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#8-1-%EC%B5%9C%EC%A0%81%ED%99%94%EB%90%9C-%EC%B6%94%EB%A1%A0-%EC%84%9C%EB%B2%84\">8-1. 최적화된 추론 서버</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#9-%EC%84%B1%EB%8A%A5-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%81%AC\">9. 성능 벤치마크</a></p>\n<ul>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#9-1-%EC%A2%85%ED%95%A9-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90\">9-1. 종합 성능 비교</a></li>\n</ul>\n</li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#10-%EA%B2%B0%EB%A1%A0\">10. 결론</a></li>\n<li><a href=\"/ai/LLM-%EC%B6%94%EB%A1%A0-%EC%B5%9C%EC%A0%81%ED%99%94-KV-Cache-Quantization-Speculative-Decoding/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\">참고 자료</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":285},"fields":{"slug":"/ai/LLM-추론-최적화-KV-Cache-Quantization-Speculative-Decoding/","image":null,"faq":[]},"frontmatter":{"title":"LLM 추론 최적화 - KV Cache, Quantization, Speculative Decoding","date":"2025년 11월 28일","dateISO":"2025-11-28T00:00:00.000Z","updatedISO":null,"category":"ai","description":"LLM 추론 성능을 최적화하는 핵심 기술들을 실전 예제와 함께 정리합니다. KV Cache, Quantization, Speculative Decoding, 배치 처리, 모델 병렬화 등 모든 최적화 기법을 다룹니다.","tags":["LLM","추론 최적화","KV Cache","Quantization","Speculative Decoding","AI","성능 최적화","모델 서빙"]}}},"pageContext":{"slug":"/ai/LLM-추론-최적화-KV-Cache-Quantization-Speculative-Decoding/","previous":{"fields":{"slug":"/etc/Docker와-Kubernetes-실전-배포-가이드/"},"frontmatter":{"title":"Docker와 Kubernetes 실전 배포 가이드","tags":["Docker","Kubernetes","컨테이너","DevOps","배포","인프라","클라우드"]}},"next":{"fields":{"slug":"/ai/AI-코딩-어시스턴트-실전-활용-Cursor와-GitHub-Copilot으로-개발-생산성-극대화하기/"},"frontmatter":{"title":"AI 코딩 어시스턴트 실전 활용 Cursor와 GitHub Copilot으로 개발 생산성 극대화하기","tags":["AI 코딩","Cursor","GitHub Copilot","개발 생산성","코드 생성","AI","프로그래밍"]}}}},"staticQueryHashes":["213619243","3262363727"]}