ChatGLM3-6B部署与微调及微调后使用

记录ChatGLM3-6B部署及官方Lora微调示例详细步骤及如何使用微调后的模型进行推理

一、下载代码

使用git clone 命令下载源码

git clone https://github.com/THUDM/ChatGLM3.git

如图所示

 

二、下载模型

模型权重文件从魔塔进行下载,不需要翻墙。权重文件比较大,所以花费时间也比较长,请耐心等待。

git lfs install
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

  

使用pwd命令获取模型路径,这个路径后面需要用到:

pwd
/mnt/workspace/chatglm3-6b

 

三、 启动验证

使用命令方式启动,启动之前需要修改模型地址配置。在路径 ChatGLM3/basic_demo 下找到文件 cli_demo.py 文件,修改MODEL_PATH,修改后的路径就是第二步【下载模型】后使用 pwd 命令查询出来的路径。

启动之前安装依赖

cd 到 ChatGLM3 路径下pip install -r requirements.txt

 

使用一下命令启动并验证,第一次启动会略慢

cd 到 basic_demo 路径下python cli_demo.py

 

四、 微调

经过多次尝试,微调的GPU显存应不小于24G,不然容易报OOM等错误。微调参数意义参考: ChatGLM3/finetune_demo at main · THUDM/ChatGLM3 (github.com)

首先先安装微调的依赖

cd 到目录 ChatGLM3/finetune_demopip install -r requirements.txt

 上传数据

转换数据,调整为标准的对话格式

import json
from typing import Union
from pathlib import Pathdef _resolve_path(path: Union[str, Path]) -> Path:return Path(path).expanduser().resolve()def _mkdir(dir_name: Union[str, Path]):dir_name = _resolve_path(dir_name)if not dir_name.is_dir():dir_name.mkdir(parents=True, exist_ok=False)def convert_adgen(data_dir: Union[str, Path], save_dir: Union[str, Path]):def _convert(in_file: Path, out_file: Path):_mkdir(out_file.parent)with open(in_file, encoding='utf-8') as fin:with open(out_file, 'wt', encoding='utf-8') as fout:for line in fin:dct = json.loads(line)sample = {'conversations': [{'role': 'user', 'content': dct['content']},{'role': 'assistant', 'content': dct['summary']}]}fout.write(json.dumps(sample, ensure_ascii=False) + '\n')data_dir = _resolve_path(data_dir)save_dir = _resolve_path(save_dir)train_file = data_dir / 'train.json'if train_file.is_file():out_file = save_dir / train_file.relative_to(data_dir)_convert(train_file, out_file)dev_file = data_dir / 'dev.json'if dev_file.is_file():out_file = save_dir / dev_file.relative_to(data_dir)_convert(dev_file, out_file)convert_adgen('data/AdvertiseGen', 'data/AdvertiseGen_fix')

 得到转换后的训练和验证数据:

使用以下命令开始训练, data/AdvertiseGen_fix  - 微调数据路径; /mnt/workspace/chatglm3-6b - 模型权重路径

cd 到 finetune_demo 目录下CUDA_VISIBLE_DEVICES=0 NCCL_P2P_DISABLE="1" NCCL_IB_DISABLE="1" python finetune_hf.py  data/AdvertiseGen_fix  /mnt/workspace/chatglm3-6b  configs/lora.yaml

训练中,根据数据量和参数设置的不同而花费的时间不同,我大概花了1个小时

 验证微调后的效果

CUDA_VISIBLE_DEVICES=0 NCCL_P2P_DISABLE="1" NCCL_IB_DISABLE="1" python inference_hf.py output/checkpoint-3000/ --prompt "类型#裙*版型#显瘦*材质#网纱*风格#性感*裙型#百褶*裙下摆#压褶*裙长#连衣裙*裙衣门襟#拉链*裙衣门襟#套头*裙款式#拼接*裙款式#拉链*裙款式#木耳边*裙款式#抽褶*裙款式#不规则"

 

五、 微调后的模型

如果想要在 basic_demo 路径下的各demo中结合使用微调后的模型,需要修改 basic_demo/ 下的*_demo.py代码,即使用 finetune_demo/inference_hf 中的 方法 load_model_and_tokenizer 替换各demo里面获取 model 和 tokenizer的方法

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)return model, tokenizer

以 basic_demo/cli_demo.py 为例,暴力粘合后的代码如下:

import os
import platform
from pathlib import Path
from typing import Annotated, Union
from peft import AutoPeftModelForCausalLM, PeftModelForCausalLM
from transformers import (AutoModelForCausalLM,AutoTokenizer,PreTrainedModel,PreTrainedTokenizer,PreTrainedTokenizerFast,
)ModelType = Union[PreTrainedModel, PeftModelForCausalLM]
TokenizerType = Union[PreTrainedTokenizer, PreTrainedTokenizerFast]
def _resolve_path(path: Union[str, Path]) -> Path:return Path(path).expanduser().resolve()MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)def load_model_and_tokenizer(model_dir: Union[str, Path]) -> 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=True, device_map='auto')tokenizer_dir = model.peft_config['default'].base_model_name_or_pathelse:model = AutoModelForCausalLM.from_pretrained(model_dir, trust_remote_code=True, device_map='auto')tokenizer_dir = model_dirtokenizer = AutoTokenizer.from_pretrained(tokenizer_dir, trust_remote_code=True)return model, tokenizer# tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
# model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()finetune_path = '/mnt/workspace/ChatGLM3/finetune_demo/output/checkpoint-3000'
model, tokenizer = load_model_and_tokenizer(finetune_path)# add .quantize(bits=4, device="cuda").cuda() before .eval() to use int4 model
# must use cuda to load int4 modelos_name = platform.system()
clear_command = 'cls' if os_name == 'Windows' else 'clear'
stop_stream = Falsewelcome_prompt = "欢迎使用 ChatGLM3-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序"def build_prompt(history):prompt = welcome_promptfor query, response in history:prompt += f"\n\n用户:{query}"prompt += f"\n\nChatGLM3-6B:{response}"return promptdef main():past_key_values, history = None, []global stop_streamprint(welcome_prompt)while True:query = input("\n用户:")if query.strip() == "stop":breakif query.strip() == "clear":past_key_values, history = None, []os.system(clear_command)print(welcome_prompt)continueprint("\nChatGLM:", end="")current_length = 0for response, history, past_key_values in model.stream_chat(tokenizer, query, history=history, top_p=1,temperature=0.01,past_key_values=past_key_values,return_past_key_values=True):if stop_stream:stop_stream = Falsebreakelse:print(response[current_length:], end="", flush=True)current_length = len(response)print("")if __name__ == "__main__":main()

最后使用 python cli_demo.py执行测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【docker 】push 镜像到私服

查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…

设计合理的IT运维服务目录:打造高效运维的蓝图

在数字化转型的浪潮中,一个设计合理、内容详尽的IT运维服务目录是连接服务提供者与消费者之间的桥梁,它不仅体现了服务设计的专业性,还直接影响着运维效率和服务质量。如何设计出既合理又高效的IT运维服务目录?让我们结合ITIL 4框…

【全开源】JAVA台球助教台球教练多端系统源码支持微信小程序+微信公众号+H5+APP

功能介绍 球厅端:球厅认证、教练人数、教练的位置记录、助教申请、我的项目、签到记录、我的钱包、数据统计 教练端:我的页面,数据统计、订单详情、保证金、实名认证、服务管理、紧急求助、签到功能 用户端:精准分类、我的助教…

Maven的使用

1.第一个Maven工程 1.1 创建约定目录结构 ​ Hello ​ src ​ ——main(存放主程序) ​ ————java(存放源代码文件) ​ ————resources(存放配置文件和资源文件) ​ ——test(存放测试程序) ​ ————java ​ ————resources ​ pom.xml 1.2 创建核心文件 pom.xml …

mysql等保测评2.0命令-三级

版本 Win默认安装位置 C:\Program Files\MySQL\MySQL Server 8.0\bin 版本:select version() from dual; 身份鉴别 a应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 1、SELEC…

新能源汽车中HEV与PHEV分别代表什么车型,它们与传统燃油车都有什么区别?

前言 新能源汽车正逐渐成为全球汽车工业的主流方向,而HEV(Hybrid Electric Vehicle)和PHEV(Plug-in Hybrid Electric Vehicle)这两种混合动力车型在这一转型过程中扮演着重要角色。下面我们详细探讨HEV与PHEV的定义&a…

RAG查询改写方法概述

在RAG系统中,用户的查询是丰富多样的,可能存在措辞不准确和缺乏语义信息的问题。这导致使用原始的查询可能无法有效检索到目标文档。 因此,将用户查询的语义空间与文档的语义空间对齐至关重要,目前主要有查询改写和嵌入转换两种方…

扫码查看文件是如何实现的?文件活码在线生成的方法

现在很多场景下会通过扫码的方式来查看文件,这种方式可以让更多的人同时通过扫码的方式来查看二维码,有利于文件的快速分享以及用户获取内容的个人体验,而且可以保护文件的安全性,那么如何制作文件二维码呢? 文件二维…

中国211大学全部排名一览表

211大学是指中国教育部实施的名为“211工程”的高等教育发展战略中被选为重点支持的高等院校。这个名称来源于项目的启动背景和目标:“211”中的“21”代表21世纪,意味着该项目面向21世纪的中国高等教育发展;“1”则意指要重点建设大约100所左…

商机无限:实景无人自动直播软件带动实体店和电商行业新一波繁荣!

直播带货风潮的兴起确实是近年来电商行业的一个显著趋势。短视频平台的崛起为直播电商开辟了新的商业蓝海,商家们也纷纷加入到直播带货的行列中。然而,对于许多商家来说,找到合适的主播并不容易,这给他们带来了一定的困扰。hhgg加…

API接口开发实现一键智能化自动抓取电商平台数据商品详情支持高并发免费接入示例

要开发一个API接口,用于自动抓取电商平台的商品详情数据,并支持高并发和免费接入,你需要考虑以下几个步骤: 确定目标电商平台和商品详情的数据结构。设计API接口规范,包括请求和响应格式。实现数据抓取逻辑&#xff0…

Ryght 在 Hugging Face 专家助力下赋能医疗保健和生命科学之旅

本文是 Ryght 团队的客座博文。 Ryght 是何方神圣? Ryght 的使命是构建一个专为医疗保健和生命科学领域量身定制的企业级生成式人工智能平台。最近,公司正式公开了 Ryght 预览版 平台。 Ryght 预览版https://www.ryght.ai/signup?utm_campaignPreview%2…

各种数据获取stream流的方式

1.单列集合&#xff08;直接调用&#xff09; ArrayList<Integer> list new ArrayList<>();list.stream(); 2.双列集合 HashMap<String, Integer> map new HashMap<>();map.put("aaa",111);map.put("bbb",222);map.put("c…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前&#xff0c;先了解一下声波的概念以及超声波和声波之间的关系 什么是声波&#xff1f; 声波是物体机械振动状态&#xff08;或能量&#xff09;的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式&#xff0c;这种振动状…

工厂模式应用实例

引言 设计模式概念 设计模式&#xff08;Design Pattern&#xff09;的官方概念可以表述为&#xff1a;在软件设计中&#xff0c;设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它是针对特定问题或特定场景的解决方案&#xff0c;是一种经过…

你写的每条SQL都是全表扫描吗

你写的每条SQL都是全表扫描吗&#xff1f;如果是&#xff0c;那MySQL可太感谢你了&#xff0c;每一次SQL执行都是在给MySQL上压力、上对抗。MySQL有苦难言&#xff1a;你不知道索引吗&#xff1f;你写的SQL索引都失效了不知道吗&#xff1f;慢查询不懂啊&#xff1f;建那么多索…

进一步解读英伟达 Blackwell 架构、NVlink及GB200 超级芯片

2024年3月19日&#xff0c;英伟达CEO黄仁勋在GTC大会上公布了新一代AI芯片架构BLACKWELL&#xff0c;并推出基于该架构的超级芯片GB200&#xff0c;将助推数据处理、工程模拟、电子设计自动化、计算机辅助药物设计、量子计算和生成式 AI 等领域。 为了纪念杰出的数学家David H…

设计软件有哪些?渲染软件篇(3),渲染100邀请码1a12

今天我们继续介绍几款渲染软件&#xff0c;方便大家了解 1、渲染100(http://www.xuanran100.com/?ycode1a12) 渲染100是网渲平台&#xff0c;为设计师提供高性能的渲染服务。通过它设计师可以把本地渲染移到云端进行&#xff0c;速度快价格便宜&#xff0c;支持3dmax、vray、…

文献速递:深度学习医学影像心脏疾病检测与诊断--基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正

Title 题目 Transfer learning‑based attenuation correction for static and dynamic cardiac PET using a generative adversarial network 基于迁移学习的生成对抗网络用于静态和动态心脏PET的衰减校正 01 文献速递介绍 心脏正电子发射断层扫描&#xff08;PET&#xf…

2024数维杯C题成品文章代码思路分享保姆级

天然气水合物资源评估与钻井位置优化&#xff1a;方法、挑战 摘要 天然气水合物&#xff0c;通常称为可燃冰&#xff0c;是一种在特定高压低温条件下由天然气和水形成的类冰结晶物。由于其外观类似冰块且可燃&#xff0c;天然气水合物在深海底及永久冻土区广泛分布&#xff0c;…