找回密码
 立即注册
首页 业界区 安全 端侧大模型极简版落地实践

端侧大模型极简版落地实践

毋峻舷 2026-2-10 20:45:03
你想实现从 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. # 1. 本地创建简易数据集(text,label 格式)
  2. echo -e "我的订单怎么还没发货,物流咨询\n申请退款多久到账,退款咨询\n产品保质期多久,产品咨询" > ./customer_service.csv
  3. # 2. 上传到 HDFS
  4. hadoop fs -mkdir -p /user/demo/data
  5. hadoop fs -put ./customer_service.csv /user/demo/data/
复制代码
1.2 Spark 极简清洗(去空、去重)

编写 clean_data.py:
  1. from pyspark.sql import SparkSession
  2. spark = SparkSession.builder.appName("DemoClean").master("yarn").getOrCreate()
  3. # 读取 HDFS 数据
  4. df = spark.read.csv("hdfs:///user/demo/data/customer_service.csv", header=False, encoding="utf-8")
  5. # 清洗:去空行、去重
  6. clean_df = df.filter(df._c0.isNotNull()).filter(df._c1.isNotNull()).dropDuplicates()
  7. # 保存清洗后的数据到 HDFS
  8. clean_df.write.csv("hdfs:///user/demo/data/clean_data", header=False, mode="overwrite", encoding="utf-8")
  9. spark.stop()
复制代码
执行清洗:
  1. spark-submit --master yarn clean_data.py
复制代码
步骤 2:训练轻量文本分类大模型(20 分钟搞定)

目标:基于 Hadoop 清洗后的数据,训练 ERNIE 3.0 轻量版模型,核心代码极简。
2.1 读取 HDFS 数据并训练

编写 train_model.py:
  1. import paddle
  2. import os
  3. from paddlenlp.transformers import ErnieMiniTokenizer, ErnieMiniForSequenceClassification
  4. from paddlenlp.data import DataLoader, Stack, Tuple, Pad
  5. from hdfs3 import HDFileSystem
  6. # 1. 从 HDFS 读取清洗后的数据
  7. hdfs = HDFileSystem(host="<你的HDFS NameNode IP>", port=9000)
  8. data = []
  9. label_map = {"物流咨询":0, "退款咨询":1, "产品咨询":2}
  10. # 读取 HDFS 下的清洗数据文件
  11. with hdfs.open("/user/demo/data/clean_data/part-00000") as f:
  12.     for line in f:
  13.         text, label = line.decode("utf-8").strip().split(",")
  14.         data.append((text, label_map[label]))
  15. # 2. 初始化轻量模型和分词器(ERNIE Mini 仅 4.6M 参数,适合端侧)
  16. tokenizer = ErnieMiniTokenizer.from_pretrained("ernie-3.0-mini-zh")
  17. model = ErnieMiniForSequenceClassification.from_pretrained("ernie-3.0-mini-zh", num_classes=3)
  18. # 3. 数据预处理
  19. def convert_example(example):
  20.     text, label = example
  21.     input_ids, token_type_ids = tokenizer(text, return_length=False)
  22.     return input_ids, token_type_ids, label
  23. # 4. 简易训练(仅演示,实际可加更多epoch,这里跑1轮即可)
  24. paddle.set_device("gpu:0")
  25. model.train()
  26. optimizer = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters())
  27. # 处理单条数据做演示训练
  28. input_ids, token_type_ids, label = convert_example(data[0])
  29. input_ids = paddle.to_tensor([input_ids])
  30. token_type_ids = paddle.to_tensor([token_type_ids])
  31. label = paddle.to_tensor([label])
  32. # 前向计算 + 反向更新
  33. logits = model(input_ids, token_type_ids)
  34. loss = paddle.nn.functional.cross_entropy(logits, label)
  35. loss.backward()
  36. optimizer.step()
  37. optimizer.clear_grad()
  38. # 5. 保存原始模型(后续轻量化)
  39. model.save_pretrained("./ernie_demo_model")
  40. tokenizer.save_pretrained("./ernie_demo_model")
  41. # 同步到 HDFS 备份
  42. hdfs.put("./ernie_demo_model", "/user/demo/models/", recursive=True)
  43. print("模型训练完成并保存到 HDFS!")
复制代码
执行训练:
  1. python train_model.py
复制代码
步骤 3:模型轻量化(10 分钟搞定)

目标:将训练好的模型压缩为端侧可运行的格式(Paddle Lite 支持),减小体积、提升速度。
编写 lite_optimize.py:
  1. from paddlelite.lite import *
  2. # 1. 初始化优化器
  3. opt = Opt()
  4. # 2. 设置原始模型路径
  5. opt.set_model_file("./ernie_demo_model/model_state.pdmodel")
  6. opt.set_param_file("./ernie_demo_model/model_state.pdiparams")
  7. # 3. 设置优化目标(适配手机arm架构)
  8. opt.set_valid_places("arm")
  9. opt.set_model_type("naive_buffer")  # 端侧轻量化格式
  10. # 4. 执行优化,生成端侧模型
  11. opt.run("./ernie_lite_model")
  12. print("模型轻量化完成,输出路径:./ernie_lite_model")
复制代码
执行轻量化:
  1. python lite_optimize.py
复制代码
步骤 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 极简版)
  1. import com.baidu.paddle.lite.MobileConfig;
  2. import com.baidu.paddle.lite.Predictor;
  3. import com.baidu.paddle.lite.Tensor;
  4. // 初始化预测器
  5. MobileConfig config = new MobileConfig();
  6. config.setModelFromFile("assets/ernie_lite_model"); // 轻量化模型路径
  7. Predictor predictor = Predictor.createPaddlePredictor(config);
  8. // 输入文本(模拟:需先分词转ID,这里简化用训练时的示例ID)
  9. int[] inputIds = {101, 2769, 4638, 3300, 752, 671, 3736, 102}; // 对应"我的订单怎么还没发货"
  10. Tensor inputTensor = predictor.getInput(0);
  11. inputTensor.resize(new long[]{1, inputIds.length});
  12. inputTensor.setData(inputIds);
  13. // 执行预测
  14. predictor.run();
  15. // 获取输出(分类结果)
  16. Tensor outputTensor = predictor.getOutput(0);
  17. float[] output = outputTensor.getFloatData();
  18. // 解析结果:取最大值对应的标签
  19. int label = 0;
  20. float max = output[0];
  21. for (int i = 1; i < output.length; i++) {
  22.     if (output[i] > max) {
  23.         max = output[i];
  24.         label = i;
  25.     }
  26. }
  27. // 输出分类结果
  28. String[] labelNames = {"物流咨询", "退款咨询", "产品咨询"};
  29. System.out.println("分类结果:" + labelNames[label]); // 预期输出:物流咨询
复制代码
4.3 运行验证

将 Android 项目打包成 APK 安装到手机,运行后输入文本(或直接用示例ID),即可在手机本地看到分类结果,无需联网调用云端模型。
总结


  • 核心场景:文本分类轻量化部署(客服文本/日志分类)是「Hadoop→大模型→端侧」全链路最简落地场景,数据/模型/部署都无额外复杂度;
  • 关键简化点:用 ERNIE Mini 轻量模型(而非超大模型)、单轮训练、端侧简化输入处理,优先保证链路通而非精度高;
  • 验证标准:能从 HDFS 读取数据→训练出模型→轻量化→端侧本地运行出分类结果,即完成 Demo 核心目标。
如果需要我补充:① 端侧分词转ID的完整代码(文本转模型输入);② 树莓派部署的替代方案(不用手机);③ 一键打包端侧APK的脚本,都可以告诉我。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2026-2-12 14:18:45

举报

7 天前

举报

您需要登录后才可以回帖 登录 | 立即注册