581. Google - Fast or Slow? Predict AI Model Runtime | predict-ai-model-runtime
首先,感谢主办方举办这次比赛。这是我第一次参加Kaggle竞赛,一时兴起就报名了,因为当时有些空闲时间。整个过程既充满乐趣又令人沮丧(乐趣+挫折)。看到其他队伍出色的解决方案,我觉得能取得这样的排名非常幸运!
编辑:在整理代码后,我注意到之前遗漏了一些内容,现已补充完善。代码已发布于 GitHub。
我的解决方案主要分为三个部分:基础特征提取与工程、图结构处理(如剪枝)以及图神经网络(GNN)训练。GNN层基于GPS层构建,使用了SAGE卷积、Linformer和可学习的位置编码RWPE。以下内容主要针对布局数据集,平铺数据集的解决方案在最后简要说明。
我使用了所有140个输入特征,并采用对数变换(先将每个特征值平移确保大于1)。此外,我从协议缓冲区中提取了以下特征:
has_dynamic_com:表示图是否包含动态计算的标志位is_root_of_com:表示节点是否为计算输出节点的标志位indices_are_sorted:一个我不确定为何添加的标志位(注:可能是冗余特征)dot操作,提取了:
lhs_contracting_dimensions 和 rhs_contracting_dimensionslhs_batch_dimensions 和 rhs_batch_dimensionsgather操作,提取了:
offset_dims、collapsed_slice_dims、start_index_mapindex_vector_dimgather_slice_sizes填充长度基于数据集中的最大序列长度确定,填充值统一为-1。这些特征中部分在图剪枝后可能失效,但仍保留在输入中。
此外,我还从协议缓冲区中提取了dot和conv操作的两个输入参数的6D形状(确保顺序一致,如dot操作的lhs/rhs),并计算了形状的和与积,增加了16维特征。这样做是为了帮助网络理解操作中输入的顺序和约减维度。
对于30维特征,我进行了两种处理:先用模128运算((x % 128)/128),再用整数除法((x // 128)/10)并归一化。目的是帮助网络处理张量维度并与TPU的寄存器大小关联。
OP代码使用128维嵌入向量。位置编码采用论文中描述的RWPE方法:使用有向邻接矩阵生成16维PE,无向邻接矩阵生成112维PE,总计128维特征。编码始终基于完整图计算,独立于训练时的图剪枝策略。
我尝试了三种剪枝/池化策略:
此外,我添加了虚拟输出节点,连接所有产生输出的节点。
GNN由SAGE卷积和Linformer组成(架构图如下)。SAGE卷积对输入/输出节点使用不同权重,消息维度为输入维度的一半。Linformer维度设为128(部分实验使用256)。采用SiLU激活函数和多层归一化。

使用Adam优化器和余弦退火学习率调度。尝试的批量大小:8/16/32,配置数:5/8/10,采用成对 hinge-loss。先在全部数据集上联合训练,再针对各数据集微调。
由于时间限制,合并节点策略仅在最后实现,且仅在xla:default数据集上训练(取得了最佳交叉验证效果)。最终提交方案:
xla:random 和 nlp 数据集:使用策略2训练的网络xla:default 数据集:使用策略3训练的网络平铺数据集采用简易GNN:5层SAGE卷积,无额外特征和位置编码。
以下尝试未取得持续的正向效果或未能充分验证: