本文只分享了自己在体验glm-4v-9b过程中遇到的问题,没有涉及对模型本身以及更多问题的分析,大家可先看问题描述,再决定是否看下去。实验平台:linux 系统,RTX A4000。嫌麻烦的可以直接到文未看结论。
本人设备有限,引用一下别人完整加载模型的数据,大约18.9g。用16g 显卡直接报OOM,用8-bit加载还是会报OOM,可以采用4-bit加载,占用显存约9.1g,进行图片识别时,约11.5g。此处测试了不同的图片,识别时显存变化不超过0.1g,因此以11.5g计算。
示例代码
# 指定gpu
os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 设置 GPU 编号,如果单机单卡指定一个,单机多卡指定多个 GPU 编号,多卡还需进行其他设置,本文不作探讨
device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载模型
quantization_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype=torch.bfloat16)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
trust_remote_code=True,
device_map=device,
quantization_config=quantization_config
).eval()
报错:CUDA Setup failed despite GPU being available
运行 python -m bitsandbytes
异常时:输出很简洁,就是False
正常时,输出一堆东西
最后可能包含这些:
Running a quick check that:
+ library is importable
+ CUDA function is callable
WARNING: Please be sure to sanitize sensible info from any such env vars!SUCCESS!
Installation was successful!
此时cuda 是安装好的,但是bitsandbytes 找不到cuda 的位置。有各种各样的原因,比如未将cuda 的路径加入CUDA PATH,如 ANACONDA CUDA PATHS, /usr/local CUDA PATHS,/usr/local CUDA PATHS, LD_LIBRARY CUDA PATHS等;也有可能本机安装过多个版本的cuda, 有卸载不干净之嫌。
参考连接:
大模型训练时,使用bitsandbytes报错的解决方法-CSDN博客
配置LLM运行环境时遇到的坑_bitsandbytes==0.39.0-CSDN博客
[踩坑记] CUDA环境下bitsandbytes安装报错/异常解决_cuda setup failed despite gpu being available. ple-CSDN博客
本人的异常描述
我最开始是在torch 2.1的环境上运行代码,提示我torchvision不支持,升级时没有指定版本,失误了。结果按照最新版本升级,连带着给torch升级到最新的2.5.1。接下来各种问题就出现 ,额外强调一下,不推荐用最新版本各种包,如无必要,使用半年前的包就行,太新的不稳定,有些问题还没暴露出来。在这个torch2.5.1的前提下,我的cuda是12.4, 出现 bitsandbytes异常。尝试将cuda路径加入LD_LIBRARY_PATH中,不能解决问题。通过nvi-smi,我注意到本机的cuda version: 12.0。感觉可能是conda 环境中的cuda版本太高,于是使用pytorch 官方命令重装torch和cuda:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
不能解决问题,因为还是默认最新的torch2.5.1,同时cuda 还是12.4,这个cuda指定不生效。
更换命令
pip3 install torch==2.2.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
解决问题,同时需要手动设置LD_LIBRARY_PATH。
强调:使用LD_LIBRARY_PATH 覆盖设置,不要使用添加
正确 eg: export LD_LIBRARY_PATH=/root/miniconda3/envs/env_name/lib/
env-name换成自己的环境名称
唯一一个,生效
错误eg:export LD_LIBRARY_PATH=/root/miniconda3/envs/env_name/lib/:LD_LIBRARY_PATH
这种方式虽然也成功添加进去了,由于不是唯一一个,没有生效
疑惑:按说每个路径都会被检查,只要成功添加进去了就该生效才是,从结果来看比较尴尬,唯一才会生效。
废话一句:cuda指定还是不生效,按照torch 2.2.0,给我默认安装了cuda 12.1,
虽然与系统的cuda version: 12.0不符,倒也没有问题。
同样的,我本机同时存在cuda 11.2和 cuda 11.3,也没有产生干扰。
在系统的cuda version 允许下,在自己的conda环境中安装指定的torch,并且手动设置LD_LIBRARY_PATH就行。只要conda环境内部信息完整,就能正常使用,不用担心系统自身的cuda 影响。
torch 和cuda 的版本对应可参考:【最新】CUDA Toolkit版本及可用PyTorch对应关系(参考官网)_cudatoolkit版本对应-CSDN博客
懒人命令:
pip3 install torch==2.2.0 torchvision torchaudio
pip3 install bitsandbytes==0.42.0 transformers==4.44.2
虽然官方建议 glm-4v-9b对应的transformers>=4.46.0,但我的4.44.2也能正常运行。此外,有个佐证:基础模型glm-4-9b和glm-4-9b-chat 需要transformers>=4.40.0,这么看我的4.44.2也没毛病。