Llama3-8B基于peft+trl进行SFT监督微调(命令行模式)

4月19日Meta终于发布了Llama3,包含8B和70B两种模型,本次我们就来试着用命令行微调下8B的模型。

参考:https://huggingface.co/blog/zh/llama3

环境:

GPU:NVIDIA A100 80G

CUDA:12.3

Python 3.11+PyTorch 2.1.2+transformers 4.40.0

一、关于Llama3

 下载Llama3-8B模型,国内可以从modelscope上下载:

git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B.git

下载完毕后有如下文件:

二、关于trl

trl (Transformer Reinforcement Learning),Transformer强化学习,它提供了在训练和微调LLM的各个步骤中的实现,包括监督微调步骤(SFT),奖励建模步骤(RM)和近端策略优化(PPO)等。

Github:GitHub - huggingface/trl: Train transformer language models with reinforcement learning.

直接安装

pip install trl

其他依赖

pip install bitsandbytes
pip install accelerate
pip install peft

三、下载数据集

采用imdb数据集,已经帮忙分好了train和test

HuggingFace下载地址:https://huggingface.co/datasets/stanfordnlp/imdb

如果HuggingFace无法下载,可以从这里下载:Sentiment Analysis

下载后文件名重命名为imdb

下载后将数据集上传至服务器指定位置。

四、开始SFT微调

注意:在开始之前要先运行以下命令进行配置:

accelerate config

依次设置以下信息

核心是设置多GPU时的编号之类的,如果是单机单GPU就跳过此步骤。

参考:https://huggingface.co/docs/trl/main/en/clis

命令行下可直接跑:

trl sft --model_name_or_path /home/work/zhujiahui1/llm/Meta-Llama-3-8B --dataset_name /home/work/zhujiahui1/dataset/imdb --dataset_text_field text --load_in_4bit --use_peft --max_seq_length 512 --learning_rate 0.001 --per_device_train_batch_size 2 --output_dir ./sft-imdb-llama3-8b --logging_steps 10

逐行模式:

trl sft \
--model_name_or_path /home/work/zhujiahui1/llm/Meta-Llama-3-8B \
--dataset_name /home/work/zhujiahui1/dataset/imdb \
--dataset_text_field text \
--load_in_4bit \
--use_peft \
--max_seq_length 512 \
--learning_rate 0.001 \
--per_device_train_batch_size 2 \
--output_dir ./sft-imdb-llama3-8b \
--logging_steps 10

运行效果:

加载数据和模型:

开始微调(最下方是日志信息):

运行还是比较漫长的,就不等结果了。

查看显存占用:大概26G。

微调前微调后

五、常见问题

1. urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))

原因:由于众所周知的原因,数据集从HuggingFace下载异常。

解决方案:模型、数据集等一律离线下载好,用路径指定。

2. raw_datasets KeyError: 'test'

Traceback (most recent call last):

  File "/opt/anaconda3/lib/python3.11/site-packages/trl/commands/scripts/sft.py", line 119, in <module>

    eval_dataset = raw_datasets[args.dataset_test_name]

                   ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^

  File "/opt/anaconda3/lib/python3.11/site-packages/datasets/dataset_dict.py", line 74, in __getitem__

    return super().__getitem__(k)

           ^^^^^^^^^^^^^^^^^^^^^^

KeyError: 'test'

原因:imdb数据集需要指定文本列。

解决方案:在命令行中补充--dataset_text_field text。参考:python - TRL SFTTrainer - llama2 finetuning on Alpaca - datasettext field - Stack Overflow

3. TypeError: LlamaForCausalLM.__init__() got an unexpected keyword argument 'attn_implementation'

SFTTrainer中报错

原因:平台不对,笔者刚开始在Mac本地跑,出现上述错误,在A100 GPU服务器上跑,没出现该问题,FlashAttention等高级的Attention实现在Mac上是不支持的。

解决方案:一定要在NVIDIA GPU环境中跑。

4. ValueError: You cannot perform fine-tuning on purely quantized models. Please attach trainable adapters on top of the quantized model to correctly perform fine-tuning. Please see: https://huggingface.co/docs/transformers/peft for more details

原因:使用量化时必须同时使用peft。

解决方案:--load_in_4bit和--use_peft要同时加上。

5. if DebugOption.UNDERFLOW_OVERFLOW in self.args.debug: TypeError: argument of type 'bool' is not iterable

原因:命令行中加了不该加的参数。

解决方案:去掉参数--config /home/work/.cache/huggingface/accelerate/default_config.yaml。

注意:该配置文件默认会加载,因此不必在命令行中显式加。

6. 各种显存不足:torch.cuda.OutOfMemoryError: CUDA out of memory

torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 224.00 MiB. GPU 0 has a total capacty of 79.15 GiB of which 89.50 MiB is free. Process 89227 has 

2.24 GiB memory in use. Process 61266 has 1.62 GiB memory in use. Process 48365 has 8.89 GiB memory in use. Including non-PyTorch memory, this process has 66.29 GiB 

memory in use. Of the allocated memory 62.53 GiB is allocated by PyTorch, and 3.26 GiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is 

large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

原因:本次微调运行的GPU编号为5,即cuda:5。该GPU空闲的显存为66G左右,按理对于1个8B的模型微调是肯定装得下的(以往经验告诉我ChatGLM3微调显存16G足矣),但是竟然报显存不足。

解决方案:量化和peft必须开启。调低--max_seq_length,设置为512,调低--per_device_train_batch_size,设置为2。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Llama3-8b是一个开源的聊天机器人模型,可以用于自然语言处理和对话生成任务。如果您希望进行私有化部署,可以按照以下步骤进行操作: 1. 获取源代码:首先,您需要从Llama3-8b的开源代码库中获取源代码。您可以在GitHub上找到该项目,并将其克隆到本地。 2. 环境配置:在进行私有化部署之前,您需要配置适当的环境。确保您的系统满足所需的软件和硬件要求,并安装必要的依赖项。 3. 数据准备:为了训练和使用Llama3-8b模型,您需要准备相应的数据集。这可能包括对话数据、语料库等。确保数据集的质量和多样性,以提高模型的性能。 4. 模型训练:使用准备好的数据集,您可以开始训练Llama3-8b模型。根据您的需求和资源情况,您可以选择在单个GPU或多个GPU进行训练。训练过程可能需要一定的时间和计算资源。 5. 模型部署:一旦训练完成,您可以将Llama3-8b模型部署到私有环境中。这可能涉及将模型加载到服务器或云平台,并设置相应的API接口供其他应用程序调用。 6. 安全性和隐私保护:在进行私有化部署时,确保采取适当的安全措施来保护用户数据和系统安全。这可能包括数据加密、访问控制、身份验证等。 7. 持续优化和更新:私有化部署后,您可以根据实际需求对Llama3-8b模型进行持续优化和更新。这可能包括增加新的训练数据、微调模型参数等。 希望以上步骤对您进行Llama3-8b的私有化部署提供了一些指导。如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值