训练一个符合人类说话语气的聊天机器人

背景

大模型输出的语言看上去不像人,更像机器人,通俗来说就是太有礼貌了

1.选择合适的大型语言模型并跑通

首先安装微调模型框架并安装依赖

conda create -n mychat python=3.10
conda activate mychat
git clone https://github.com/fazhang-master/Llama-Chinese.git
cd Llama-Chinese
pip install -r requirements.txt

这里只考虑中文大语言模型。我使用了Atom-7B-Chat(基于Llama2架构的预训练语言模型)(模型可在魔搭社区下载)

from modelscope import snapshot_download
model_dir = snapshot_download('FlagAlpha/Atom-7B-Chat',cache_dir='./Llama-Chinese/models')

下载完成后在项目根目录下新建quick_start.py并填写代码,这里要注意修改模型路径(对应上你下载的路径)

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
device_map = "cuda:0" if torch.cuda.is_available() else "auto"
model = AutoModelForCausalLM.from_pretrained('FlagAlpha/Atom-7B-Chat',device_map=device_map,torch_dtype=torch.float16,load_in_8bit=True,trust_remote_code=True,use_flash_attention_2=True)
model =model.eval()
tokenizer = AutoTokenizer.from_pretrained('FlagAlpha/Atom-7B-Chat',use_fast=False)
tokenizer.pad_token = tokenizer.eos_token
input_ids = tokenizer(['<s>Human: 介绍一下中国\n</s><s>Assistant: '], return_tensors="pt",add_special_tokens=False).input_ids
if torch.cuda.is_available():
  input_ids = input_ids.to('cuda')
generate_input = {
    "input_ids":input_ids,
    "max_new_tokens":512,
    "do_sample":True,
    "top_k":50,
    "top_p":0.95,
    "temperature":0.3,
    "repetition_penalty":1.3,
    "eos_token_id":tokenizer.eos_token_id,
    "bos_token_id":tokenizer.bos_token_id,
    "pad_token_id":tokenizer.pad_token_id
}
generate_ids  = model.generate(**generate_input)
text = tokenizer.decode(generate_ids[0])
print(text)

最后,在当前虚拟环境下运行 python quick_start.py
即可获得结果。此时你已经有了一个通用的语言大模型了。

(mychat) root:/mnt/data/zf/Llama-Chinese# python quick_srart.py The `load_in_4bit` and `load_in_8bit` arguments are deprecated and will be removed in the future versions. Please, pass a `BitsAndBytesConfig` object in `quantization_config` argument instead.
Loading checkpoint shards:   0%|                                              | 0/2 [00:00<?, ?it/s]/mnt/program/miniconda3/envs/mychat/lib/python3.10/site-packages/torch/_utils.py:831: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly.  To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
  return self.fget.__get__(instance, owner)()
Loading checkpoint shards: 100%|██████████████████████████████████████| 2/2 [00:07<00:00,  3.65s/it]
<s> Human: 介绍一下中国
</s><s> Assistant: 好的,我是AI语言模型,为您提供知识性回答。以下是关于中国的简要介绍:

中国最早的人类祖先生活在约20万年前的旧石器时代晚期的北京周口店地区。在距今5,000多年前的新时期早期至 中期时,中华文明的雏形开始形成并逐渐发展壮大起来。在中国历史上,有许多重要的朝代和王朝如夏、商、周等相继出现,其中最为著名的是汉朝(公元前26-公元220年)和中国唐朝(唐玄宗开元年间713年至907年)。此外还有元朝(元世祖忽必烈于1284年成立)、明朝(朱元璋建立后称明太祖)等等许多历史时期的国家政权和政治制度。这些国家的文化和艺术遗产也是世界上最丰富多样的文化之一。

目前中国人口约为近十四亿之巨,是中国最大的人口国。同时由于地理环境的特殊性和经济发展的迅速推进,也使得其成为全球最重要的经济大国之一。从农业到工业再到服务业等领域都取得了巨大的成就和发展。近年来随着互联网技术的不断发展和普及以及国际贸易的发展与交流,中国在国际上的地位越来越高且影响力日益扩大。

总而言之,作为一个拥有悠久文化历史的古老国度,中国是一个充满活力和创新精神的现代社会主义经济体系中的重要组成部分。它的未来充满了无限的可能性和未来机遇!
</s>

另外如果提示安装Flash Attention 2,如果支持则安装,不支持可以在quick_start.py中将 use_flash_attention_2=True 参数替换为 attn_implementation="eager"

2.整理数据集

要想训练有语言风格的模型,先要有高质量/大数量的对话数据,就涉及到数据的提取和预处理。至于数据的获得,可以从微信里通过这个项目提取微信聊天数据,项目链接: https://github.com/LC044/WeChatMsg 。也可以直接找大语言模型(我是找的chatgpt生成)。
不论是何种方式,数据集的格式都应如下:

"<s>Human: "+问题+"\n</s><s>Assistant: "+答案+"\n"</s>

例如:

<s>Human: 用一句话描述地球为什么是独一无二的。</s><s>Assistant: 因为地球是目前为止唯一已知存在生命的行星。</s>

保存为,训练数据:data/train_sft.csv;验证数据:data/dev_sft.csv

3. 模型微调

想要了解更多的去看看,不想了解可以直接跳过这一部分

3.1 LoRA微调

LoRA微调脚本见:train/sft/finetune_lora.sh,关于LoRA微调的具体实现代码见train/sft/finetune_clm_lora.py,单机多卡的微调可以通过修改脚本中的–include localhost:0来实现。

3.2 全量参数微调

全量参数微调脚本见:train/sft/finetune.sh,关于全量参数微调的具体实现代码见train/sft/finetune_clm.py。

4.加载微调模型

4.1 LoRA微调

进入train/sft/finetune_lora.sh指定原模型和微调后模型的文件位置,其余参数可根据需求修改
同 全量参数微调

4.2 全量参数微调

进入train/sft/finetune.sh指定原模型和微调后模型的文件位置,其余参数可根据需求修改,修改完成后可通过执行train/sft/finetune.sh进入训练。需要注意1.新模型位置是否存在;2.相对路径用不好可以用绝对路径3.关于ValueError: No slot '1' specified on host 'localhost'错误直接删除--include localhost:1,0
在这里插入图片描述
然后训练就开始了(我用的LoRA微调,因为28G的内存顶不住全量。参数数据量2W)
在这里插入图片描述

5.结束语

这样就可以训练一个有独特说话风格的机器人了

6.番外:可能遇到的其他错误

错误1

ImportError: FlashAttention2 has been toggled on, but it cannot be used due to the following error: the package flash_attn seems to be not installed. Please refer to the documentation of https://huggingface.co/docs/transformers/perf_infer_gpu_one#flashattention-2 to install Flash Attention 2.
原因:Flash Attention 2 需要特定的硬件支持(如 NVIDIA 的 A100 GPU)和安装额外的软件包
解决方法:
安装不成功可以直接禁用use_flash_attention_2=True
在本例子中是在 /train/sft/finetune_clm.py
在这里插入图片描述

错误2

AttributeError: ‘DeepSpeedCPUAdam’ object has no attribute ‘ds_opt_adam’
原因:cuda和pytoch版本不匹配
解决办法:更新cuda或pytorch版本

错误3

TypeError: CsvConfig.init() got an unexpected keyword argument ‘use_auth_token’
原因:在加载 CSV 文件时,finetune_clm.py 脚本中的 CsvConfig 类遇到了一个未知参数 use_auth_token。这是因为 datasets 库在加载数据时传递了一个不支持的参数。
解决办法:检查 finetune_clm.py 文件中是否显式调用了 use_auth_token 参数。如果是,移除这个参数,因为加载本地 CSV 文件时不需要 use_auth_token。

错误4

Config: alpha=0.000100, betas=(0.900000, 0.999000), weight_decay=0.000000, adam_w=1
[2024-10-30 15:19:14,476] [INFO] [logging.py:96:log_dist] [Rank 0] Using DeepSpeed Optimizer param name adamw as basic optimizer
[2024-10-30 15:19:14,477] [INFO] [logging.py:96:log_dist] [Rank 0] Removing param_group that has no ‘params’ in the basic Optimizer
[2024-10-30 15:19:14,500] [INFO] [logging.py:96:log_dist] [Rank 0] DeepSpeed Basic Optimizer = DeepSpeedCPUAdam
[2024-10-30 15:19:14,500] [INFO] [utils.py:56:is_zero_supported_optimizer] Checking ZeRO support for optimizer=DeepSpeedCPUAdam type=<class ‘deepspeed.ops.adam.cpu_adam.DeepSpeedCPUAdam’>
[2024-10-30 15:19:14,500] [INFO] [logging.py:96:log_dist] [Rank 0] Creating torch.bfloat16 ZeRO stage 2 optimizer
[2024-10-30 15:19:14,501] [INFO] [stage_1_and_2.py:149:init] Reduce bucket size 500000000
[2024-10-30 15:19:14,501] [INFO] [stage_1_and_2.py:150:init] Allgather bucket size 500000000
[2024-10-30 15:19:14,501] [INFO] [stage_1_and_2.py:151:init] CPU Offload: True
[2024-10-30 15:19:14,501] [INFO] [stage_1_and_2.py:152:init] Round robin gradient partitioning: False
[2024-10-30 15:19:39,157] [INFO] [launch.py:316:sigkill_handler] Killing subprocess 42427
原因:内存不足
解决方法:增加内存或者减少 per_device_train_batch_size 和 per_device_eval_batch_size 参数的值,再进一步可以减少gradient_accumulation_steps 的值

7.番外:测评

数据集
在这里插入图片描述
微调模型
在这里插入图片描述

总之说起话来没有大模型那样一大长串且礼貌性的回答了,这一点更像人

<think>好的,用户遇到了ModuleNotFoundError: No module named 'flash_attn'的错误,需要安装相应的依赖包。我需要先回想一下flash_attn这个库的相关信息。 首先,flash_attn应该是Hugging Face的Transformer库中提到的Flash Attention实现,或者是Tri Dao维护的那个优化过的注意力机制库。我记得Flash Attention是一个高效实现,能加速训练并减少内存占用,尤其在处理长序列时效果显著。 用户需要安装这个模块,但可能不清楚具体的安装步骤。可能需要注意几点:PyTorch的版本是否兼容,CUDA版本是否匹配,是否需要从源码编译安装,或者是否有预编译的版本可用。 接下来,我需要确认正确的安装命令。根据之前的知识,安装flash_attn通常需要从源码安装,或者通过pip安装预编译的版本。可能还需要安装一些依赖项,比如ninja、packaging等。此外,CUDA的版本需要对应,比如CUDA 11.x或12.x,不同的flash-attn版本可能有不同的要求。 用户可能是在尝试运行某些需要Flash Attention的代码时遇到了这个问题,比如使用Hugging Face的模型或者自定义的注意力层。需要提醒用户安装正确的版本,并检查环境是否符合要求。 另外,用户可能是在不同的操作系统上安装,比如Linux或Windows。需要注意的是,官方可能只支持Linux,Windows用户可能需要通过WSL或其他方式安装。此外,安装时可能需要确保PyTorch已经正确安装,并且CUDA工具链可用。 可能还需要验证安装是否成功,比如在Python中导入flash_attn模块,或者运行简单的测试代码。如果安装后仍然存在问题,可能需要考虑CUDA版本不匹配,或者安装过程中缺少某些依赖项。 总结步骤应该是:安装依赖项,安装正确版本的flash_attn,验证安装。同时,可能需要根据用户的实际情况提供不同的解决方案,比如使用预编译的wheel或从源码编译。</think>遇到 `ModuleNotFoundError: No module named 'flash_attn'` 错误时,说明你的 Python 环境中缺少 **Flash Attention** 库。这个库是用于加速 Transformer 模型中注意力计算的优化实现,尤其在大模型训练中广泛应用。以下是安装和验证步骤: --- ### 1. **安装 `flash-attn` 库** #### 官方安装方式(推荐) Flash Attention 对系统环境和 CUDA 版本有特定要求,需确保满足以下条件: - **操作系统**:Linux(Windows 需通过 WSL 或源码编译)。 - **CUDA 版本**:11.8、12.1 或更高(需与 PyTorch 的 CUDA 版本匹配)。 - **PyTorch**:已安装且 CUDA 可用。 执行以下命令安装最新版本: ```bash # 安装依赖项(可选,但建议安装) pip install -U ninja packaging # 安装 flash-attn(官方推荐方式) pip install flash-attn --no-build-isolation ``` #### 替代安装方式 如果官方安装失败,尝试以下方法: - **使用预编译的 Wheel**(需匹配 CUDA 和 PyTorch 版本): ```bash # 例如 CUDA 12.1 的预编译包 pip install https://github.com/Dao-AILab/flash-attention/releases/download/v2.5.3/flash_attn-2.5.3+cu121torch2.1cxx11abiFALSE-cp310-cp310-linux_x86_64.whl ``` > 注:从 [Release 页面](https://github.com/Dao-AILab/flash-attention/releases) 查找适合你的 CUDA 和 Python 版本的 Wheel 文件。 - **从源码编译**: ```bash git clone https://github.com/Dao-AILab/flash-attention cd flash-attention pip install . ``` --- ### 2. **验证安装** 安装完成后,在 Python 中测试是否能成功导入: ```python import flash_attn # 检查 Flash Attention 是否支持当前环境 print(flash_attn.__version__) # 输出版本号(如 2.5.3) # 进一步验证 CUDA 功能 from flash_attn import flash_attn_func import torch # 随机生成 Q, K, V 张量 q = torch.randn(1, 8, 128, 64, dtype=torch.float16, device="cuda") k = torch.randn(1, 8, 128, 64, dtype=torch.float16, device="cuda") v = torch.randn(1, 8, 128, 64, dtype=torch.float16, device="cuda") # 运行 Flash Attention output = flash_attn_func(q, k, v) print(output.shape) # 应输出 torch.Size([1, 8, 128, 64]) ``` --- ### 3. **常见问题解决** #### 问题 1:安装后仍报错 `ModuleNotFoundError` - **原因**:可能安装了错误的包名(如混淆了 `flash-attn` 和 `flash_attn`)。 - **解决**: ```bash # 确保包名正确 pip uninstall flash-attn flash_attn # 清理旧包 pip install flash-attn --force-reinstall ``` #### 问题 2:CUDA 版本不兼容 - **现象**:安装时提示 `CUDA architecture` 错误。 - **解决**: 1. 检查 PyTorch 的 CUDA 版本是否匹配: ```python import torch print(torch.version.cuda) # 例如输出 12.1 ``` 2. 根据 CUDA 版本选择对应的预编译 Wheel 或源码编译。 #### 问题 3:Windows 支持 - **限制**:官方未提供 Windows 预编译包。 - **解决**:使用 WSL(Windows Subsystem for Linux)或在 Windows 上手动编译(需安装 CUDA Toolkit 和 Visual Studio 构建工具)。 --- ### 4. **依赖关系** - **PyTorch 版本**:需 ≥ 2.0(推荐 2.1+)。 - **GPU 要求**:NVIDIA GPU(支持 Ampere 架构或更新,如 A100、RTX 3090/4090)。 --- ### 总结 安装 `flash-attn` 的关键是确保 **CUDA 版本、PyTorch 版本和操作系统兼容**。如果遇到问题,优先检查环境配置,或直接从源码编译安装。安装成功后,可显著提升注意力计算的效率(尤其是长序列场景)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值