此贴记录本人在跟随各类教程试图安装Fengshen库时遇到的问题,主要是关于pytorch、deepspeed这两个库的具体安装问题
模型官网:封神榜(封神榜大模型)
Hugging Face:https://huggingface.co/IDEA-CCNL
本帖亮点Highlights
- 安装Fengshen前,先自行安装Pytorch系列库和Deepspeed库
- pytorch-lightning==1.8.0 torch ==1.12.1 torchmetrics==0.7.0 torchvision==0.13.1 这个版本组合测试成功
- windows环境下安装Deepspeed不能直接使用pip install,要手动编译后在本地pip install轮子
- 编译Deepspeed推荐安装VS2022 生成工具
pytorch与python环境坑
Fengshen对pytorch的内部import
Fengshen模型使用了pytorch,且使用了pytroch2.0以前的语法,比如导入一些命名空间已经变更的module,pytorch2.0对此类语法不提供后向兼容。
Fengshen的安装wheel不对pytorch版本做上限限制
在使用其官方git仓库上的轮子构建安装时,轮子只要求安装pytroch,没对版本做限制,这导致如果运行安装程序前,当前python环境下未安装pytorch库,则会自动安装最新可用的pytorch库(version >2.0.*),从而导致后续无法正常使用。
pytorch安装次生bug
本人经历,安装较高版本pytorch后,想要降级容易触发各种奇怪bug(这里不做详细记录,主要就是二进制文件和path问题;莫名奇妙拒绝访问或者找不到路径),所以最好的方式是尽可能一次性安装合适的pytorch
pytorch的其它依赖
pytorch依赖特定的python版本,特定的torchmetrics,特定的pytorch-lightning等,而pip安装方式似乎经常不能正确识别这类dependence或对版本给出警告(尤其是上限警告)
特别地,对torchmetrics、pytorch-lightning的不正确版本组合在导入Fengshen库时几乎是100%会触发,猜测应当是Fengshen库内部会import pytorch-lightning,而后者又进一步试图导入torchmetrics、pytroch本身,触发命名空间错误,包括但不限于:
module 'pytorch_lightning.loggers' 不存在
torch.cuda' has no attribute '_UntypedStorage'
解决思路
按照pytorch-lightning 文档中建议的组合关系,手动指定版本安装,具体步骤如下:
- 先不运行Fengshen git中的轮子安装Fengshen库
- 在文档中查找满足pytorch<=2.0的版本组合,经过测试,我选择了 `pytorch-lightning==1.8.0 torch ==1.12.1 torchmetrics==0.7.0 torchvision==0.13.1`这个版本组合;特别地,pytorch-lightning1.9.0看似也符合要求,但是我安装后在试图使用Fengshen时报错了
- 这个版本的组合需要3.7-3.10版本的python,所以需要提前创建python3.10版本(我使用了python3.8),用conda提前创建
- pip install torchmetrics==0.7.0
- pip install pytorch-lighting==1.8.0
- 确定cuda、驱动等已经安装完毕;PS:网上安装驱动的方法有效但比较麻烦,需要自己查看系统参数选版本,目前win11正版系统似乎都捆绑了GeForce Experience这个程序,它可以一键更新NVIDIA驱动版本到本机最新可用版(但是很烦人的是这个程序也要登录后才让用,网页下载驱动似乎也是要登录才给下载)
- 在pytorch官网上找到 历史版本安装页,根据选择的版本,找到安装命令,使用提供的pip 命令安装。注:必须使用pip命令安装,因为在较老版本中,用conda命令安装后,即使选择了cuda加速,其实际安装的build版本一直是`cpu0`,而且使用时也会报错cuda未安装,原因一说是channel缺乏对旧版本的维护导致被污染;
DeepSpeed编译与安装坑
包括但不限于以下错误,且搜索引擎给出的结果有的比较绕,不能从根本上解决问题:
fatal error LNK1181: 无法打开输入文件“aio.lib”
C2398: 元素"1": 从"size_t"转换为"_Ty"需要收缩转换
UserWarning: Error checking compiler version for cl: [WinError 2] 系统找不到指定的文件
win10及以上系统一直无法通过pip的wheel安装
原因一说是已编译好的wheel时默认是在Linux环境下,将aio.lib作为依赖之一编入了,所以pip install时会因为windows没有aio.lib而报错;
手动编译DeepSpeed包时各种报错
总之就是不顺利,各种奇怪的报错,报错拿去搜索时靠前的回答都是让你改cpp文件中的源代码,基本上是越改越乱,bug越来越多,但按照官方github特意提到的windows手动构建指南,运行完run命令后应该是能直接看到success的
重复安装Deepspeed包时的次生问题
主要也是由Fengshen自己的安装构建项目引发的,道理同上,当运行Fengshen的setup时,如果发现当前没有安装Deepspeed,则会尝试pip install Deepspeed,然后由于上述原因报错;报错后似乎有概率对整体安装造成影响,推测是已完成的安装操作没有完成回退,导致文件或版本混杂。
解决思路
- 先安装好正确版本的pytorch系列,因为Deepspeed的安装对其有依赖
- 去Deepspeed的官方github下载项目源码
- 安装VISUAL studio 生成工具(安装整个VS也行,但是体积很大),安装2022版的!尽管官方指南仅要求VS2019C++,但如果选择了VS 生成工具2019(默认含C++工具),手动编译过程还是会报各种错误,猜测是本生成工具中没有及时引入C++编译器的一些新特性,导致CPP文件中部分代码无法正常编译执行;我选了VS生成工具2022,并勾选了如下可选项,应该是最小编译要求的超集(实在没精力排除到底哪个是必备项了):
- 手动编译,编译成功后在项目根目录会找到自己的Deepspeed.wheel文件
- pip insatll 这个wheel
- 保证pytorch系列和Deepspeed库都成功安装后,最终安装Fengshen 库
后记
本篇博客主要针对一些奇特问题的解决方式做记录,省略了一些容易查到的攻略(比如:怎么安装CUDA驱动,怎么使用conda创建新的虚拟环境,怎么activate新虚拟环境等),主要写给有一定经验的同好看,可能不适合小白逐步复现使用。
如确定自身已经按照一般教程安装,并规避了本博客提到的几个重要坑后还有其他问题,欢迎评论区留言讨论