共计 5787 个字符,预计需要花费 15 分钟才能阅读完成。
背景
上一篇文章《GPT 大语言模型 Alpaca-lora 本地化部署实际》介绍了斯坦福大学的 Alpaca-lora 模型的本地化部署,并验证了理论的推理成果。
总体感觉其实并不是特地现实,原始 Alpaca-lora 模型对中文反对并不好,用 52k 的中文指令集对模型进行 fine-tuning 之后,成果仍然达不到网上说的媲美 GPT-3.5 的推理成果,验证了那句话:“事不目见耳闻,而臆断其有无,可乎?”
在具备 3 块 Tesla P40 显卡的服务器上,利用 3 块 GPU 显卡加载模型参数和计算,进行一次简略的推理(非数学运算和逻辑运算)也须要大略 30s-1min 的工夫,效率几乎慢的惊人。在京东云 GPU 云主机部署上,尽管推理效率进步了很多,用中文数据集对模型进行了 fine-tuning,然而对中文的反对也并不是很好,常常会呈现乱码、反复问题、词不达意等状况。
最近大模型也同雨后春笋般的层出不穷,各个大厂和科研机构都推出了本人的大模型,其中基于 LLaMA(开源且好用)的最多,所以决定再看看其余模型,有没有推理成果好,中文反对好,同时推理效率高的模型。
通过筛选,Vicuna-13B 的推理成果据说达到了 ChatGPT 的 90% 以上的能力,优于 LLaMA-13B 和 Alpaca-13B 的成果(具体如下图所示)。评估办法是对各个模型 Alpaca、LLaMA、ChatGPT 和 Bard 输出同样的问题,而后通过 GPT- 4 当裁判对推理后果进行打分,以 ChatGPT 的答复作为 100 分,答复越靠近得分越高(尽管评估办法并不迷信,然而目前看也没有更好的方法对模型推理后果进行更迷信的评估)。
同时 Vicuna 的训练老本也很低,据说只须要 $300 左右,所以尝试本地化部署一下 Vicuna-7B,看看成果如何,说干就干。
环境筹备
因为之前本地化部署过 Alpaca-lora 模型了,本认为能够间接下载开源包,简略部署一下就能够看到成果了,后果发现我还是“too young,too simple”了,环境部署和解决包抵触的过程居然比第一次部署 Alpaca-lora 模型还要吃力。
简略的复述一下部署流程,具体的能够参考上一篇内容《GPT 大语言模型 Alpaca-lora 本地化部署实际》。
- 本地化部署或 GPU 云主机部署:GPU 服务器具备 4 块独立的 GPU,型号是 P40,单个 P40 算力相当于 60 个等同主频 CPU 的算力;GPU 云主机要选购 P40https://www.jdcloud.com/cn/calculator/calHost
- 装置显卡驱动和 CUDA 驱动
模型筹备
因为 Vicuna 是基于 LLaMA 模型的,为了合乎 LLaMA 模型 license 受权,仅公布了 delta 权重,所以咱们须要将原始 llama-7b 模型与 delta 模型权重合并之后,能力失去 vicuna 权重。
首先是下载 llama-7b 模型,因为文件比拟大,所以用 lfs 间接从文件服务器上下载,大小有 26G,执行:
git lfsclonehttps://huggingface.co/decapoda-research/llama-7b-hf
而后是下载 delta 模型,执行:
git lfsclonehttps://huggingface.co/lmsys/vicuna-7b-delta-v1.1
下载实现后进行权重合并,执行:
python -m fastchat.model.apply_delta \ –base ./model/llama-7b-hf \ –delta ./model/vicuna-7b-delta-v1.1 \ –target ./model/vicuna-7b-all-v1.1
这个合并过程会很快,最终后果如下,合并之后参数大小变成了 13G。
合并之后的目录下会有配置文件和数据文件。
装置依赖包
Vicuna 次要用到 3 个依赖包,fschat、tensorboardX 和 flash-attn,前 2 个装置比较顺利,间接 pip install fschat、tensorboardX 即可装置实现。flash-attn 装置遇到了问题,始终报以下谬误:
通过一番检索,发现是 gcc 版本太低导致的,须要降级 gcc,首先查看了一下本地的 gcc 版本,gcc - v 和 g ++ - v 发现是 4.8.5 的,的确是太低了,那么既然要降级,就降级到最新版,间接下载 13.1 版本,能够在
http://ftp.gnu.org/gnu/gcc/ 抉择想要装置的版本,这里抉择的是 gcc-13.1.0.tar.gz。
执行:
tar -xzf gcc-13.1.0.tar.gz
cd gcc-13.1.0
./contrib/download_prerequisites
mkdir build
cd build/
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
而后执行 make 编译,留神这里 make 工夫会十分长,可能会继续几个小时,能够应用 make -j 8 让 make 最多运行 8 个编译命令同时运行,放慢编译速度。
顺利完成后,咱们再执行 make install 进行装置。
而后用 gcc - v 和 g ++ - v 验证版本是否曾经更新,如果提醒如下,阐明装置实现。
而后咱们须要卸载原有的 gcc 和 g ++,切换到 root 权限,执行 yum -y remove gcc g++。
配置新版本全局可用,执行 ln -s /usr/local/bin/gcc /usr/bin/gcc。
更新链接库,执行:
查看原链接库:strings /usr/lib64/libstdc++.so.6 | grep CXXABI
删除原链接库:rm -f /usr/lib64/libstdc++.so.6
建设软连贯:ln -s /usr/local/lib64/libstdc++.so.6.0.29 /usr/lib64/libstdc++.so.6
查看新链接库:strings /usr/lib64/libstdc++.so.6 | grep CXXABI
如果最新版本有变动,那么祝贺你,阐明曾经降级胜利啦。
装置 cuda
因为之前是用 rpm 包装置的 cuda,有些文件是缺失的,运行时会报各种奇奇怪怪的谬误,这里就不赘述了(只有经验过才会懂),间接介绍用二进制文件装置 cuda 过程。
下载地址:
https://developer.nvidia.com/cuda-11-7-0-download-archive?target\_os=Linux&target\_arch=x86\_64&Distribution=CentOS&target\_version=7&target\_type=runfile\_local
留神这里要抉择 runfile(local)。
而后执行 sh
cuda\_11.7.0\_515.43.04_linux.run。
装置实现后,须要配置环境变量,在本地.bash_profile 中配置如下两项:
上面验证一下装置是否胜利,执行 nvcc -V,如下图所示,那么祝贺你,装置胜利啦。
装置 cudnn 和 nccl
装置 cudnn 和 nccl 须要先在 nvidia 注册账号,注册之后能够在以下两个地址下载相应的 rpm 包,而后 rpm -ivh XXXXX.rpm 包即可。
cudnn 下载地址:https://developer.nvidia.com/cudnn
nccl 下载地址:https://developer.nvidia.com/nccl/nccl-legacy-downloads
装置实现后,如下图所示阐明曾经装置胜利 rpm 包。
模型推理
又到激动人心的时刻啦,让咱们来测试一下看看模型的推理成果如何?首先咱们先擦拭一下还没有干透辛勤的汗水,所有致力,都是为了最终能跟机器人程序对上话,现实状况是让咱们感觉它并不是一个机器人。
在终端执行如下命令,而后输出问题即可。
python -m fastchat.serve.cli –model-path ./model/vicuna-7b-all-v1.1 –style rich
当然,还能够依据不同的需要场景,设置不必的运行参数,如下:
压缩模型 预测成果会稍差一点,适宜 GPU 显存不够的场景
python -m fastchat.serve.cli –model-path ./model/vicuna-7b-all-v1.1 –load-8bit –style rich
应用 cpu 进行推理,速度会很慢,慎用
python -m fastchat.serve.cli –model-path ./model/vicuna-7b-all-v1.1 –device cpu –style rich
应用多个 GPU 进行预测
python -m fastchat.serve.cli –model-path ./model/vicuna-7b-all-v1.1 –num-gpus 3 –style rich
1)举荐菜谱测试:
2)多语言测试:
3)代码能力测试:
4)数学计算测试
5)一般对话举荐
推理过程中 GPU 服务器资源应用状况,目前应用单 GPU 进行推理,都能够做到秒级响应,GPU 内存空加载 13G,推理时不到 15G,推理时单 GPU 算力根本能够达到 90% 以上,甚至 100%,如下图所示。
总结一下:
1)对准确的推理成果并不是很现实,比方举荐菜谱,感觉是在不苟言笑的胡言乱语,依照推理的后果很难做出可口的饭菜️;
2)对多种自然语言的反对,这个真的是出乎预料,居然日语和西班牙语齐全都可能自若应答,能够说是相当的惊艳了;
3)编码能力还是能够的,可能大略给出根本需要,当然如果想间接编译执行可能还须要人工微调,然而作为辅助工具应该是没问题的;
4)数据计算能力目前看还是比拟弱的,简略的乘法目前还不可能给出正确的答案;
5)一般的对话是齐全没有问题的,对中文的了解也齐全是否合乎预期,解解闷排解一下孤单是可能 cover 住的。
因为模型目前还没有做 fine-tuning,从目前的推理成果来看,曾经是十分不错了,而且推理的效率也是十分不错的,即便应用单 GPU 进行推理也能够做到秒级响应,而且推理过程中显存占用也才只有 60% 多,跟空载时候的 50% 多没差多少,总之在没有通过 fine-tuning 的状况下,模型的推理体现和推理效率还是能够打 7 - 8 分(满分 10 分)的,如果假以时日,有足够的语料库和进行 fine-tuning 的话,成果还是可期的。
模型 fine-tuning
要想使模型适宜某一特定畛域内的场景,获取特定畛域的常识是必不可少的,基于原始模型就要做 fine-tuning 操作,那么咱们尝试做一下 fine-tuning,看看成果如何吧。
fine-tuning 须要在终端执行一下命令:
torchrun --nproc_per_node=3 --master_port=40001 ./FastChat/fastchat/train/train_mem.py \
--model_name_or_path ./model/llama-7b-hf \
--data_path dummy.json \
--bf16 False \
--output_dir ./model/vicuna-dummy \
--num_train_epochs 2 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 300 \
--save_total_limit 10 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--report_to "tensorboard" \
--fsdp "full_shard auto_wrap" \
--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
--tf32 False \
--model_max_length 2048 \
--gradient_checkpointing True \
--lazy_preprocess True
最终./model/vicuna-dummy 目录输入就是咱们 fine-tuning 之后的模型权重文件目录。
很遗憾,本文 fine-tuning 没有胜利,报错如下:
起因也很简略,因为咱们应用的 GPU 型号是 Tesla P40,此款显卡应用的 SM\_62 架构,目前模型 fine-tuning 至多须要 SM\_75 及以上架构,看社区有在 4090、A100 或者 A80 显卡上 fine-tuning 胜利的,所以 fine-tuning 只能后续再更高架构的显卡上进行了。
后续工作
终上,Vicuna 模型在整体体现和推理效率上能够说是秒杀 Alpaca 模型的,咱们本文测试用的是 Vicuna-7b,如果是 Vicuna-13b 成果会更好,而且对多种自然语言(蕴含中文)的反对也要远远好于 Alpaca 模型,的确像社区所说的,目前 Vicuna 模型能够说是开源大模型的天花板了,如果想基于开源大模型进行二次开发,是个不二的抉择。
基于大模型的本地化部署工作目前就告一段落了,后续做的工作可能有以下几点:
1)如果有更好的显卡,能够对 vicuna 进行 fine-tuinig,验证一下 fine-tuning 之后模型能不能学到特定畛域的常识;后续筹备应用公司外部提供的试用资源【京东云 GPU 云主机 p.n3a100 系列 】,这个产品提供 Nvidia® A100 GPU(80G 显存),搭配应用 Intel® Xeon® Platinum 8338C 处理器及 DDR4 内存,反对 NVLink,单精度浮点运算峰值能达到 156TFlops,能够说是最强算力了。
2)找到适合的与目前利用联合的场景,将大语言模型利用落地;
3)基于 vicuna 开源我的项目进行二次开发,封装成可用的服务;
4)基于大语言模型进行更多的摸索和学习。
起源:京东云开发者社区
作者:Beyond_luo(未经受权请勿转载)