更新时间:2024-12-17 GMT+08:00
分享

附录:大模型推理常见问题

问题1:在推理预测过程中遇到NPU out of memory

解决方法:调整推理服务启动时的显存利用率,将--gpu-memory-utilization的值调小。

问题2:在推理预测过程中遇到ValueError:User-specified max_model_len is greater than the drived max_model_len

解决方法:

修改config.json文件中的"seq_length"的值,"seq_length"需要大于等于 --max-model-len的值。config.json存在模型对应的路径下,例如:/data/nfs/benchmark/tokenizer/chatglm3-6b/config.json

问题3:使用llama3.1系列模型进行推理时报错

使用llama3.1系模型进行推理时报错:ValueError: 'rope_scaling' must be a dictionary with two fields, 'type' and 'factor', got {'factor': 8.0, 'low_freq_factor': 1.0, 'high_freq_factor': 4.0, 'original_max_position_embeddings': 8192, 'rope_type': 'llama3'}

解决方法:

升级transformers版本到4.43.1

pip install transformers --upgrade

问题4:使用SmoothQuant进行W8A8进行模型量化时报错

使用SmoothQuant进行W8A8进行模型量化时报错:AttributeError: type object 'LlamaAttention' has no attribute '_init_rope'

解决方法:降低transformers版本到4.42

pip install transformers==4.42 --upgrade

问题5:使用AWQ转换llama3.1系列模型权重出现报错

使用AWQ转换llama3.1系列模型权重出现报错:ValueError: 'rope_scaling' must be a dictionary with two fields, 'type' and 'factor'

解决方法:

该问题通过将transformers升级到4.44.0,修改对应transformers中的transformers/models/llama/modeling_llama.py,在class LlamaRotaryEmbedding中的forward函数中增加self.inv_freq = self.inv_freq.npu()

问题6:使用Qwen2-7B、Qwen2-72B模型有精度问题,重复输出感叹号

检查步骤六中4. 配置环境变量章节中,高精度模式的环境变量是否开启。

问题7:使用autoAWQ进行qwen-7b模型量化时报错

使用autoAWQ进行qwen-7b模型量化时报错:TypeError: 'NoneType' object is not subscriptable

解决方法:

修改qwen-7b权重路径下modeling_qwen.py第39行为SUPPORT_FP16 = True

问题8:使用benchmark-tools对GLM系列模型进行性能测试报错

使用benchmark-tools对GLM系列模型进行性能测试报错TypeError: _pad() got an unexpected keyword argument 'padding_side'

解决方法:

1、下载最新的tokenization_chatglm.py,替换原来权重里的tokenization_chatglm.py。

https://huggingface.co/THUDM/glm-4-9b-chat/blob/main/tokenization_chatglm.py

https://huggingface.co/THUDM/chatglm3-6b/blob/main/tokenization_chatglm.py

或者2、修改tokenization_chatglm.py,在266行增加padding_side: str = "left",如图1所示。

图1 tokenization_chatglm.py

问题9:使用benchmark-tools访问推理服务返回报错

使用benchmark-tools访问推理服务时,输入输出的token和大于max_model_len,服务端返回报错Response payload is not completed,见图2

再次设置输入输出的token和小于max_model_len访问推理服务,服务端响应200,见图3

客户端仍返回报错Response payload is not completed,见图4

图2 服务端返回报错Response payload is not completed
图3 服务端响应200
图4 仍返回报错Response payload is not completed

解决方法:

安装brotlipy后返回正确报错

pip install brotlipy

问题10:使用benchmark-tools访问推理客户端返回报错或警告

使用benchmark-tools访问推理客户端返回报错或警告:actual output_tokens_length < expected output_len

图5 benchmark-tools访问推理客户端返回报错
图6 benchmark-tools访问推理客户端返回警告

解决方法:

减少参数--prompt-tokens和--output-tokens的值,或者增大启动服务的参数--max-model-len的值。

问题11:使用离线推理时,性能较差或精度异常

解决方法:将block_size大小设置为128

from vllm import LLM, SamplingParams
llm = LLM(model="facebook/opt-125m", block_size=128)

问题12:使用SmoothQuant做权重转换时,scale显示为nan或推理时精度异常

图7 权重转换scale显示为nan

涉及模型:qwen2-1.5b, qwen2-7b

解决方法:修改AscendCloud/AscendCloud-LLM/llm_tools/AutoSmoothQuant/autosmoothquant/utils/utils.py中的build_model_and_tokenizer函数,将torch_dtype类型从torch.float16改成torch.bfloat16

kwargs = {"torch_dtype": torch.bfloat16, "device_map": "auto"}

问题13:使用SmoothQuant做权重转换时报错

图8 权重转换报错

涉及模型:qwen2-1.5b, qwen2-0.5b

解决方法:修改AscendCloud/AscendCloud-LLM/llm_tools/AutoSmoothQuant/autosmoothquant/examples/smoothquant_model.py中的main函数,保存模型时将safe_serialization指定为False

int8_model.save_pretrained(output_path,safe_serialization=False)

相关文档