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

📌 一、背景介绍: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[推荐/排单系统 实时调用]

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

模型结构(简化版):

python 复制代码
# 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 + TFBatchWriter 的流式训练平台:

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

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


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

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

bash 复制代码
# 每日凌晨调度训练
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)

转换流程:

bash 复制代码
# 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 运行时效果:

指标 TensorFlow TensorRT
p50 推理延迟 25ms 11ms
p95 推理延迟 48ms 17ms
模型大小 18MB 3.2MB
单节点QPS 1500 4200

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

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

🔍 八、工程挑战与解法

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

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

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

相关推荐
vx-bot55566622 分钟前
企业微信接口在混合云环境下的集成架构与网络互联方案企业微信接口在混合云环境下的集成架构与网络互联方案
网络·架构·企业微信
小白640232 分钟前
2025年终总结-迷途漫漫,终有一归
前端·程序人生
烟花落o36 分钟前
贪吃蛇及相关知识点讲解
c语言·前端·游戏开发·贪吃蛇·编程学习
晚霞的不甘40 分钟前
Flutter for OpenHarmony专注与习惯的完美融合: 打造你的高效生活助手
前端·数据库·经验分享·flutter·前端框架·生活
好好研究44 分钟前
SpringBoot整合SpringMVC
xml·java·spring boot·后端·mvc
曹轲恒1 小时前
SpringBoot整合SpringMVC(末)
java·spring boot·后端
小马爱打代码1 小时前
Spring Boot:邮件发送生产可落地方案
java·spring boot·后端
kogorou0105-bit1 小时前
前端设计模式:发布订阅与依赖倒置的解耦之道
前端·设计模式·面试·状态模式
止观止1 小时前
像三元表达式一样写类型?深入理解 TS 条件类型与 `infer` 推断
前端·typescript
雪芽蓝域zzs1 小时前
uniapp 省市区三级联动
前端·javascript·uni-app