Back to Chinese Llama Alpaca

转换并量化中文LLaMA和Alpaca模型

notebooks/convert_and_quantize_chinese_llama_and_alpaca.ipynb

5.04.8 KB
Original Source

转换并量化中文LLaMA和Alpaca模型

项目地址:https://github.com/ymcui/Chinese-LLaMA-Alpaca

⚠️ 内存消耗提示(确保刷出来的机器RAM大于以下要求):

  • 7B模型:15G+
  • 13B模型:18G+
  • 33B模型:22G+

💡 提示和小窍门:

  • 免费用户默认的内存只有12G左右,不足以转换模型。实测选择TPU的话有机会随机出35G内存,建议多试几次
  • Pro(+)用户请选择 “代码执行程序” -> “更改运行时类型” -> “高RAM”
  • 程序莫名崩掉或断开连接就说明内存爆了
  • 如果选了“高RAM”之后内存还是不够大的话,选择以下操作,有的时候会分配出很高内存的机器,祝你好运😄!
    • 可以把GPU或者TPU也选上(虽然不会用到)
    • 选GPU时,Pro(+)用户可选“A100”类型GPU

温馨提示:用完之后注意断开运行时,选择满足要求的最低配置即可,避免不必要的计算单元消耗(Pro只给100个计算单元)。

安装相关依赖

python
!pip install torch==1.13.1
!pip install transformers==4.30.2
!pip install peft==0.3.0
!pip install sentencepiece

克隆目录和代码

python
!git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca
!git clone https://github.com/ggerganov/llama.cpp

合并模型(以Alpaca-7B为例)

此处使用的是🤗模型库中提供的基模型(已是HF格式),而不是Facebook官方的LLaMA模型,因此略去将原版LLaMA转换为HF格式的步骤。 这里直接运行第二步:合并LoRA权重,生成全量模型权重。可以直接指定🤗模型库的地址,也可以是本地存放地址。

  • 基模型:elinas/llama-7b-hf-transformers-4.29 (use at your own risk,我们比对过SHA256和正版一致,但你应确保自己有权使用该模型)
  • LoRA模型:ziqingyang/chinese-alpaca-lora-7b
    • 如果是Alpaca-Plus模型,记得要同时传入llama和alpaca的lora,教程:这里
  • 输出格式:可选pth或者huggingface,这里选择pth,因为后面要用llama.cpp量化

由于要下载模型,所以需要耐心等待一下,尤其是33B模型。 转换好的模型存放在alpaca-combined目录。 如果你不需要量化模型,那么到这一步就结束了,可自行下载或者转存到Google Drive。

python
!python ./Chinese-LLaMA-Alpaca/scripts/merge_llama_with_chinese_lora_low_mem.py \
    --base_model 'elinas/llama-7b-hf-transformers-4.29' \
    --lora_model 'ziqingyang/chinese-alpaca-lora-7b' \
    --output_type pth \
    --output_dir alpaca-combined

比对SHA256

完整值:https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/SHA256.md

其中本示例生成的Alpaca-7B的标准SHA256:

  • fbfccc91183169842aac8d093379f0a449b5a26c5ee7a298baf0d556f1499b90

使用下述命令评测后发现两者相同,合并无误。

python
!sha256sum alpaca-combined/consolidated.*.pth

量化模型

接下来我们使用llama.cpp工具对上一步生成的全量版本权重进行转换,生成4-bit量化模型。

编译工具

首先对llama.cpp工具进行编译。

python
!cd llama.cpp && make

模型转换为ggml格式(FP16)

这一步,我们将模型转换为ggml格式(FP16)。

💡 转换13B/33B模型提示:

  • tokenizer可以直接用7B的,13B/33B和7B的相同
  • Alpaca和LLaMA的tokenizer.model不能混用!
  • 以下看到7B字样的都是文件夹名,与转换过程没有关系了,改不改都行
python
!cd llama.cpp && mkdir zh-models && mv ../alpaca-combined zh-models/7B
!mv llama.cpp/zh-models/7B/tokenizer.model llama.cpp/zh-models/
!ls llama.cpp/zh-models/
python
!cd llama.cpp && python convert.py zh-models/7B/

将FP16模型量化为4-bit

我们进一步将FP16模型转换为4-bit量化模型,此处选择的是新版Q4_K方法。

python
!cd llama.cpp && ./quantize ./zh-models/7B/ggml-model-f16.bin ./zh-models/7B/ggml-model-q4_K.bin q4_K

(可选)测试量化模型解码

至此已完成了所有转换步骤。 我们运行一条命令测试一下是否能够正常加载并进行对话。

FP16和Q4量化文件存放在./llama.cpp/zh-models/7B下,可按需下载使用。

python
!cd llama.cpp && ./main -m ./zh-models/7B/ggml-model-q4_K.bin --color -p "详细介绍一下北京的名胜古迹:" -n 128