美团 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.

相关推荐
SoFlu软件机器人8 分钟前
3 分钟生成 Spring Cloud 微服务架构,标准目录 + 依赖配置,开箱即用
spring cloud·微服务·架构
Adolf_199321 分钟前
React 中 props 的最常用用法精选+useContext
前端·javascript·react.js
前端小趴菜0521 分钟前
react - 根据路由生成菜单
前端·javascript·react.js
喝拿铁写前端28 分钟前
`reduce` 究竟要不要用?到底什么时候才“值得”用?
前端·javascript·面试
鱼樱前端38 分钟前
2025前端SSR框架之十分钟快速上手Nuxt3搭建项目
前端·vue.js
極光未晚1 小时前
React Hooks 中的时空穿梭:模拟 ComponentDidMount 的奇妙冒险
前端·react.js·源码
Codebee1 小时前
OneCode 3.0 自治UI 弹出菜单组件功能介绍
前端·人工智能·开源
ui设计兰亭妙微1 小时前
# 信息架构如何决定搜索效率?
前端
EyeDropLyq1 小时前
从 0 到 1 掌握 自研企业级分布式 ID 发号器
分布式·架构
1024小神1 小时前
Cocos游戏中UI跟随模型移动,例如人物头上的血条、昵称条等
前端·javascript