该文档是笔者从0-1实现了大语言模型的安装配置,及任务训练,局域网WebUIb部署,内容思路仅供参考
-
大语言模型的选择
-
现有可供选择的开源大语言模型(部分)
• LlaMA系列:由 Meta 发布,是一种预训练的生成文本模型,具有7到700亿个参数,已通过来自人类反馈的强化学习(RLHF)进行了微调,可以用作聊天机器人,能适应各种自然语言生成任务,包括编程任务
• BLOOM系列:经过与来自70多个国家的志愿者和 Hugging Face 的研究人员为期一年的合作开发而成。它是一个自回归语言模型,拥有176亿个参数,能够以46种语言和13种编程语言提供连贯准确的文本。其源代码和训练数据可公开访问;
• Falcon 180b:由阿拉伯技术创新研究所于2023年9月发布,可以接受1800亿个参数和3.5万亿个token。在各种自然语言处理任务中表现出色,Hugging Face 称其可与谷歌的 PaLM2 相媲美;
ChatGLM系列:例如 ChatGLM-6b 是一个开源的、支持中英双语问答的对话语言模型,并针对中文进行了优化。它基于 General Language Model(GLM)架构,具有62亿参数。结合模型量化技术,可在消费级显卡上进行本地部署;
MOSS:是一个支持中英双语和多种插件的开源对话语言模型,例如 MOSS-moon 系列模型具有160亿参数;
CPM-BEE:是一个完全开源、允许商用的百亿参数中英文基座模型,采用 Transformer 自回归架构,使用万亿级高质量语料进行预训练;
通义千问(qwen):阿里云此前已开源5亿、18亿、40亿、70亿、140亿和720亿参数的6款大语言模型。
-
为什么选用qwen2:0.5b ?
- Qwen2:0.5b计算资源需求适中:对于一些计算资源有限的场景, 0.5b 的规模相对较小,更容易在这些设备上运行和部署,减少了硬件成本和计算时间。在后面的参数微调中可以使用full方法对模型进行全参量的微调,在保证微调GPU内存的情况下又可以增加批处理任务数量,提高微调效率;
- 特定任务需求:对于一个小领域模型研究的任务不需要过于庞大和复杂的模型,Qwen2:0.5b已经能够提供足够的语言理解和生成能力来满足这些任务的要求。
- 文件数据量较少时,Qwen2:0.5b版本因为所用的预训练数据较少,对与我们使用少量的数据微调效果也更好
- 成本较少:由于我们只研究政策模型这一个小版块,而不对其他版块进行研究,所以使用0.5b版本可以极大的节约系统开销;
-
qwen2:0.5b的安装配置
-
qwen2安装
模型下载地址:https://huggingface.co/Qwen/Qwen2-0.5B
直接将huggingface目录下的qwen2-0.5文件下载到本地文件夹,可以使用自带api调用启动模型;推荐使用ollama加载模型,便于后续的部署;
-
ollama安装配置
Ollama 是一个用于运行本地大语言模型的工具。
它的主要特点包括:
支持在本地运行模型,这有助于保护数据隐私,并减少对网络连接的依赖。
提供了一种便捷的方式来管理和使用不同的语言模型。
允许用户根据自己的需求和硬件配置选择合适的模型进行部署和交互。
Ollama安装配置参考:GitHub - ollama/ollama: Get up and running with Llama 3.1, Mistral, Gemma 2, and other large language models.
在github直接下载Windows 的ollama版本安装工具,一键安装;
-
模型导入
如果不进行训练直接使用
Ollama run qwen2:0.5b
就可以实现自动下载导入,如果是训练好得到的模型参考下面步骤导入;
前面下载的qwen模型属于Safetensors系列格式,导入ollama时需进行一些转换
首先,克隆仓库:ollama/ollama
git clone git@github.com:ollama/ollama.git ollama
cd ollama
然后获取其子模块:llama.cpp
git submodule init
git submodule update llm/llama.cpp
接下来,安装 Python 依赖项:
python3 -m venv llm/llama.cpp/.venv
source llm/llama.cpp/.venv/bin/activate
pip install -r llm/llama.cpp/requirements.txt
转换模型
python llm/llama.cpp/ convert-hf-to-gguf.pyconvert.py
./model --outtype f16 --outfile /output
模型量化
llm/llama.cpp/quantize converted.bin quantized.bin q4_0
为模型创建一个:Modelfile
FROM quantized.bin
PARAMETER 可配置参数
TEMPLATE "[INST] {{ .Prompt }} [/INST]"
创建 Ollama 模型
ollama create example -f Modelfile
**其中ollama官方文档所给出的PARAMETER可选参数如下表
Parameter(参数名) | 描述 | 值的类型 | 使用示例 |
mirostat | 启用Mirostat算法以控制困惑度(perplexity)。 Mirostat算法可以有效减少结果中重复的发生。perplexity是指对词语预测的不确定性 (default: 0, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0) | int | mirostat 0 |
mirostat_eta | 它影响算法对生成文本反馈的响应速度。学习率较低会导致调整更慢,而较高的学习率则会使算法反应更加迅速。 (Default: 0.1) | float | mirostat_eta 0.1 |
mirostat_tau | 控制输出的连贯性和多样性之间的平衡。较低的值会使得文本更集中和连贯,而较高的值则会带来更大的多样性。 (Default: 5.0) | float | mirostat_tau 5.0 |
num_ctx | 设置生成下一个token时使用的上下文窗口大小。(Default: 2048) | int | num_ctx 4096 |
repeat_last_n | 设定了模型需要回顾多少信息来以防止重复。 (Default: 64, 0 = disabled, -1 = num_ctx) | int | repeat_last_n 64 |
repeat_penalty | 设定了重复惩罚的强度。较高的值(例如,1.5)会更强烈地处罚重复,而较低的值(如0.9)则会宽容一些. (Default: 1.1) | float | repeat_penalty 1.1 |
temperature | 模型的温度。 temperature通常用于控制随机性和多样性,提高温度意味着更高的随机性,可能导致更出乎意料但可能更有创意的答案。(Default: 0.8) | float | temperature 0.7 |
seed | 设置了生成时使用的随机数种子。设置特定的数值将使得模型对于相同的提示会生成相同的文本。(Default: 0) | int | seed 42 |
stop | 设置停止序列。当模型遇到这个模式时,会停止生成文本并返回。可以通过在Modelfile中指定多个独立的stop参数来设置多个停止模式。 | string | stop “AI assistant:” |
tfs_z | 尾部自由采样被用来减少不那么可能的token对输出的影响。较高的值(例如,2.0)会更大幅度地减小这种影响,而设置为1.0则禁用此功能。(default: 1) | float | tfs_z 1 |
num_predict | 生成文本时预测的最大token数量。 (Default: 128, -1 = infinite generation(无限制), -2 = fill context(根据上下文填充完整fill the context to its maximum)) | int | num_predict 42 |
top_k | 减少生成无意义内容的概率。较高的值(例如,100)会使答案更加多样,而较低的值(如,10)则会更为保守。 (Default: 40) | int | top_k 40 |
top_p | top-k协同工作。较高的值(例如,0.95)将导致更丰富的文本多样性,而较低的值(如,0.5)则会生成更聚焦和保守的内容。(Default: 0.9) | float | top_p 0.9 |
-
qwen2模型启动
1启动环境配置
本人所用的电脑配置为
Intel(R) Core(TM) i9-14900KF 3.20 GHz
RAM 128GB
GPU 4090(24G) *2
软件版本号参考如下:
Python Version 3.11.
配置的库及其版本号
Package | Version |
datasets | 2.20.0 |
deepspeed | 0.11.2+unknown |
dill | 0.3.8 |
safetensors | 0.4.3 |
torch | 2.3.1+cu121 |
tokenizers | 0.19.1 |
transformers | 4.43.1 |
torch一定要参考本机CUDA驱动,在官网下载,不要通过镜像下载,不然大概率会导致无法识别到GPU
GPU 驱动 CUDA 12.4
2启动模型
Ollama run ModelName
就可以在命令行界面进行模型交互
-
模型的训练
-
训练环境搭建
环境使用了ollama-factory框架
部署参考:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
Ollama-factory框架集成了多种模型训练方法,支撑多种模型的训练,又集模型训练,模型评估,模型推理,模型合并一体,而且带有webUI界面;
LLaMA-Factory下载
直接使用Git:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
Windows LoRA依赖
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.2.post2-py3-none-win_amd64.whl
框架启动
直接在命令行中启动web界面
Python LlaMA-Factory/src/webui.py
-
训练数据预处理
从postgresql数据库中直接通过python导入本地;
由于数据库文件数据是超文本格式,有许多的超文本标记,所以直接导入到本地以后就每一条数据生成一个html文件,再使用python BeautifulSoup库提取文本信息
数据的处理
训练数据要求的是指定格式的JSON,所以对提取到的文本还要进一步处理
参考LLaMA-Factory/data/README_zh.md at main · hiyouga/LLaMA-Factory · GitHub
使用自定义数据集需要在LlaMA-Factory的data文件夹下的dataset_info.json文件中定义数据集;在文件中添加:数据集描述
-
训练参数
为了达到政策模型预期的效果,即使回答的内容紧扣我们所给的训练文件
所以训练时采用了Full的微调方法,Full微调的优点是能够使模型更好地适应特定的任务和数据集,但也可能存在过拟合的风险,Full方法比较占用显卡内存如果内存不够使用lora方法,lora方法支撑QloRA量化可节约内存
加速方法使用flashattn2进行一个GPU并行化的加速
训练方法使用Supervised Fine-Tuning进行一个对数据的训练,以更好的适应数据
学习率可以根据数据大小适当调
笔者具体微调参数如下:
llamafactory-cli train ` --stage sft ` --do_train True ` --model_name_or_path saves\Qwen2-0.5B\full\train_2024-07-29-14-34-22 ` --preprocessing_num_workers 16 ` --finetuning_type full ` --quantization_method bitsandbytes ` --template default ` --flash_attn fa2 ` --dataset_dir D:\AI\LLaMA-Factory\data ` --dataset train_data_qa,train_data_policy,train_data_case,train_data_interpret ` --cutoff_len 500 ` --learning_rate 5e-05 ` --num_train_epochs 5.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\Qwen2-0.5B\full\train_2024-07-29-17-41-08 ` --bf16 True ` --plot_loss True ` --ddp_timeout 180000000 ` --include_num_input_tokens_seen True
-
模型的推理测试
训练完成的模型保存到了\Qwen2-0.5B\full\train_2024-07-29-17-41-08目录下,由于我们需要他可以更好的反应我们所给的训练数据,所以模型不需要再通原模型进行合并,直接使用导出的模型进行对话推理
如果需要增强模型的语言表达能力,可以将训练得到的模型与元模型进行合并,使用LlaMMA-Factory 的输出功能便可以实现;
笔者选择的参数如下:
推理引擎:huggingface
推理数据类型:float16
推理的设置参数:
Maximum new tokens 500
Top-p 0.13
Temperature 0.14
较低的Top-p和Temperature 可以更加完整的保留原数据的推理结果,而且降低了模型的自我创造力,但是回答的多样性较低;(根据不同需求调整一般不用这么低,笔者是项目要求)
-
模型局域网的UI界面部署
这里有使用docker熟悉的,又或者想要更多功能的可以使用open-webui进行部署,
Ollama-webui属于open-webui的精简版;
(1)ollama-webui安装
安装步骤:
1克隆存储库:
git clone https://github.com/ollama-webui/ollama-webui-lite.git
cd ollama-webui-lite
2安装依赖项:
npm ci
3在开发模式下运行应用程序:
npm run dev
(2)参数设置
本地计算机环境变量设置:
OLLAMA_ORIGINS=* ##使局域网访问也可以使用所有模型
OLLAMA_HOST= 0.0.0.0:11434 ##开放外网端口
(3)web界面访问
使用:http://localhost:3000 本地访问
或使用http://本机IP:3000 即可局域网访问
参考文档及网站:
https://huggingface.co/Qwen/Qwen2-0.5B
https://github.com/hiyouga/LLaMA-Factory/blob/main
LLaMA-Factory/data/README_zh.md at main · hiyouga/LLaMA-Factory · GitHub