发布说明¶
当前版本 2.2.1:Flax 的两套 API 都支持。
2.2.1¶
- Flax Linen。
esmoe.flax.linen.ESMoE是一个linen.Module,参数放在模块外、用apply跑,平衡项 sow 进intermediates。esmoe.flax仍是nnx,Flax 现在推荐的那套。 - 目录按层重排。 与后端无关的四个模块收进
esmoe/core/,Flax 的两套 API 各占一个子包esmoe/flax/nnx与esmoe/flax/linen,平衡目标两套共用。
2.2.0¶
- Flax 后端。
esmoe.flax.ESMoE是一个nnx.Module,参数在构造时建好,平衡项存在nnx.Intermediate变量上,nnx.jit与nnx.grad直接可用。 - jax 现在有三条路,按项目选:本来就用 Flax 选
esmoe.flax;不想引入 Flax、自己管参数树选esmoe.jax;用 Keras 跨后端选esmoe.keras配KERAS_BACKEND=jax。三条路的路由、平衡项与构造参数一致。 esmoe[flax]装它,esmoe[nnx]是同一个 extra 的别名。CI 多一条 flax 腿。
2.1.0¶
- TensorFlow 原生后端。
esmoe.tensorflow.ESMoE是一个tf.Module,只依赖 TensorFlow:自带的批归一化把滑动统计量存成不训练的变量,辅助损失走与 torch 同一套弱引用注册表,graft按属性名或Sequential下标插块。 - Jax 原生后端。
esmoe.jax.ESMoE是一组纯函数,init建参数树、apply返回输出与平衡项,整段进jax.jit与jax.grad,不依赖 Keras 也不依赖 Flax。参数树是普通字典与数组,optax直接能用。 - extras 补齐别名。
esmoe[pytorch]、esmoe[tf]、esmoe[keras3]、esmoe[ultralytics]分别等同于esmoe[torch]、esmoe[tensorflow]、esmoe[keras]、esmoe[yolo];esmoe[all]是五个正式名字的合集。 - CI 加两条腿。 tensorflow 与 jax 各跑一条,先断言 keras 与 ultralytics 都没装,再跑该后端自己的测试。
2.0.0¶
块不再绑在 Ultralytics 上。uv add esmoe 只装 torch,块可以直接拼进任何 torch 模型;Ultralytics 集成变成 uv add esmoe[yolo],用法与 1.x 相同。另有一份 Keras 3 实现,同一个块在 tensorflow、jax、torch 上都能跑。
2.0.0 的变化¶
- torch 与 YOLO 平级。 核心只依赖 torch,
nn.Sequential里直接放得下;通道在首次前向推断,所以不用写宽度。辅助损失用with esmoe.routing(net) as route:读,进入时清一次注册表,这一步没跑到的块不会把上一步的值报上来。 - 两个旋钮定专家。
kernels给每个专家一个感受野,int或(h, w),给了它专家数就由它定;expert给分支结构,一个工厂管全部,或逐分支一个。三选一、五个专家、条带卷积、核重复都是一行的事。 - Keras 3 后端。
esmoe.keras下是同一个块的 Keras 实现,构造参数与 torch 那份完全一致,辅助损失走 Keras 自己的add_loss。它每个专家都算——跳过未路由的专家取决于数据,静态图表达不了。 - 往现成的模型里插块。
esmoe.graft(model, at="layer3", mode="after", ...)按子模块名、若干名字或判断函数定位,after/before/replace三种改法,原地生效。同名的esmoe.graft("yolo11n.yaml", ...)仍然改配置,按第一个参数分派。 - 配置里的块认三个名字。
ESMoE、ES_MoE、ES_MOE都解析到它。配置里已经写了块,equip就按原样用,不再插入。 - 参数怎么写都认。 位置参数里的映射当作
options,c/c1/ch/c2/e/k这些别名都认,experts按值的样子归位。认不出的键警告一次后忽略,top_k超过专家数时降到全选——都不再让一次训练在构造时就失败。取值不合法照旧报错。 - Python 下限 3.12。 换来
type别名这类现在就能用的写法。
从 1.x 过来¶
| 1.x | 2.0 |
|---|---|
pip install esmoe |
uv add esmoe(只要块)或 uv add esmoe[yolo] |
esmoe.inject_esmoe() |
esmoe.register(),旧名仍可用 |
expert_kernel_sizes= |
kernels=,旧名仍接 |
max_kernel_size= |
max_kernel=,旧名仍接 |
from esmoe.inject import X |
from esmoe.yolo.inject import X |
| 认不出的参数报错 | 警告后忽略 |
1.x 存下的检查点照常加载。
1.x¶
1.0.0 是第一个稳定版:七代主干的兼容矩阵、满协议实验与判读线、中英双语文档站。1.0.1 修了交付审计的子串匹配、数据集统计的边界框、图表只取登记过的运行,以及文档站的几处显示。1.1.0 加了文档站的试玩页——最多三个模型在同一张图上并排跑,带块的逐块列出专家分值,推理在读者自己的浏览器里完成——以及导出脚本 scripts/demo_export.py。
更早的小版本¶
0.1 系列给出 inject_esmoe、graft、attach_aux_loss、collect_aux_loss 四个入口与三 seed 证据,随后修好不带 out 时的配置传递、8.4.13x 的训练日志表头,并把包从 src/ 移到仓库根目录。
安装¶
uv add esmoe # 块本身,只依赖 torch
uv add esmoe[yolo] # 再加 Ultralytics 集成
pip install esmoe # 偏要的话