-
Notifications
You must be signed in to change notification settings - Fork 580
inference_with_transformers_zh
我们提供了命令行和Web图形界面两种方式使用原生Transformers进行推理。
下面以加载Chinese-LLaMA-2-7B/Chinese-Alpaca-2-7B模型为例说明启动方式。
如果你下载的是完整版权重,或者之前已执行了merge_llama2_with_chinese_lora_low_mem.py
脚本将LoRA权重与原版Llama-2合并,可直接加载完整版模型(请勿指定--lora_model
)。
python scripts/inference/inference_hf.py \
--base_model path_to_merged_llama2_or_alpaca2_hf_dir \
--with_prompt \
--interactive
如果你不想合并模型,也不想下载完整版模型,请通过加载原版Llama-2-hf和我们的LoRA模型进行推理。
python scripts/inference/inference_hf.py \
--base_model path_to_original_llama_2_hf_dir \
--lora_model path_to_chinese_llama2_or_alpaca2_lora \
--with_prompt \
--interactive
可以使用vLLM作为LLM后端进行推理,需要额外安装vLLM库。
pip install vllm
目前vLLM不支持加载LoRA模型(--lora_model
),仅支持使用8bit推理(--load_in_8bit
)或者纯CPU部署(--only_cpu
)。
python scripts/inference/inference_hf.py \
--base_model path_to_merged_llama2_or_alpaca2_hf_dir \
--with_prompt \
--interactive \
--use_vllm
命令行交互形式支持使用投机采样加速推理。可以使用小模型(Chinese-LLaMA-2-1.3B、Chinese-Alpaca-2-1.3B)作为Draft Model
,加速大模型的推理。
关于投机采样的详细说明见投机采样解码。
python scripts/inference/inference_hf.py \
--base_model path_to_merged_llama2_or_alpaca2_hf_dir \
--with_prompt \
--interactive \
--speculative_sampling \
--draft_k 4 \
--draft_base_model path_to_llama2_1.3b_or_alpaca2_1.3b_hf_dir
-
--base_model {base_model}
:存放HF格式的LLaMA-2模型权重和配置文件的目录 -
--lora_model {lora_model}
:中文LLaMA-2/Alpaca-2 LoRA解压后文件所在目录,也可使用🤗Model Hub模型调用名称。若不提供此参数,则只加载--base_model
指定的模型 -
--tokenizer_path {tokenizer_path}
:存放对应tokenizer的目录。若不提供此参数,则其默认值与--lora_model
相同;若也未提供--lora_model
参数,则其默认值与--base_model
相同 -
--with_prompt
:是否将输入与prompt模版进行合并。如果加载Alpaca模型,请务必启用此选项! -
--interactive
:以交互方式启动,以便进行多次单轮问答(此处不是llama.cpp中的上下文对话) -
--data_file {file_name}
:非交互方式启动下,按行读取file_name
中的的内容进行预测 -
--predictions_file {file_name}
:非交互式方式下,将预测的结果以json格式写入file_name
-
--only_cpu
:仅使用CPU进行推理 -
--gpus {gpu_ids}
:指定使用的GPU设备编号,默认为0。如使用多张GPU,以逗号分隔,如0,1,2
-
--alpha {alpha}
:使用NTK方法拓展上下文长度的系数,可以提升可处理的输入长度。默认为1。如果不知道怎么设置,可以保持默认值,或设为"auto"
-
--load_in_8bit
或--load_in_4bit
:使用8bit或4bit方式加载模型,降低显存占用 -
--system_prompt {system_prompt}
:指定system prompt,默认为alpaca-2.txt中的内容。 -
--use_vllm
:使用vLLM作为LLM后端进行推理 -
--guidance_scale {guidance_scale}
: Classifier-Free Guidance (CFG) sampling强度。默认为1。当guidance_scale>1
时,CFG sampling启用。与--use_vllm
不可同时使用。 -
--negative_prompt {negative_prompt}
: CFG sampling的反向提示语。默认为空,即不使用额外的反向提示语。 -
--speculative_sampling
: 使用投机采样加速推理 -
--draft_k {draft_k}
: 投机采样中小模型每次生成的token数。默认为0。传入非正整数时,使用动态变化的draft_k
-
--draft_base_model {draft_base_model}
: 存放HF格式的LLaMA-2小模型权重和配置文件的目录 -
--draft_lora_model {draft_lora_model}
: 小模型的LoRA文件目录。若不提供此参数,则只加载--base_model
指定的模型 -
--draft_model_load_in_8bit
或--draft_model_load_in_4bit
: 使用8bit或4bit方式加载小模型,降低显存占用 -
--use_flash_attention_2
: 使用Flash-Attention加速推理 -
--use_ntk
: 使用dynamic-ntk扩展上下文窗口,不适用64K版本长上下文模型。
该方式将启动Web前端页面进行交互,并且支持多轮对话。除transformers之外,需要安装gradio和mdtex2html:
pip install gradio
pip install mdtex2html
如果你下载的是完整版权重,或者之前已执行了merge_llama2_with_chinese_lora_low_mem.py
脚本将LoRA权重与原版Llama-2合并,可直接加载完整版模型(请勿指定--lora_model
)。
python scripts/inference/gradio_demo.py --base_model path_to_merged_alpaca2_hf_dir
如果你不想合并模型,也不想下载完整版模型,请通过加载原版Llama-2-hf和我们的LoRA模型进行推理。
python scripts/inference/gradio_demo.py \
--base_model path_to_original_llama_2_hf_dir \
--lora_model path_to_chinese_alpaca2_lora
如果之前已执行了merge_llama2_with_chinese_lora_low_mem.py
脚本将LoRA权重合并,那么无需再指定--lora_model
:
可以使用vLLM作为LLM后端进行推理,需要额外安装vLLM库(安装过程8-10分钟)。
pip install vllm
目前vLLM不支持加载LoRA模型(--lora_model
),仅支持使用8bit推理(--load_in_8bit
)或者纯CPU部署(--only_cpu
)。
python scripts/inference/gradio_demo.py --base_model path_to_merged_alpaca2_hf_dir --use_vllm
Web图形界面交互形式支持使用投机采样加速推理。可以使用小模型(Chinese-LLaMA-2-1.3B、Chinese-Alpaca-2-1.3B)作为Draft Model
,加速大模型的推理。
关于投机采样的详细说明见投机采样解码。
python scripts/inference/gradio_demo.py \
--base_model path_to_merged_alpaca2_hf_dir \
--speculative_sampling \
--draft_base_model path_to_llama2_1.3b_or_alpaca2_1.3b_hf_dir
-
--base_model {base_model}
:存放HF格式的LLaMA-2模型权重和配置文件的目录 -
--lora_model {lora_model}
:中文Alpaca-2 LoRA解压后文件所在目录,也可使用🤗Model Hub模型调用名称。若不提供此参数,则只加载--base_model
指定的模型 -
--tokenizer_path {tokenizer_path}
:存放对应tokenizer的目录。若不提供此参数,则其默认值与--lora_model
相同;若也未提供--lora_model
参数,则其默认值与--base_model
相同 -
--only_cpu
: 仅使用CPU进行推理 -
--gpus {gpu_ids}
: 指定使用的GPU设备编号,默认为0。如使用多张GPU,以逗号分隔,如0,1,2
-
--alpha {alpha}
:使用NTK方法拓展上下文长度的系数,可以提升有效上下文长度。默认为1。如果不知道怎么设置,可以保持默认值,或设为"auto"
。关于取值对性能的影响可参考#23 -
--load_in_8bit
或--load_in_4bit
:使用8bit或4bit方式加载模型 -
--max_memory
:多轮对话历史中存储的最大序列长度(以token计),默认1024 -
--use_vllm
:使用vLLM作为LLM后端进行推理 -
--speculative_sampling
: 使用投机采样加速推理 -
--draft_base_model {draft_base_model}
: 存放HF格式的LLaMA-2小模型权重和配置文件的目录 -
--draft_lora_model {draft_lora_model}
: 小模型的LoRA文件目录。若不提供此参数,则只加载--base_model
指定的模型 -
--draft_model_load_in_8bit
或--draft_model_load_in_4bit
: 使用8bit或4bit方式加载小模型,降低显存占用 -
--flash_attn
: 使用Flash-Attention加速推理
- 因不同框架的解码实现细节有差异,该脚本并不能保证复现llama.cpp的解码效果
- 该脚本仅为方便快速体验用,并未对推理速度做优化
- 如在CPU上运行7B模型推理,请确保有32GB内存;如在GPU上运行7B模型推理,请确保有16GB显存
我们在scripts/inference/speculative_sample.py
中实现了投机采样解码。投机采样是一种解码加速策略,在每轮解码时先使用能力较弱但速度快的小模型作为草稿模型(Draft Model
)预测多个token,然后由大模型检查这些token,并接受分布一致的部分,达到每轮生成大于等于1个token的效果,从而加速大模型的推理。使用方法参考命令行交互和Web图形界面交互中的相关说明。
下表给出了使用投机采样策略下,Chinese-LLaMA-2-1.3B和Chinese-Alpaca-2-1.3B作为draft model加速7B、13B的LLaMA和Alpaca模型的效果,可供参考。测试在1*A40-48G上完成,报告了生成每个token的平均时间,单位为ms/token。解码时小模型每次生成的token数(draft_k
)采用动态变化策略。LLama模型的测试数据是中文摘要任务数据,Alpaca模型的测试数据是指令任务数据。
草稿模型 | 草稿模型速度 | 目标模型 | 目标模型速度 | 投机采样速度(加速比) |
---|---|---|---|---|
Chinese-LLaMA-2-1.3B | 7.6 | Chinese-LLaMA-2-7B | 49.3 | 36.0(1.37x) |
Chinese-LLaMA-2-1.3B | 7.6 | Chinese-LLaMA-2-13B | 66.0 | 47.1(1.40x) |
Chinese-Alpaca-2-1.3B | 8.1 | Chinese-Alpaca-2-7B | 50.2 | 34.9(1.44x) |
Chinese-Alpaca-2-1.3B | 8.2 | Chinese-Alpaca-2-13B | 67.0 | 41.6(1.61x) |
在draft_k
动态变化的设置下,Chinese-LLaMA-2-1.3B和Chinese-Alpaca-2-1.3B对7B、13B的LLaMA和Alpaca模型均有一定的加速解码效果。如要改变draft_k
的设置,使用固定的draft_k
,可以在使用scripts/inference/inference_hf.py
脚本时修改传入的--draft_k
参数,以及使用scripts/inference/gradio_demo.py
脚本时在前端页面上修改draft_k
参数(值为0
时动态变化)。在不同使用场景下,调整draft_k
的取值可能获得更高的加速效果。