美团 ETA 模型在线训练与推理加速实践

295 阅读2分钟

📌 一、背景介绍:ETA 精度是美团履约体验的灵魂

用户下单后,“还要等多久?” 配送员接单后,“还能抢几单?” 系统排单时,“哪条路径最优?”

ETA(Estimated Time of Arrival)作为美团履约链路中的核心指标,广泛应用于:

  • 外卖 App ETA 展示
  • 骑手排单策略
  • 配送路径规划
  • 用户体验打分(评分、投诉识别)

我们自研了 ETA 模型系统,分为两部分:

  • 在线预测引擎(业务实时调用)
  • Flink 在线训练系统(持续迭代模型)

⚙️ 二、整体架构图(Mermaid)

graph TD
A[历史轨迹数据] --> B[Flink 特征生成 Job]
B --> C[在线样本存储]
C --> D[特征服务平台]
D --> E[TensorFlow 模型服务器]
E --> F[TensorRT 加速引擎]
F --> G[推荐/排单系统 实时调用]

📂 三、模型结构与特征设计

模型结构(简化版):

# ETA 模型结构
class EtaNet(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = tf.keras.layers.Dense(64, activation="relu")
        self.dense2 = tf.keras.layers.Dense(32, activation="relu")
        self.output_layer = tf.keras.layers.Dense(1)

    def call(self, inputs):
        x = self.dense1(inputs)
        x = self.dense2(x)
        return self.output_layer(x)

样本特征示例:

特征描述
start_lat/lng起点坐标
end_lat/lng终点坐标
weather_type当前天气(晴/雨/雪)
time_slot小时段(早高峰/晚高峰)
rider_speed_avg骑手平均速度(动态更新)
traffic_level_path路径上拥堵级别分布(数组)

🧠 四、Flink 在线训练平台

我们采用 Flink + TFBatchWriter 的流式训练平台:

val cleaned = gpsStream
  .filter(isValid)
  .map(toSample)
  .keyBy(_.orderId)
  .addSink(new TFRecordWriter("hdfs:///eta/samples/"))

每天生成约 4000 万条样本,供模型训练使用。


🔄 五、模型迭代与线上热更新

我们部署了每日训练 + 每日部署机制:

# 每日凌晨调度训练
python train_eta_model.py --input hdfs:///eta/samples/

# 导出 SavedModel 格式
saved_model_cli show --dir ./model/ --all

# 推送至 TensorFlow Serving + TensorRT 引擎

⚡️ 六、推理加速:TensorRT 实战优化

目标:

  • 压缩模型体积(从 18MB → 3.2MB)
  • 降低预测延迟(p99 从 60ms → 22ms)

转换流程:

# Step 1: 使用 TF-Trt 转换 SavedModel
from tensorflow.python.compiler.tensorrt import trt_convert as trt

params = trt.TrtConversionParams(precision_mode=trt.TrtPrecisionMode.FP16)
converter = trt.TrtGraphConverterV2(input_saved_model_dir="model", conversion_params=params)
converter.convert()
converter.save("model_trt")

TensorRT 运行时效果:

指标TensorFlowTensorRT
p50 推理延迟25ms11ms
p95 推理延迟48ms17ms
模型大小18MB3.2MB
单节点QPS15004200

🧪 七、线上 A/B 实验效果

  • ETA 误差(均方根 RMSE)下降 21.3%
  • ETA 趋势方向准确率提升 14.7%
  • 用户满意度(投诉/取消率)下降 6.5%
  • 系统推单准度提升,骑手满意度提升

🔍 八、工程挑战与解法

问题解决方案
Flink 特征延迟高使用 AsyncIO + 状态缓存并发提速
模型热更新频繁导致缓存失效引入特征向量签名 hash + warmup
TensorRT 不兼容动态输入强制输入 shape 定长 + ZeroPadding

✅ 总结(来自内部架构师的一句话)

“在 ETA 上的每 1 秒误差,其实是美团对用户体验的 1% 不敬。” ——来自 ETA 算法团队负责人 A.N.