容器搭建vivo蓝心大模型

本文详细介绍了如何在容器环境下搭建和使用VIVO的BlueLM-7B-Chat-4bit模型,涉及硬件需求、CUDA容器镜像的使用、Anaconda安装、依赖软件配置以及模型的部署和测试过程。
摘要由CSDN通过智能技术生成

        本文将详述在容器环境中搭建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 >>>

# !! Contents within this block are managed by 'conda init' !!

__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"

if [ $? -eq 0 ]; then

    eval "$__conda_setup"

else

    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then

        . "/opt/anaconda3/etc/profile.d/conda.sh"

    else

        export PATH="/opt/anaconda3/bin:$PATH"

    fi

fi

unset __conda_setup

# <<< conda initialize <<<

        这里创建一个python 3.11版本的环境,建议在该环境下编译:

        conda create -n py3.11 python=3.11

        conda activate py3.11

5 apt安装依赖软件

        安装必须的依赖软件:vi、cmake和git,由于ubuntu软件源经常出现gpg证书无法验证签名的问题,可以使用以下下属选项来屏蔽证书校验错误:

        apt -o Acquire::AllowInsecureRepositories=true -o Acquire::AllowDowngradeToInsecureRepositories=true -o APT::Get::AllowUnauthentic

:Check-Valid-Until=false install vim cmake git

6 下载BlueLM大模型

        # 在容器中下载BlueLM源码:

        git clone https://github.com/vivo-ai-lab/BlueLM

        # 使用pip安装依赖:

        pip install -r requirements.txt

        # 注意:由于使用4bits量化模型,需要额外安装quanta_cuda量化计算库,通过量化,可以降低计算和存储需求,同时提高计算速度。

        cd quant_cuda; python setup_cuda.py install

        # 使用huggingface镜像站点下载大模型文件,通常包括模型权重文件(LFS)、预训练模型的配置信息、词汇表和标签文件。

        # 需要首先安装huggingface工具软件:

        pip install -U huggingface_hub

        # 设置模型库镜像站点

        export HF_ENDPOINT=https://hf-mirror.com

        # 下载模型,需要注意启用断点续传--resume-download;关闭--local-dir-use-symlinks意味着下载的模型和数据会直接保存在指定的本地目录中,而不是通过符号链接指向实际文件;使用--local-dir指定下载的路径

        huggingface-cli download --resume-download --local-dir-use-symlinks False vivo-ai/BlueLM-7B-Chat-4bits --local-dir /opt/BlueLM/vivo-ai/BlueLM-7B-Chat-4bits

7 使用BlueLM大模型

7.1 推理测试

# 推理测试:在python3命令提示符下执行:

# AutoTokenizer和AutoModelForCausalLM是两个预训练模型包装器,用于简化自然语言处理任务中的模型加载和预处理过程,其中:AutoTokenizer用于加载预训练分词器的包装器、AutoModelForCausalLM是用于生成式任务(如文本生成、对话系统等)的预训练模型包装器。

from transformers import AutoTokenizer, AutoModelForCausalLM

# 加载预训练分词器:1、需要指定已下载好的本地大模型的完整路径,使用相对路径vivo-ai/BlueLM-7B-Chat-4bits便会从网站再次更新该路径;2、如果分词器的实现需要从远程服务器加载其他资源或依赖项,trust_remote_code=True选项将允许这些操作。这在某些情况下可能是必要的,例如,当分词器需要加载词表、模型权重或其他相关资源时。3、选项use_fast=False意味着使用慢速分词器,在处理大量文本时更注重可理解和可调试特性,而不是性能。

tokenizer = AutoTokenizer.from_pretrained("/opt/BlueLM/vivo-ai/BlueLM-7B-Chat-4bits", trust_remote_code=True, use_fast=False)

# 加载预训练模型:该步骤将触发模型加载到指定的显卡上。

model = AutoModelForCausalLM.from_pretrained("/opt/BlueLM/vivo-ai/BlueLM-7B-Chat-4bits", device_map="cuda:0", trust_remote_code=True)

# 将模型设置为评估模式:在评估模式下,模型的行为会有所变化。具体来说,模型会关闭一些对训练过程有影响的功能,例如随机性和dropout。这样可以确保在每次推理时,模型的输出是一致且可重复的。大模型(如深度神经网络)的随机性和dropout是指在训练过程中对模型的一部分权重进行随机失活或丢弃。这种技术被广泛应用于深度学习领域,以提高模型的泛化能力和防止过拟合。

model = model.eval()

# 将自然语言问题转换为PyTorch张量

inputs = tokenizer("[|Human|]:三国演义的作者是谁?[|AI|]:", return_tensors="pt")

# 将输入张量inputs移动到CUDA设备上计算

inputs = inputs.to("cuda:0")

# 执行推理,文本中最大标记数量为128

outputs = model.generate(**inputs, max_new_tokens=128)

# 将模型生成的输出文本转换为可读的文本格式并打印出来,outputs.cpu()[0]是将模型生成的输出从GPU转移到CPU上,并获取输出结果的第一个元素;decode方法接受一个张量作为输入,并将其转换为对应的文本;skip_special_tokens=True参数用于跳过特殊标记,如起始标记和结束标记,以便生成的文本更加干净和可读

print(tokenizer.decode(outputs.cpu()[0], skip_special_tokens=True))

7.2 开放使用

        BlueLM源码中提供了开箱即用的客户端cli_demo.py和Web端web_demo.py,修改源文件,将MODEL_ID设置为模型文件的完整路径。

        python3 cli_demo.py

        # 注意:web_demo.py需要对numpy进行升级,从1.22升级到1.26即可。

        pip install numpy --upgrade

        streamlit run web_demo.py --server.port 8080

8 镜像压缩包

分享地址:阿里云盘不能分享压缩包,有需要者请与我联系:jameshugh@126.com

        总的来说,容器化语言模型可以提供灵活、可扩展和可移植的部署方式。但是需要注意的是,容器化部署同样依赖一定的GPU硬件资源,并且需要根据具体情况进行调整和优化。

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值