page contents

Python 3.15:Linux 先行,Windows 暂缺

LinearCrossEntropyLoss将该线性投影与交叉熵损失的计算融合为一个算子,避免显式生成完整的 logits 张量。官方数据显示,在大词表场景下,峰值显存占用约为原来的四分之一。该功能主要适用于训练阶段。推理时由于通常不涉及交叉熵损失的计算,因此无法获得此收益。

attachments-2026-07-n8L7Ha846a4f019c84705.pngPyTorch 2.13 开始支持 Python 3.15,但是暂时只支持 Linux:

• Linux(x86 / aarch64):CPU、CUDA、ROCm、XPU 均提供了 Python 3.15 的 wheel 包,包含 free-threaded 模式的 3.15t 构建。

• Windows:尚未提供 Python 3.15 的 wheel 包。PyTorch 官方安装页面显示 Windows 平台仍仅支持 Python 3.10 至 3.14,如需使用 Python 3.15 需等待后续版本或 nightly 构建。

此外,Python 3.13t(free-threaded)的 Linux wheel 已被移除,上游 manylinux 已将其替换为 3.14t,建议原有用户迁移至 3.14t 或 3.15t。

新增实用功能

nn.LinearCrossEntropyLoss合并线性投影与交叉熵损失

背景:训练语言模型时,最后一层通常需要将隐藏状态通过nn.Linear投影到词表维度,再计算交叉熵损失。此过程中会实例化一个形状为[batch, seq_len, vocab_size]的 logits 张量,当词表规模较大(如 3 万至 10 万)时,该张量会占用数 GB 显存,且前向和反向传播均需保留,显著增加显存峰值。

LinearCrossEntropyLoss将该线性投影与交叉熵损失的计算融合为一个算子,避免显式生成完整的 logits 张量。官方数据显示,在大词表场景下,峰值显存占用约为原来的四分之一。该功能主要适用于训练阶段。推理时由于通常不涉及交叉熵损失的计算,因此无法获得此收益。

# 传统方式
head = nn.Linear(hidden_size, vocab_size, bias=False)
logits = head(hidden)   # 产生完整 logits 张量
loss = F.cross_entropy(logits.view(-1, vocab_size), labels)

# PyTorch 2.13
criterion = nn.LinearCrossEntropyLoss(head)
loss = criterion(hidden, labels)  # 不物化完整 logits

注:该功能对于词表较小的分类任务(如 1000 类)收益有限;主要适用于词表超过 5 万的 LLM 或 MoE 模型。

torch.func.rearrange函数

背景:深度学习代码中常需要调整张量形状。PyTorch 原生提供了view、reshape、permute、transpose、flatten等原语,但它们存在两个问题:

• 语义不够直观。例如permute(0, 2, 3, 1)仅通过下标指定顺序,读者必须回头查看原始张量的各维含义才能理解变换结果。

• 复杂变换步骤繁琐。若要拆分或合并某一维(如将[batch, seq, num_heads * head_dim]拆成[batch, seq, num_heads, head_dim]),往往需要依次调用reshape和permute,稍有不慎就会出错。

einops 的解决方案:第三方库einops提出了一种基于字符串模板的描述方式,将变换逻辑浓缩在一行表达式中。它的三个核心操作:rearrange(重排/拆分/合并)、reduce(归约)、repeat(重复扩维)。这样的表达可提升代码的可读性和容错性。

# 传统写法
y = x.permute(0, 2, 3, 1)   # 下标难读

# einops 写法
y = rearrange(x, "b c h w -> b h w c")  # 维度名称一目了然

torch.func.rearrange实现了 einops 中最常用的 rearrange语义,其功能与 einops 的rearrange基本一致,支持括号拆分、合并、重排序等操作。PyTorch 2.13 起,torch.func.rearrange被提升为正式支持的公共接口。

import torch
from torch.func import rearrange

# 示例1:通道交换(NCHW -> NHWC)
x = torch.randn(2, 3, 224, 224)
y = rearrange(x, "b c h w -> b h w c")

# 示例2:拆分最后一维(多头注意力常用)
x = torch.randn(2, 10, 64)
y = rearrange(x, "b s (h d) -> b s h d", h=8)

# 示例3:合并两个维度
x = torch.randn(2, 8, 20, 30)
y = rearrange(x, "b h w c -> b (h w) c")

注意:若项目中已重度使用einops的reduce和repeat,或需要在不同深度学习框架间共享同一套变换逻辑,仍可继续使用原版einops库。torch.func.rearrange更适合那些仅需rearrange语义、希望减少依赖的场景。

torch.dtype.abbr属性

该属性返回数据类型的缩写字符串,例如torch.float16.abbr返回 "f16",torch.float32.abbr返回 "f32",torch.bfloat16.abbr返回 "bf16"。

这个属性可用于编写日志、拼接实验文件名或保存检查点元数据。

torch.load能直接加载safetensors格式

safetensors是一种面向机器学习权重文件设计的序列化格式,核心优势有两点:一是零拷贝加载,映射文件即可使用,避免反序列化阶段的内存复制开销;二是安全,其数据模型不包含可执行代码,不存在 Python pickle机制下可能出现的任意代码执行风险。该格式目前由 PyTorch 基金会托管,已成为模型权重存储的主流选择,在 Hugging Face Hub 上的公开模型中覆盖率极高,transformers、diffusers等库下载的权重文件多数采用.safetensors后缀。

此前,加载.safetensors文件需要额外安装safetensors库并调用 safetensors.torch.load_file()。自 2.13 版本起,可直接使用 torch.load("model.safetensors")加载,无需额外依赖。

# 之前:需要先安装 safetensors 库
# from safetensors.torch import load_file
# ckpt = load_file("model.safetensors")

# 2.13 起
ckpt = torch.load("model.safetensors")   # 直接读,不用 safetensors 依赖

注意:torch.save尚不支持直接写入safetensors格式,当前仅实现了读取功能,是"能读不能写"单向打通。

需注意的破坏性变更

完全移除了named tensor功能

Tensor.names、rename()、refine_names()、align_to()、torch.zeros(..., names=...) 等与命名张量相关的接口已被彻底删除。该功能历经多年实验阶段后未被正式采纳,曾使用该功能的用户需改用基于维度的位置索引方式。

自定义算子返回值与输入张量别名时将发出警告

若自定义函数的返回值与某个输入张量指向同一内存地址(即别名关系),现在会触发警告,未来版本将变为错误。建议修改为返回副本:

# 原写法(PyTorch 2.13引发警告,以后会报错)
def f(x):
    x[0] = 1
    return x

# 修正写法
def f(x):
    y = x.clone()
    y[0] = 1
    return y

升级建议

• Python版本 :Linux 用户可升级至 Python 3.15(含 free-threaded 的 3.15t),原使用 3.13t 者需迁至 3.14t;Windows 用户仍应锁定 Python 3.10 至 3.14 版本。

• 大词表 LLM 训练:推荐试用nn.LinearCrossEntropyLoss,可降低显存占用。

• 使用 named tensor 的代码:请在升级前修改代码,否则升级后将出现AttributeError。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

  • 发表于 2026-07-09 10:04
  • 阅读 ( 42 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2251 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 2251 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章