AWS P3实例微调OPT-6.7B遇数据类型不匹配错误及训练异常求助
问题原因分析
- Torch与CUDA版本不匹配:AWS环境安装的是通用版
torch==1.13.1,而Colab用的是绑定CUDA 11.6的torch==1.13.1+cu116。AWS系统CUDA版本为11.7,通用Torch无法正确适配,导致模型权重的半精度(Half)转换逻辑异常,触发expected scalar type Half but found Float错误。 - Bitsandbytes库适配问题:AWS P3的Tesla V100计算能力为7.0,bitsandbytes加载的是
libbitsandbytes_cuda117_nocublaslt.so(无cublaslt加速),而Colab的T4计算能力7.5加载的是带cublaslt的版本。无cublaslt的版本在半精度张量处理上存在兼容性问题,引发类型不匹配和训练时的梯度计算异常。 - Autocast的副作用:强行使用
torch.autocast("cuda")虽然掩盖了类型错误,但会导致张量dtype在训练过程中频繁切换,破坏LoRA微调的精度一致性,进而引发loss波动或GPT-J模型loss为0的异常(本质是模型未有效学习)。
解决方案
- 安装对应CUDA版本的Torch:在AWS环境卸载现有Torch,安装匹配系统CUDA 11.7的版本:
pip uninstall torch -y pip install torch==1.13.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117 - 显式指定模型与输入的dtype:加载模型时强制设置半精度,同时确保输入数据统一为
torch.float16:import torch from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained( "facebook/opt-6.7b", torch_dtype=torch.float16, device_map="auto", load_in_8bit=True ) tokenizer = AutoTokenizer.from_pretrained("facebook/opt-6.7b") # 处理输入时强制转成半精度 inputs = tokenizer("your_text", return_tensors="pt").to("cuda", dtype=torch.float16) - 调整Bitsandbytes的环境配置:设置环境变量强制bitsandbytes使用兼容V100的库,避免加载nocublaslt版本:
export BITSANDBYTES_CUDA_VERSION=117 export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64:$LD_LIBRARY_PATH - 移除不必要的Autocast:在确保模型和输入dtype统一后,去掉
with torch.autocast("cuda"):上下文,避免dtype切换干扰训练。 - 验证Peft/LoRA配置的一致性:确保LoRA层的dtype与主模型一致,示例配置:
from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", inference_mode=False, dtype=torch.float16 ) model = get_peft_model(model, lora_config)
验证步骤
- 重新安装依赖后,运行
torch.cuda.get_device_capability()确认计算能力为(7,0),torch.version.cuda确认CUDA版本为11.7。 - 加载模型后,检查
model.dtype是否为torch.float16,输入张量的dtype是否匹配。 - 启动小规模训练,观察loss是否逐步下降,确认无类型错误。
内容的提问来源于stack exchange,提问作者SRC
相关产品推荐
相关产品推荐

