←Back to Science Coding Hub/Part I/I2
I2Medium★ Core Essential · Industrial BedrockPart I · Inference, Decoding & Quantization

LLM Generation Sampler (Temperature, Top-K & Top-P)

Industrial-grade implementation and mathematical foundations of LLM Generation Sampler (Temperature, Top-K & Top-P).

⏱️ Time Complexity: O(V log V) 排序开销,V 为词表大小
💾 Space Complexity: O(V)
💡

Core Mental Anchor / Mnemonic

Master LLM Generation Sampler (Temperature, Top-K & Top-P): enforce numerical stability, check tensor shapes, and eliminate redundant memory allocations.

📐 Mathematical Derivation & Core Formula

Pi=ezi/T∑jezj/T,∑i∈TopPPi≥p,TopK:i≤KP_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}, \quad \sum_{i \in \mathrm{TopP}} P_i \ge p, \quad \mathrm{TopK}: i \le K
### Mathematical Derivation & Theoretical Principles
Detailed first-principles formulation and architectural mechanics for LLM Generation Sampler (Temperature, Top-K & Top-P).

Refer to the LaTeX equation above for the core operator definition. The operator is designed to ensure strict numerical bounds, avoiding floating-point overflows and gradient anomalies.

🔄 Tensor Dimensions & Shape Flow

logits -> 除以 T -> Top-K 截断为 -inf -> Softmax -> Top-P 累计截断并重归一化 -> random.choice 抽取 token_id

🛡️ Industrial Numerical Stability & Pitfalls

  • Ensure proper multi-dimensional tensor broadcasting and keepdims retention.
  • Enforce numerical guards (eps clamping and overflow thresholds) during exponentiation and division.
  • Verify train versus eval mode behavioral distinctions (e.g. frozen running statistics and dropout bypass).

💻 Industrial Code Implementation

import numpy as np

def sample_next_token(
    logits: np.ndarray,      # (vocab_size,) 未归一化预测
    temperature: float = 0.7,
    top_k: int = 50,
    top_p: float = 0.9
) -> int:
    # 1. 贪心特例
    if temperature == 0.0:
        return int(np.argmax(logits))
        
    # 2. 温度缩放
    scaled_logits = logits / temperature
    
    # 3. Top-K 截断
    if top_k > 0 and top_k < len(scaled_logits):
        # 寻找第 top_k 个最大值的阈值
        kth_val = np.partition(scaled_logits, -top_k)[-top_k]
        scaled_logits[scaled_logits < kth_val] = -np.inf
        
    # 4. Softmax 转换为有效概率分布
    max_l = np.max(scaled_logits)
    exp_l = np.exp(scaled_logits - max_l)
    probs = exp_l / np.sum(exp_l)
    
    # 5. Top-P (核采样) 截断
    if top_p < 1.0:
        sorted_indices = np.argsort(-probs)
        sorted_probs = probs[sorted_indices]
        cumulative_probs = np.cumsum(sorted_probs)
        
        # 找到累计概率刚刚超过 top_p 的位置
        cutoff_mask = cumulative_probs > top_p
        # 保证至少保留第 1 个最高概率词
        cutoff_mask[0] = False
        
        # 剔除截断之外的词
        filtered_indices = sorted_indices[cutoff_mask]
        probs[filtered_indices] = 0.0
        # 重新归一化
        probs = probs / np.sum(probs)
        
    # 6. 多项分布随机采样抽签
    return int(np.random.choice(len(probs), p=probs))

🧪 Runnable Assertions & Validation

Copy and run directly in Python / Jupyter to verify correctness:

import numpy as np
logits = np.array([10.0, 9.0, 1.0, 0.0])
# 贪心模式必定选第 0 个
assert sample_next_token(logits, temperature=0.0) == 0
# Top-K=1 等价于贪心
assert sample_next_token(logits, temperature=1.0, top_k=1) == 0
print("✓ 大模型生成采样器自测通过")

🎯 Core Architecture Follow-up Q&A

Q1:What are the key trade-offs and memory bottlenecks when deploying LLM Generation Sampler (Temperature, Top-K & Top-P) in high-throughput inference?
Memory bandwidth (HBM to SRAM I/O) is the primary latency factor. Fusing element-wise operations and avoiding intermediate tensor materialization significantly outperforms naive implementations.
Q2:How does LLM Generation Sampler (Temperature, Top-K & Top-P) handle extreme numerical boundaries or precision reduction (FP16/BF16/INT8)?
Under low precision, operations must be upcasted to FP32 during accumulation to prevent underflow/overflow, followed by proper scaling and clamping before converting back to the target format.
←Prev: INT8 Affine & Symmetric QuantizationAll 69 KernelsNext: Speculative Decoding Verification & Accept/Reject→