ChatGLM-6B异常处理常见错误排查手册部署和运行ChatGLM-6B时遇到各种报错是常有的事。内存不够、模型加载失败、依赖冲突、端口占用……这些问题就像一个个拦路虎让很多开发者头疼不已。我刚开始接触ChatGLM-6B时也踩过不少坑。记得有一次为了跑通一个简单的对话示例我花了整整两天时间排查各种环境问题。从那时候起我就开始整理这些常见错误的解决方法希望能帮到更多遇到同样问题的朋友。这篇文章就是把我这些年积累的经验整理出来用最直白的方式告诉你遇到这些错误该怎么办。我会按照从部署到运行的顺序把最常见的错误一个个拆解给出具体的排查步骤和解决方案。你不用再像我当初那样到处搜索、反复试错跟着这个手册走大部分问题都能快速解决。1. 环境准备阶段的常见问题在开始部署ChatGLM-6B之前环境配置是第一个坎。很多人在这里就卡住了其实大部分问题都有固定的解决方法。1.1 内存和显存不足这是最常见的问题之一。ChatGLM-6B虽然号称“轻量”但对硬件还是有基本要求的。错误表现运行时报错CUDA out of memory程序直接崩溃提示内存不足模型加载到一半就卡住不动了根本原因 ChatGLM-6B在不同精度下对内存/显存的需求不同FP16无量化需要约13GB显存INT8量化需要约8GB显存INT4量化需要约6GB显存CPU运行需要约32GB内存如果你的硬件达不到这些要求就会出现各种内存相关的错误。解决方案方案一使用量化模型推荐如果你只有消费级显卡比如RTX 3060的12GB显存直接加载FP16模型可能会爆显存。这时候可以用量化版本# 使用INT8量化模型 from transformers import AutoTokenizer, AutoModel tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b-int8, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b-int8, trust_remote_codeTrue).half().cuda() # 或者使用INT4量化模型更省显存 model AutoModel.from_pretrained(THUDM/chatglm-6b-int4, trust_remote_codeTrue).half().cuda()方案二在CPU上运行如果没有合适的GPU或者显存实在不够可以在CPU上运行# CPU运行需要约32GB内存 model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).float() # 如果内存不够用量化版本 model AutoModel.from_pretrained(THUDM/chatglm-6b-int4, trust_remote_codeTrue).float()方案三清理显存有时候不是真的显存不够而是之前的程序没释放干净import torch import gc # 清理缓存 torch.cuda.empty_cache() gc.collect() # 如果用了多个模型可以尝试重启Python内核方案四分批处理对于长文本生成可以尝试分批处理# 如果生成很长的文本可以分段生成 def generate_long_text(prompt, max_length2048, chunk_size512): result current_prompt prompt while len(result) max_length: chunk, _ model.chat(tokenizer, current_prompt, history[]) result chunk current_prompt chunk[-100:] # 用最后100个字符作为下一段的提示 if len(result) max_length: break return result[:max_length]1.2 Python版本和依赖冲突ChatGLM-6B对Python版本和依赖包版本有特定要求版本不对很容易出问题。错误表现ImportError: cannot import name xxx from transformersAttributeError: module torch has no attribute half各种奇怪的版本兼容性错误根本原因Python版本太低需要3.8transformers版本不兼容推荐4.27.1torch版本问题其他依赖包版本冲突解决方案第一步检查Python版本python --version # 需要Python 3.8或更高版本如果版本太低需要升级。在Ubuntu上可以这样安装Python 3.8sudo apt update sudo apt install python3.8 python3.8-venv python3.8-dev第二步创建虚拟环境强烈推荐不要用系统Python一定要创建虚拟环境# 创建虚拟环境 python3.8 -m venv chatglm_env # 激活虚拟环境 # Linux/Mac source chatglm_env/bin/activate # Windows chatglm_env\Scripts\activate第三步安装指定版本的依赖ChatGLM-6B官方推荐的版本组合# 先升级pip pip install --upgrade pip # 安装指定版本的torch根据你的CUDA版本选择 # CUDA 11.7 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 # 或者CPU版本 pip install torch1.13.1 torchvision0.14.1 # 安装其他依赖 pip install transformers4.27.1 pip install cpm_kernels pip install gradio pip install mdtex2html pip install sentencepiece pip install accelerate pip install streamlit pip install streamlit-chat第四步如果还有冲突尝试完整重装有时候依赖关系太复杂最简单的方法是全部重装# 删除虚拟环境重新创建 deactivate rm -rf chatglm_env # 重新创建并安装 python3.8 -m venv chatglm_env source chatglm_env/bin/activate # 使用requirements.txt安装 # 先创建一个requirements.txt文件 echo torch1.13.1 transformers4.27.1 cpm_kernels gradio mdtex2html sentencepiece accelerate streamlit streamlit-chat requirements.txt pip install -r requirements.txt2. 模型下载和加载问题模型文件很大约12GB下载和加载过程中容易出问题。2.1 模型下载失败或速度慢错误表现ConnectionError: Failed to establish a new connection下载进度条不动或者速度极慢下载到一半中断根本原因网络连接问题特别是访问Hugging Face磁盘空间不足Git LFS没有正确安装解决方案方案一使用国内镜像源如果从Hugging Face下载太慢可以用国内镜像# 方法1使用ModelScope阿里云 git clone https://www.modelscope.cn/ZhipuAI/ChatGLM-6B.git chatglm-6b cd chatglm-6b git checkout v1.0.16 # 方法2使用清华镜像 # 先设置环境变量 export HF_ENDPOINThttps://hf-mirror.com # 然后正常下载 git clone https://hf-mirror.com/THUDM/chatglm-6b方案二手动下载模型文件如果git clone还是不行可以手动下载访问Hugging Face页面https://huggingface.co/THUDM/chatglm-6b手动下载所有文件注意要下载.gitattributes文件把下载的文件放到本地目录比如./chatglm-6b修改代码从本地加载# 修改这一行把模型路径改成本地路径 model AutoModel.from_pretrained(./chatglm-6b, trust_remote_codeTrue)方案三分步下载先下载代码再单独下载模型权重# 1. 只下载代码跳过LFS文件 GIT_LFS_SKIP_SMUDGE1 git clone https://huggingface.co/THUDM/chatglm-6b # 2. 进入目录 cd chatglm-6b # 3. 单独下载大文件 git lfs pull2.2 模型加载失败错误表现OSError: Unable to load weights from pytorch checkpoint fileRuntimeError: Error(s) in loading state_dict加载模型时卡住不动根本原因模型文件损坏或不完整文件权限问题磁盘空间不足解决方案第一步检查模型文件完整性# 检查文件大小主要文件应该有 # pytorch_model.bin ≈ 12GB # tokenizer.model ≈ 2.5MB # 其他配置文件 ls -lh chatglm-6b/如果文件大小不对可能需要重新下载。第二步检查文件权限# 确保有读取权限 chmod -R 755 chatglm-6b/ # 如果用了sudo下载可能需要改文件所有者 sudo chown -R $USER:$USER chatglm-6b/第三步验证模型是否能加载写一个简单的测试脚本# test_load.py from transformers import AutoTokenizer, AutoModel import torch print(Testing model loading...) try: # 先试量化版本加载快 print(Trying INT4 quantized model...) tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b-int4, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b-int4, trust_remote_codeTrue).float() print(✓ INT4 model loaded successfully) # 测试对话 response, history model.chat(tokenizer, 你好, history[]) print(fTest response: {response[:50]}...) except Exception as e: print(fError loading INT4 model: {e}) # 试试从本地加载 try: print(\nTrying to load from local path...) tokenizer AutoTokenizer.from_pretrained(./chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(./chatglm-6b, trust_remote_codeTrue).float() print(✓ Local model loaded successfully) except Exception as e2: print(fError loading local model: {e2})运行测试python test_load.py第四步清理缓存重新加载有时候transformers的缓存有问题# 清理transformers缓存 rm -rf ~/.cache/huggingface/ # 或者 rm -rf ~/.cache/huggingface/transformers/然后重新运行。3. 运行时的常见错误模型加载成功后运行过程中还会遇到各种问题。3.1 CUDA相关错误错误表现RuntimeError: CUDA error: out of memoryRuntimeError: CUDA error: an illegal memory access was encounteredAssertionError: Torch not compiled with CUDA enabled根本原因显存不足最常见CUDA版本和torch版本不匹配没有安装CUDA版本的torch解决方案第一步检查CUDA和torch是否匹配import torch print(fPyTorch version: {torch.__version__}) print(fCUDA available: {torch.cuda.is_available()}) print(fCUDA version: {torch.version.cuda}) print(fGPU count: {torch.cuda.device_count()}) if torch.cuda.is_available(): print(fCurrent GPU: {torch.cuda.get_device_name(0)})如果torch.cuda.is_available()返回False说明安装的是CPU版本的torch需要重新安装。第二步安装正确版本的torch根据你的CUDA版本安装对应的torch# 查看CUDA版本 nvcc --version # 或者 nvidia-smi # 根据CUDA版本安装torch # CUDA 11.7 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 # CUDA 11.6 pip install torch1.13.1cu116 torchvision0.14.1cu116 --extra-index-url https://download.pytorch.org/whl/cu116 # CUDA 10.2 pip install torch1.13.1cu102 torchvision0.14.1cu102 --extra-index-url https://download.pytorch.org/whl/cu102第三步优化显存使用如果显存还是不够可以尝试这些优化# 1. 使用更小的batch size # 2. 使用梯度累积 # 3. 使用混合精度训练 # 4. 及时清理缓存 import torch from torch.cuda.amp import autocast, GradScaler # 混合精度训练示例 scaler GradScaler() with autocast(): # 前向传播 outputs model(inputs) loss criterion(outputs, labels) # 反向传播 scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() # 及时清理 torch.cuda.empty_cache()3.2 推理速度慢错误表现生成回答非常慢几十秒才回复一句话GPU利用率很低CPU占用率很高根本原因模型没有放到GPU上使用了CPU模式输入序列太长没有使用优化策略解决方案方案一确保模型在GPU上# 错误的做法忘记.cuda() model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half() # 缺少.cuda() # 正确的做法 model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() model model.eval() # 设置为评估模式方案二使用量化模型INT4量化模型推理速度更快显存占用更少# 使用INT4量化模型 model AutoModel.from_pretrained(THUDM/chatglm-6b-int4, trust_remote_codeTrue).half().cuda()方案三优化推理参数调整生成参数可以显著影响速度# 较快的参数设置 response, history model.chat( tokenizer, prompt, historyhistory, max_length512, # 限制生成长度 num_beams1, # 不使用beam search更快 do_sampleFalse, # 不采样更快 temperature1.0, # 温度设为1.0 top_p0.7, # top-p采样 )方案四使用缓存加速对于重复的查询可以使用缓存from functools import lru_cache lru_cache(maxsize100) def get_cached_response(prompt): response, history model.chat(tokenizer, prompt, history[]) return response # 使用缓存 response get_cached_response(你好)3.3 Web Demo相关问题错误表现Streamlit is not recognized as an internal or external commandError: That port is already in use网页打不开或者打开后无法交互解决方案问题一streamlit命令找不到# 确保streamlit已安装 pip install streamlit streamlit-chat # 检查是否在虚拟环境中 # 如果不在先激活虚拟环境 source chatglm_env/bin/activate # 运行web demo cd ChatGLM-6B streamlit run web_demo2.py --server.port 7860问题二端口被占用# 查看端口占用情况 lsof -i :7860 # 或者 netstat -tulpn | grep :7860 # 杀掉占用进程 kill -9 PID # 或者换一个端口 streamlit run web_demo2.py --server.port 7861问题三网页能打开但不能对话检查控制台输出常见问题模型路径不对修改web_demo2.py中的模型路径# 修改前 tokenizer AutoTokenizer.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue).half().cuda() # 修改后使用本地路径 tokenizer AutoTokenizer.from_pretrained(./chatglm-6b, trust_remote_codeTrue) model AutoModel.from_pretrained(./chatglm-6b, trust_remote_codeTrue).half().cuda()没有公网IP访问如果是远程服务器需要配置# 允许所有IP访问 streamlit run web_demo2.py --server.port 7860 --server.address 0.0.0.0 # 然后在浏览器访问http://服务器IP:7860安全组/防火墙问题确保端口开放# 临时关闭防火墙测试用生产环境不要这样 sudo ufw disable # 或者开放特定端口 sudo ufw allow 78604. 高级问题与优化4.1 多GPU部署问题错误表现RuntimeError: Expected all tensors to be on the same device只有一个GPU被使用其他GPU闲置显存使用不均衡解决方案方案一使用官方多GPU支持from utils import load_model_on_gpus # 均匀切分到多个GPU model load_model_on_gpus(THUDM/chatglm-6b, num_gpus2)方案二手动指定设备映射from transformers import AutoTokenizer, AutoModel import torch # 指定每个层放在哪个GPU上 device_map { transformer.word_embeddings: 0, transformer.layers.0: 0, transformer.layers.1: 0, # ... 前半部分放在GPU 0 transformer.layers.14: 1, transformer.layers.15: 1, transformer.layers.16: 1, # ... 后半部分放在GPU 1 transformer.final_layernorm: 1, lm_head: 1 } model AutoModel.from_pretrained( THUDM/chatglm-6b, trust_remote_codeTrue, device_mapdevice_map )方案三使用accelerate库from accelerate import Accelerator accelerator Accelerator() model AutoModel.from_pretrained(THUDM/chatglm-6b, trust_remote_codeTrue) model accelerator.prepare(model)4.2 长文本生成问题错误表现生成到一半中断生成的内容重复或质量下降显存随着生成长度增加而增加解决方案方案一分段生成def generate_long_text_with_chunks(prompt, max_tokens2048, chunk_size256): 分段生成长文本 full_response current_prompt prompt for i in range(0, max_tokens, chunk_size): # 生成一个chunk chunk, history model.chat( tokenizer, current_prompt, history[], max_lengthchunk_size, temperature0.7 ) full_response chunk current_prompt chunk # 用生成的chunk作为下一段的提示 # 如果生成结束或达到最大长度 if len(full_response) max_tokens or 。 in chunk[-20:]: break return full_response[:max_tokens]方案二使用流式生成def stream_generate(prompt, max_length512): 流式生成可以实时看到生成内容 inputs tokenizer(prompt, return_tensorspt).to(model.device) with torch.no_grad(): for i in range(max_length): outputs model.generate( **inputs, max_new_tokens1, do_sampleTrue, temperature0.7, top_p0.9 ) new_token outputs[0, -1:] inputs[input_ids] torch.cat([inputs[input_ids], new_token.unsqueeze(0)], dim-1) # 解码并输出 new_text tokenizer.decode(new_token, skip_special_tokensTrue) print(new_text, end, flushTrue) # 如果生成结束符 if new_token.item() tokenizer.eos_token_id: break print() # 换行4.3 微调相关问题错误表现RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn微调后模型效果变差微调过程显存爆炸解决方案方案一正确设置可训练参数# 只微调部分参数如P-Tuning v2 from peft import get_peft_model, LoraConfig, TaskType # LoRA配置 lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, inference_modeFalse, r8, lora_alpha32, lora_dropout0.1 ) model get_peft_model(model, lora_config) model.print_trainable_parameters() # 查看可训练参数数量方案二使用梯度检查点# 启用梯度检查点节省显存 model.gradient_checkpointing_enable() # 训练时使用 from torch.utils.checkpoint import checkpoint def custom_forward(*inputs): # 自定义前向传播 return model(*inputs) outputs checkpoint(custom_forward, input_ids, attention_mask)方案三调整微调参数# 较小的学习率 from transformers import AdamW optimizer AdamW( model.parameters(), lr1e-5, # 小学习率 weight_decay0.01 ) # 使用warmup from transformers import get_linear_schedule_with_warmup total_steps len(train_dataloader) * epochs scheduler get_linear_schedule_with_warmup( optimizer, num_warmup_stepsint(total_steps * 0.1), num_training_stepstotal_steps )5. 总结处理ChatGLM-6B的异常问题其实是有规律可循的。大部分问题都集中在几个关键点环境配置、模型加载、显存管理、依赖版本。从我自己的经验来看最重要的建议是一定要用虚拟环境。这能避免90%的依赖冲突问题。其次从量化模型开始尝试INT4版本对硬件要求低更容易跑起来。最后善用官方文档和社区资源很多问题别人已经遇到并解决了。遇到问题时不要急着到处搜索先按这个排查手册的思路走一遍检查环境、检查版本、检查硬件资源、检查错误信息。大部分情况下问题都能定位到具体的原因。实际用下来ChatGLM-6B的部署和运行其实比想象中要简单。虽然会遇到各种小问题但都有对应的解决方法。关键是要有耐心一步步排查不要被表面的错误信息吓到。很多错误看着复杂其实解决起来就是一两行命令的事。如果你刚接触这块建议先从最简单的环境开始跑通一个基础示例然后再慢慢尝试更复杂的功能。遇到问题不要慌按照这个手册的思路排查大部分都能解决。实在解决不了的可以去社区问问大家都很乐意帮忙。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。