当前位置:   article > 正文

windows环境Ollama部署Llama3中文并调优_windows 训练 llama3

windows 训练 llama3

Windows

Ollama 模型部署

地址:https://ollama.com/download
github地址: https://github.com/ollama/ollama

  1. Python >= 3.11
安装python3版本
https://www.python.org/downloads/
  • 1
  • 2
  1. 显卡驱动 CUDA
文档地址: https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html

下载: https://developer.nvidia.com/cuda-downloads
选择示例: windows / x86_64 / 11 / exe(local)   (实际按需选择)

  • 1
  • 2
  • 3
  • 4
  • 5
  1. pytorch
官网 https://pytorch.org/

安装命令 (版本2.3.0 / 系统windows / 管理pip / 语言python / 平台CUDA 12.1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

  • 1
  • 2
  • 3
  • 4
  • 5

直接运行exe程序安装。安装完成后,可以在右下角看到ollama图标

环境变量控制:
OLLAMA_MODELS 配置模型下载部署的目录, 示例: D:\models
OLLAMA_HOST 服务地址端口, 示例: 0.0.0.0:11434

ollama运行命令见 ollama --help 查看帮助
ollama启动模型: ollama run llama3 (llama3 是线上模型名称)

open webui 模型界面

地址: https://github.com/open-webui/open-webui

  1. Python >= 3.11
  2. Node.js >= 20.10
  3. ubuntu
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://example.com -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

参数说明:
OLLAMA_BASE_URL: ollama 服务地址   -- 根据ollama 部署实际需要
name:docker 名称    -- 默认就好
open-webui: 静态文件地址   -- 不用改

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

llamafactory 模型训练

github地址: https://github.com/hiyouga/LLaMA-Factory

启动步骤

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .[torch,metrics]

## windows 在训练中量化模型,需要安装 bitsandbytes windows版本  (不建议,量化由后续处理)
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.2.post2-py3-none-win_amd64.whl

启动
llamafactory-cli webui

帮助
llamafactory-cli help

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

llamafactory webui 训练lora模型

  1. 准备数据集
  2. 准备读取数据集的 dataset_info.json 文件, 参考 data/dataset_info.json

数据集介绍:
https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README.md

参数后续补充

最后预览命令,然后执行
生成的lora模型 < 500M

llamafactory webui 合并模型

  1. 切换tab到 export
    刷新适配器,并选择刚刚的lora
    这里不要选量化!!!
    执行合并

ollama 发布本地模型

模型文件格式转换

github地址: https://github.com/ggerganov/llama.cpp (属于ollama子目录关联项目,在llm/llama.cpp/)

命令行,在 ollama/llm/llama.cpp 源码的目录
执行:(地址按需调整)
python convert-hf-to-gguf.py D:\work\data\ollama\models\Llama3-8B-Chinese-Chat --outtype f16 --outfile D:\work\data\ollama\models\Llama3-8B-Chinese-Chat\converted.gguf

转换遇到 问题: BPE pre-tokenizer was not recognized - update get_vocab_base_pre()
convert-hf-to-gguf.py  line 429:  logger.debug 改 warning  并查看 输出的值
根据输出的 chkhsh 值修改 key。 返回是 "llama-bpe" 常量


  • 1
  • 2
  • 3
  • 4
  • 5

模型量化

量化工具包下载
地址: https://github.com/ggerganov/llama.cpp/releases/tag/b2932
文件名: llama-b1380-bin-win-avx2-x64.zip

下载后解压到 ollama 项目下 llm\llama.cpp\build\bin\Release 目录

执行: (地址按需调整)
build\bin\Release\quantize D:\work\data\ollama\models\Llama3-8B-Chinese-Chat\converted.gguf D:\work\data\ollama\models\Llama3-8B-Chinese-Chat\converted_quantized.gguf q4_0

这里使用q4_0 ,8G显存只能加载q4模型。 有更高显存,可以提高精度

ollama 发布模型

命令行切换到 ollama 目录
创建 Modelfile 文件 内容如下 (模型地址按需调整)

# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM llama3:latest
FROM D:\work\python\LLaMA-Factory\export\v2\converted_quantized.gguf
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>"""
PARAMETER temperature 0.6
PARAMETER top_p 0.9
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|reserved_special_token"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Llamafactory 参数说明

model_name_or_path: meta-llama/Llama-2-7b-hf

指定模型名称或路径。
到时候根据自己项目部署修改这部分meta-llama/Llama-2-7b-hf

dataset: c4_demo

使用的数据集名称。(数据集就自己研究吧,如果不忙也会写先挖个坑)
根据自己需求修改这部分c4_demo的数据集名字

finetuning_type: lora
  1. Full:这种方式就是从头到尾完全训练一个模型。想象一下,你有一块白纸,你要在上面画出一幅完整的画作,这就是Full Training。你从零开始,逐步训练模型,直到它能够完成你想要的任务。
  2. Freeze:这种方式有点像是在一幅半完成的画上继续作画。在模型中,有些部分(通常是模型的初级部分,如输入层或底层特征提取部分)是已经训练好的,这部分会被“冻结”,不再在训练过程中更新。你只更新模型的其他部分,这样可以节省训练时间和资源。
  3. LoRA:这是一种比较新的技术,全称是“Low-Rank Adaptation”。可以理解为一种轻量级的模型调整方式。它主要是在模型的某些核心部分插入小的、低秩的矩阵,通过调整这些小矩阵来实现对整个模型的微调。这种方法不需要对原始模型的大部分参数进行重训练,从而可以在不牺牲太多性能的情况下,快速适应新的任务或数据。
  4. QLoRA:这是在LoRA的基础上进一步发展的一种方法。它使用量化技术(也就是用更少的比特来表示每个数字),来进一步减少模型调整过程中需要的计算资源和存储空间。这样做可以使得模型更加高效,尤其是在资源有限的设备上运行时。
lora_target: q_proj,v_proj

指定LoRA调整的目标层,这里是q_proj和v_proj。
​ 在使用LoRA(Low-Rank Adaptation,低秩适应)技术进行模型微调时,我们通常会选择模型中的特定层(或部分)进行调整。这些层被称为“目标层”。
​ 具体来说:
1.q_proj:通常指的是在自注意力机制中,用于生成查询(Query)向量的投影层。
2.v_proj:指的是在自注意力机制中,用于生成值(Value)向量的投影层。
​ 自注意力机制是很多现代深度学习模型,特别是Transformer模型的核心组成部分。在这种机制中,输入数据会被转换成三种类型的向量:查询(Query)、键(Key)、值(Value)。这些转换通常通过线性投影实现,即通过乘以一个权重矩阵。
​ 在使用LoRA进行微调时,我们不直接修改这些投影层的权重矩阵,而是在这些层插入低秩矩阵。通过优化这些低秩矩阵,我们可以在不显著改变原始模型结构的情况下,有效地调整模型的行为,使其更好地适应新的任务或数据。
​ 这种方法的优点是,它可以在保持大部分预训练模型权重不变的情况下,通过调整相对较少的参数来实现快速有效的微调。这样不仅可以节省计算资源,还可以减少过拟合的风险,特别是在数据较少的情况下。

output_dir saves/LLaMA2-7B/lora/pretrain

指定输出目录,训练完成后的模型和相关文件将保存在这里。
到时候根据需求修改这部分就可以 saves/LLaMA2-7B/lora/pretrain

overwrite_cache

如果设置参数为true,将覆盖加载数据时的缓存。

overwrite_output_dir

如果设置参数为true,将覆盖输出目录中已存在的文件。

cutoff_len: 1024

指定处理数据时的截断长度。

preprocessing_num_workers: 16

指定预处理数据时使用的工作进程数量。

per_device_train_batch_size: 1

每个设备上的训练批次大小。

per_device_eval_batch_size: 1

每个设备上的评估批次大小。

gradient_accumulation_steps: 8

梯度累积步数,用于在更新模型前累积更多的梯度,有助于使用较小的批次大小训练大模型

梯度累积的工作原理:
在每个批次的前向和反向传播过程中,不是立即更新模型权重,而是将梯度累积多个批次。当累积到一定数量的步骤后,再统一更新模型权重。这样可以模拟更大批量大小的效果。

选择梯度累积步数:
选择多少步骤进行梯度累积取决于你的具体需求和硬件限制。一般来说,步数越多,模拟的批量大小就越大,但同时每次更新权重的间隔也更长,可能会影响训练速度和效率。

低资源环境:可以选择较高的累积步数,以减少硬件压力。
高资源环境:如果内存允许,可以减少累积步数,使训练更加频繁地更新,可能会加速收敛。

lr_scheduler_type: cosine
学习率调度器类型

其他学习率调度器类型:

linear(线性):
描述:学习率从一个较高的初始值开始,然后随着时间线性地减少到一个较低的值。
使用场景:当你想要让模型在训练早期快速学习,然后逐渐减慢学习速度以稳定收敛时使用。

cosine(余弦):
描述:学习率按照余弦曲线的形状进行周期性调整,这种周期性的起伏有助于模型在不同的训练阶段探索参数空间。
使用场景:在需要模型在训练过程中不断找到新解的复杂任务中使用,比如大规模的图像或文本处理。

cosine_with_restarts(带重启的余弦):
描述:这是余弦调整的一种变体,每当学习率达到一个周期的最低点时,会突然重置到最高点,然后再次减少。
使用场景:适用于需要模型从局部最优解中跳出来,尝试寻找更好全局解的情况。

polynomial(多项式):
描述:学习率按照一个多项式函数减少,通常是一个幂次递减的形式。
使用场景:当你需要更精细控制学习率减少速度时使用,适用于任务比较复杂,需要精细调优的模型。

constant(常数):
描述:学习率保持不变。
使用场景:简单任务或者小数据集,模型容易训练到足够好的性能时使用。

constant_with_warmup(带预热的常数):
描述:开始时使用较低的学习率“预热”模型,然后切换到一个固定的较高学习率。
使用场景:在训练大型模型或复杂任务时,帮助模型稳定地开始学习,避免一开始就进行大的权重调整。

inverse_sqrt(逆平方根):
描述:学习率随训练步数的增加按逆平方根递减。
使用场景:常用于自然语言处理中,特别是在训练Transformer模型时,帮助模型在训练后期进行细微的调整。

reduce_lr_on_plateau(在平台期降低学习率):
描述:当模型的验证性能不再提升时,自动减少学习率。
使用场景:适用于几乎所有类型的任务,特别是当模型很难进一步提高性能时,可以帮助模型继续优化和提升。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
logging_steps: 10

每训练10步记录一次日志

save_steps: 100

每训练100步保存一次模型。

eval_steps: 100

每训练100步进行一次评估。

evaluation_strategy: steps

评估策略,这里设置为按步骤评估。

load_best_model_at_end

训练结束时加载表现最好的模型。

learning_rate: 5e-5

设置学习率。

学习率是机器学习和深度学习中控制模型学习速度的一个参数。你可以把它想象成你调节自行车踏板力度的旋钮:旋钮转得越多,踏板动得越快,自行车就跑得越快;但如果转得太快,可能会导致自行车失控。同理,学习率太高,模型学习过快,可能会导致学习过程不稳定;学习率太低,模型学习缓慢,训练时间长,效率低。

常见的学习率参数包括但不限于:
1e-1(0.1):相对较大的学习率,用于初期快速探索。
1e-2(0.01):中等大小的学习率,常用于许多标准模型的初始学习率。
1e-3(0.001):较小的学习率,适用于接近优化目标时的细致调整。
1e-4(0.0001):更小的学习率,用于当模型接近收敛时的微调。
5e-5(0.00005):非常小的学习率,常见于预训练模型的微调阶段,例如在自然语言处理中微调BERT模型。
选择学习率的情况:
快速探索:在模型训练初期或者当你不确定最佳参数时,可以使用较大的学习率(例如0.1或0.01),快速找到一个合理的解。
细致调整:当你发现模型的性能开始稳定,但还需要进一步优化时,可以减小学习率(例如0.001或0.0001),帮助模型更精确地找到最优解。
微调预训练模型:当使用已经预训练好的模型(如在特定任务上微调BERT)时,通常使用非常小的学习率(例如5e-5或更小),这是因为预训练模型已经非常接近优化目标,我们只需要做一些轻微的调整。

num_train_epochs: 3.0

训练的轮次

max_samples: 10000

最大样本数。

val_size: 0.1

验证集大小,这里设置为10%。

plot_loss

如果设置参数为true 将绘制损失图。

fp16

如果设置,将使用16位浮点数进行训练,可以减少内存使用并可能加速训练。

在深度学习中,我们可以选择不同的数值精度来进行模型的训练和计算。不同的精度会影响计算资源的使用、训练速度和模型的精确度。下面我用更通俗的语言解释一下这些术语:

  1. FP16 (Half Precision,半精度):
    这种方式使用16位的浮点数来保存和计算数据。想象一下,如果你有一个非常精细的秤,但现在只用这个秤的一半精度来称重,这就是FP16。它不如32位精度精确,但计算速度更快,占用的内存也更少。
  2. BF16 (BFloat16):
    BF16也是16位的,但它在表示数的方式上和FP16不同,特别是它用更多的位来表示数的大小(指数部分),这让它在处理大范围数值时更加稳定。你可以把它想象成一个专为机器学习优化的“半精度”秤,尤其是在使用特殊的硬件加速器时。
  3. FP32 (Single Precision,单精度):
    这是使用32位浮点数进行计算的方式,可以想象为一个标准的、全功能的精细秤。它在深度学习中非常常见,因为它提供了足够的精确度,适合大多数任务。
  4. Pure BF16:
    在表示数的方式上和FP16不同,特别是它用更多的位来表示数的大小(指数部分),这让它在处理大范围数值时更加稳定。你可以把它想象成一个专为机器学习优化的“半精度”秤,尤其是在使用特殊的硬件加速器时。
  5. FP32 (Single Precision,单精度):
    这是使用32位浮点数进行计算的方式,可以想象为一个标准的、全功能的精细秤。它在深度学习中非常常见,因为它提供了足够的精确度,适合大多数任务。
  6. Pure BF16:
    这种模式下,所有计算都仅使用BF16格式。这意味着整个模型训练过程中,从输入到输出,都在使用为机器学习优化的半精度计算。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/673836
推荐阅读
相关标签
  

闽ICP备14008679号