本文将详述在容器环境中搭建VIVO的BlueLM-7B-Chat-4bit模型的过程,与各位朋友分享我在实践中的心得与体验。希望能为热衷于大模型的朋友们提供一条便捷之路,同时也欢迎各位对我的搭建方法提出宝贵意见,共同进步。
1 硬件需求
该模型对硬件有一定要求,主要依赖于GPU进行推理,而在CPU和NPU上推理较为困难。经过测试,4bits量化模型大约需要7G的显存。为了满足这一需求,我选择了一台配备Tesla T4显卡的GPU服务器,其显存大小为16G。
首先在GPU服务器上查看显卡使用情况:执行nvidia-smi,可以选择一块内存使用率不高的显卡,如下图的4号显卡。
由于GPU资源的稀缺,目前多人共用一台GPU服务器甚至一张显卡,在这个条件下采用容器化部署模式更高效;而若采用虚机方式部署虽然可以独占显卡,但需要开启GPU直通,需要重启主机以在BIOS中开启这个选项,过程较为繁琐。
2 下载cuda容器镜像
为了省略容器内安装CUDA驱动的环节,可以直接使用nvidia/cuda的官方容器镜像,这里使用cuda-11.7.1版本,原因是该模型依赖该版本,而其他版本如cuda-12.1则不被支持,需要注意的是:GPU服务器上安装的CUDA版本为12.1,GPU服务器上运行的的docker容器内部署的CUDA版本为11.7,在容器内执行nvidia-smi依然显示为宿主机的CUDA版本12.1,而不是11.7,但该现象并不影响后续的安装,此外镜像需下载devel开发版,后续编译过程则无需安装其他编译工具。
docker pull nvidia/cuda:11.7.1-devel-ubuntu22.04
3 创建和运行cuda容器
使用如下命令启动容器,注意若选择多块显卡,"device=n,m"需要使用单引号括起来;此外,由于GPU服务器安装的docker版本较低(19.03.9),存在一些BUG,会造成一些系统调用无法正确执行,这里添加的选项--security-opt seccomp:unconfined将禁用seccomp限制,使容器中的进程能够访问所有系统调用。
docker run -idt --gpus '"device=4,5"' --network=host --security-opt seccomp:unconfined --name cuda-11.7.1 nvidia/cuda:11.7.1-devel-ubuntu22.04
注意:后续全部操作均在容器内进行:
docker exec -it cuda-11.7.1 bash
4 安装Anaconda
安装Anaconda3:本人在安装到最后时出现无法添加环境变量的问题,需要手工添加配置到~/.bashrc:
# >>> conda initialize >>>