你想实现从 Hadoop → 大模型 → 端侧部署的完整 Demo,最简单、最易落地的场景是「文本分类轻量化部署」 —— 比如基于企业日志/客服文本,用 Hadoop 预处理数据、训练通用文本分类大模型,再轻量化压缩后部署到手机/嵌入式设备(端侧)做本地文本分类,这个场景覆盖全链路且技术门槛最低,无需复杂硬件和业务逻辑。
为什么选这个场景?
- 数据侧:文本数据易获取(日志、公开语料)、预处理简单(Hadoop/Spark 几行代码就能清洗),无需处理图像/视频等复杂数据;
- 模型侧:飞桨(PaddlePaddle)有成熟的文本分类预训练模型(如 ERNIE 3.0 轻量版),微调代码极简,且支持一键轻量化压缩;
- 端侧部署:飞桨的 Paddle Lite 框架专门适配端侧,支持手机(Android/iOS)、树莓派等设备,部署脚本开箱即用;
- 全链路闭环:从 Hadoop 存数据 → 训练模型 → 轻量化 → 端侧运行,完整覆盖你要的「大数据→大模型→端侧」链路,且效果可直观验证(输入文本出分类结果)。
最简落地 Demo 全流程(一步都不绕)
前置条件(极简版)
- Hadoop 集群(仅需 HDFS + Spark,单机伪分布式也可);
- 一台带 GPU 的服务器(训练轻量模型,1 张 1080Ti 即可);
- 一部 Android 手机(端侧部署,或用模拟器);
- 依赖:paddlepaddle>=2.5、paddlenlp、paddlelite、pyspark。
步骤 1:Hadoop 侧预处理文本数据(10 分钟搞定)
目标:准备「客服咨询文本 + 分类标签」的训练数据(比如「退款咨询」「物流咨询」「产品咨询」3 类)。
1.1 上传原始数据到 HDFS
- # 1. 本地创建简易数据集(text,label 格式)
- echo -e "我的订单怎么还没发货,物流咨询\n申请退款多久到账,退款咨询\n产品保质期多久,产品咨询" > ./customer_service.csv
- # 2. 上传到 HDFS
- hadoop fs -mkdir -p /user/demo/data
- hadoop fs -put ./customer_service.csv /user/demo/data/
复制代码 1.2 Spark 极简清洗(去空、去重)
编写 clean_data.py:- from pyspark.sql import SparkSession
- spark = SparkSession.builder.appName("DemoClean").master("yarn").getOrCreate()
- # 读取 HDFS 数据
- df = spark.read.csv("hdfs:///user/demo/data/customer_service.csv", header=False, encoding="utf-8")
- # 清洗:去空行、去重
- clean_df = df.filter(df._c0.isNotNull()).filter(df._c1.isNotNull()).dropDuplicates()
- # 保存清洗后的数据到 HDFS
- clean_df.write.csv("hdfs:///user/demo/data/clean_data", header=False, mode="overwrite", encoding="utf-8")
- spark.stop()
复制代码 执行清洗:- spark-submit --master yarn clean_data.py
复制代码 步骤 2:训练轻量文本分类大模型(20 分钟搞定)
目标:基于 Hadoop 清洗后的数据,训练 ERNIE 3.0 轻量版模型,核心代码极简。
2.1 读取 HDFS 数据并训练
编写 train_model.py:- import paddle
- import os
- from paddlenlp.transformers import ErnieMiniTokenizer, ErnieMiniForSequenceClassification
- from paddlenlp.data import DataLoader, Stack, Tuple, Pad
- from hdfs3 import HDFileSystem
- # 1. 从 HDFS 读取清洗后的数据
- hdfs = HDFileSystem(host="<你的HDFS NameNode IP>", port=9000)
- data = []
- label_map = {"物流咨询":0, "退款咨询":1, "产品咨询":2}
- # 读取 HDFS 下的清洗数据文件
- with hdfs.open("/user/demo/data/clean_data/part-00000") as f:
- for line in f:
- text, label = line.decode("utf-8").strip().split(",")
- data.append((text, label_map[label]))
- # 2. 初始化轻量模型和分词器(ERNIE Mini 仅 4.6M 参数,适合端侧)
- tokenizer = ErnieMiniTokenizer.from_pretrained("ernie-3.0-mini-zh")
- model = ErnieMiniForSequenceClassification.from_pretrained("ernie-3.0-mini-zh", num_classes=3)
- # 3. 数据预处理
- def convert_example(example):
- text, label = example
- input_ids, token_type_ids = tokenizer(text, return_length=False)
- return input_ids, token_type_ids, label
- # 4. 简易训练(仅演示,实际可加更多epoch,这里跑1轮即可)
- paddle.set_device("gpu:0")
- model.train()
- optimizer = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters())
- # 处理单条数据做演示训练
- input_ids, token_type_ids, label = convert_example(data[0])
- input_ids = paddle.to_tensor([input_ids])
- token_type_ids = paddle.to_tensor([token_type_ids])
- label = paddle.to_tensor([label])
- # 前向计算 + 反向更新
- logits = model(input_ids, token_type_ids)
- loss = paddle.nn.functional.cross_entropy(logits, label)
- loss.backward()
- optimizer.step()
- optimizer.clear_grad()
- # 5. 保存原始模型(后续轻量化)
- model.save_pretrained("./ernie_demo_model")
- tokenizer.save_pretrained("./ernie_demo_model")
- # 同步到 HDFS 备份
- hdfs.put("./ernie_demo_model", "/user/demo/models/", recursive=True)
- print("模型训练完成并保存到 HDFS!")
复制代码 执行训练:步骤 3:模型轻量化(10 分钟搞定)
目标:将训练好的模型压缩为端侧可运行的格式(Paddle Lite 支持),减小体积、提升速度。
编写 lite_optimize.py:- from paddlelite.lite import *
- # 1. 初始化优化器
- opt = Opt()
- # 2. 设置原始模型路径
- opt.set_model_file("./ernie_demo_model/model_state.pdmodel")
- opt.set_param_file("./ernie_demo_model/model_state.pdiparams")
- # 3. 设置优化目标(适配手机arm架构)
- opt.set_valid_places("arm")
- opt.set_model_type("naive_buffer") # 端侧轻量化格式
- # 4. 执行优化,生成端侧模型
- opt.run("./ernie_lite_model")
- print("模型轻量化完成,输出路径:./ernie_lite_model")
复制代码 执行轻量化:步骤 4:端侧(Android 手机)部署(15 分钟搞定)
目标:在手机上运行轻量化模型,实现本地文本分类。
4.1 准备端侧运行环境
- 下载 Paddle Lite 预编译库:https://github.com/PaddlePaddle/Paddle-Lite/releases(选 Android/arm64-v8a 版本);
- 新建 Android 项目,将 ernie_lite_model 拷贝到 assets 目录,引入 Paddle Lite 库。
4.2 端侧核心运行代码(Java 极简版)
- import com.baidu.paddle.lite.MobileConfig;
- import com.baidu.paddle.lite.Predictor;
- import com.baidu.paddle.lite.Tensor;
- // 初始化预测器
- MobileConfig config = new MobileConfig();
- config.setModelFromFile("assets/ernie_lite_model"); // 轻量化模型路径
- Predictor predictor = Predictor.createPaddlePredictor(config);
- // 输入文本(模拟:需先分词转ID,这里简化用训练时的示例ID)
- int[] inputIds = {101, 2769, 4638, 3300, 752, 671, 3736, 102}; // 对应"我的订单怎么还没发货"
- Tensor inputTensor = predictor.getInput(0);
- inputTensor.resize(new long[]{1, inputIds.length});
- inputTensor.setData(inputIds);
- // 执行预测
- predictor.run();
- // 获取输出(分类结果)
- Tensor outputTensor = predictor.getOutput(0);
- float[] output = outputTensor.getFloatData();
- // 解析结果:取最大值对应的标签
- int label = 0;
- float max = output[0];
- for (int i = 1; i < output.length; i++) {
- if (output[i] > max) {
- max = output[i];
- label = i;
- }
- }
- // 输出分类结果
- String[] labelNames = {"物流咨询", "退款咨询", "产品咨询"};
- System.out.println("分类结果:" + labelNames[label]); // 预期输出:物流咨询
复制代码 4.3 运行验证
将 Android 项目打包成 APK 安装到手机,运行后输入文本(或直接用示例ID),即可在手机本地看到分类结果,无需联网调用云端模型。
总结
- 核心场景:文本分类轻量化部署(客服文本/日志分类)是「Hadoop→大模型→端侧」全链路最简落地场景,数据/模型/部署都无额外复杂度;
- 关键简化点:用 ERNIE Mini 轻量模型(而非超大模型)、单轮训练、端侧简化输入处理,优先保证链路通而非精度高;
- 验证标准:能从 HDFS 读取数据→训练出模型→轻量化→端侧本地运行出分类结果,即完成 Demo 核心目标。
如果需要我补充:① 端侧分词转ID的完整代码(文本转模型输入);② 树莓派部署的替代方案(不用手机);③ 一键打包端侧APK的脚本,都可以告诉我。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |