news 2026/6/15 16:12:56

【】什么是 MoE(混合专家模型)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【】什么是 MoE(混合专家模型)

什么是专家

“专家”不是 GPU,而是 MoE(混合专家模型)中的专家子网络,GPU 是承载这些专家的计算设备。

具体来说:

  • 专家(Expert):是 MoE 模型中的子网络模块(比如独立的前馈网络 FFN),每个专家负责处理特定类型的任务 / 数据(比如 “数学专家”“代码专家”)。
  • GPU:是硬件设备,多个专家会被分配到不同的 GPU 上(通过 “专家并行” 策略),一个 GPU 可以承载多个专家,一个专家也可以部署在单个 GPU 上。

举个例子:图中expert_indices = [1, 5]指的是 “选择第 1、5 号专家子网络”,而这些专家可能分布在不同的 GPU 上(需要通过 NVLink/RDMA 在 GPU 间通信)。

MoE 中 “专家” 与 GPU 的对应关系

场景

专家与 GPU 的对应

典型适用场景

多专家共享 GPU

1 GPU → N 个专家

小模型 MoE

单专家独占 GPU

1 GPU → 1 个专家

大模型 MoE

单专家跨多 GPU

N GPU → 1 个专家

超大规模 MoE

Buffer 在 MoE 中的作用

MoE 的核心逻辑是 “多个专家(Expert)并行计算,通过门控(Gating)选择部分专家处理输入”,这个过程中会频繁用到 buffer,且有明确的场景指向,因此成为 MoE 实现中的关键组件:

1. 专家输入 / 输出的聚合与拆分 buffer

MoE 中,输入数据会被门控分成 “不同专家的专属数据分片”(比如:输入 batch 中的 100 个样本,门控选择让专家 1 处理 30 个、专家 2 处理 40 个、专家 3 处理 30 个)。

  • 拆分时:需要先把完整输入张量存到一个 buffer 中,按门控的选择结果,将 buffer 中的数据拆分到对应专家的局部 buffer;
  • 聚合时:每个专家处理完自己的分片后,将输出存到各自的 buffer,再汇总到一个全局 buffer 中,拼接成完整的输出张量。这里的 buffer 是解决 “输入拆分 - 专家并行 - 输出聚合” 流程的核心载体。
2. 分布式 MoE 中的通信 buffer

大模型 MoE 通常是 “张量并行 + 专家并行” 结合(比如:专家分布在不同 GPU / 节点上),此时需要跨设备 / 节点传输数据,buffer 的作用更关键:

  • 比如你之前问的 All-to-All 通信:在分布式 MoE 中,输入数据要通过 All-to-All 传输到对应专家所在的设备,传输前会把 “每个设备要发送给其他设备的专家数据” 整理到通信 buffer 中,再通过torch.distributed或 NCCL 发送,接收方则用 buffer 接收数据后再分发给本地专家。
  • 门控权重的传输:门控的输出(选择哪个专家的权重)也需要通过 buffer 临时存储,再同步给所有专家节点,避免频繁小数据传输。
3. 稀疏激活的临时 buffer

MoE 是 “稀疏激活” 模型(每次只激活部分专家,而非全部),稀疏性会导致数据分布不规则(比如不同专家处理的样本数量差异大)。为了避免频繁申请 / 释放内存,MoE 会预先分配固定大小的 buffer,专门存储稀疏激活的专家输入 / 输出、门控的中间结果,减少内存碎片和调度开销。

怎么理解 张量 这个概念?

张量本质就是多维数组。

简化理解时可以说 “张量≈多维数组”,但严格来说,张量是 “支持线性代数运算的多维数组”

1. 从简单到复杂:张量的维度对应

  • 0 维张量(标量):单个数字,比如3(温度、年龄),没有维度。
  • 1 维张量(向量):一串数字,比如[1,2,3](坐标(x,y,z)),维度是(3,)
  • 2 维张量(矩阵):表格型数据,比如[[1,2],[3,4]](Excel 表格的一行一列),维度是(2,2)
  • 3 维张量:堆叠的矩阵,比如[[[1,2],[3,4]], [[5,6],[7,8]]](比如一张 “2×2 像素、3 个颜色通道” 的图片),维度是(2,2,2)
  • N 维张量:更高维度的堆叠,比如 “视频” 是 “时间序列 + 图片”,维度可能是(10秒, 1080像素, 1920像素, 3通道)

deepEP 中张量内容详解

x[0, :] # 第1个令牌的128维特征向量

x[5, :] # 第6个令牌的特征向量

x[:, 0] # 所有令牌的第1个特征值

x[:, 127] # 所有令牌的第128个特征值

张量就是需要在不同专家之间进行分发和组合的核心数据载体。

2 为什么 AI 里离不开张量?

因为 AI 模型(比如神经网络)处理的是 “批量、多维的数据”:

  • 输入图片:(批量大小, 高度, 宽度, 通道数)(4 维张量);
  • 文本数据:(批量大小, 句子长度, 词向量维度)(3 维张量);
  • 模型参数:比如神经网络的权重是(输入维度, 输出维度)(2 维张量)。

简单说:张量就是 “能装多维数据的数组”,是 AI 里统一处理 “标量 / 向量 / 矩阵 / 更高维数据” 的工具

举个例子:

  • 普通多维数组(比如 Python 的list嵌套):只是把数据按维度排列,不能直接做矩阵乘法、转置等线性代数操作;
  • 张量(比如 PyTorch 的torch.Tensor):不仅是多维数据的存储形式,还内置了向量点积、矩阵相乘、张量收缩等数学运算,这也是它能成为 AI 模型核心数据结构的原因。

什么是前向 后向?

阶段

核心目标

MOE 特有的关键动作

前向(Forward)

从输入数据出发,通过专家计算,输出预测结果(如分类、回归)

1. 路由(Routing):判断每个样本该交给哪些专家;2. Dispatch(分发):将样本分发到对应专家;3. Combine(组合):聚合专家输出,得到最终结果

后向(Backward)

从预测误差出发,计算每个参数的梯度,更新专家权重(优化模型)

1. 梯度拆分:将最终误差梯度,按前向路由规则拆分给对应专家;2. 专家梯度计算:每个专家独立计算自身参数的梯度;3. 梯度聚合:收集所有专家的梯度,用于全局参数更新

不论是前向还是后向,都需要经过Dispatch 和 Combine 步骤

  • 前向 Dispatch:数据分发 → 反向 Combine:梯度分发
  • 前向 Combine:结果组合 → 反向 Dispatch:梯度组合

这就是 MoE 中的特殊对称性

通俗例子:做题(类比 MOE 训练流程)

假设场景:

  • 「输入数据」= 10 道数学题(有代数、几何、概率题);
  • 「MOE 模型」= 1 个班主任(路由模块)+ 3 个专科老师(专家:代数专家、几何专家、概率专家);
  • 「训练目标」:让老师团队(MOE)学会做这 10 道题(降低错题率)。
1. 前向过程(做题→批改出结果)
  1. 路由(班主任分配任务):班主任(路由模块)看每道题的类型,决定交给对应专家(稀疏性:1 道题只交 1 个专家,避免冗余):
    • 题 1(代数)→ 代数专家;题 2(几何)→ 几何专家;题 3(概率)→ 概率专家;... 题 10(代数)→ 代数专家。(工程上:路由模块是一个小型神经网络,输出每个样本对专家的 “匹配分数”,取 Top-1/Top-2 专家)。
  1. Dispatch(分发题目):班主任把 10 道题按类型分发给 3 个专家(对应 DeepEP 的 dispatch 动作):
    • 代数专家拿到题 1、题 10;几何专家拿到题 2、题 5;概率专家拿到题 3、题 4、... 题 9。
  1. 专家计算(老师解题):每个专家独立处理自己的题目(并行计算,对应 EP 模式的核心优势):
    • 代数专家算出题 1 答案 = A、题 10 答案 = C;几何专家算出题 2 答案 = B;...
  1. Combine(组合结果):班主任收集所有专家的答案,整理成 “10 道题的完整答案”(对应 DeepEP 的 combine 动作),这就是 MOE 的「前向输出」。
  2. 计算误差:对比 “完整答案” 和 “标准答案”,发现 3 道题做错了(题 1、题 3、题 8),误差 = 3(这是后续后向传播的依据)。
2. 后向过程(分析错题→优化教学方法)
  1. 梯度拆分(班主任定位错题责任):既然误差来自 3 道错题,按前向的分配规则,把 “纠错责任” 拆给对应专家:
    • 题 1(代数题错)→ 代数专家;题 3(概率题错)→ 概率专家;题 8(几何题错)→ 几何专家。(工程上:误差梯度按前向路由的权重拆分,只流向参与计算的专家,稀疏梯度减少通信开销)。
  1. 专家梯度计算(老师反思错题原因):每个专家独立分析自己的错题,找到 “教学漏洞”(对应计算自身参数的梯度):
    • 代数专家:题 1 错是因为 “公式应用错误”→ 需优化 “代数公式参数”;
    • 概率专家:题 3 错是因为 “概率公式记错”→ 需优化 “概率模型参数”。
  1. 梯度聚合(汇总优化方案):班主任收集所有专家的 “教学漏洞”(梯度),统一更新 “教学大纲”(模型全局参数,如路由模块参数、专家共享层参数)。
  2. 参数更新(调整教学方法):每个专家根据自己的梯度,修改自己的 “教学内容”(更新专家自身的权重);班主任也根据路由误差,调整 “题目分配规则”(优化路由模块)。

→ 重复前向 + 后向,直到错题率降低到目标(模型训练完成)。

------------------------------------------------------------------------------over----------------------------------------------------------------------

PyTorch 中张量操作

以下是 PyTorch 中张量维度的高频操作示例,覆盖维度创建、查看、变形、拼接、拆分等核心场景,结合实际数据场景(如图片、文本)讲解,方便理解:

一、基础:创建不同维度的张量

先从 0 维到 5 维张量的创建入手,对应之前的 “数据场景”:

python

运行

import torch # 0维张量(标量):单个数值 scalar = torch.tensor(3.14) print("0维张量:", scalar, "维度:", scalar.ndim, "形状:", scalar.shape) # 输出:0维张量: tensor(3.1400) 维度: 0 形状: torch.Size([]) # 1维张量(向量):单条文本特征(长度为5的词向量) vector = torch.tensor([1, 2, 3, 4, 5]) print("1维张量:", vector, "维度:", vector.ndim, "形状:", vector.shape) # 输出:1维张量: tensor([1, 2, 3, 4, 5]) 维度: 1 形状: torch.Size([5]) # 2维张量(矩阵):单张灰度图(5×5像素) matrix = torch.randn(5, 5) # 随机生成5×5矩阵 print("2维张量:", matrix.shape) # 输出:torch.Size([5, 5]) # 3维张量:单张彩色图(高×宽×通道:224×224×3) img_3d = torch.randn(224, 224, 3) print("3维张量:", img_3d.shape) # 输出:torch.Size([224, 224, 3]) # 4维张量:批量图片(批量数×高×宽×通道:32张×224×224×3) img_batch_4d = torch.randn(32, 224, 224, 3) print("4维张量:", img_batch_4d.shape) # 输出:torch.Size([32, 224, 224, 3]) # 5维张量:批量视频(批量数×时间帧×高×宽×通道:8个视频×100帧×224×224×3) video_5d = torch.randn(8, 100, 224, 224, 3) print("5维张量:", video_5d.shape) # 输出:torch.Size([8, 100, 224, 224, 3])

二、核心操作:维度变形(reshape/permute/unsqueeze/squeeze)

张量维度变形是 AI 中最常用的操作(比如调整图片维度顺序、增加 / 减少维度):

1. reshape:改变维度形状(不改变数据顺序)

python

运行

# 把1维向量(10个元素)变成2维矩阵(2×5) vec = torch.arange(10) # [0,1,2,3,4,5,6,7,8,9] mat = vec.reshape(2, 5) print("reshape后:", mat.shape) # 输出:torch.Size([2, 5]) # 批量图片变形:把4维(32,224,224,3)变成(32, 224×224×3)(展平成特征向量) img_flat = img_batch_4d.reshape(32, -1) # -1表示自动计算维度 print("展平后:", img_flat.shape) # 输出:torch.Size([32, 150528])(224*224*3=150528)
2. permute:维度重排(改变维度顺序,关键!)

PyTorch 中图片常需要调整 “通道维度” 位置(比如从(H,W,C)(C,H,W)):

python

运行

# 3维彩色图:(224,224,3) → (3,224,224)(通道在前) img_3d_permute = img_3d.permute(2, 0, 1) print("permute后:", img_3d_permute.shape) # 输出:torch.Size([3, 224, 224]) # 4维批量图片:(32,224,224,3) → (32,3,224,224) img_batch_permute = img_batch_4d.permute(0, 3, 1, 2) print("批量图片permute后:", img_batch_permute.shape) # 输出:torch.Size([32, 3, 224, 224])
3. unsqueeze:增加维度(比如给标量加批量维度)

python

运行

# 0维标量 → 1维张量(增加批量维度,变成(1,)) scalar_unsqueeze = scalar.unsqueeze(0) print("增加维度后:", scalar_unsqueeze.shape) # 输出:torch.Size([1]) # 1维向量(5,) → 2维张量(1,5)(模拟“1个样本的5维特征”) vector_unsqueeze = vector.unsqueeze(0) print("向量加维度后:", vector_unsqueeze.shape) # 输出:torch.Size([1, 5])
4. squeeze:删除长度为 1 的维度(反向操作)

python

运行

# 2维张量(1,5) → 1维张量(5,) vector_squeeze = vector_unsqueeze.squeeze(0) print("删除维度后:", vector_squeeze.shape) # 输出:torch.Size([5])

三、进阶:维度拼接 / 拆分(cat/split/chunk)

1. cat:按指定维度拼接张量(比如合并两个批量的图片)

python

运行

# 生成两个批量图片:各16张,形状(16,224,224,3) batch1 = torch.randn(16, 224, 224, 3) batch2 = torch.randn(16, 224, 224, 3) # 按批量维度(第0维)拼接,得到32张图片 batch_cat = torch.cat([batch1, batch2], dim=0) print("拼接后批量:", batch_cat.shape) # 输出:torch.Size([32, 224, 224, 3]) # 按通道维度(第3维)拼接(模拟给图片加额外通道) img_cat_channel = torch.cat([img_3d, img_3d], dim=2) print("通道拼接后:", img_cat_channel.shape) # 输出:torch.Size([224, 224, 6])
2. split/chunk:按维度拆分张量(比如把 32 张图片拆成两个 16 张)

python

运行

# split:按指定长度拆分(拆成两个16张的批量) batch_split = batch_cat.split(16, dim=0) print("拆分后第一个批量:", batch_split[0].shape) # 输出:torch.Size([16, 224, 224, 3]) # chunk:按指定份数拆分(把32张拆成4份,每份8张) batch_chunk = batch_cat.chunk(4, dim=0) print("chunk拆分后每份:", batch_chunk[0].shape) # 输出:torch.Size([8, 224, 224, 3])

四、实用:获取维度信息(ndim/shape/size)

python

运行

# 查看维度数(ndim)、整体形状(shape)、指定维度长度(size(dim)) print("批量图片维度数:", img_batch_4d.ndim) # 输出:4 print("批量图片形状:", img_batch_4d.shape) # 输出:torch.Size([32, 224, 224, 3]) print("批量数(第0维):", img_batch_4d.size(0)) # 输出:32 print("高度(第1维):", img_batch_4d.size(1)) # 输出:224

关键总结

操作

核心作用

适用场景

reshape

改变维度形状(数据不变)

展平特征、调整矩阵尺寸

permute

重排维度顺序

调整图片通道位置(HWC→CHW)

unsqueeze

增加维度

给标量 / 向量加批量维度

squeeze

删除长度为 1 的维度

去除多余的批量维度

cat

拼接张量

合并多个批量、增加通道

split/chunk

拆分张量

批量数据分片、分布式处理

补充张量维度操作的避坑指南(比如 permute 和 reshape 的区别、维度索引越界问题)

PyTorch 张量维度操作避坑指南

张量维度操作是 AI 开发中高频出错点,核心坑点集中在「维度理解偏差」「操作逻辑混淆」「设备 / 数据类型不一致」三类,以下结合实际场景拆解避坑要点 + 解决方案:

一、核心避坑点:permute vs reshape(最易混淆)

坑点表现

误以为permutereshape都是 “改形状”,混用导致数据顺序错乱(比如图片变形后像素错位、模型输入维度匹配失败)。

本质区别

操作

核心逻辑

是否改变数据内存顺序

典型错误场景

reshape

仅重新划分维度(拼积木)

不改变

用 reshape 调整图片通道顺序(HWC→CHW)

permute

重排维度索引(换坐标轴)

改变

用 permute 把 (32,10) 改成 (10,32)(无意义)

避坑示例

python

运行

import torch # 错误示例:用reshape调整图片通道(结果:像素完全错位) img_hwc = torch.randn(224, 224, 3) # HWC格式 img_chw_wrong = img_hwc.reshape(3, 224, 224) print("reshape后维度:", img_chw_wrong.shape) # (3,224,224),但数据顺序错了 # 正确示例:用permute调整通道(仅换维度顺序,数据不变) img_chw_right = img_hwc.permute(2, 0, 1) print("permute后维度:", img_chw_right.shape) # (3,224,224),数据顺序正确

避坑原则

  • 仅调整 “维度形状”(比如把 (32,224,224,3) 展平成 (32, 150528))→ 用reshape
  • 调整 “维度顺序”(比如 HWC↔CHW、批量 / 时间维度互换)→ 用permute
  • 不确定时:打印张量前 3 个元素,对比操作前后是否符合预期。

二、维度索引越界(新手高频错)

坑点表现

报错IndexError: Dimension out of range (expected to be in range of [-N, N-1], but got X),比如给 4 维张量操作第 5 维。

核心原因

  • 张量维度索引从0 开始,且支持负索引(-1 = 最后一维);
  • 混淆 “维度数” 和 “维度索引”(比如 4 维张量的索引范围是 0~3,不是 1~4)。

避坑示例

python

运行

# 4维批量图片:(32,224,224,3) → 维度索引0(批量)、1(高)、2(宽)、3(通道) img_batch = torch.randn(32, 224, 224, 3) # 错误示例1:索引超出范围(4维张量最大索引是3,写4报错) # img_batch.permute(0,4,2,3) # 直接报错:IndexError # 错误示例2:负索引用错(-0=0,不是最后一维) # img_batch.unsqueeze(-0) # 等价于unsqueeze(0),非预期的“加通道维度” # 正确示例: print("最后一维(通道)索引:", img_batch.size(-1)) # 3(正确) img_batch_unsqueeze = img_batch.unsqueeze(-1) # 在最后加维度 → (32,224,224,3,1)

避坑原则

  1. 操作前先打印tensor.ndim确认维度数,再确定索引范围(0 ~ ndim-1);
  2. 优先用负索引表示 “最后一维”(比如dim=-1代替具体数字),避免维度数变化后出错;
  3. 复杂操作前先做 “小尺寸测试”(比如用 (2,2,3) 的小张量代替 (224,224,3))。

三、unsqueeze/squeeze 易错点

坑点 1:squeeze 删除所有长度为 1 的维度(非指定维度)

python

运行

# 张量形状:(1, 32, 1, 224) tensor = torch.randn(1, 32, 1, 224) # 错误:无参数squeeze会删除所有长度为1的维度 → (32,224) tensor_squeeze_wrong = tensor.squeeze() print(tensor_squeeze_wrong.shape) # (32,224) # 正确:指定维度删除 → 只删第0维,保留第2维 → (32,1,224) tensor_squeeze_right = tensor.squeeze(0) print(tensor_squeeze_right.shape) # (32,1,224)

坑点 2:unsqueeze 后维度顺序错乱(加维度位置错误)

python

运行

# 目标:把1维向量(768,) → 2维(1,768)(1个样本的768维特征) vec = torch.randn(768) # 错误:unsqueeze(1) → (768,1)(变成768个样本的1维特征,完全反了) vec_unsqueeze_wrong = vec.unsqueeze(1) print(vec_unsqueeze_wrong.shape) # (768,1) # 正确:unsqueeze(0) → (1,768) vec_unsqueeze_right = vec.unsqueeze(0) print(vec_unsqueeze_right.shape) # (1,768)

避坑原则

  • squeeze必须指定维度(除非明确要删除所有 1 维);
  • unsqueeze前先明确 “要加的维度在哪个位置”(比如批量维度在最前→dim=0,通道维度在最后→dim=-1)。

四、cat 拼接的核心坑:非拼接维度形状不一致

坑点表现

报错RuntimeError: Sizes of tensors must match except in dimension X,比如拼接两个形状不匹配的张量。

示例与解决方案

python

运行

# 错误示例:拼接维度0,但其他维度不一致(一个是(16,224,224),一个是(16,128,224)) batch1 = torch.randn(16, 224, 224) batch2 = torch.randn(16, 128, 224) # torch.cat([batch1, batch2], dim=0) # 报错:非拼接维度1的形状224≠128 # 正确:先统一非拼接维度形状(比如把batch2的高从128 resize到224) batch2_resize = torch.nn.functional.interpolate(batch2.unsqueeze(1), size=224, mode='nearest').squeeze(1) batch_cat = torch.cat([batch1, batch2_resize], dim=0) print(batch_cat.shape) # (32,224,224)(正确)

避坑原则

  1. 拼接前检查:除了拼接维度,其他所有维度的形状必须完全一致;
  2. 批量拼接(dim=0):确保所有张量的高、宽、通道数一致;
  3. 通道拼接(dim=-1):确保所有张量的批量、高、宽一致。

五、reshape 的隐形坑:维度乘积不匹配

坑点表现

报错RuntimeError: shape '[X,Y]' is invalid for input of size Z,比如把 10 个元素的张量 reshape 成 (3,4)(3×4=12≠10)。

避坑示例

python

运行

vec = torch.arange(10) # 10个元素 # 错误:3×4=12≠10 → 报错 # vec.reshape(3,4) # 正确:用-1让PyTorch自动计算(推荐) vec_reshape = vec.reshape(2, -1) # 2×5=10 → 自动算第2维为5 print(vec_reshape.shape) # (2,5)(正确)

避坑原则

  • 手动指定多维度时,先算 “所有维度的乘积” 是否等于张量总元素数(tensor.numel());
  • 优先用-1代替一个维度,让 PyTorch 自动计算,避免手动算错。

六、分布式 / 设备相关的维度坑(进阶)

坑点表现

在 MoE / 分布式训练中,张量拆分后维度不匹配(比如 All-to-All 通信后,各 GPU 张量维度不一致)。

避坑示例

python

运行

import torch.distributed as dist # 模拟分布式场景:2个GPU,拆分(8, 1024)张量到各GPU if dist.get_rank() == 0: tensor = torch.randn(8, 1024).cuda() # 错误:拆分长度8→5+3,导致GPU1的张量维度(3,1024),和GPU0的(5,1024)不兼容 # tensor_split = tensor.split([5,3], dim=0) # 正确:均匀拆分 → 8→4+4,各GPU张量维度一致 tensor_split = tensor.split(4, dim=0) else: tensor_split = torch.randn(4, 1024).cuda()

避坑原则

  1. 分布式拆分 / 拼接时,优先 “均匀拆分”(chunk代替split),确保各设备张量维度一致;
  2. 跨设备通信前,打印各设备张量的shapenumel(),确认匹配后再通信。

避坑总原则

  1. 小尺寸测试:复杂维度操作前,先用小张量(比如 (2,2,3))验证,再放大到实际尺寸;
  2. 步步打印:操作后立即打印shape,确认维度符合预期;
  3. 理解本质:记住 “reshape 改形状、permute 改顺序、unsqueeze/squeeze 加 / 删维度、cat 按维度拼接” 的核心逻辑,不盲目复制代码。

如果需要针对 MoE 场景(比如专家输入张量的维度调整)补充专属避坑点,可以告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:32:30

还在为预测误差发愁?R语言随机森林回归最佳实践方案曝光

第一章:还在为预测误差发愁?随机森林回归的破局之道面对复杂数据关系和高维特征空间,传统线性回归模型常常因过拟合或欠拟合导致预测误差居高不下。随机森林回归作为一种集成学习方法,通过构建多个决策树并融合其输出结果&#xf…

作者头像 李华
网站建设 2026/6/14 18:21:01

SillyTavern终极升级手册:从风险预警到完美体验的完整指南

SillyTavern终极升级手册:从风险预警到完美体验的完整指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 想要让SillyTavern保持最佳状态,但又担心升级过程中出现意…

作者头像 李华
网站建设 2026/6/15 14:33:52

英超Big6集体翻车,唯有枪手狂奔!冠军真的在招手了!

北京时间今天凌晨,英超赛场冷风劲吹,争冠与争四格局一夜颠覆!除了阿森纳稳稳拿下三分,其余Big5竟无一胜绩——曼联、热刺、利物浦纷纷被逼平,而压轴上演的“双蓝会”更是以一场1-1的激战收场。本轮过后,阿森…

作者头像 李华
网站建设 2026/6/13 5:07:41

哔哩下载姬完整指南:零基础掌握B站视频下载技巧

哔哩下载姬完整指南:零基础掌握B站视频下载技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)…

作者头像 李华
网站建设 2026/6/15 13:36:27

RePKG资源提取器:解锁Wallpaper Engine壁纸素材的终极指南

RePKG资源提取器:解锁Wallpaper Engine壁纸素材的终极指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 还在为无法获取Wallpaper Engine精美壁纸的原始资源而困扰吗&…

作者头像 李华