跳转至

TensorFlow 集成

uv add esmoe[tensorflow]

esmoe.tensorflow.ESMoE 是一个 tf.Module,只依赖 TensorFlow,不经 Keras。输入按 NHWC。

import tensorflow as tf
from esmoe.tensorflow import ESMoE, Sequential

net = Sequential([ESMoE(kernels=[3, 5, 7], top_k=1)])
out = net(tf.random.normal([2, 16, 16, 8]), training=True)

kernels 给每个专家一个感受野,int 或 (h, w),专家数由它定;top_k 决定几选几。通道取自第一次调用。

辅助损失

平衡项要自己加进总损失:

from esmoe.tensorflow import routing

with routing(net) as route:
    with tf.GradientTape() as tape:
        total = tf.reduce_sum(net(x, training=True)) + 0.01 * route.loss()
grads = tape.gradient(total, net.trainable_variables)

routing 进入时清一次注册表,这一步没跑到的块就不会把上一步的值报上来。不用上下文管理器就自己配对调用 clear_aux_loss 与 collect_aux_loss。

插进现成的模型

from esmoe.tensorflow import graft

graft(model, at="stem", mode="after", kernels=[3, 5, 7], top_k=1)

at 收属性名、若干名字,或 (name, module) -> bool;Sequential 里的层按下标取名。mode 为 after、before、replace,原地改。

边界

每个专家都要算。跳过未被路由到的专家取决于当批数据,静态图表达不了。

批归一化的滑动统计量存成不参与训练的变量,training=True 时更新。