当前位置: 首页 > article >正文

Ubuntu 22.04安装MongoDB:GLM4模型对话数据收集与微调教程

在Ubuntu 22.04安装MongoDB Community Edition的教程请点击下方链接进行参考:

点击这里获取MongoDB Community Edition安装教程

今天将为大家带来如何微调GLM4模型并连接数据库进行对话的教程。快跟着小编一起试试吧~

1. 大模型 ChatGLM4 微调步骤

1.1 从 github 仓库 克隆项目

  • 克隆存储库:
#拉取代码
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git

image.png

出现以上页面即是克隆项目成功!

请注意,如果 git clone https://github.com/hiyouga/LLaMA-Factory.git 这个链接不存在或者无效,git clone 命令将不会成功克隆项目,并且会报错。确保链接是有效的,并且您有足够的权限访问该存储库。

1.2 安装模型依赖库

  • 切换到项目目录、安装依赖
#切换到LLaMA-Factory根目录
cd LLaMA-Factory#安装项目依赖
pip install -e ".[torch,metrics]"

image.png

等待安装完成

image.png

1.3 下载需要微调的模型

  • Git 下载
  • 请确保 lfs 已经被正确安装
git lfs installgit clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git ZhipuAI/glm-4-9b-chat

1.4 启动 webui.py 文件

注意这里需要在 LLaMA-Factory 的根目录启动

# 启动 webui.py 文件
python src/webui.py

image.png

需要设置 Gradio 服务器名称和端口

# 设置 Gradio 服务器名称和端口
export GRADIO_SERVER_NAME=0.0.0.0
export GRADIO_SERVER_PORT=8080# 启动 webui.py 文件
python src/webui.py

image.png

启动端口后就可以访问微调页面了页面如下:

image.png

1.5 微调页面操作步骤

1.5.1 语言切换

image.png

1.5.2 选择微调模型

image.png

1.5.3 加载本地模型的文件路径

image.png

1.5.4 准备数据集
  • 复制以下路径进入 算家云文件管理 页面,并打开 identity.json 文件
LLaMA-Factory/data/

image.png

  • 按照以下数据格式进行数据替换

image.png

1.5.5 选择数据

image.png

1.5.6 开始微调模型

image.png

image.png

出现以上问题,需要安装 deepspeed 依赖

# 安装 deepspeed 依赖
pip3 install deepspeed

image.png

等待安装完成

image.png

再次启动 webui.py 文件,开始微调模型

# 启动 webui.py 文件
python src/webui.py

image.png

1.5.7 微调过程展示
  • web 页面

image.png

  • 命令行

image.png

1.5.8 训练完成

image.png

1.5.9 模型验证
  • 选择模型检查点

image.png

  • 选择数据集

image.png

  • 开始执行验证模型

image.png

  • 等待执行完成

image.png

1.5.10 模型加载
  • 加载模型检查点

image.png

  • 输入文本,进行对话

    image.png

  • 验证模型对话

image.png

1.5.11 模型合并
  • 加载保存导出模型的文件夹路径

image.png

  • web 完成页面

image.png

  • 命令行完成页面

image.png

2 大模型 GLM4 微调调用

2.1 结束当前运行(按键盘上的 Ctrl + C)

image.png

2.2 从 github 仓库 克隆项目

  • 克隆存储库:
#拉取代码
git clone https://github.com/THUDM/GLM-4.git

image.png

出现以上页面即是克隆项目成功!

请注意,如果  bash git clone https://github.com/THUDM/GLM-4.git 这个链接不存在或者无效,git clone 命令将不会成功克隆项目,并且会报错。确保链接是有效的,并且您有足够的权限访问该存储库。

2.3 修改微调后保存的模型、IP 以及端口

vim GLM-4/basic_demo/trans_web_demo.py

image.png

image.png

2.4 启动trans_web_demo.py 文件

# 启动 trans_web_demo.py 文件
python /GLM-4/basic_demo/trans_web_demo.py

image.png

2.5 访问端口,进行模型测试

image.png

测试结果如下

image.png

3.编辑trans_web_demo.py 文件连接 MongoDB 数据库

3.1 MongoDB配置

首先,在代码的开头部分定义了MongoDB的连接字符串 MONGO_URI、数据库名称 DB_NAME和集合名称 COLLECTION_NAME。这些变量用于指定MongoDB服务器的位置、要使用的数据库以及存储对话记录的集合。

# MongoDB配置
MONGO_URI = "mongodb://root:123456@localhost:27017/"
DB_NAME = "chat_records"
COLLECTION_NAME = "conversations"

3.2 连接MongoDB

接下来,使用 pymongo库来建立与MongoDB服务器的连接,并选择相应的数据库和集合。

# 连接MongoDB
client = pymongo.MongoClient(MONGO_URI)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]

这里,client对象代表与MongoDB服务器的连接,db对象表示选择了名为 chat_records的数据库,而 collection对象则指向了该数据库中的 conversations集合。

3.3 保存对话记录

为了将每次对话的结果保存到MongoDB,定义了一个名为 save_to_mongodb的函数。此函数接受用户消息和模型响应作为参数,并创建一个包含这些信息的新文档,同时添加了时间戳。

def save_to_mongodb(user_message: str, model_response: str):"""将对话记录保存至MongoDB"""record = {"user_message": user_message,"model_response": model_response,"timestamp": datetime.datetime.now()  # 使用datetime模块获取当前时间}collection.insert_one(record)

在这个函数中,record字典包含了用户的消息、模型的响应以及当前的时间戳。通过调用 collection.insert_one(record)方法,可以将这条记录插入到MongoDB的 conversations集合中。

3.4 融入预测流程

当用户提交查询后,会触发 predict函数来生成模型的响应。一旦模型完成了对用户输入的处理并生成了响应,就会调用 save_to_mongodb函数来保存这次对话记录。

for new_token in streamer:if new_token:response += new_tokenhistory[-1][1] = responseyield history
# 当响应完成时,保存对话记录到MongoDB
save_to_mongodb(history[-1][0], response)

在这段代码中,当模型生成的响应流结束时,会调用 save_to_mongodb函数,将最后一次用户输入(history[-1][0])和模型生成的完整响应(response)作为参数传递给它,从而实现对话记录的保存。

3.5 融入全部 MongoDB 代码到 webui.py 文件

import os
from pathlib import Path
from threading import Thread
from typing import Union
import datetime  # 导入datetime模块import gradio as gr
import pymongo
import torch
from peft import AutoPeftModelForCausalLM, PeftModelForCausalLM
from transformers import (AutoModelForCausalLM,AutoTokenizer,PreTrainedModel,PreTrainedTokenizer,PreTrainedTokenizerFast,StoppingCriteria,StoppingCriteriaList,TextIteratorStreamer
)ModelType = Union[PreTrainedModel, PeftModelForCausalLM]
TokenizerType = Union[PreTrainedTokenizer, PreTrainedTokenizerFast]MODEL_PATH = os.environ.get('MODEL_PATH', '/root/sj-tmp/ZhipuAI/glm-4-9b-chat-20241025-1/')
TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)# MongoDB配置
MONGO_URI = "mongodb://root:123456@localhost:27017/"
DB_NAME = "chat_records"
COLLECTION_NAME = "conversations"# 连接MongoDB
client = pymongo.MongoClient(MONGO_URI)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]def _resolve_path(path: Union[str, Path]) -> Path:return Path(path).expanduser().resolve()def load_model_and_tokenizer(model_dir: Union[str, Path], trust_remote_code: bool = True
) -> tuple[ModelType, TokenizerType]:model_dir = _resolve_path(model_dir)if (model_dir / 'adapter_config.json').exists():model = AutoPeftModelForCausalLM.from_pretrained(model_dir, trust_remote_code=trust_remote_code, device_map='auto')tokenizer_dir = model.peft_config['default'].base_model_name_or_pathelse:model = AutoModelForCausalLM.from_pretrained(model_dir, trust_remote_code=trust_remote_code, device_map='auto')tokenizer_dir = model_dirtokenizer = AutoTokenizer.from_pretrained(tokenizer_dir, trust_remote_code=trust_remote_code, use_fast=False)return model, tokenizermodel, tokenizer = load_model_and_tokenizer(MODEL_PATH, trust_remote_code=True)class StopOnTokens(StoppingCriteria):def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:stop_ids = model.config.eos_token_idfor stop_id in stop_ids:if input_ids[0][-1] == stop_id:return Truereturn Falsedef save_to_mongodb(user_message: str, model_response: str):"""将对话记录保存至MongoDB"""record = {"user_message": user_message,"model_response": model_response,"timestamp": datetime.datetime.now()  # 使用datetime模块获取当前时间}collection.insert_one(record)def predict(history, prompt, max_length, top_p, temperature):stop = StopOnTokens()messages = []if prompt:messages.append({"role": "system", "content": prompt})for idx, (user_msg, model_msg) in enumerate(history):if prompt and idx == 0:continueif idx == len(history) - 1 and not model_msg:messages.append({"role": "user", "content": user_msg})breakif user_msg:messages.append({"role": "user", "content": user_msg})if model_msg:messages.append({"role": "assistant", "content": model_msg})model_inputs = tokenizer.apply_chat_template(messages,add_generation_prompt=True,tokenize=True,return_tensors="pt").to(next(model.parameters()).device)streamer = TextIteratorStreamer(tokenizer, timeout=60, skip_prompt=True, skip_special_tokens=True)generate_kwargs = {"input_ids": model_inputs,"streamer": streamer,"max_new_tokens": max_length,"do_sample": True,"top_p": top_p,"temperature": temperature,"stopping_criteria": StoppingCriteriaList([stop]),"repetition_penalty": 1.2,"eos_token_id": model.config.eos_token_id,}t = Thread(target=model.generate, kwargs=generate_kwargs)t.start()response = ""for new_token in streamer:if new_token:response += new_tokenhistory[-1][1] = responseyield history# 当响应完成时,保存对话记录到MongoDBsave_to_mongodb(history[-1][0], response)with gr.Blocks() as demo:gr.HTML("""<h1 align="center">GLM-4-9B Gradio Simple Chat Demo</h1>""")chatbot = gr.Chatbot()with gr.Row():with gr.Column(scale=3):with gr.Column(scale=12):user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10, container=False)with gr.Column(min_width=32, scale=1):submitBtn = gr.Button("Submit")with gr.Column(scale=1):prompt_input = gr.Textbox(show_label=False, placeholder="Prompt", lines=10, container=False)pBtn = gr.Button("Set Prompt")with gr.Column(scale=1):emptyBtn = gr.Button("Clear History")max_length = gr.Slider(0, 32768, value=8192, step=1.0, label="Maximum length", interactive=True)top_p = gr.Slider(0, 1, value=0.8, step=0.01, label="Top P", interactive=True)temperature = gr.Slider(0.01, 1, value=0.6, step=0.01, label="Temperature", interactive=True)def user(query, history):return "", history + [[query, ""]]def set_prompt(prompt_text):return [[prompt_text, "成功设置prompt"]]pBtn.click(set_prompt, inputs=[prompt_input], outputs=chatbot)submitBtn.click(user, [user_input, chatbot], [user_input, chatbot], queue=False).then(predict, [chatbot, prompt_input, max_length, top_p, temperature], chatbot)emptyBtn.click(lambda: (None, None), None, [chatbot, prompt_input], queue=False)demo.queue()
demo.launch(server_name="0.0.0.0", server_port=8080, inbrowser=True, share=True)

4. 测试 MongoDB 是否正常连接到对话过程

4.1 启动 webui.py 文件

  • 安装 pymongo
pip install pymongo
  • 启动 trans_web_demo.py 文件
# 启动 webui.py 文件
python /GLM-4/basic_demo/trans_web_demo.py

image.png

4.2 访问端口,进行模型测试

  • Gradio 测试结果如下

image.png

  • 命令行测试结果如下

image.png

  • Navicat 测试结果如下

image.png

到此,在 Ubuntu 22.04 上安装 MongoDB Community Edition 进行 GLM4 模型微调的对话数据收集到此就结束了。

相关文章:

Ubuntu 22.04安装MongoDB:GLM4模型对话数据收集与微调教程

在Ubuntu 22.04安装MongoDB Community Edition的教程请点击下方链接进行参考&#xff1a; 点击这里获取MongoDB Community Edition安装教程 今天将为大家带来如何微调GLM4模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1. 大模型 ChatGLM4 微调步骤 1.1 从 github…...

Java 中的继承与多态:面向对象编程的核心特性

继承和多态是面向对象编程中最重要的两个概念&#xff0c;它们使代码结构更加清晰、灵活&#xff0c;并极大地提高了代码复用性。本文将深入探讨 Java 中的继承与多态&#xff0c;帮助你更好地理解这些核心概念。 1. 继承 1.1 为什么需要继承 在实际编程中&#xff0c;我们经…...

可编程增益放大器(PGA)在智能传感器自调节系统中的角色

在电子电路设计中&#xff0c;放大器芯片作为信号处理的核心器件&#xff0c;其性能直接影响系统整体表现。然而面对运算放大器、功率放大器、仪表放大器等众多类型&#xff0c;工程师常陷入选型困惑。作为国内领先的半导体解决方案提供商&#xff0c;华芯邦深耕放大器芯片领域…...

微信登录、商品浏览前瞻

一.业务效果 二.所需技术...

浙大研究团队揭示电场调控5-HT1AR的分子机制

本期介绍的文章题为 “Structural Insight into the Inactive/Active States of 5‑HT1AR and Molecular Mechanisms of Electric Fields in Modulating 5‑HT1AR” 。近期发表于JCIM。通过分子动力学模拟&#xff0c;探究 5-羟色胺 1A 受体(5-HT1AR) 在非活性 / 活性状态的构象…...

RoboOS与RoboBrain:引领具身智能新时代的跨本体协作框架

摘要 2025年3月29日&#xff0c;智源研究院在中关村论坛的“未来人工智能先锋论坛”上发布了两项重要成果&#xff1a;跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain。这一创新技术使机器人能够实现跨场景多任务部署及跨本体协作&#xff0c;推动单机智能向群体智能…...

视频AI赋能水利行业生态治理,水电站大坝漂浮物实时监测与智能预警方案

水电站大坝周边水域垃圾漂浮物不仅影响水质&#xff0c;还可能对大坝设施运行、水生态环境造成威胁。传统依靠人工巡检的方式效率低、存在监测盲区&#xff0c;难以实时全面地掌握漂浮物情况。借助EasyCVR视频汇聚平台与TSINGSEE青犀AI算法中台构建智能化监测方案&#xff0c;能…...

SnapdragonCamera骁龙相机源码解析

骁龙相机是高通开发的一个测试系统摄像头的demo&#xff0c;代码完善&#xff0c;功能强大。可以配合Camera驱动进行功能联调。 很多逻辑代码在CaptureModule.java里。 CaptureModule有8000多行&#xff0c;包罗万象。 涉及到界面显示要结合CaptureUI.java 一起来实现。 Ca…...

Spring Boot 整合 RabbitMQ:注解声明队列与交换机详解

RabbitMQ 作为一款高性能的消息中间件&#xff0c;在分布式系统中广泛应用。Spring Boot 通过 spring-boot-starter-amqp 提供了对 RabbitMQ 的无缝集成&#xff0c;开发者可以借助注解快速声明队列、交换机及绑定规则&#xff0c;极大简化了配置流程。本文将通过代码示例和原理…...

SecureCRT常用命令

一、连接命令 1. telnet&#xff1a;使用Telnet协议连接到远程设备。 例如&#xff1a;telnet 192.168.1.1 会连接到IP地址为192.168.1.1的远程设备。 二、文件传输命令 2. put&#xff1a;上传文件到远程服务器。 例如&#xff1a;put C:\localfile.txt /remotefolder 将本地文…...

flink 分组窗口聚合 与 窗口表值函数聚合 的区别

警告&#xff1a;分组窗口聚合已经过时。推荐使用更加强大和有效的窗口表值函数聚合。 参考官方文档 在 Apache Flink 中&#xff0c;分组窗口聚合&#xff08;Group Window Aggregation&#xff09; 和 窗口表值函数聚合&#xff08;Windowing TVF Aggregation&#xff09;…...

阿里云Tair KVCache:打造以缓存为中心的大模型Token超级工厂

一、Tair KVCache 简介 Tair KVCache 是阿里云瑶池旗下云数据库 Tair 面向大语言模型推理场景推出的 KVCache 缓存加速服务。 随着互联网技术的演进与流量规模的激增&#xff0c;缓存技术逐渐成为系统架构的核心组件。该阶段催生了 Redis 等开源缓存数据库&#xff0c;阿里巴巴…...

通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍&#xff1a; DMA控制器可以生成单次传输或增量突发传输&#xff0c;传输的节拍数为4、8或16。 为了确保数据一致性&#xff0c;构成突发传输的每组传输都是不可分割的&#xff1a;AHB传输被锁定&#xff0c;AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备…...

【JAVA】【疑难杂症解决!】org.springframework.transaction.UnexpectedRollbackException:

程序莫名其妙出现这个事务回滚错误,不显示具体错误信息!! 问题:前几天遇到一个问题,代码没有抛出我想要的带自定义提示消息的异常,却报了个这个,去搜了一下,大概原因如下: 因为我在方法上写了@Transactional注解,里边调用的service的方法上也写了@Transactional注解…...

[Effective C++]条款26:尽可能延后变量定义的出现时间

. 在C中&#xff0c;尽可能延后变量定义的出现时间&#xff0c;主要原因是为了提供代码的可读性&#xff0c;减少不必要的开销以及避免潜在的错误。 1、代码执行过程中抛出异常 如果在代码开头定义了变量&#xff0c;但在后续代码中抛出了异常&#xff0c;可能导致变量在未被使…...

如何在k8s中对接s3存储

github地址&#xff1a; https://github.com/majst01/csi-driver-s3 1.CSI for S3 这是用于 S3&#xff08;或兼容 S3&#xff09;存储的容器存储接口 (CSI)。它可以动态分配存储桶并通过Fuse mount将它们安装到任何容器中 2.状态 这仍处于试验阶段&#xff0c;不应在任何…...

基于TradingView和CTPBee的自动化期货交易系统实现

引言 在量化交易领域&#xff0c;TradingView因其强大的技术分析工具和丰富的指标库而广受欢迎&#xff0c;但是其不支持国内期货自动化交易&#xff0c;CTPBee则是一个优秀的国产Python期货交易接口。本文将介绍如何将两者结合&#xff0c;实现一个完整的自动化交易系统。 本…...

FPGA实现LED流水灯

一、在VsCode中写代码 1、建立工程项目文件water_led.v文件 2、打开项目文件&#xff0c;创建三个目录 3、打开文件trl&#xff0c;创建water_led.v文件 4、打开文件tb&#xff0c;创建water_led_tb.v文件 5、用VsCode打开water_led.v文件&#xff0c;编写源代码 module water…...

电商场景下高稳定性数据接口的选型与实践

在电商系统开发中&#xff0c;API接口需要应对高并发请求、动态数据更新和复杂业务场景。我将重点解析电商场景对数据接口的特殊需求及选型方案。 一、电商API必备的四大核心能力 千万级商品数据实时同步 支持SKU基础信息/价格/库存多维度更新每日增量数据抓取与历史版本对比…...

4199. 公约数-公约数模版题

给定两个正整数 a 和 b。 你需要回答 q个询问。 每个询问给定两个整数 l,r&#xff0c;你需要找到最大的整数 x&#xff0c;满足&#xff1a; x 是 a 和 b 的公约数。l≤x≤r。 输入格式 第一行包含两个整数 a,b。 第二行包含一个整数 q。 接下来 q 行&#xff0c;每行包…...

百度文库免费下载器

01 引言 在国内的环境下&#xff0c;Greasy Fork网站是彻底打不开了&#xff0c;导致好多小伙伴想要用脚本都没办法。 特别是需要某Wen库下载的小伙伴&#xff0c;之前还说实在没办法&#xff0c;去Greasy Fork网站上安个脚本就可下载&#xff0c;但是现在网站被墙了&#xf…...

[NCTF2019]True XML cookbook[XXE] [内网探测] [网络ip相关知识]

一模一样的登录界面 我直接故伎重演但是并卵 &#xff08;话说XXE注入之前好像其他博客都加上了<?xml version"1.0" encoding"utf-8"?>&#xff0c;但是不加好像也没有什么问题&#x1f914;&#xff09; <?php /** * autor: c0ny1 * date: …...

Qt | 电脑音频采集曲线Charts

01 audio.pro # 项目使用了charts(图表)模块和multimedia(多媒体)模块。QT += charts multimedia# 调试打印QT += coreHEADERS += \ widget.h \ xyseriesiodevice.hSOURCES += \ main.cpp\ widget.cpp \ xyseriesiodevice.cpptarget.path = $$[QT_INSTAL…...

Linux驱动的基本概念

一 交叉开发编译 概念&#xff1a;交叉开发编译(Cross Compilation)是指在一个平台上生成能在另一个不同平台上执行的代码的编译过程。这是嵌入式系统开发和跨平台软件开发中的常见技术。 二 系统启动流程 在Linux源码下&#xff0c;通过网口利用tftp协议把u-bantu下的uImage…...

win server2022 限制共享文件夹d

点击配额管理中的配额 然后创建配额 导入要配额的文件即可 然后确定即可...

Ansible(3)——主机清单与配置文件

目录 一、创建 Ansible 清单&#xff1a; 1、清单定义&#xff1a; 2、使用静态清单指定受管主机&#xff1a; &#xff08;1&#xff09;主机名称指定&#xff1a; &#xff08;2&#xff09;IP 地址指定&#xff1a; 3、验证清单&#xff1a; &#xff08;1&#xff0…...

C语言 【初始指针】【指针一】

引言 思绪很久&#xff0c;还是决定写一写指针&#xff0c;指针这块内容很多&#xff0c;也不是那么容易说清楚&#xff0c;这里尽可能写地详细&#xff0c;让大家理解指针。&#xff08;未完序&#xff09; 一、内存和地址 在讲指针前&#xff0c;需要有一个对内存和地址的认…...

装饰器模式详解

以下是一个结合装饰器模式解决实际开发问题的Java实现案例&#xff0c;涵盖动态扩展功能、多层装饰顺序控制、性能优化等场景需求&#xff0c;附带逐行中文注释&#xff1a; 场景描述 开发一个数据加密传输系统&#xff0c;需满足&#xff1a; 基础功能&#xff1a;原始数据传…...

IP 地址规划中的子网划分:/18 网络容纳 64 个 C 段(/24)的原理与应用解析

整体表格说明 这是某市教育城域网中某县教育相关机构的IP地址规划表&#xff0c;明确了某县一中和某县教育局的IP地址范围&#xff0c;包括终端使用地址段、业务互访地址段。 概念解析 64个C段终端及互联地址 C段地址&#xff1a;一个C段是IP地址中的一个/24网络&#xff08;…...

linux下Tomcat配置提示权限不够解决办法

文章目录 前言解决方案 前言 往linux服务器上部署Java后端&#xff0c;但是在服务器上安装好的tomcat&#xff0c;却因为权限不够无法进入 这就导致后端war包项目及前端页面无法部署 解决方案 sudo chmod -R 777 /opt/tomcat/webapps修改tomcat目录下的权限即可&#xff0c;对…...