mirror of
https://github.com/QwenLM/Qwen.git
synced 2026-05-20 16:35:47 +08:00
update readme
This commit is contained in:
committed by
junyang.ljy
parent
f7681f9e77
commit
0b55158031
44
README_CN.md
44
README_CN.md
@@ -384,7 +384,11 @@ sh finetune/finetune_lora_single_gpu.sh
|
||||
sh finetune/finetune_lora_ds.sh
|
||||
```
|
||||
|
||||
与全参数微调不同,LoRA ([论文](https://arxiv.org/abs/2106.09685)) 只更新adapter层的参数而无需更新原有语言模型的参数。这种方法允许用户用更低的显存开销来训练模型,也意味着更小的计算开销。然而,如果你依然遇到显存不足的问题,可以考虑使用Q-LoRA ([论文](https://arxiv.org/abs/2305.14314))。该方法使用4比特量化模型以及paged attention等技术实现更小的显存开销。
|
||||
与全参数微调不同,LoRA ([论文](https://arxiv.org/abs/2106.09685)) 只更新adapter层的参数而无需更新原有语言模型的参数。这种方法允许用户用更低的显存开销来训练模型,也意味着更小的计算开销。
|
||||
|
||||
注意,如果你使用预训练模型进行LoRA微调,而非chat模型,模型的embedding和输出层的参数将被设为可训练的参数。这是因为预训练模型没有学习过ChatML格式中的特殊token,因此需要将这部分参数设为可训练才能让模型学会理解和预测这些token。这也意味着,假如你的训练引入新的特殊token,你需要通过代码中的`modules_to_save`将这些参数设为可训练的参数。如果你想节省显存占用,可以考虑使用chat模型进行LoRA微调,显存占用将大幅度降低。下文的显存占用和训练速度的记录将详细介绍这部分细节。
|
||||
|
||||
如果你依然遇到显存不足的问题,可以考虑使用Q-LoRA ([论文](https://arxiv.org/abs/2305.14314)) 。该方法使用4比特量化模型以及paged attention等技术实现更小的显存开销。
|
||||
|
||||
注意:如你使用单卡Q-LoRA,你可能需要安装`mpi4py`。你可以通过`pip`或者`conda`来安装。
|
||||
|
||||
@@ -397,7 +401,7 @@ sh finetune/finetune_qlora_single_gpu.sh
|
||||
sh finetune/finetune_qlora_ds.sh
|
||||
```
|
||||
|
||||
我们建议你使用我们提供的Int4量化模型进行训练,即Qwen-7B-Chat-Int4。请**不要使用**非量化模型!与全参数微调以及LoRA不同,Q-LoRA仅支持fp16。
|
||||
我们建议你使用我们提供的Int4量化模型进行训练,即Qwen-7B-Chat-Int4。请**不要使用**非量化模型!与全参数微调以及LoRA不同,Q-LoRA仅支持fp16。此外,上述LoRA关于特殊token的问题在Q-LoRA依然存在。并且,Int4模型的参数无法被设为可训练的参数。所幸的是,我们只提供了Chat模型的Int4模型,因此你不用担心这个问题。但是,如果你执意要在Q-LoRA中引入新的特殊token,很抱歉,我们无法保证你能成功训练。
|
||||
|
||||
与全参数微调不同,LoRA和Q-LoRA的训练只需存储adapter部分的参数。假如你需要使用LoRA训练后的模型,你需要使用如下方法。假设你使用Qwen-7B训练模型,你可以用如下代码读取模型:
|
||||
|
||||
@@ -411,7 +415,24 @@ model = AutoPeftModelForCausalLM.from_pretrained(
|
||||
).eval()
|
||||
```
|
||||
|
||||
上述shell脚本使用`torchrun`来运行单GPU和多GPU训练。分布式训练需要根据你的需求和机器指定正确的分布式训练超参数。
|
||||
如果你觉得这样一步到位的方式让你很不安心或者影响你接入下游应用,你可以选择先合并并存储模型,再用常规方式读取你的新模型,示例如下:
|
||||
|
||||
```python
|
||||
from peft import AutoPeftModelForCausalLM
|
||||
|
||||
model = AutoPeftModelForCausalLM.from_pretrained(
|
||||
path_to_adapter, # path to the output directory
|
||||
device_map="auto",
|
||||
trust_remote_code=True
|
||||
).eval()
|
||||
|
||||
merged_model = model.merge_and_unload()
|
||||
# max_shard_size and safe serialization are not necessary.
|
||||
# They respectively work for sharding checkpoint and save the model to safetensors
|
||||
merged_model.save_pretrained(new_model_directory, max_shard_size="2048MB", safe_serialization=True)
|
||||
```
|
||||
|
||||
注意:分布式训练需要根据你的需求和机器指定正确的分布式训练超参数。此外,你需要根据你的数据、显存情况和训练速度预期,使用`--model_max_length`设定你的数据长度。
|
||||
|
||||
### 显存占用及训练速度
|
||||
下面记录7B和14B模型在单GPULoRA和QLoRA时处理不同长度输入的显存占用和训练速度的情况。本次评测运行于单张A100-SXM4-80G GPU,使用CUDA 11.8和Pytorch 2.0。我们统一使用batch size为1,gradient accumulation为8的训练配置,记录输入长度分别为256、512、1024和2048的显存占用(GB)和训练速度(s/iter)。具体数值如下所示:
|
||||
@@ -534,24 +555,23 @@ print(response.choices[0].message.content)
|
||||
|
||||
## 部署
|
||||
|
||||
在CPU上运行非常简单,使用方法如下所示:
|
||||
### CPU
|
||||
|
||||
我们推荐你使用 [qwen.cpp](https://github.com/QwenLM/qwen.cpp) 来实现CPU部署和推理。qwen.cpp是Qwen和tiktoken的C++实现。你可以点击链接进入repo了解详情。
|
||||
|
||||
当然,直接在CPU上运行模型也是可以的,示例如下:
|
||||
|
||||
```python
|
||||
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B-Chat", device_map="cpu", trust_remote_code=True).eval()
|
||||
```
|
||||
|
||||
如果你遇到显存不足的问题而希望使用多张GPU进行推理,可以使用提供的脚本`utils.py`:
|
||||
但是,这样的推理效率大概率会非常低。
|
||||
|
||||
```python
|
||||
from utils import load_model_on_gpus
|
||||
model = load_model_on_gpus('Qwen/Qwen-7B-Chat', num_gpus=2)
|
||||
```
|
||||
### 多GPU
|
||||
|
||||
你即可使用2张GPU进行推理。
|
||||
如果你遇到显存不足的问题而希望使用多张GPU进行推理,可以使用上述的默认的使用方法读取模型。此前提供的脚本`utils.py`已停止维护。
|
||||
<br><br>
|
||||
|
||||
我们同时提供了Qwen-LM和tiktoken的C++实现, 更多细节请查看[qwen.cpp](https://github.com/QwenLM/qwen.cpp).
|
||||
|
||||
## 工具调用
|
||||
|
||||
Qwen-Chat针对工具使用、函数调用能力进行了优化。用户可以开发基于Qwen的Agent、LangChain应用、甚至Code Interpreter。
|
||||
|
||||
Reference in New Issue
Block a user