1. cuda版本
cuda建议11.8,之前使用的12.1,但遇到一些问题降级到11.8了,但忘了是啥库装不上了,目前11.8肯定能用,web能打开、lora能简单跑。
python版本是3.10。
2. 下载模型和项目
> 通义千问-7B-Chat · 模型库 (modelscope.cn)
使用git
#模型
git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git
#项目
git clone https://github.com/QwenLM/Qwen.git
模型的缺省目录是项目下的 Qwen\Qwen-7B,可以酌情放置,并在项目的各种.py中进行调整。
3. 有关WSL(windows linux子系统)
好处是下载的各种东西直接放到windows里,ubuntu子系统可以在/mnt中直接读取,很方便。
参见:
WSL2+ubuntu2004+cuda11.8+cudnn8.8开发环境搭建
我是用的ubuntu版本是2204,也没问题。基于该文部署好cuda11.8,cudnn(也可能不需要)、环境变量.bashrc、当然还有python3.10。
然后,ubuntu内pytorch的部署(11.8),很慢:
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
4. 安装依赖项
时间可能有些长,尽量搞国内源:
#这一句包含了requirements.txt的内容
pip install transformers==4.32.0 accelerate tiktoken einops scipy transformers_stream_generator==0.0.4 peft deepspeed
#以及web支持:
pip install -r requirements_web_demo.txt
5.安装 flash-attention(可选)
理论上这一大步没有也行,但有了能加速一些。
如果你的显卡支持fp16或bf16精度,我们还推荐安装flash-attention(当前已支持flash attention 2)来提高你的运行效率以及降低显存占用。(flash-attention只是可选项,不安装也可正常运行该项目)
这是一个很大的坑,碰巧成功了,步骤有些乱。
首先安装了ninja(不知道能否优化掉这一步):
pip install ninja
之后,我用千问官网和flash_atten官网Releases · Dao-AILab/flash-attention (github.com) 的两三种方式编译或安装都不太顺,总是遇到网络等问题,貌似也很常见,网上各种攻略看着有点繁琐,且效果不是很可靠。
不最后的解决也很简单,根据我用的cuda版本(cu118)、pytorch(2.0)和python版本(310)等,直接下载release文件(whl):
Releases · Dao-AILab/flash-attention · GitHub
我下载的文件是:
flash_attn-2.4.2+cu118torch2.0cxx11abiFALSE-cp310-cp310-linux_x86_64.whl
直接 pip安装上面的whl。
此时理论上能跑web_demo了,但可能会显示缺layer_norm啥的,这个是个warning,不解决也没问题,解决了据说微调等速度会变快。解决方法:
下载项目:
git clone https://github.com/Dao-AILab/flash-attention.git
然后在项目目录执行:
pip install csrc/layer_norm
经过漫长的等待,居然成功了。之前同样这么长时间安装flash-attention,结果是存在网络错误。这个时候我的git是设置了梯子的,不知道有没有影响。
6. 运行web——demo
注意在web_demo.py中修改模型位置,然后python运行就行了。
根据提示,自动转换为bf16精度。
7. lora微调初探
还不太明白,但应该是跑起来了(24G显存)。
首先确保安装了 peft deepspeed(之前的语句中已经安装),在windows上,这个deepspeed也是个坑,在wsl中不是问题。
自己准备好数据文件,然后单显卡可以在项目目录下执行:
bash ./finetune/finetune_lora_single_gpu.sh [-m MODEL_PATH] [-d DATA_PATH]
需要指明模型路径和数据路径,或者写死在项目文件的finetune.py中,就不用每次指定了。默认情况下,也是bf16精度。
可能会遇到一个小问题,这个sh文件貌似是windows格式,ubuntu会识别出乱字符,解决方法:
vim xxxx.sh
:set ff= unix
#然后保存退出,即
:wq
或者采用其他方式另存为linux格式即可。