唯心笔录

  • 模型下载
  • 环境准备
  • 参考教程
  • 没有可用的显卡?
  • 数据准备
  • 数据清洗
  • 清洗编码错误
  • 语料库
  • 增量预训练
  • 模型微调
  • 模型推理
  • 部署模型
  • 模型文件部署
  • 启动脚本代码
  • Python安装版本
  • 依赖环境安装
  • 运行fastapi
  • PHP实例
  • Ubuntu系统说明
  • 安装venv&full
  • 创建虚拟环境
  • 激活虚拟环境
  • 随笔
  • 笔记
  • 口水
  • 备忘

Amazon bt chanify CodeServer docker fastadmin frp JS Linux MySql NAS openwrt photoprism photosync PHP Portainer Shortener SMB vfs wechat 亚马逊 内网穿透 升级 备份 宝塔 引号 微信 微擎 换行 文本分类 正则 照片 电报 短网址 缓存 群晖 迅雷

近期文章

  • 分本分类模型训练实战教程
  • 电报邀请链接机制
  • 如何批量下载Telegram群组视频图片等媒体
  • Navicat提示2002 10060无法连远程数据库
  • 群晖通过SSH工具命令行方式升级docker应用memos

分本分类模型训练实战教程

  • jeechou
  • 2024-07-31
  • 0

模型下载

在你要工作的目录,按住shift,点击鼠标右键,打开powerShell,克隆项目

git clone https://www.modelscope.cn/tiansz/text_classification.git

环境准备

其实在windows上,还是比较简单,根据教程下载几个软件安装就行了

参考教程

模型地址 https://modelscope.cn/models/tiansz/text_classification

没有可用的显卡?

这里有个显卡的问题,如果没有找到显卡,可以参考此教程 https://blog.csdn.net/banlanggen1111/article/details/130566778

数据准备

我准备了五个TXT分类,垃圾信息:广告.txt,正常聊天:其它.txt,不太确定/软广:软广.txt,许愿.txt,业务.txt
分别丢进去已经第一次清洗过的数据,并且进行人工检查一遍

数据清洗

在拿到一份数据时,需要将数据集中的重复数据剔除,同时删除没有意义的句子,例如纯英文或者纯数字的句子。

python process/clean.py --origin_path datasets/msgcate/未清洗数据.csv --clean_path datasets/msgcate/已清洗数据.csv

因为我已经提前根据分类创建了不同的文件,所以这里应该依次

python process/clean.py --origin_path datasets/msgcate/待清洗_广告.csv --clean_path datasets/msgcate/已清洗_广告.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_其它.csv --clean_path datasets/msgcate/已清洗_其它.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_软广.csv --clean_path datasets/msgcate/已清洗_软广.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_许愿.csv --clean_path datasets/msgcate/已清洗_许愿.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_业务.csv --clean_path datasets/msgcate/已清洗_业务.csv
清洗编码错误

如果遇到清洗的时候提示编码错误,经过测试,可以先新建一个表格文件,然后把内容粘贴进去,保存为待清洗_其它.csv格式的文件,再用记事本打开待清洗_其它.csv文件,另存为的时候,选择UTF8的格式覆盖保存就OK了

语料库

我的理解是,把待清洗的几个文件的内容,合并到语料库.txt

增量预训练

目前分类效果较好的模型都是预训练模型,它们会在大量数据训练出一个模型,然后再用这个模型用于分类任务。听起来可能复杂,但总之我们会用该模型来学习句子之间的语义,让模型懂得句子之间的区别。因此我们会用预训练模型再在我们自己的数据上进行增量预训练,用于提升模型的效果。

python process/preprocess.py --corpus_path datasets/msgcate/语料库.txt --dataset_path datasets/msgcate/dataset.pt
python pretrain.py --dataset_path datasets/msgcate/dataset.pt --pretrained_model_path models/roberta_wwm_base/pretrain_model.bin --output_model_path models/new_pretrain_model.bin --world_size 1 --gpu_ranks 0 --total_steps 100 --save_checkpoint_steps 100 --batch_size 32 --data_processor mlm --target mlm

模型微调

首先需要将数据拆分成训练集和开发集,其中训练集就是模型需要学习的数据了,而开发集就是让模型在开发集来验证当前的拟合效果,所以开发集有时也称为验证集。如果以往接触过相关知识的同学可能要问我为什么不设置测试集,这是因为测试集虽然确实能判断当前模型是否存在过拟合的情况,但由于测试集比较小,所以也无法覆盖所有应用场景,因此不再划分测试集。
新建一个表格文件,按照下方的格式进行整理,然后另存为csv,再用记事本转换成UTF8格式

text_a,label
内容,分类名

成功后执行代码进行模型微调

python process/split.py --label_path datasets/msgcate/已分类数据.csv --train_path datasets/msgcate/train.tsv --dev_path datasets/msgcate/dev.tsv --label2id_path datasets/msgcate/label2id.json --id2label_path datasets/msgcate/id2label.json

得到拆分的数据后我们终于可以来训练分类模型了

python finetune.py --pretrained_model_path models/new_pretrain_model.bin --train_path datasets/msgcate/train.tsv --dev_path datasets/msgcate/dev.tsv --epochs_num 50 --batch_size 32

模型推理

我们在训练完模型后,还需要不断地迭代模型,所以需要在大量的未标注数据上进行推理。同时在推理完之后需要对推理后的数据重新进行标注,用以提升模型的准确率和泛化性。

python inference.py --load_model_path models/finetune_model.bin --test_path datasets/msgcate/test_nolabel.tsv --prediction_path datasets/msgcate/prediction.tsv --labels_num 5 --batch_size 32

这一步直接执行会提示test_nolabel.tsv文件找不到,那么我是把已分类的数据,去掉第二列,然后保存为test_nolabel.tsv,再之上上面的代码就OK
不过最终得到的推理结果是保存在 tsv 格式的文件中,为了更方便标注,后续需要将推理结果转换为 xlsx 文件

python process/merge.py --test_path datasets/msgcate/test_nolabel.tsv --prediction_path datasets/msgcate/prediction.tsv --mapping_path datasets/msgcate/label2id.json --merge_path datasets/msgcate/合并语料.xlsx

部署模型

模型文件部署

将models文件夹上传到服务器,目录为/text/models/

我这里因为买的服务器系统只有CentOs 8 ,都是默认安装的python3.6,安装python3.7以上版本很麻烦,所以是先在本地测试,用内网穿透跑起来

启动脚本代码

python的运行文件代码,在/text/目录保存文件,名称为app.py

from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline

# 加载模型和分词器
model_path = "models/classification_model_q"  # 你的模型路径
model = AutoModelForSequenceClassification.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 创建 FastAPI 应用
app = FastAPI()

# 创建 pipeline
pipe = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)

# 定义一个数据模型用于验证请求体
class TextItem(BaseModel):
    text: str

# 定义一个 API 端点,接收文本并返回情感分析结果
@app.post("/sentiment-analysis/")
async def sentiment_analysis(item: TextItem):
    result = pipe(item.text)[0]
    return {"text": item.text, "label": result['label'], "score": result['score']}

# 定义一个健康检查的 API 端点
@app.get("/health/")
async def health_check():
    return {"status": "healthy"}

Python安装版本

需要安装3.7或以上版本的python

依赖环境安装

  1. 安装PyTorch库
pip install torch torchvision

当遇到 pip: command not found 错误时,这通常意味着 pip 未被正确安装或未添加到系统的环境变量中。
对于 CentOS Stream 8 系统,您可以执行以下命令:sudo yum install python3-pip
安装完成后,再次尝试执行 pip install torch torchvision 命令

经过实战,发现低版本的CentOs安装依赖的时候问题相当多,我在一个CentOs Stream 9 系统上面比较顺畅。

  1. 安装transformers,不然会报错ModuleNotFoundError: No module named 'transformers'
pip install transformers
  1. 需要在服务器安装fastapi,查了下资料,相比Flask并发和性能好一些
pip install fastapi
运行fastapi

安装完之后,运行脚本的代码

uvicorn app:app --reload

或者,可以指定host和端口

uvicorn app:app --host 0.0.0.0 --port 8000

PHP实例

public function analyzeSentiment(text) {url = "http://domain/sentiment-analysis/";

        data = [
            "text" =>text
        ];

        options = [
            'http' => [
                'header'  => "Content-type: application/json\r\n",
                'method'  => 'POST',
                'content' => json_encode(data),
            ],
        ];

        context  = stream_context_create(options);
        result = file_get_contents(url, false, context);

        if (result === false) {
            echo "Request failed.";
        } else {
            response = json_decode(result, true);
            if (isset(response['error'])) {
                echo "Request failed with status".response['status'];
                echo "Error details: " . response['message'];
                return false;
            } else {
                echo "Sentiment analysis result: ";
                print_r(response);
                return response;
            }
        }eTime = time();
        echo "\n耗时:" . eTime -sTime;
    }

Ubuntu系统说明

如果在Ubuntu系统安装,则有注意事项
通过 pip 命令安装 transformers 和 fastapi 等python包时,系统会报错安全问题,则需要创建并使用虚拟环境。

安装venv&full

首先,确保你已经安装了python3-venv和python3-full。你可以通过运行sudo apt install python3-venv python3-full来安装它们

创建虚拟环境
  • 通过python3 -m venv myenv来创建一个虚拟环境,其中myenv这里myenv是虚拟环境的名称,你可以根据需要更改它。
激活虚拟环境
  • 激活虚拟环境。在终端中,运行以下命令来激活虚拟环境(根据你的shell类型,命令可能略有不同):
source myenv/bin/activate  # 对于bash或zsh  
# 或者  
myenv\Scripts\activate     # 如果你使用的是Windows的cmd
© 2025 唯心笔录
Theme by Wing
蜀ICP备2020027593号-1
  • {{ item.name }}
  • {{ item.name }}