第五章 大语言模型安装

第五章主要讲的是五种国内常见大模型的部署,并且进行了编程验证,代码都在GitHub。 项目上面,这里就不贴详细代码了。

上面选取了ChatGLM3-6B、Qwen-VL-Chat-Int4、LLama-2-7b-chat、Gemma-2B和Whisper-large-v3模型进行部署。这五个比较典型的大模型分别代表了国产文本类、国产图像类、开源标杆、最新模型和语音识别类。下面是我做的几个我觉得以后学习需要注意的笔记:

不管github项目的源码如何变更,这个提交点的版本下的源码是保持不变的。Git代码库回退到某个提交点的命令是“git checkout commit_id”(在cmd中cd到本地的项目文件夹下),查询commitid的方式:

git log(查询所有提交的项目的历史)

git rev-parse HEAd(查询最新的commit id)

Python的第三方库使用pip工具安装。由于库与库之间的版本有相互依赖关系,规范的做法是将项目所用到的所有第三方库的名字、版本号写入一个名为requirements.txt的文本文件,安装库时,通过“pip install -r requirements.txt”命令进行批量安装,这里的“-r”是recursion(递归)的意思。

将镜像路径以“-i”参数进行指定,再加到pip命令的尾部。为了确认安全性,还需要增加一个“--trusted-host”参数指向镜像所在的网站域名。本例中,使用中科大发布的pypi镜像安装依赖库,命令如下(需要注意的是,这个命令是针对Linux的。如果在Windows上执行,则要去掉反斜杠“\”和换行符后将代码保持在一行上才能正常运行。)

Gemma的原始模型首先在kaggle.com上发布。并且,Google与Hugging Face合作,将模型集成到了Hugging Face的生态系统中,使原始模型被转化成hf格式供开发者免费下载。Gemma的hf格式模型可以通过Hugging Face的Transformers库装载运行,这与其他模型(如LLaMA2等)在使用方面没有太大区别。对于模型的推理过程,可以使用Transformers库的AutoModelForCausalLM.from_pretrained方法装载模型,再用model.generate方法进行模型推理。装载模型时,用load_in_8bit和load_in_4bit量化模式会非常顺利,占用资源也比较少。

具体模型的部署和简单量化方式书上面写的很详细,主要是llama-2使用text-generation-webui加载验证模型的方法挺有意思的,下面是text-generation-webui的使用部署方法:

安装

# 获取text-generation-webui源码,并将源码固定到指定的版本
git clone https://github.com/oobabooga/text-generation-webui
cd text-generation-webui
git checkout 1934cb6
# 创建python3.10虚拟环境
conda config --add envs_dirs /nova_compute_data/anaconda3
conda create -n text-generation-webui python=3.10 -y
# 编辑requirements.txt,只保留tiktoken及以前的库
# 安装依赖库
conda activate text-generation-webui
pip install -r requirements.txt \
-i https://pypi.mirrors.ustc.edu.cn/simple \
--trusted-host=pypi.mirrors.ustc.edu.cn
# 校验PyTorch
python -c "import torch; print(torch.cuda.is_available())"
# 下载模型
# 模型下载脚本从aliendao.cn首页下载
# 链接为 https://aliendao.cn/model_download.py
# linux下使用wget命令下载,windows下直接在浏览器打开链接下载
wget https://aliendao.cn/model_download.py
# 从aliendao.cn下载Llama-2-7b-chat-hf 模型文件
python model_download.py --e --repo_id NousResearch/Llama-2-7b-chat-hf \
--token YPY8KHDQ2NAHQ2SG
# 下载后的文件在./dataroot/models/NousResearch/Llama-2-7b-chat-hf 目录下
# 移动模型
mkdir ./models/Llama-2-7b-chat-hf
mv ./dataroot/models/NousResearch/Llama-2-7b-chat-hf/* ./models/Llama-2-7b-chat-hf/
# 运行
python server.py --listen-host 0.0.0.0 --listen

第六章 大语言模型微调

主要讲大模型的微调,笔记如下:

在大语言模型进行微调时,判定微调效果不是靠步数,而是要参考训练过程中的loss值。一般来说,当loss值趋于稳定且不再显著下降时,即可以认为模型已经收敛。判断模型微调效果是否趋于稳定,有一个经验值——0.3。当loss值低于这个值时,说明微调模型基本可用。当然,实际操作中模型不同、参数量不同、任务不同、数据集不同、微调方法不同,不能一味用这个固定的loss值来判断,最好的做法是根据实际情况来测试和评估模型的性能。所以,当进行了3000步微调后,若loss值依然很大或评估发现效果不佳,则还要载入3000步的检查点继续微调,以达到更好的效果。

微调LLaMA2模型可采用alpaca_dataset数据集。alpaca_dataset是一个斯坦福开源数据集,包括用于特定领域模型微调Alpaca的52000组指令数据。其文件内容是一个字典列表,每个字典包含以下字段:instruction(指令)、input(输入)和output(输出)。
• instruction:描述模型应执行的任务。52000组数据中,每一组数据要指定唯一的instruction,不能重复。
• input:任务的可选上下文或输入内容。例如,当instruction为“总结以下文章”时,输入内容就是文章本身。
• output:由text-davinci-003(ChatGPT-3.5背后的大语言模型)生成的答案。

为了将纯文本的原始语料转换成微调所需的JSON格式,以及在需要时方便将此语料转换为其他格式,本例将转换过程分成两步。第一步:原始文本文件转换为简单的JSON格式,如[{“q”:“问1”,“a”:“答1”}, {“q”:“问2”,“a”:“答2”}]。第二步:将简单的JSON格式转成微调要求的语料格式。具体的转化步骤如下。

txt2json.py代码如下:

import json
import argparse


def txt2json(infile, outfile):
    with open(infile, 'r', encoding='utf-8') as file:
        data = file.read()
    lines = data.split('\n')
    json_data = []
    for i in range(len(lines)):
        if (i - 2 >= 0) and ((i - 2) % 3 == 0):
            question = lines[i-2]
            answer = lines[i-1]
            json_data.append({"q": question, "a": answer})
    with open(outfile, 'w', encoding='utf-8') as file:
        json.dump(json_data, file, indent=4, ensure_ascii=False)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--infile', type=str, required=True)
    parser.add_argument('--outfile', type=str, required=True)
    args = parser.parse_args()
    txt2json(args.infile, args.outfile)

转化成json的命令如下

 json转成微调格式的命令如下:

convert_data.py代码如下:

import json
import argparse


def load_data(infile):
    with open(infile, 'r', encoding='utf-8') as file:
        data = json.load(file)
    return data


def convert_data_conversations(original_data, trainfile, devfile):
    output_train = []
    dev_train = []
    train_data_len = round(len(original_data) * 0.7)
    i = 0
    for item in original_data:
        conversation = {
            "conversations": [
                {
                    "role": "user",
                    "content": item["q"]
                },
                {
                    "role": "assistant",
                    "content": item["a"]
                }
            ]
        }
        i = i + 1
        if i < train_data_len:
            output_train.append(conversation)
        else:
            dev_train.append(conversation)
    with open(trainfile, 'w', encoding='utf-8') as json_file:
        json.dump(output_train, json_file,
                  ensure_ascii=False, indent=4)
    with open(devfile, 'w', encoding='utf-8') as json_file:
        json.dump(dev_train, json_file,
                  ensure_ascii=False, indent=4)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--infile', type=str, required=True)
    parser.add_argument('--trainfile', type=str, required=True)
    parser.add_argument('--devfile', type=str, required=True)
    args = parser.parse_args()
    original_data = load_data(args.infile)
    convert_data_conversations(original_data,
                               args.trainfile, args.devfile)

其实,现在常用的微调还是PEFT微调,全参数微调使用的时间和费用成本太高,lora引入的低秩的方法,让微调成本下降了很多,论文链接如下LoRA: Low-Rank Adaptation of Large Language Models

第七章 大语言模型量化

本章主要讲模型的量化(主要讲了llama.cpp和gemma.cpp,这部分模型量化的代码在GitHub上面),模型量化是指将模型中的权重参数或激活值从32位浮点型的高精度转换为4bit或8bit的低精度整数的过程,得到的结果是精度降低、模型变小、计算的复杂度降低,使模型在CPU等低算力条件下也能正常推理。

我一直对模型量化,知识蒸馏有一点模糊,查了一些资料后,现在的理解:模型量化通过降低精度直接压缩模型,适合对计算效率要求高的场景。知识蒸馏通过模仿大模型的行为间接压缩模型,适合对精度要求高的场景。两者都是压缩模型的大小,但是使用方法和实用场景不同,并且两种可以相互结合,进一步优化模型或者进行更高效的压缩。

现在常用的量化方法是llama.cpp和Gemma.cpp,在文章中有具体量化方法。

第八章 多模态模型应用

这章主要介绍stable diffusion,先讲了来源和基本原理,后面说了部署方法,这边其实可以直接去b站看秋叶大神。文章里面介绍的较为简单,对很多提示词和微调方法都没有详细解释(当然,篇幅问题,可以理解)

下面是文章里面对核心原理的解释:

Stable Diffusion的核心运行原理,则是将输入的噪声图像转换为目标图像。这分为前向扩散和稳定化两个关键步骤。
• 前向扩散:利用逐步引入高斯噪声的方式,模拟图像向随机状态演变的过程,将输入的噪声图像与随机噪声混合,使输出图像在保留原始特征的同时又有一些随机化特性。
• 稳定化:为了解决前向扩散过程中的不稳定性和难以控制的问题,Stable Diffusion引入了稳定化步骤。该步骤利用一个判别网络,区分生成的图像是真实图像还是随机噪声,通过使判别网络的输出概率最大化,确保生成的图像更加稳定和可控。

其他的可以看看,但是想要快速上手,这边推荐看b站这几个up🐷:秋葉aaaki  Nenly同学 朱尼酱

 

 

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐