第一次做大模型的微调,记录一下。我的显卡是 4060ti 16G,显存只有16G注定会碰到很多问题。
模型:Llama3-Chinese-8B-Instruct
1. 我首先选择了LLaMA-Factory做为工具进行微调,最终结果提示显存不足,大概差1G吧。参考Llama3本地部署与高效微调入门_llama3 8b 微调-CSDN博客
2. 我又用unsloth作为工具进行微调,将fp16设置成True,bf16设置成False,可以生成相应的lora。参考使用Unsloth微调Llama3-Chinese-8B-Instruct中文开源大模型_llama3 unsloth-CSDN博客 https://colab.research.google.com/drive/135ced7oHytdxu3N2DNe1Z0kqjyYIkDXp?usp=sharing
3. 用transformers加载unsloth生成的lora和Llama3-Chinese-8B-Instruct时, 如果device_map为auto时,可以加载成功,但是很慢,gpu大概用了13G左右。
AutoModelForCausalLM.from_pretrained(mode, device_map="auto", torch_dtype=torch.float16)
如果将device_map设置成gpu,则会报错,提示显存不足。
4. 改用ollama部署,但ollama需要gguf格式的文件。将第二步生成的lora,直接保存成gguf,仍然提示显存不足
model.push_to_hub_gguf("hf/model", tokenizer, token = "")
修改了quantization_method参数,也没有用。这里我是将微调加保存放在一个py文件内,让后执行py文件,model会load和finetune后会一直占着显存,无法释放。我不清楚如果用jupyter会不会好些。
5. 用convert-lora-to-ggml.py转换第二步中生成的lora为bin文件。参考nous-llama.cpp/convert-llama-ggml-to-gguf.py at master · NousResearch/nous-llama.cpp · GitHub
6. 将Llama3-Chinese-8B-Instruct转成gguf文件,参考llama.cpp/examples/quantize/README.md at master · ggerganov/llama.cpp · GitHub
7. 做个Modelfile之后用ollama部署,最终可以load成功
总结:如果没有24G以上的显存还是用ollama+llama.cpp比较好
遗留问题:
1. 我查看40系列的显卡是支持bf16,为什么微调时不能用bf16
2. 在其他的贴子下看到,用ollama分别加载model和lora,效果不好,需要在第二步将model和lora merge。待验证。ollama 使用自己的微调模型_ollama微调模型-CSDN博客