惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
J
Java Code Geeks
博客园 - 聂微东
量子位
C
Check Point Blog
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
B
Blog
罗磊的独立博客
腾讯CDC
GbyAI
GbyAI
博客园 - 【当耐特】
A
About on SuperTechFans
M
MIT News - Artificial intelligence
U
Unit 42
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队

博客园 - marsggbo

GPU 算力没在算模型,在等 CPU 发号施令——CUDA Graph 是怎么解决这件事的 推理模型做 decode,GPU 只有 3% 在干活——SparseSpec 把稀疏 Attention 变成了 2.1× 加速 vllm v1 源码精读(三):KV Cache 管理、Chunked Prefill 与异步架构 vllm v1 源码精读(二):generate() 计算流——model.forward() 在哪里被调用? vllm v1 源码精读(一):为什么要重写,以及 LLM() 这行代码背后发生了什么 160 个 AI 比 80 个效果更差?这篇论文量化了一件大家隐约知道但说不清楚的事 ICLR'25 | SWIFT:不训练不搜索,Self-Speculative Decoding 的即插即用版 2025 | SSD for dLLMs:扩散语言模型也能用推测解码,最高 3.46× arXiv'26 | SSD for ASR:用 CTC 编码器打草稿,LLM 验证,语音识别也能推测解码 WWW'26 | SS-MoE:显存墙下的 MoE 推理,Self-Speculative Decoding 怎么救场? EMNLP'23 | 不用额外模型,LLM 自己给自己加速——Self-Speculative Decoding 原理详解 ACL'24 | LayerSkip:Meta 把 Self-Speculative Decoding 从头训到尾,直接干到 2.16× 从图像到文本:Diffusion 模型原理全解——数学、结构、训练、推理一次讲清 贝叶斯优化从零推导:从「我对这个函数有个猜测」到自动调参 长音频转写慢 10 倍,99% 的 Attention 在白做功——MURMUR 如何破解这道难题 2026 | dLLM-ASR 让语音识别推理快 4.44 倍,还不掉精度 公司里那个一言不发的马尾辫大叔,现在被装进了你的 AI agent 里 SpecASR:ASR 专属 Speculative Decoding,让 LLM 语音识别快 3.79 倍 COLM'25 | PredGen:你还在说话,LLM 已经想好怎么回了 LLM agent 为什么不稳?问题可能不在模型,在 harness Meta-Harness:让 LLM 自己搜索最优 harness,模型不动,性能白涨 从零理解 ASR:音频基础、Qwen3-ASR 架构,以及离线 vs 流式推理原理 arXiv'26 | LLM Agents 让群体信念变得可编程:当 AI 开始系统性操控舆论 巴西「主权大模型」翻车:当模型可以随便融合,怎么证明它偷了你的权重? 进阶篇 | 不靠人工设计,让遗传算法自己进化出 SOTA 的 LLM 剪枝指标 说人话:一文搞懂现在火热的 LLM agent 自进化原理 ICML'26 | Transformer 真的需要三个投影矩阵吗?Q-K=V 让 KV Cache 直接砍半 UPenn & Meta | NF-CoT:当 LLM 的思维链不再是文字,而是连续概率流 arXiv'26 | 为什么你的多智能体系统越加 agent 越慢?DeLM 用去中心化解了这个矛盾 arXiv'26 | Self-Harness:让 Agent 自己改自己的 harness,pass rate 最高翻倍
Huggingface Transformers实现张量并行的小坑 set/get_output...
marsggbo · 2024-05-06 · via 博客园 - marsggbo

transformers 库里实现的很多模型会有这么两个函数 get_output_embeddingsget_output_embeddings。以 SwitchTransformer 为例

class SwitchTransformersForConditionalGeneration(SwitchTransformersPreTrainedModel):
    def set_output_embeddings(self, new_embeddings):
        self.lm_head = new_embeddings
    def get_output_embeddings(self):
        return self.lm_head

默认情况下,大模型的输入和输出的 vocab 是保持一致的,所以如果传入的 embedding 的大小变化了,默认也会让 lm_head 发生变化。

但是在实现张量并行的时候,我们通常会使用如下方式来初始化lm_head

from fairscale.nn.model_parallel.layers import (
    ParallelEmbedding,
    RowParallelLinear,
    ColumnParallelLinear
)
default_linear_init = functools.partial(nn.init.kaiming_uniform_, a=math.sqrt(5))
def __init__(self, ...):
    self.lm_head = ColumnParallelLinear(config.d_model, config.vocab_size, bias=False, init_method=default_linear_init)

换言之,在多 GPU 张量并行下,每张卡上 lm_head 的输出维度就不再是原来的 vocab_size 了,而是 vocab_size/#gpus。所以一种粗暴的解决办法就是把get_output_embeddings的输出改为 None 即可,如下:

    def get_output_embeddings(self):
        return None # PretrainedModel.tie_weights 函数会将 lm_head 绑定为 shared 参数,导致张量并行情况下 lm_head 参数发生不匹配的错误