CharacterGLM

对标题的评论会显示在这里

CharacterGLM-6B Transformers部署调用

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8

对这一段的评论会显示在这里
对这一段的评论会显示在这里

接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行demo。

对这一段的评论会显示在这里

pip换源和安装依赖包

对这一段的评论会显示在这里
#升级pip
python -m pip install --upgrade pip
#更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install modelscope
pip install transformers
pip install sentencepiece
对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

使用 modelscope 中的snapshot_download函数下载模型,第一个参数为模型名称,参数cache_dir为模型的下载路径。

对这一段的评论会显示在这里

在 /root/autodl-tmp 路径下新建 download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件,如下图所示。并运行 python /root/autodl-tmp/download.py执行下载,模型大小为 12 GB,下载模型大概需要 10~15 分钟

对这一段的评论会显示在这里
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('THUCoAI/CharacterGLM-6B', cache_dir='/root/autodl-tmp', revision='master')
对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里
from transformers import AutoTokenizer,AutoModelForCausalLM
import torch
# 使用模型下载到的本地路径以加载
model_dir = '/root/autodl-tmp/THUCoAI/CharacterGLM-6B'
# 分词器的加载,本地加载,trust_remote_code=True设置允许从网络上下载模型权重和相关的代码
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
# 模型加载,本地加载,使用AutoModelForCausalLM类
model = AutoModelForCausalLM.from_pretrained(model_dir, trust_remote_code=True)
# 将模型移动到GPU上进行加速(如果有GPU的话)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
# 使用模型的评估模式来产生对话
model.eval()
session_meta = {'user_info': '我是陆星辰,是一个男性,是一位知名导演,也是苏梦远的合作导演。我擅长拍摄音乐题材的电影。苏梦远对我的态度是尊敬的,并视我为良师益友。', 'bot_info': '苏梦远,本名苏远心,是一位当红的国内女歌手及演员。在参加选秀节目后,凭借独特的嗓音及出众的舞台魅力迅速成名,进入娱乐圈。她外表美丽动人,但真正的魅力在于她的才华和勤奋。苏梦远是音乐学院毕业的优秀生,善于创作,拥有多首热门原创歌曲。除了音乐方面的成就,她还热衷于慈善事业,积极参加公益活动,用实际行动传递正能量。在工作中,她对待工作非常敬业,拍戏时总是全身心投入角色,赢得了业内人士的赞誉和粉丝的喜爱。虽然在娱乐圈,但她始终保持低调、谦逊的态度,深得同行尊重。在表达时,苏梦远喜欢使用“我们”和“一起”,强调团队精神。', 'bot_name': '苏梦远', 'user_name': '陆星辰'}
# 第一轮对话
response, history = model.chat(tokenizer, session_meta,"你好呀,小苏", history=[])
print(response)
# 第二轮对话
response, history = model.chat(tokenizer, session_meta,"最近对音乐有什么新的想法吗", history=history)
print(response)
# 第三轮对话
response, history = model.chat(tokenizer,session_meta, "那我们商量一下下一部音乐电影的拍摄,好嘛?", history=history)
print(response)
对这一段的评论会显示在这里

部署

对这一段的评论会显示在这里

在终端输入以下命令运行trans.py,即实现CharacterGLM-6B的Transformers部署调用

对这一段的评论会显示在这里
cd /root/autodl-tmp
python trans.py
对这一段的评论会显示在这里

观察命令行中loading checkpoint表示模型正在加载,等待模型加载完成产生对话,如下图所示

对这一段的评论会显示在这里
对这一段的评论会显示在这里

CharacterGLM-6B FastApi部署调用

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8

对这一段的评论会显示在这里
对这一段的评论会显示在这里

接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行demo。

对这一段的评论会显示在这里

pip换源和安装依赖包

对这一段的评论会显示在这里
# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install fastapi==0.104.1
pip install uvicorn==0.24.0.post1
pip install requests==2.25.1
pip install modelscope==1.9.5
pip install transformers==4.37.2
pip install streamlit==1.24.0
pip install sentencepiece==0.1.99
pip install accelerate==0.24.1
对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

使用 modelscope 中的snapshot_download函数下载模型,第一个参数为模型名称,参数cache_dir为模型的下载路径。

对这一段的评论会显示在这里

在 /root/autodl-tmp 路径下新建 download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件,如下图所示。并运行 python /root/autodl-tmp/download.py执行下载,模型大小为 12 GB,下载模型大概需要 10~15 分钟

对这一段的评论会显示在这里
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('THUCoAI/CharacterGLM-6B', cache_dir='/root/autodl-tmp', revision='master')
对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里

在/root/autodl-tmp路径下新建api.py文件并在其中输入以下内容,粘贴代码后记得保存文件。下面的代码有很详细的注释,大家如有不理解的地方,欢迎提出issue。

对这一段的评论会显示在这里
from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM
import uvicorn
import json
import datetime
import torch

# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息

# 清理GPU内存函数
def torch_gc():
    if torch.cuda.is_available():  # 检查是否可用CUDA
        with torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备
            torch.cuda.empty_cache()  # 清空CUDA缓存
            torch.cuda.ipc_collect()  # 收集CUDA内存碎片

# 创建FastAPI应用
app = FastAPI()

# 处理POST请求的端点
@app.post("/")
async def create_item(request: Request):
    global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器
    json_post_raw = await request.json()  # 获取POST请求的JSON数据
    json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串
    json_post_list = json.loads(json_post)  # 将字符串转换为Python对象
    prompt = json_post_list.get('prompt')  # 获取请求中的提示
    history = json_post_list.get('history')  # 获取请求中的历史记录
    max_length = json_post_list.get('max_length')  # 获取请求中的最大长度
    top_p = json_post_list.get('top_p')  # 获取请求中的top_p参数
    temperature = json_post_list.get('temperature')  # 获取请求中的温度参数
    session_meta = {'user_info': '我是陆星辰,是一个男性,是一位知名导演,也是苏梦远的合作导演。我擅长拍摄音乐题材的电影。苏梦远对我的态度是尊敬的,并视我为良师益友。', 'bot_info': '苏梦远,本名苏远心,是一位当红的国内女歌手及演员。在参加选秀节目后,凭借独特的嗓音及出众的舞台魅力迅速成名,进入娱乐圈。她外表美丽动人,但真正的魅力在于她的才华和勤奋。苏梦远是音乐学院毕业的优秀生,善于创作,拥有多首热门原创歌曲。除了音乐方面的成就,她还热衷于慈善事业,积极参加公益活动,用实际行动传递正能量。在工作中,她对待工作非常敬业,拍戏时总是全身心投入角色,赢得了业内人士的赞誉和粉丝的喜爱。虽然在娱乐圈,但她始终保持低调、谦逊的态度,深得同行尊重。在表达时,苏梦远喜欢使用“我们”和“一起”,强调团队精神。', 'bot_name': '苏梦远', 'user_name': '陆星辰'}
    # 调用模型进行对话生成
    response, history = model.chat(
        tokenizer,
        session_meta,
        prompt,
        history=history,
        max_length=max_length if max_length else 2048,  # 如果未提供最大长度,默认使用2048
        top_p=top_p if top_p else 0.7,  # 如果未提供top_p参数,默认使用0.7
        temperature=temperature if temperature else 0.95  # 如果未提供温度参数,默认使用0.95
    )
    now = datetime.datetime.now()  # 获取当前时间
    time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串
    # 构建响应JSON
    answer = {
        "response": response,
        "history": history,
        "status": 200,
        "time": time
    }
    # 构建日志信息
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)  # 打印日志
    torch_gc()  # 执行GPU内存清理
    return answer  # 返回响应

# 主函数入口
if __name__ == '__main__':
    # 加载预训练的分词器和模型
    tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/THUCoAI/CharacterGLM-6B", trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained("/root/autodl-tmp/THUCoAI/CharacterGLM-6B", trust_remote_code=True).to(torch.bfloat16).cuda()
    model.eval()  # 设置模型为评估模式
    # 启动FastAPI应用
    # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api
    uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)  # 在指定端口和主机上启动应用
对这一段的评论会显示在这里

Api部署调用

对这一段的评论会显示在这里

在终端输入以下命令启动api服务

对这一段的评论会显示在这里
cd /root/autodl-tmp
python api.py
对这一段的评论会显示在这里

默认部署在 6006 端口,通过 POST 方法进行调用,可以使用curl调用,如下所示:

对这一段的评论会显示在这里
curl -X POST "http://127.0.0.1:6006" \
     -H 'Content-Type: application/json' \
     -d '{"prompt": "你好", "history": []}'
对这一段的评论会显示在这里

调用示例结果如下图所示

对这一段的评论会显示在这里
对这一段的评论会显示在这里

也可以使用python中的requests库进行调用,新建api-requests.py文件,写入如下代码:

对这一段的评论会显示在这里
import requests
import json

def get_completion(prompt):
    headers = {'Content-Type': 'application/json'}
    data = {"prompt": prompt, "history": []}
    response = requests.post(url='http://127.0.0.1:6006', headers=headers, data=json.dumps(data))
    return response.json()['response']

if __name__ == '__main__':
    print(get_completion('你是谁呀?'))
对这一段的评论会显示在这里

新开一个终端,输入如下指令

对这一段的评论会显示在这里
cd /root/autodl-tmp
python api-requests.py
对这一段的评论会显示在这里

得到的返回值及结果展示如下

对这一段的评论会显示在这里
{
'response': '嗨,你好,我叫苏梦远。(微笑着向对方走去)', 
'history': [['你是谁呀?', '嗨,你好,我叫苏梦远。(微笑着向对方走去)']], 
'status': 200, 
'time': '2024-03-05 22:44:35'
}
对这一段的评论会显示在这里
对这一段的评论会显示在这里

CharacterGLM-6B-chat

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8

对这一段的评论会显示在这里
对这一段的评论会显示在这里

接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行demo。

对这一段的评论会显示在这里

pip换源和安装依赖包

对这一段的评论会显示在这里
# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install modelscope
pip install transformers
对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

使用 modelscope 中的snapshot_download函数下载模型,第一个参数为模型名称,参数cache_dir为模型的下载路径。

对这一段的评论会显示在这里

在 /root/autodl-tmp 路径下新建 download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件,如下图所示。并运行 python /root/autodl-tmp/download.py执行下载,模型大小为 12 GB,下载模型大概需要 10~15 分钟

对这一段的评论会显示在这里
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('THUCoAI/CharacterGLM-6B', cache_dir='/root/autodl-tmp', revision='master')
对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里

首先clone代码,打开autodl平台自带的学术镜像加速。学术镜像加速详细使用请看: https://www.autodl.com/docs/network_turbo/

对这一段的评论会显示在这里
source /etc/network_turbo
对这一段的评论会显示在这里

然后切换路径, clone代码.

对这一段的评论会显示在这里
cd /root/autodl-tmp
git clone https://github.com/thu-coai/CharacterGLM-6B
对这一段的评论会显示在这里

demo运行

对这一段的评论会显示在这里

修改代码路径,将 /root/autodl-tmp/CharacterGLM-6B/basic_demo/web_demo_streamlit.py中第20行的模型更换为本地的/root/autodl-tmp/THUCoAI/CharacterGLM-6B

对这一段的评论会显示在这里
对这一段的评论会显示在这里

修改requirements.txt文件,将其中的torch删掉,环境中已经有了torch,不需要再安装。然后执行下面的命令:

对这一段的评论会显示在这里
cd /root/autodl-tmp/CharacterGLM-6B
pip install -r requirements.txt
对这一段的评论会显示在这里

在终端运行以下命令即可启动推理服务,尽量cd到basic_demo文件夹下,防止找不到character.json文件

对这一段的评论会显示在这里
cd /root/autodl-tmp/CharacterGLM-6B/basic_demo
streamlit run ./web_demo2.py --server.address 127.0.0.1 --server.port 6006
对这一段的评论会显示在这里
对这一段的评论会显示在这里

在将 autodl 的端口映射到本地的 http://localhost:6006 后,即可看到demo界面。具体映射步骤参考文档General-Setting文件夹下/02-AutoDL开放端口.md文档。

对这一段的评论会显示在这里

在浏览器打开 http://localhost:6006 界面,模型加载,即可使用,如下图所示。

对这一段的评论会显示在这里
对这一段的评论会显示在这里

命令行运行

对这一段的评论会显示在这里

修改代码路径,将 /root/autodl-tmp/CharacterGLM-6B/basic_demo/cli_demo.py中的模型路径更换为本地的/root/autodl-tmp/THUCoAI/CharacterGLM-6B

对这一段的评论会显示在这里

在终端运行以下命令即可启动推理服务

对这一段的评论会显示在这里
cd /root/autodl-tmp/CharacterGLM-6B/basic_demo
python ./cli_demo.py 
对这一段的评论会显示在这里
对这一段的评论会显示在这里

04-CharacterGLM-6B-Chat Lora微调

对这一段的评论会显示在这里

概述

对这一段的评论会显示在这里

本文简要介绍如何基于transformers、peft等框架,对CharacterGLM-6B-chat模型进行Lora微调。Lora原理可参考博客:知乎|深入浅出Lora 本文代码未使用分布式框架,微调 ChatGLM3-6B-Chat 模型至少需要 21G 及以上的显存,且需要修改脚本文件中的模型路径和数据集路径。

对这一段的评论会显示在这里

环境配置

对这一段的评论会显示在这里

在完成基本环境配置和本地模型部署的情况下,还需要安装一些第三方库,可以使用如下命令:

对这一段的评论会显示在这里
pip install transformers==4.37.2
pip install peft==0.4.0.dev0
pip install datasets==2.10.1
pip install accelerate==0.21.0
对这一段的评论会显示在这里

在本节内容中,将微调数据集放置在根目录/dataset

对这一段的评论会显示在这里

指令集构建

对这一段的评论会显示在这里

LLM微调一般指指令微调过程。所谓指令微调,是说我们使用的微调数据形如:

对这一段的评论会显示在这里
{
    "instruction":"回答用户以下问题,直接给出结果。"
    "input":"中国第一个诺贝尔奖得主是谁?"
    "output":"莫言"
}
对这一段的评论会显示在这里

其中instruction是用户指令,告知模型需要完成的任务;input是用户输入,是完成用户指令所必需的输入内容;output是模型应该给出的输出。

对这一段的评论会显示在这里

即我们的核心训练目标是让模型具有理解并遵循用户指令的能力。因此,在指令集构建时,我们应针对我们的目标任务,针对性构建任务指令集。在本文我们使用由笔者合作开源的Chat-甄嬛项目作为示例,我们的目标是构建一个能够模拟甄嬛对话风格的个性化LLM,因此我们构建的指令形如:

对这一段的评论会显示在这里
{
    "instruction": "",
    "input":"你是谁?",
    "output":"家父是大理寺少卿甄远道。"
}
对这一段的评论会显示在这里

我们构造的全部指令数据集在根目录下。

对这一段的评论会显示在这里

QA和Instruction的区别和联系

对这一段的评论会显示在这里

QA是指一问一答的形式,通常是用户提问,模型给出回答。而instruction则源自于Prompt Engineering,将问题拆分成两个部分:Instruction用于描述任务,Input用于描述待处理的对象。

对这一段的评论会显示在这里

问答(QA)格式的训练数据通常用于训练模型执行具体任务。例如,对于问题“请解释INFJ和ENTP两种MBTI性格之间的区别”

对这一段的评论会显示在这里

*问答(QA)格式:

对这一段的评论会显示在这里
指令(instruction):
输入(input):INFJ和ENTP这两种MBTI性格之间的区别是什么?
对这一段的评论会显示在这里

*指令(Instruction)格式:

对这一段的评论会显示在这里
指令(Instruction):请解释下面两种MBTI性格的区别
输入(input):INFJ和ENTP
对这一段的评论会显示在这里

数据格式化

对这一段的评论会显示在这里

Lora训练的数据是需要经过格式化、编码之后再输入给模型进行训练的,我们一般需要将输入文本编码为input_ids,将输出文本编码为labels,编码之后的结果都是多维向量。我们首先定义一个与处理函数,这个函数用于对每一个样本,编码其输入,输出文本并返回一个编码后的字典:

对这一段的评论会显示在这里
def process_func(example):
    MAX_LENGTH = 512
    input_ids, labels = [], []
    prompt = tokenizer.encode("用户:\n"+"现在你要扮演皇帝身边的女人--甄嬛。", add_special_tokens=False)
    instruction_ = tokenizer.encode("\n".join([example["instruction"], example["input"]]).strip(), add_special_tokens=False,max_length=512)
    instruction = tokenizer.encode(prompt + instruction_)
    response = tokenizer.encode("CharacterGLM-6B:\n:" + example["output"], add_special_tokens=False)
    input_ids = instruction + response + [tokenizer.eos_token_id]
    labels = [tokenizer.pad_token_id] * len(instruction) + response + [tokenizer.eos_token_id]
    pad_len = MAX_LENGTH - len(input_ids)
    # print()
    input_ids += [tokenizer.pad_token_id] * pad_len
    labels += [tokenizer.pad_token_id] * pad_len
    labels = [(l if l != tokenizer.pad_token_id else -100) for l in labels]

    return {
        "input_ids": input_ids,
        "labels": labels
    }
对这一段的评论会显示在这里

经过格式化的数据,也就是送入模型的每一条数据,都是一个字典,包含了input_ids、labels两个键值对,其中input_ids是输入文本的编码,labels是输出文本的编码。

对这一段的评论会显示在这里

加载tokenizer和半精度模型

对这一段的评论会显示在这里

模型以版精度形式加载,如果显卡比较新,可以用torch.bfloat形式加载,对于自定义的模型一定要指定trust_remote_code参数为True

对这一段的评论会显示在这里
tokenizer=AutoTokenizer.from_pretrained('/root/autodl-tmp/THUCoAI/CharacterGLM-6B',use_fast=False,trust_remote_code=True)

model=AutoModelForCausalLM.from_pretrained('/root/autodl-tmp/THUCoAI/CharacterGLM-6B',trust_remote_code=True,torch_dtype=torch.half,device_map="auto")
对这一段的评论会显示在这里

定义LoraConfig

对这一段的评论会显示在这里

LoraConfig这个类中可以设置很多参数,部分参数展示如下: task_type:模型类型 target——modules:需要训练的模型层的名字,主要就是attention部分的层,不同的模型对应的层的名字不同,可以传入数组,也可以字符串,也可以正则表达式。 r:lora的秩 lora_alpha:Lora alpha modules_to_save:指定的是除了拆成lora的模块,其它的模块可以完整的指定训练

对这一段的评论会显示在这里

Lora的所方式lora_alpha/r,在这个LoraConfig中缩放就是4倍。这个缩放的本质并没有改变Lora的参数量大小,本质在于将里面的参数数值做广播乘法,进行线性的缩放。

对这一段的评论会显示在这里
config=LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["query_key_value"],
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1
)
对这一段的评论会显示在这里

自定义TraininArguments参数

对这一段的评论会显示在这里

TrainingArguments这个类的源码也介绍了每个参数的具体作用,常用的参数如下: output_dir:模型的输出路径 per_device_train_batch_size:batch_size gradient_accumulation_steps:梯度累加,如果显存比较小,可以把batch_size设置小一点,梯度累积增大一点 logging_steps:多少步,输出一次log num_train_epochs:顾名思义epoch gradient_chechpointing:梯度检查,这个一旦开启,模型就必须执行 model.enable_input_require_grads()

对这一段的评论会显示在这里
data_collator=DataCollatorForSeq2Seq(
    tokenizer,
    model=model,
    label_pad_token_id=-100,
    pad_to_multiple_of=None,
    padding=False
)
args=TrainingArguments(
    output_dir="./output/CharacterGLM",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=2,
    logging_steps=10,
    num_train_epochs=3,
    gradient_checkpointing=True,
    save_steps=100,
    learning_rate=1e-4,
)
对这一段的评论会显示在这里

使用Trainer训练

对这一段的评论会显示在这里

把model放进去,把上面设置的参数放进去,数据集放进去,开始训练

对这一段的评论会显示在这里
trainer=Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_id,
    data_collator=data_collator,
)
trainer.train()
对这一段的评论会显示在这里

模型推理

对这一段的评论会显示在这里
model = model.cuda()
ipt = tokenizer("用户:{}\n{}".format("现在你要扮演皇帝身边的女人--甄嬛。你是谁?", "").strip() + "characterGLM-6B:\n", return_tensors="pt").to(model.device)
tokenizer.decode(model.generate(**ipt, max_length=128, do_sample=True)[0], skip_special_tokens=True)
对这一段的评论会显示在这里

从新加载

对这一段的评论会显示在这里

通过PEFT所微调的模型,都可以使用下面的方法进行重新加载,并推理:

对这一段的评论会显示在这里

加载源model与tokenizer; 使用PeftModel合并源model与PEFT微调后的参数

对这一段的评论会显示在这里
from peft import Peftmodel
model=AutoModelForCausalLM.from_pretrained("/root/autodl-tmp/THUCoAI/CharacterGLM-6B",trust_remote_code=True,low_cpu_mem_usage=True)
tokenizer=AutoTokenizer.from_pretrained("root/autodl-tmp/THUCoAI/CharacterGLM-6B",use_fast=False,trust_remote_code=True)
p_model=PeftModel.from_pretrained(model,model_id="./output/CharatcerGLM/checkpoint-1000/")
ipt = tokenizer("用户:{}\n{}".format("现在你要扮演皇帝身边的女人--甄嬛。你是谁?", "").strip() + "characterGLM-6B:\n", return_tensors="pt").to(model.device)
tokenizer.decode(p_model.generate(**ipt,max_length=128,do_sample=True)[0],skip_special_tokens=True)
对这一段的评论会显示在这里

CharacterGLM-6B

对这一段的评论会显示在这里

简介

对这一段的评论会显示在这里

CharacterGLM-6B 是聆心智能和清华大学 CoAI 实验室联合发布的新一代对话预训练模型。 本文件夹下属文件包含 CharacterGLM-6B 的部署、微调全流程。

对这一段的评论会显示在这里

01-CharacterGLM-6B Transformer部署调用

对这一段的评论会显示在这里

这个项目是关于如何使用CharacterGLM-6B模型进行对话生成的部署调用。通过该部署,可以轻松地在Autodl平台中租用一台具有足够显存的显卡机器,然后配置环境、下载模型并运行demo,以实现基于该模型的对话生成功能。

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

在Autodl平台中租用一台具有24G显存的显卡机器。
打开JupyterLab并在其中的终端中进行环境配置、模型下载和运行demo。

对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

通过使用modelscope中的snapshot_download函数下载模型,您可以指定模型名称以及下载路径。该模型的下载路径设置为/root/autodl-tmp,并且模型大小为12 GB。

对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里

在代码准备部分,您需要加载模型和分词器,并将模型移动到GPU上(如果可用)。然后,您可以通过使用模型的评估模式来生成对话。示例代码中包括了三轮对话的示例,展示了模型的使用方法。

对这一段的评论会显示在这里

部署

对这一段的评论会显示在这里

通过在终端中运行trans.py文件,即可实现CharacterGLM-6B模型的Transformers部署调用。在命令行中观察loading checkpoint表示模型正在加载,等待模型加载完成后即可开始产生对话。 通过这些步骤,您可以轻松地部署并使用CharacterGLM-6B模型进行对话生成。

对这一段的评论会显示在这里

02-CharacterGLM-6B FastApi部署调用

对这一段的评论会显示在这里

这个项目是关于如何使用CharacterGLM-6B模型进行对话生成的FastApi部署调用。通过该部署,可以轻松地在Autodl平台中租用一台具有足够显存的显卡机器,然后配置环境、下载模型并运行demo,以实现基于该模型的对话生成功能。

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

在Autodl平台中租用一台具有24G显存的显卡机器。
打开JupyterLab并在其中的终端中进行环境配置、模型下载和运行demo。

对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

通过使用modelscope中的snapshot_download函数下载模型,您可以指定模型名称以及下载路径。该模型的下载路径设置为/root/autodl-tmp,并且模型大小为12 GB。

对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里

在代码准备部分,您需要加载模型和分词器,并将模型移动到GPU上(如果可用)。

对这一段的评论会显示在这里

部署

对这一段的评论会显示在这里

通过在终端中运行api文件,即可实现CharacterGLM-6B模型的FastApi部署调用。在命令行中观察loading checkpoint表示模型正在加载,等待模型加载完成后即可开始产生对话。 通过这些步骤,您可以轻松地部署并使用CharacterGLM-6B模型进行对话生成。

对这一段的评论会显示在这里

03-CharacterGLM-6B-chat

对这一段的评论会显示在这里

本文件包含了使用 CharacterGLM-6B 模型进行类似于聊天机器人的推理的代码。CharacterGLM-6B 模型是一个经过微调的大型语言模型,用于在对话场景中生成文本回复。

对这一段的评论会显示在这里

环境设置

对这一段的评论会显示在这里

在 autodl 平台上租用具有 24GB GPU 的服务器。
打开租用的服务器上的 JupyterLab,并在终端中开始配置环境、下载模型和运行演示。
更换 pip 源并安装所需的软件包。

对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

使用 modelscope 中的 snapshot_download 函数下载模型,并将其缓存在指定的路径中。

对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里

克隆代码仓库,并根据需要修改代码路径以及配置文件。

对这一段的评论会显示在这里

demo 运行

对这一段的评论会显示在这里

修改代码路径并运行演示,通过浏览器或命令行即可与模型进行交互。

对这一段的评论会显示在这里

04-CharacterGLM-6B Lora微调

对这一段的评论会显示在这里

本文简要介绍如何基于 transformers 和 peft 框架,对 CharacterGLM-6B-chat 模型进行 Lora 微调。Lora 原理可参考博客:知乎|深入浅出Lora

对这一段的评论会显示在这里

环境配置

对这一段的评论会显示在这里

在完成基本环境配置和本地模型部署的情况下,还需要安装一些第三方库。

对这一段的评论会显示在这里

指令集构建

对这一段的评论会显示在这里

LLM 微调一般指指令微调过程。

对这一段的评论会显示在这里

QA和Instruction的区别和联系

对这一段的评论会显示在这里

QA 是指一问一答的形式,通常是用户提问,模型给出回答。而 instruction 则源自于 Prompt Engineering,将问题拆分成两个部分:Instruction 用于描述任务,Input 用于描述待处理的对象。

对这一段的评论会显示在这里

数据格式化

对这一段的评论会显示在这里

Lora 训练的数据是需要经过格式化、编码之后再输入给模型进行训练的。

对这一段的评论会显示在这里

加载 tokenizer 和半精度模型

对这一段的评论会显示在这里

模型以半精度形式加载。

对这一段的评论会显示在这里

定义 LoraConfig

对这一段的评论会显示在这里

LoraConfig 这个类中可以设置很多参数。

对这一段的评论会显示在这里

自定义 TraininArguments 参数

对这一段的评论会显示在这里

TrainingArguments 这个类的源码也介绍了每个参数的具体作用。

对这一段的评论会显示在这里

使用 Trainer 训练

对这一段的评论会显示在这里

把 model 放进去,把上面设置的参数放进去,数据集放进去,开始训练。

对这一段的评论会显示在这里

模型推理

对这一段的评论会显示在这里

重新加载

对这一段的评论会显示在这里

通过 PEFT 所微调的模型,都可以使用下面的方法进行重新加载,并推理。

对这一段的评论会显示在这里