Home / PostsPost

低成本部署、微调整、训练大语言模型 Vicuna、LLaMA

嘟噜聪2023/05/27 22:49:21 [vicuna] [chatgpt] [llama] [gpt] [vicuna-7b] [vicuna-13b] [模型] [大语言模型] 1934人已阅

简介 想要对大语言模型进行微调所需要的硬件资源不是我们普通人能够企及的。如果我们只是想将自己的数据丢给大语言模型进行训练,训练成自己的模型。那么有一种低成本的方案将模型进行训练,然后将模型进行私有化部署

想要对大语言模型进行微调所需要的硬件资源不是我们普通人能够企及的。如果我们只是想将自己的数据丢给大语言模型进行训练,训练成自己的模型。那么有一种低成本的方案将模型进行训练,然后将模型进行私有化部署。

本文将介绍,如何低成本部署大语言模型。

各大云厂商都开能一种叫作“抢占式”的云服务器,这就是一个很好的薅羊毛机会了,那么我们就通过腾讯云的抢占式服务器部署大语言模型。

购买腾讯云服务器

登陆到腾讯云管理平台,进入到购买CVM页面

选择带有优惠的地区,然后选择GPU类型的机型,然后在实例列表中合适有GPU型号。

建议配置

CPU 内存 硬盘 GPU内存 带宽
8核+ 90G+ 100G+ 48G 100Mbps

GPU参考

型号 显存 备注
NVIDIA V100 32G 小模型可以单卡训练
NVIDIA P40 24G 小模型可以单卡训练
NVIDIA P4 8G 要以考虑多卡并联
NVIDIA T4 16G 要以考虑多卡并联

如果训练vicuna-13b的模型那至少需要90G以上的内存16核以上的CPU 如果在同区域你有常用的服务器或云盘,则可以不选择带宽和硬盘,或选择最小值就行,可以通过挂云盘的方案将磁盘挂载到购买到的抢占式服务器。 如果没有,则得想办法把模型上传到服务器上,如果直接从huggingface下载模型,则需要花大量时间(金钱在燃烧)

抢占服务器使用

服务器够买成功之后通过命令行登陆到目标服务器,我在同区是一台常用的服务器,我将合成好的模型放到的常用服务器上,并挂载的云盘。当购买的抢占式服务器起来后我们卸载常用服务器的云盘,并将它挂载到购买好的抢占服务器上,这样模型就可以直接使用了。或者通过内网复制也是可以的,腾讯云内网复制速度可以达到140MB/s。

时间就是金钱,我的朋友!尽量不要浪费时间,毕竟每小时都在算钱呢。

执行$ nvidia-smi 查看GPU信息

安装基础环境

进入服务器后直接开始安装环境,因为系统默认自带的python版本比较好,我们这里先把python的环境给搭建好,下面是搭建脚本。

安装python3

$ yum groupinstall "Development Tools"
$ yum install -y openssl-devel libffi-devel
$ wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz
$ tar zxvf Python-3.10.11.tgz
$ cd Python-3.10.11
$ ./configure --prefix=/usr/local/python310
$ make && make install
$ echo 'export PATH=/usr/local/python310/bin:$PATH' >> /etc/profile
$ source /etc/profile
$ python3 -V

安装FastChat

直接使用pip3安装,它交会把所需要的依赖都安装完。

$ pip3 install fschat

启动

尝试启fastchat,看是否还有依赖没有安装:

$ python3 -m fastchat.serve.controller

  File "/usr/local/python310/lib/python3.10/ssl.py", line 99, in <module>
    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'

  File "/usr/local/python310/lib/python3.10/ctypes/__init__.py", line 8, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'

  File "/usr/local/python310/lib/python3.10/bz2.py", line 17, in <module>
    from _bz2 import BZ2Compressor, BZ2Decompressor
ModuleNotFoundError: No module named '_bz2'

如果看到以上错误尝试安装以下依赖:

$ yum install -y zlib zlib-dev openssl-devel openssl openssl-static sqlite sqlite-devel bzip2-devel libffi bzip2 bzip2-devel ncurses xz lzma xz-devel gdbm gdbm-devel tk tk-devel libffi-devel gcc gcc-c++

安装bz2

$ wget https://jaist.dl.sourceforge.net/project/bzip2/bzip2-1.0.6.tar.gz
$ tar -zxvf bzip2-1.0.6.tar.gz
$ cd bzip2-1.0.6/
$ make -f Makefile-libbz2_so
$ make && make install
$ export CFLAGS="-I/usr/include"
$ export LDFLAGS="-L/usr/lib64"
$ export LD_LIBRARY_PATH=/usr/lib64

再次重新编译python3

$ cd Python-3.10.11/
$ make distclean
$ ./configure --prefix=/usr/local/python310 --enable-optimizations  
$ make && make install

安装之后再次尝试执行 $ python3 -m fastchat.serve.controller

可能还会有**_ssl*的错误,这个时候就需要修改python3源码,并重新编译了。具体的可以在google搜索一下,应该有很多项目都遇到过这个问题,这里就不再复制了。

启动fastchat.server.controller

$ python3 -m fastchat.serve.controller

上面命令是将服务启动在前台了,为了方便操作我们将它挂在后台启动,使用以下使用命令:

$ nohup python3 -m fastchat.serve.controller > controller.log 2>&1 &

继续起后面的服务,将模型加载到GPU。详情的可以参考《基于 LLaMA 模型的 vicuna-7b 安装教程 》

$ python3 -m fastchat.serve.model_worker  --model-path /data/vicuna-7b-v1.1
$ python3 -m fastchat.serve.gradio_web_server

搞定,输入ip或域名打开页面尝试是否可用。

测试没问题之后,关闭相关fastchat的服务,接下来我们尝试对模型进微调。

训练、微调模型

fastchat 提供了几个参考脚本,我们可以参照它给的脚本修改一些参数然后执行:

$ torchrun --master_port 20001 /data/train/fastchat/train/train_mem.py \
    --model_name_or_path /data/vicuna-7b-v1.1 \
    --data_path ./dummy.json \
    --fp16 True \
    --output_dir output_7b \
    --num_train_epochs 3 \
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 16 \
    --gradient_accumulation_steps 16 \
    --evaluation_strategy "steps" \
    --eval_steps 1500 \
    --save_strategy "steps" \
    --save_steps 1500 \
    --save_total_limit 8 \
    --learning_rate 2e-5 \
    --weight_decay 0. \
    --warmup_ratio 0.04 \
    --lr_scheduler_type "cosine" \
    --logging_steps 1 \
    --fsdp "full_shard auto_wrap" \
    --fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
    --tf32 False \
    --model_max_length 2048 \
    --gradient_checkpointing True \
    --lazy_preprocess True

该参数就是你要微调的数据,是json格式的数据:--data_path ./dummy.json,参考格式如下:

[
  {
    "id": "identity_0",
    "conversations": [
      {
        "from": "human",
        "value": "Who are you?"
      },
      {
        "from": "gpt",
        "value": "I am Vicuna, a language model trained by researchers from Large Model Systems Organization (LMSYS)."
      },
      {
        "from": "human",
        "value": "What can you do?"
      },
      {
        "from": "gpt",
        "value": "I can chat with you."
      }
    ]
  }
]

如果要在更少的GPU上训练,则可以减少per_device_train_batch_size,并相应地增加gradient_accumulation_steps,以保持全局批大小不变。要设置环境,可以参见scripts/train-vicuna.yaml中的设置部分。

踩坑

  1. v100 不支持 bf16

  1. 缺少模块: einops, flash_attn,

    $ pip3 install einops
    $ pip3 install flash_attn
    
  2. 需要注册wandb.ai的账号

wandb是一个非常不错的平台,可以通过该平台查看到你当前训练模型的情况.

糟糕!!!

账户没钱了,机器被回收了......

有没有老板可以赞助一下,下次继续更新!

很赞哦! (5)

文章评论

点击排行

本栏推荐

站点信息

  • 微信公众号