大模型私有化部署实践(四):打造符合自身业务的垂类模型

451 阅读4分钟

专栏

LlamaFactory介绍

  • LlamaFactory 是一个专注于高效、灵活的大规模语言模型(LLM)微调和训练的开源平台。它旨在为开发者和研究人员提供一套强大的工具,帮助他们快速定制和优化语言模型,以满足特定任务和业务需求。LlamaFactory 支持多种主流预训练模型(如 LLaMA、GPT 等),并提供直观的界面和丰富的 API,使用户能够轻松完成数据预处理、模型微调、性能评估和部署等全流程操作。
  • LlamaFactory 的核心优势在于其模块化设计和高度可扩展性。用户可以根据需求选择不同的训练策略、优化器和硬件加速方案,同时支持分布式训练,显著提升模型训练效率。此外,LlamaFactory 还集成了多种评估工具,帮助用户实时监控模型性能并进行调优。
  • 无论是学术研究还是工业应用,LlamaFactory 都能为用户提供高效、可靠的解决方案,助力语言模型在自然语言处理、对话系统、内容生成等领域的广泛应用。通过 LlamaFactory,用户可以更专注于创新,而无需为复杂的底层实现分心。

LlamaFactory安装

  • conda修改国内镜像(可选,已经配置过可忽略)
sudo mkdir -p /root/.pip
sudo touch /root/.pip/pip.conf
然后vim /root/.pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
  • 我的是Ubuntu 22.04, 使用conda安装
conda create -n llamaFactory python=3.10 -y

conda activate llamaFactory
cd /usr/local
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"

  • 单卡训练后台启动
nohup env CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui > output.log 2>&1 &

LlamaFactory实践

lora

  • 参数高效微调(Parameter-Efficient Fine-Tuning,简称PEFT)是一种针对大型预训练模型(如大语言模型)的微调技术,它旨在减少训练参数的数量,从而降低计算和存储成本,同时保持或提升模型性能。LoRA(Low-Rank Adaptation,低秩适应)  是 PEFT 的一种具体实现方法
  • 本质上只是增加低秩矩阵

lora.png

  • 浏览器打开ip:7860能看到

LlamaFactory.png

  • 模型路径写自己下载的路劲,可以从魔塔社区下载,也可以执行下面命令
pip isntall modelscope
modelscope download --model LLM-Research/Llama-3.2-1B-Instruct --cache_dir /usr/local/Llama-3.2-1B-Instruct/ 

模型.png

  • 微调方式可以选lora

微调方式.png

  • 数据集,如果只是单个数据集快速验证,可以用偷懒的方式,打开你下载的LlamFactory目录执行下面命令,然后把alpaca_zh_demo.json替换成你自己的内容,这样界面上就能选择alpaca_zh_demo.json,展示的也是你自己的数据集合
cd /usr/local/src/LLaMA-Factory/data
cp  alpaca_zh_demo.json alpaca_zh_demo.json.bak

数据集.png

  • Lora的秩等配置都用默认的

Lora配置.png

  • 预览命令可以看实际lora微调执行的python命令,点击开始能看到每次迭代执行时loss

开始.png

  • 完成之后chat选择对应适配器之后可以试试微调后的效果

chat.png

  • export可以导出模型并保存

export.png

LlamaFactory集合DeepSpeed分布式多机多卡微调

真正执行train方法

  • LlamaFactory web界面配置好参数之后点击预览可以看到如下的train命令
llamafactory-cli train \
    --stage sft \
    --do_train True \
    --model_name_or_path  /usr/local/Llama-3.2-1B-Instruct \
    --preprocessing_num_workers 16 \
    --finetuning_type lora \
    --template default \
    --flash_attn auto \
    --dataset_dir data \
    --dataset mllm_demo \
    --cutoff_len 1024 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --optim adamw_torch \
    --packing False \
    --report_to none \
    --output_dir saves/LLaMA3-8B/lora/train_2024-12-17-11-45-21 \
    --fp16 True \
    --plot_loss True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --lora_target all
  • 参数解析
  1. 实际的批量大小 = batch_size * gradient_accumulation_steps
  2. 允许在多个小批次(mini-batches)上累积梯度,然后一次性更新模型参数,然增加了总体计算时间,但可以更有效地利用 GPU,特别是在处理大型模型时,如果显存有限,可以考虑调小这几个参数,当然微调的时间也要变更长
  3. max_grad_norm 限制梯度的最大范数(norm),确保梯度不会超过指定的阈值
  4. cosine 学习率调度器基于余弦函数来逐渐降低学习率,从初始学习率平滑地降低到非常小的值。 lr(t) = lr_min + 0.5 * (lr_max - lr_min) * (1 + cos(t * π / T))
  5. warmup_steps 在训练初期,学习率从一个很小的值开始,逐步增加到设定的最大值。 这个过程称为 "warmup"(预热)阶段
  6. self.dropout(x):首先对输入 x 应用 dropout。Dropout是一种正则化技术,随机"丢弃"一部分神经元,防止过拟合。在训练时随机置零一些元素,在推理时通常不应用。

多机多卡训练

  • 可参考之前文章大模型私有化部署实践(三):使用DeepSpeed多机多卡训练

参考文章