📌 一、背景介绍: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 在线训练平台
我们采用 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.