微调大语言模型是常见的需求,由于模型参数量大,即使用 Lora/Qlora 进行微调也需要 GPU 显卡,Mac M系是苹果自己的 GPU,目前主流的框架还在建立在 CUDA 的显卡架构,也就是主要的卡还是来自英伟达。如果要用 Mac 来做训练和推理,需要用MLX,MLX 类似于 Pytorch,对苹果芯片做了支持,从而使得苹果电脑也可以进行深度学习。本文将介绍如何用 MLX 训练 Phi3 大语言模型:
安装 MLX
pip install mlx-lm
模型下载推理
这里需要访问 HuggingFace 下载,可以使用国内镜像
国内镜像
https://hf-mirror.com/
export HF_ENDPOINT=https://hf-mirror.com
python -m mlx_lm.generate --model microsoft/Phi-3-mini-4k-instruct --max-token 2048 --prompt "<|user|>\nCan you introduce yourself<|end|>\n<|assistant|>"
HF 模型转换为 MLX 模型
mlx 的命令都有一些默认值,-h 中没有具体说明, 只能去源码里看。
例如,转换完成的模型会保存到 mlx_model 目录下。
python -m mlx_lm.convert --hf-path microsoft/Phi-3-mini-4k-instruct
通过 MLX 进行调优
首先准备数据,MLX 使用 jsonl 数据格式进行训练,从 github 下载数据集并存放到 data 目录下,一共三个文件,test、train 和 valid,文件下载好之后我们就可以开始训练了。
https://github.com/microsoft/Phi-3CookBook/tree/main/code/04.Finetuning/mlx/data
消耗资源比较多,M2 风扇又开始转了。
python -m mlx_lm.lora --model microsoft/Phi-3-mini-4k-instruct --train --data ./data --iters 1000
模型推理
-
运行未训练的模型和训练好的模型,并对推理的结果进行比较。
python -m mlx_lm.generate --model microsoft/Phi-3-mini-4k-instruct --adapter-path ./adapters --max-token 2048 --prompt "Why do chameleons change colors? " --eos-token "<|end|>"
-
原始模型
python -m mlx_lm.generate --model microsoft/Phi-3-mini-4k-instruct --max-token 2048 --prompt "Why do chameleons change colors? " --eos-token "<|end|>"
合并模型
将训练好的 Lora adapter 合并到原始模型中。
python -m mlx_lm.fuse --model microsoft/Phi-3-mini-4k-instruct
生成 GGUF
通过 llama.cpp 生成 GGUF,量化参数支持 'f32', 'f16', 'bf16', 'q8_0',根据需要自行修改。Phi3 模型默认没有 tokenizer.model,需要从 HF 下载
https://huggingface.co/microsoft/Phi-3-mini-4k-instruct/tree/main
将 tokenizer.model 复制到 /lora_fused_model/ 目录下,完成后运行生成GGUF 的转换命令。
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
pip install -r requirements.txt
python convert-hf-to-gguf.py ../lora_fused_model --outfile ../phi-3-mini-ft.gguf --outtype q8_0
创建 Ollma 模型
首先创建 Ollama 的模型文件 ModelFile,和上一步生成的 gguf 文件放到同一个目录下
FROM ./phi-3-mini-ft.gguf
PARAMETER stop "<|end|>"
创建模型
ollama create phi3ft -f Modelfile
Ollama 启动模型并进行推理
ollama run phi3ft
总结
MLX 模型推理非常简单,数据准备好就可以训练和推理,本次使用的是 phi3 模型,中文支持的不好,以后可以试试 Qwen2 怎么样。