作者:vivo 互联网客户端团队- Li Quanlong
本文介绍端智能技术在vivo官网APP的落地实践,通过抽象问题、提出端智能解决方案、方案落地这三大块内容逐步递进地展开端智能技术的应用过程。
一、前言
vivo官网APP首页是流量最大的页面,承载着新品、活动、商品、其他入口等流量分发的重任。在流量分发上,云端针对首页的主要场景建设了算法支撑。通过梳理首页的场景发现,智能硬件楼层场景的商品配置还是运营纯手工动态配置,而非算法推荐。为此,我们探索了端智能技术,将其运用在智能硬件楼层场景,用于提升商品分发效率,进而提升智能硬件楼层场景的点击率。
端智能广义上来说,是指将人工智能算法部署到端侧设备中,使端侧设备具备感知、理解和推理能力;狭义上来说,端智能就是将机器/深度学习算法集成到端侧设备中,通过算法模型处理端侧感知的数据从而实时得到推理结果。而所谓的"端"实际上是相对于"云"的概念,是一些带有计算能力的个体设备,如手机、家庭路由器、网络的边缘节点等。因此,可以看到端智能的应用离不开这几个关键点:数据、算法模型及计算能力。
二、抽象问题
端智能是如何提高vivo官网APP首页智能硬件楼层场景的商品分发效率的呢?在回答这个问题之前,我们先了解下智能硬件楼层场景,如下图所示:
图1:vivo官网APP首页-智能硬件楼层
智能硬件楼层场景,有4个商品展示资源位,由运营在众多的智能硬件商品中挑选出4个商品进行配置。所以,不同的用户群体进入到vivo官网APP首页看到该场景下的商品都是相同的。而引入端智能技术要解决的问题是:不同的用户群体看到的商品推荐是不一致的,是更加符合该用户群体的商品,做到推荐的精准匹配,如下图所示:
图2:智能硬件楼层商品分发
端智能推荐分发,就是在智能硬件资源池中推荐最适合的4个商品展示在智能硬件楼层场景中。我们抽象下问题,也就是在N个商品中选取前K个商品(K ONNX -> TensorFlow -> TFLite
(2)TensorFlow深度学习语言模型转换
使用TensorFlow深度学习语言训练的话,可以直接使用下述代码,转换为Android端侧可以加载的模型文件.tflite
图9:TensorFlow模型转换
(图片来源:TensorFlow官网)
模型转换代码示例如下:- # 输入层
- input_data = keras.layers.Input(shape=(input_size,), name="input")
- output = tf.keras.layers.Dense(64, activation="relu")(input_data)
- output = tf.keras.layers.Dense(128, activation="relu")(output)
- output = tf.keras.layers.Dense(output_size, activation="softmax")(output)
- # 输出层:top k index
- output = NewSkuAndFilterPredictEnvSkuIdLayer(index_groups=acc.index_groups, )(output)
- # 输出层:index 映射 skuid 直接出
- output = SkuTopKCategoricalLayer(acc.skuid_list, spu_count=len(acc.spuid_list))(output)
复制代码 3.5 计算推理
Google提供了TensorFlow Lite库,可以加载TFLite文件,并在端侧利用本地计算资源完成推理,注意这里只是有推理能力,而不提供训练。如下所示:- train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))test_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))# 使用shuffle方法对数据集进行随机化处理# 参数 buffer_size 指定了用于进行随机化处理的元素数量,通常设置为大于数据集大小的值以确保充分随机化、batch() 则指定了每个批次的数据量。train_dataset = train_dataset.shuffle(buffer_size=datasets.train_len).batch(config.BATCH_SIZE)test_dataset = test_dataset.shuffle(buffer_size=datasets.test_len).batch(config.BATCH_SIZE) # 获取模型输入、输出纬度大小acc_input_size = datasets.acc_columns - 1acc_out_size = datasets.acc_output # 构建模型model = build_parts_model(acc_input_size, acc_out_size)optimizer = tf.keras.optimizers.legacy.RMSprop(learning_rate=config.LEARN_RATIO)model.compile(optimizer=optimizer, loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=[tf.keras.metrics.SparseTopKCategoricalAccuracy(k=5, name="top5_acc_accuracy")])model.fit(train_dataset, epochs=config.TRAIN_EPOCH)
复制代码 通过添加模块依赖项将TensorFlow Lite库引入到APP应用中。
3.5.1 加载模型
假设现在模型文件是放在assets文件目录下,那么首先先加载模型,构建Interpreter对象,如下代码:- train_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))
- test_dataset = tf.data.Dataset.from_tensor_slices((train_data, train_labels))
- # 使用shuffle方法对数据集进行随机化处理
- # 参数 buffer_size 指定了用于进行随机化处理的元素数量,通常设置为大于数据集大小的值以确保充分随机化、batch() 则指定了每个批次的数据量。
- train_dataset = train_dataset.shuffle(buffer_size=datasets.train_len).batch(config.BATCH_SIZE)
- test_dataset = test_dataset.shuffle(buffer_size=datasets.test_len).batch(config.BATCH_SIZE)
-
- # 获取模型输入、输出纬度大小
- acc_input_size = datasets.acc_columns - 1
- acc_out_size = datasets.acc_output
-
- # 构建模型
- model = build_parts_model(acc_input_size, acc_out_size)
- optimizer = tf.keras.optimizers.legacy.RMSprop(learning_rate=config.LEARN_RATIO)
- model.compile(optimizer=optimizer, loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
- metrics=[tf.keras.metrics.SparseTopKCategoricalAccuracy(k=5, name="top5_acc_accuracy")])
- model.fit(train_dataset, epochs=config.TRAIN_EPOCH)
复制代码 3.5.2 模型运行推理
加载好模型文件后,就可以直接调用推理API了,推理API提供了两个,分别是:- 1、Keras Model
- 训练过程中,直接将model转成tflite
- converter = tf.lite.TFLiteConverter.from_keras_model(model)
- # 转换模型
- tflite_float_model = converter.convert()
- # 保存模型
- with open('mnist_lenet5.tflite', 'wb') as f:
- f.write( tflite_float_model)
-
- 2、SavedModel
- model.save('mnist_lenet5_save_model', save_format='tf')
- # 转换模型
- converter = tf.lite.TFLiteConverter.from_saved_model('mnist_lenet5_save_model') tflite_model = converter.convert()
-
- # 保存模型
- with open('mnist_lenet5_saved_model_dir.tflite', 'wb') as f:
- f.write(tflite_model)
复制代码 因此,只需要准备好输入和输出数组即可直接调用,如下代码所示:- dependencies {
- implementation 'org.tensorflow:tensorflow-lite:2.14.0'
- }
复制代码 四、方案落地
4.1 模型配置
在设计算法模型之初,需要考虑输入和输出纬度大小,尽量将输入和输出的纬度固定下来,这样的话当不断迭代算法模型时,就不会因为输入和输出纬度不一致导致不能兼顾到之前的APP版本,进而做到模型可动态升级。在模型配置中心管理模型版本、下发策略,在端侧下载模型时可通过模型版本号及文件MD5值校验模型文件的完整性。
4.2 运行监控
模型上线后,需要监控线上执行的效果。主要关注三个指标:
- **模型运行成功率:**加载模型、执行模型上报是否成功
- **模型版本分布:**模型版本升级情况,便于分析数据
- **模型各版本的平均运行时长:**关注运行时长,进而指导模型设计时考虑模型的复杂程度
图10:模型运行监控
如上图所示,通过建立完善的线上监控,一方面清楚了解模型运行情况,另一方面可以提供设计算法模型的方向,进而更好地迭代出一个模型,可以在端侧设备计算资源及收益效果达到一个各方都还不错的平衡点。
五、总结
要使用端智能能力,首先要知道解决什么问题。如,本文是解决的"重排序"问题,其实本质就是"多分类"问题。知道了具体解决的问题后,要进一步抽象出输入是什么、输出是什么。此时,还需要盘点当前能够获取哪些原始数据,并设计特征工程去处理好原始数据,将其转换为算法模型能够接受的特征。再紧接着,就是要结合应用场景设计好算法模型即可。
本文通过利用端智能重排序云端返回的商品信息,进而不同人群展示不同商品信息,实现千人千面效果。从获取原始数据开始,到特征工程的设计,设计符合该业务场景的算法模型,然后进行训练获取模型,再进行模型转换为TFLite文件格式,通过端侧加载该模型后,进行计算推理获取重排序后的结果。
在端智能的道路上,一方面我们继续探索更多的落地场景,另一方面继续挖掘丰富的端侧数据,更新迭代特征工程及算法模型,更好地为业务创造价值。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |